Skip to content

Commit

Permalink
Merge pull request #52 from Xaidee/feature/electrum-kinetic-damage
Browse files Browse the repository at this point in the history
  • Loading branch information
PssbleTrngle committed Sep 17, 2024
2 parents b562bf8 + 6b31f16 commit 44003b7
Show file tree
Hide file tree
Showing 19 changed files with 209 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// 1.20.1 2024-08-28T12:15:19.5456297 Oreganized Item Tags
// 1.20.1 2024-09-17T12:51:06.9601625 Oreganized Item Tags
3a2cbf8d34e9bde2e22d59d4437fa80361d53291 data/farmersdelight/tags/items/tools/knives.json
d8d286ea76e30a635512bc93d68815770003ff41 data/forge/tags/items/buckets/molten_lead.json
7a2d68d81bc5ee59f9a2f4ba68ddb39bfd9c875d data/forge/tags/items/glass.json
Expand Down Expand Up @@ -47,6 +47,7 @@ a4acb3623320f801e89e3451f8b7d9e2246f99d0 data/minecraft/tags/items/walls.json
81fb1b18afaa14ae90800b23c32de565d1389bb3 data/oreganized/tags/items/crystal_glass.json
f1dfddab1e3f2dec1e7ed1c3fbf9f6a7f261cf08 data/oreganized/tags/items/crystal_glass_panes.json
bf2ad799074f5c44acee490bdf3d3ae81d56997b data/oreganized/tags/items/gargoyle_snack.json
4d89056c908550931c1f2008f9817f5d3ff7aa68 data/oreganized/tags/items/has_kinetic_damage.json
f7810c755845dc955112f7b0cedf68260ad693cc data/oreganized/tags/items/lead_source.json
376b7c9ff449a4b98cb7b1f65b47d658c4e39428 data/oreganized/tags/items/lighter_than_lead.json
3112fb4a1df2953e2c3572fa47f886bf8e5bd679 data/oreganized/tags/items/stone_types/glance.json
Expand Down
1 change: 1 addition & 0 deletions src/generated/resources/assets/oreganized/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"advancements.story.melting_point.title": "Melting Point",
"advancements.story.obtain_silver.description": "Smelt Raw Silver",
"advancements.story.obtain_silver.title": "Every Stone has a Silver Lining",
"attribute.oreganized.kinetic_damage": "Kinetic Damage",
"block.oreganized.black_crystal_glass": "Black Crystal Glass",
"block.oreganized.black_crystal_glass_pane": "Black Crystal Glass Pane",
"block.oreganized.blue_crystal_glass": "Blue Crystal Glass",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"values": [
"oreganized:electrum_axe",
"oreganized:electrum_hoe",
"oreganized:electrum_knife",
"oreganized:electrum_machete",
"oreganized:electrum_pickaxe",
"oreganized:electrum_shovel",
"oreganized:electrum_sword"
]
}
2 changes: 2 additions & 0 deletions src/main/java/galena/oreganized/Oreganized.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import galena.oreganized.data.ORegistries;
import galena.oreganized.data.OSoundDefinitions;
import galena.oreganized.data.OSpriteSourceProvider;
import galena.oreganized.index.OAttributes;
import galena.oreganized.index.OBlocks;
import galena.oreganized.index.OEffects;
import galena.oreganized.index.OEntityTypes;
Expand Down Expand Up @@ -138,6 +139,7 @@ public Oreganized() {
OStructures.STRUCTURES,
OFeatures.FEATURES,
OPaintingVariants.PAINTING_VARIANTS,
OAttributes.ATTRIBUTES,
LOOT_MODIFIERS,
};

Expand Down
10 changes: 10 additions & 0 deletions src/main/java/galena/oreganized/data/OItemTags.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,16 @@ protected void addTags(HolderLookup.Provider provider) {
tag(SHIELDS_SE).add(OItems.ELECTRUM_SHIELD.get());
tag(MACHETES).add(OItems.ELECTRUM_MACHETE.get());

tag(HAS_KINETIC_DAMAGE).add(
OItems.ELECTRUM_AXE.get(),
OItems.ELECTRUM_HOE.get(),
OItems.ELECTRUM_KNIFE.get(),
OItems.ELECTRUM_MACHETE.get(),
OItems.ELECTRUM_PICKAXE.get(),
OItems.ELECTRUM_SHOVEL.get(),
OItems.ELECTRUM_SWORD.get()
);

tag(OTags.Items.GARGOYLE_SNACK).addTags(INGOTS_SILVER);
}
}
2 changes: 2 additions & 0 deletions src/main/java/galena/oreganized/data/OLang.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ protected void addTranslations() {
add("death.attack.lead_bolt.item", "%1$s was shot %2$s using %3$s");
add("death.attack.molten_lead", "%1$s refused to let go of the soaring hot metal");

add("attribute.oreganized.kinetic_damage", "Kinetic Damage");

/*
Automatically create translations for blocks and items based on their registry name.
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/galena/oreganized/index/OAttributes.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package galena.oreganized.index;

import galena.oreganized.Oreganized;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.RangedAttribute;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

@Mod.EventBusSubscriber(modid = Oreganized.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class OAttributes {

public static final DeferredRegister<Attribute> ATTRIBUTES = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, Oreganized.MOD_ID);

public static final RegistryObject<Attribute> KINETIC_DAMAGE = register("kinetic_damage", 0.0, 0.0, 30.0);

private static RegistryObject<Attribute> register(String name, double defaultValue, double min, double max) {
return ATTRIBUTES.register(name, () -> new RangedAttribute("attribute.%s.%s".formatted(Oreganized.MOD_ID, name), defaultValue, min, max));
}

}
20 changes: 1 addition & 19 deletions src/main/java/galena/oreganized/index/OItemTiers.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,7 @@
public enum OItemTiers implements Tier {
LEAD(0, 150, 7.0F, 1.5F, 8, () -> Ingredient.of(OTags.Items.INGOTS_LEAD)),

/*
Electrum should be better than diamond but not the same as netherite
in terms of toughness and durability, taking on some benefits
from gold tools such as speed and enchantability instead.
Here's the tiers for diamond, gold and netherite for comparison.
DIAMOND(3, 1561, 8.0F, 3.0F, 10, () -> {
return Ingredient.of(Items.DIAMOND);
}),
GOLD(0, 32, 12.0F, 0.0F, 22, () -> {
return Ingredient.of(Items.GOLD_INGOT);
}),
NETHERITE(4, 2031, 9.0F, 4.0F, 15, () -> {
return Ingredient.of(Items.NETHERITE_INGOT);
});
*/
ELECTRUM(4,1561,11.0F,3.0F,18, () -> Ingredient.of(OTags.Items.INGOTS_ELECTRUM));

ELECTRUM(4,1561,8.0F,3.0F,14, () -> Ingredient.of(OTags.Items.INGOTS_ELECTRUM));

private final int level;
private final int durability;
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/galena/oreganized/index/OItems.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,11 @@ public static Supplier<? extends Item> compat(String modid, Function<Item.Proper
public static final RegistryObject<Item> BUSH_HAMMER = HELPER.createItem("bush_hammer", () -> new BushHammerItem(OItemTiers.LEAD, 2.5F, -2.8F, (new Item.Properties()).stacksTo(1)));
public static final RegistryObject<Item> SCRIBE = HELPER.createItem("scribe", () -> new ScribeItem(new Item.Properties().durability(250)));

public static final RegistryObject<Item> ELECTRUM_SWORD = HELPER.createItem("electrum_sword", () -> new SwordItem(OItemTiers.ELECTRUM, 3, -2.2F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_SHOVEL = HELPER.createItem("electrum_shovel", () -> new ShovelItem(OItemTiers.ELECTRUM, 1.5F, -2.8F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_PICKAXE = HELPER.createItem("electrum_pickaxe", () -> new PickaxeItem(OItemTiers.ELECTRUM, 1, -2.6F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_AXE = HELPER.createItem("electrum_axe", () -> new AxeItem(OItemTiers.ELECTRUM, 6.0F, -2.8F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_HOE = HELPER.createItem("electrum_hoe", () -> new HoeItem(OItemTiers.ELECTRUM, 0, -2.8F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_SWORD = HELPER.createItem("electrum_sword", () -> new SwordItem(OItemTiers.ELECTRUM, 3, -2.4F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_SHOVEL = HELPER.createItem("electrum_shovel", () -> new ShovelItem(OItemTiers.ELECTRUM, 1.5F, -3.0F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_PICKAXE = HELPER.createItem("electrum_pickaxe", () -> new PickaxeItem(OItemTiers.ELECTRUM, 1, -2.8F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_AXE = HELPER.createItem("electrum_axe", () -> new AxeItem(OItemTiers.ELECTRUM, 5.0F, -3.0F, (new Item.Properties())));
public static final RegistryObject<Item> ELECTRUM_HOE = HELPER.createItem("electrum_hoe", () -> new HoeItem(OItemTiers.ELECTRUM, -3, 0.0F, (new Item.Properties())));

public static final RegistryObject<Item> ELECTRUM_KNIFE = HELPER.createItem("electrum_knife", compat(FARMERS_DELIGHT_ID, it -> FarmersDelightCompat.KNIFE_FACTORY.apply(it), new Item.Properties()));
public static final RegistryObject<Item> ELECTRUM_SHIELD = HELPER.createItem("electrum_shield", () -> new ShieldItem(new Item.Properties().durability(363)));
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/galena/oreganized/index/OParticleTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import galena.oreganized.client.particle.LeadShrapnelParticle;
import galena.oreganized.client.particle.VengeanceParticleProvider;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.CritParticle;
import net.minecraft.client.particle.ParticleEngine;
import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.particles.SimpleParticleType;
Expand All @@ -26,6 +27,7 @@ public class OParticleTypes {
public static final RegistryObject<SimpleParticleType> LANDING_LEAD = PARTICLES.register("landing_lead", () -> new SimpleParticleType(true));
public static final RegistryObject<SimpleParticleType> LEAD_SHRAPNEL = PARTICLES.register( "lead_shrapnel", () -> new SimpleParticleType(true));
public static final RegistryObject<SimpleParticleType> VENGEANCE = PARTICLES.register( "vengeance", () -> new SimpleParticleType(true));
public static final RegistryObject<SimpleParticleType> KINETIC_HIT = PARTICLES.register( "kinetic_hit", () -> new SimpleParticleType(true));


@SubscribeEvent
Expand All @@ -37,5 +39,6 @@ public static void registerParticleFactories(RegisterParticleProvidersEvent even
engine.register(LANDING_LEAD.get(), CustomDrippingParticle.LeadLandProvider::new);
engine.register(LEAD_SHRAPNEL.get(), LeadShrapnelParticle.Provider::new);
engine.register(VENGEANCE.get(), VengeanceParticleProvider::new);
engine.register(KINETIC_HIT.get(), CritParticle.DamageIndicatorProvider::new);
}
}
2 changes: 2 additions & 0 deletions src/main/java/galena/oreganized/index/OTags.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ public static class Items {
public static final TagKey<Item> SHIELDS_SE = ItemTags.create(new ResourceLocation(SHIELD_EXPANSION_ID, "shields"));
public static final TagKey<Item> MACHETES = ItemTags.create(new ResourceLocation(NETHERS_DELIGHT_ID, "tools/machetes"));

public static final TagKey<Item> HAS_KINETIC_DAMAGE = tag( "has_kinetic_damage");

public static final TagKey<Item> GARGOYLE_SNACK = tag("gargoyle_snack");

private static TagKey<Item> tag(String name) {
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/galena/oreganized/mixin/EnchantmentHelperMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package galena.oreganized.mixin;

import galena.oreganized.world.KineticDamage;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(EnchantmentHelper.class)
public class EnchantmentHelperMixin {

@Inject(method = "doPostDamageEffects(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/Entity;)V", at = @At("HEAD"))
private static void applyKineticDamage(LivingEntity cause, Entity target, CallbackInfo ci) {
KineticDamage.apply(cause, target);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import galena.oreganized.Oreganized;
import galena.oreganized.network.packet.DoorPushingPacket;
import galena.oreganized.network.packet.GargoyleParticlePacket;
import galena.oreganized.network.packet.KineticHitPacket;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;

Expand All @@ -20,5 +21,6 @@ public static void register() {

CHANNEL.registerMessage(id++, GargoyleParticlePacket.class, GargoyleParticlePacket::write, GargoyleParticlePacket::from, GargoyleParticlePacket::handle);
CHANNEL.registerMessage(id++, DoorPushingPacket.class, DoorPushingPacket::write, DoorPushingPacket::from, DoorPushingPacket::handle);
CHANNEL.registerMessage(id++, KineticHitPacket.class, KineticHitPacket::write, KineticHitPacket::from, KineticHitPacket::handle);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package galena.oreganized.network.packet;

import galena.oreganized.world.KineticDamage;
import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;

import java.util.function.Supplier;

public record KineticHitPacket(int target) {

public void write(FriendlyByteBuf buffer) {
buffer.writeInt(target);
}

public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
var context = contextSupplier.get();
context.enqueueWork(() -> {
var level = Minecraft.getInstance().level;
if (level == null) return;

var target = level.getEntity(target());
if (target == null) return;

KineticDamage.spawnParticles(target);
});

context.setPacketHandled(true);
}

public static KineticHitPacket from(FriendlyByteBuf buffer) {
var target = buffer.readInt();
return new KineticHitPacket(target);
}

}
52 changes: 52 additions & 0 deletions src/main/java/galena/oreganized/world/KineticDamage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package galena.oreganized.world;

import galena.oreganized.index.OAttributes;
import galena.oreganized.index.OParticleTypes;
import galena.oreganized.network.OreganizedNetwork;
import galena.oreganized.network.packet.KineticHitPacket;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraftforge.network.PacketDistributor;

public class KineticDamage {

public static void apply(LivingEntity cause, Entity target) {
if (cause == null) return;

var stack = cause.getMainHandItem();
var mods = stack.getAttributeModifiers(EquipmentSlot.MAINHAND).get(OAttributes.KINETIC_DAMAGE.get());

if (mods.isEmpty()) return;

var factor = Math.min(cause.getDeltaMovement().horizontalDistance() / 0.046F, 1F);

// ignores modifier operation, since only addition is used by oreganized this works, but may be adapted in the future
var kineticDamage = factor * mods.stream().mapToDouble(AttributeModifier::getAmount).sum();
var source = target.level().damageSources().generic();

if (kineticDamage == 0.0) return;

target.invulnerableTime = 0;
target.hurt(source, (float) kineticDamage);
OreganizedNetwork.CHANNEL.send(
PacketDistributor.NEAR.with(PacketDistributor.TargetPoint.p(target.getX(), target.getY(), target.getZ(), 16.0, target.level().dimension())),
new KineticHitPacket(target.getId())
);
}

public static void spawnParticles(Entity target) {
var level = target.level();
var count = 3 + level.random.nextInt(2) + level.random.nextInt(2);

for (int i = 0; i < count; i++) {
level.addParticle(
OParticleTypes.KINETIC_HIT.get(),
target.getRandomX(0.75), target.getRandomY(), target.getRandomZ(0.75),
level.random.nextGaussian() * 0.02D, level.random.nextGaussian() * 0.02D, level.random.nextGaussian() * 0.02D
);
}
}

}
29 changes: 29 additions & 0 deletions src/main/java/galena/oreganized/world/event/PlayerEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import galena.oreganized.content.block.MoltenLeadCauldronBlock;
import galena.oreganized.content.entity.GargoyleBlockEntity;
import galena.oreganized.content.item.ScribeItem;
import galena.oreganized.index.OAttributes;
import galena.oreganized.index.OBlocks;
import galena.oreganized.index.OEffects;
import galena.oreganized.index.OFluids;
Expand All @@ -19,23 +20,31 @@
import net.minecraft.world.InteractionHand;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.DiggerItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.SwordItem;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.ToolAction;
import net.minecraftforge.common.ToolActions;
import net.minecraftforge.event.ItemAttributeModifierEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.level.BlockEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.util.UUID;

@Mod.EventBusSubscriber(modid = Oreganized.MOD_ID)
public class PlayerEvents {

Expand Down Expand Up @@ -143,4 +152,24 @@ public static void onBlockBreak(final BlockEvent.BreakEvent event) {
event.setExpToDrop(0);
}
}

@SubscribeEvent(priority = EventPriority.LOW)
public static void onItemAttributes(ItemAttributeModifierEvent event) {
var stack = event.getItemStack();
var mods = event.getModifiers();

if (event.getSlotType() != EquipmentSlot.MAINHAND) return;

if (stack.is(OTags.Items.HAS_KINETIC_DAMAGE) && !mods.containsKey(OAttributes.KINETIC_DAMAGE.get())) {
var damage = stack.getItem() instanceof DiggerItem item
? item.getAttackDamage()
: stack.getItem() instanceof SwordItem item
? item.getDamage()
: 2.0F;
event.addModifier(OAttributes.KINETIC_DAMAGE.get(), new AttributeModifier(
UUID.fromString("0191ff58-54d7-711d-8a94-692379277c23"), "Kinetic Damage", damage / 3, AttributeModifier.Operation.ADDITION)
);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"textures": [
"oreganized:kinetic_damage"
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 4 additions & 3 deletions src/main/resources/oreganized.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
"package": "galena.oreganized.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"AbstractArrowMixin", "BlockMixin", "CrossbowMixin", "DispenserBlockMixin", "FoodDataMixin", "IceBlockMixin",
"MobEffectInstanceMixin", "PillagerMixin", "PlayerMixin"
"AbstractArrowMixin", "BlockMixin", "CrossbowMixin", "DispenserBlockMixin", "EnchantmentHelperMixin",
"FoodDataMixin", "IceBlockMixin", "MobEffectInstanceMixin", "PillagerMixin", "PlayerMixin"
],
"client": [
"client.GuiAccessor", "client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin", "client.HumanoidModelMixin"
"client.GuiAccessor", "client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin",
"client.HumanoidModelMixin"
],
"server": [],
"injectors": {
Expand Down

0 comments on commit 44003b7

Please sign in to comment.