From 6b31f163fd02d81a5774c86d9bb2dbf20b14d6db Mon Sep 17 00:00:00 2001 From: Niklas Widmann Date: Tue, 17 Sep 2024 15:08:15 +0200 Subject: [PATCH] implement kinetic damage for electrum tools --- .../86c4ba3fec62c329e6b7e74d87569e08181a0d37 | 3 +- .../assets/oreganized/lang/en_us.json | 1 + .../tags/items/has_kinetic_damage.json | 11 ++++ .../java/galena/oreganized/Oreganized.java | 2 + .../galena/oreganized/data/OItemTags.java | 10 ++++ .../java/galena/oreganized/data/OLang.java | 2 + .../galena/oreganized/index/OAttributes.java | 22 ++++++++ .../galena/oreganized/index/OItemTiers.java | 20 +------ .../java/galena/oreganized/index/OItems.java | 10 ++-- .../oreganized/index/OParticleTypes.java | 3 + .../java/galena/oreganized/index/OTags.java | 2 + .../mixin/EnchantmentHelperMixin.java | 20 +++++++ .../oreganized/network/OreganizedNetwork.java | 2 + .../network/packet/KineticHitPacket.java | 36 ++++++++++++ .../oreganized/world/KineticDamage.java | 52 ++++++++++++++++++ .../oreganized/world/event/PlayerEvents.java | 29 ++++++++++ .../oreganized/particles/kinetic_hit.json | 5 ++ .../textures/particle/kinetic_damage.png | Bin 0 -> 196 bytes src/main/resources/oreganized.mixins.json | 7 ++- 19 files changed, 209 insertions(+), 28 deletions(-) create mode 100644 src/generated/resources/data/oreganized/tags/items/has_kinetic_damage.json create mode 100644 src/main/java/galena/oreganized/index/OAttributes.java create mode 100644 src/main/java/galena/oreganized/mixin/EnchantmentHelperMixin.java create mode 100644 src/main/java/galena/oreganized/network/packet/KineticHitPacket.java create mode 100644 src/main/java/galena/oreganized/world/KineticDamage.java create mode 100644 src/main/resources/assets/oreganized/particles/kinetic_hit.json create mode 100644 src/main/resources/assets/oreganized/textures/particle/kinetic_damage.png diff --git a/src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37 b/src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37 index 6d8ddfd0..b711f76a 100644 --- a/src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37 +++ b/src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37 @@ -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 @@ -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 diff --git a/src/generated/resources/assets/oreganized/lang/en_us.json b/src/generated/resources/assets/oreganized/lang/en_us.json index 6b63e70c..ee9aa7bf 100644 --- a/src/generated/resources/assets/oreganized/lang/en_us.json +++ b/src/generated/resources/assets/oreganized/lang/en_us.json @@ -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", diff --git a/src/generated/resources/data/oreganized/tags/items/has_kinetic_damage.json b/src/generated/resources/data/oreganized/tags/items/has_kinetic_damage.json new file mode 100644 index 00000000..deb410f8 --- /dev/null +++ b/src/generated/resources/data/oreganized/tags/items/has_kinetic_damage.json @@ -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" + ] +} \ No newline at end of file diff --git a/src/main/java/galena/oreganized/Oreganized.java b/src/main/java/galena/oreganized/Oreganized.java index 7d7a8d09..2a33b65f 100644 --- a/src/main/java/galena/oreganized/Oreganized.java +++ b/src/main/java/galena/oreganized/Oreganized.java @@ -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; @@ -138,6 +139,7 @@ public Oreganized() { OStructures.STRUCTURES, OFeatures.FEATURES, OPaintingVariants.PAINTING_VARIANTS, + OAttributes.ATTRIBUTES, LOOT_MODIFIERS, }; diff --git a/src/main/java/galena/oreganized/data/OItemTags.java b/src/main/java/galena/oreganized/data/OItemTags.java index 54d757b8..86741ca1 100644 --- a/src/main/java/galena/oreganized/data/OItemTags.java +++ b/src/main/java/galena/oreganized/data/OItemTags.java @@ -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); } } diff --git a/src/main/java/galena/oreganized/data/OLang.java b/src/main/java/galena/oreganized/data/OLang.java index a7a63f43..f0935e6d 100644 --- a/src/main/java/galena/oreganized/data/OLang.java +++ b/src/main/java/galena/oreganized/data/OLang.java @@ -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. diff --git a/src/main/java/galena/oreganized/index/OAttributes.java b/src/main/java/galena/oreganized/index/OAttributes.java new file mode 100644 index 00000000..fa271d7d --- /dev/null +++ b/src/main/java/galena/oreganized/index/OAttributes.java @@ -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 ATTRIBUTES = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, Oreganized.MOD_ID); + + public static final RegistryObject KINETIC_DAMAGE = register("kinetic_damage", 0.0, 0.0, 30.0); + + private static RegistryObject 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)); + } + +} diff --git a/src/main/java/galena/oreganized/index/OItemTiers.java b/src/main/java/galena/oreganized/index/OItemTiers.java index a3b6105a..9bde8a9b 100644 --- a/src/main/java/galena/oreganized/index/OItemTiers.java +++ b/src/main/java/galena/oreganized/index/OItemTiers.java @@ -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; diff --git a/src/main/java/galena/oreganized/index/OItems.java b/src/main/java/galena/oreganized/index/OItems.java index 0e1f2f1d..88b3ccc7 100644 --- a/src/main/java/galena/oreganized/index/OItems.java +++ b/src/main/java/galena/oreganized/index/OItems.java @@ -63,11 +63,11 @@ public static Supplier compat(String modid, Function BUSH_HAMMER = HELPER.createItem("bush_hammer", () -> new BushHammerItem(OItemTiers.LEAD, 2.5F, -2.8F, (new Item.Properties()).stacksTo(1))); public static final RegistryObject SCRIBE = HELPER.createItem("scribe", () -> new ScribeItem(new Item.Properties().durability(250))); - public static final RegistryObject ELECTRUM_SWORD = HELPER.createItem("electrum_sword", () -> new SwordItem(OItemTiers.ELECTRUM, 3, -2.2F, (new Item.Properties()))); - public static final RegistryObject ELECTRUM_SHOVEL = HELPER.createItem("electrum_shovel", () -> new ShovelItem(OItemTiers.ELECTRUM, 1.5F, -2.8F, (new Item.Properties()))); - public static final RegistryObject ELECTRUM_PICKAXE = HELPER.createItem("electrum_pickaxe", () -> new PickaxeItem(OItemTiers.ELECTRUM, 1, -2.6F, (new Item.Properties()))); - public static final RegistryObject ELECTRUM_AXE = HELPER.createItem("electrum_axe", () -> new AxeItem(OItemTiers.ELECTRUM, 6.0F, -2.8F, (new Item.Properties()))); - public static final RegistryObject ELECTRUM_HOE = HELPER.createItem("electrum_hoe", () -> new HoeItem(OItemTiers.ELECTRUM, 0, -2.8F, (new Item.Properties()))); + public static final RegistryObject ELECTRUM_SWORD = HELPER.createItem("electrum_sword", () -> new SwordItem(OItemTiers.ELECTRUM, 3, -2.4F, (new Item.Properties()))); + public static final RegistryObject ELECTRUM_SHOVEL = HELPER.createItem("electrum_shovel", () -> new ShovelItem(OItemTiers.ELECTRUM, 1.5F, -3.0F, (new Item.Properties()))); + public static final RegistryObject ELECTRUM_PICKAXE = HELPER.createItem("electrum_pickaxe", () -> new PickaxeItem(OItemTiers.ELECTRUM, 1, -2.8F, (new Item.Properties()))); + public static final RegistryObject ELECTRUM_AXE = HELPER.createItem("electrum_axe", () -> new AxeItem(OItemTiers.ELECTRUM, 5.0F, -3.0F, (new Item.Properties()))); + public static final RegistryObject ELECTRUM_HOE = HELPER.createItem("electrum_hoe", () -> new HoeItem(OItemTiers.ELECTRUM, -3, 0.0F, (new Item.Properties()))); public static final RegistryObject ELECTRUM_KNIFE = HELPER.createItem("electrum_knife", compat(FARMERS_DELIGHT_ID, it -> FarmersDelightCompat.KNIFE_FACTORY.apply(it), new Item.Properties())); public static final RegistryObject ELECTRUM_SHIELD = HELPER.createItem("electrum_shield", () -> new ShieldItem(new Item.Properties().durability(363))); diff --git a/src/main/java/galena/oreganized/index/OParticleTypes.java b/src/main/java/galena/oreganized/index/OParticleTypes.java index 7aed2f35..ffcdfe89 100644 --- a/src/main/java/galena/oreganized/index/OParticleTypes.java +++ b/src/main/java/galena/oreganized/index/OParticleTypes.java @@ -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; @@ -26,6 +27,7 @@ public class OParticleTypes { public static final RegistryObject LANDING_LEAD = PARTICLES.register("landing_lead", () -> new SimpleParticleType(true)); public static final RegistryObject LEAD_SHRAPNEL = PARTICLES.register( "lead_shrapnel", () -> new SimpleParticleType(true)); public static final RegistryObject VENGEANCE = PARTICLES.register( "vengeance", () -> new SimpleParticleType(true)); + public static final RegistryObject KINETIC_HIT = PARTICLES.register( "kinetic_hit", () -> new SimpleParticleType(true)); @SubscribeEvent @@ -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); } } diff --git a/src/main/java/galena/oreganized/index/OTags.java b/src/main/java/galena/oreganized/index/OTags.java index f076b5a3..ef046755 100644 --- a/src/main/java/galena/oreganized/index/OTags.java +++ b/src/main/java/galena/oreganized/index/OTags.java @@ -54,6 +54,8 @@ public static class Items { public static final TagKey SHIELDS_SE = ItemTags.create(new ResourceLocation(SHIELD_EXPANSION_ID, "shields")); public static final TagKey MACHETES = ItemTags.create(new ResourceLocation(NETHERS_DELIGHT_ID, "tools/machetes")); + public static final TagKey HAS_KINETIC_DAMAGE = tag( "has_kinetic_damage"); + public static final TagKey GARGOYLE_SNACK = tag("gargoyle_snack"); private static TagKey tag(String name) { diff --git a/src/main/java/galena/oreganized/mixin/EnchantmentHelperMixin.java b/src/main/java/galena/oreganized/mixin/EnchantmentHelperMixin.java new file mode 100644 index 00000000..cff01c84 --- /dev/null +++ b/src/main/java/galena/oreganized/mixin/EnchantmentHelperMixin.java @@ -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); + } + +} diff --git a/src/main/java/galena/oreganized/network/OreganizedNetwork.java b/src/main/java/galena/oreganized/network/OreganizedNetwork.java index 065e0ba6..b7a2af1a 100644 --- a/src/main/java/galena/oreganized/network/OreganizedNetwork.java +++ b/src/main/java/galena/oreganized/network/OreganizedNetwork.java @@ -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; @@ -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); } } diff --git a/src/main/java/galena/oreganized/network/packet/KineticHitPacket.java b/src/main/java/galena/oreganized/network/packet/KineticHitPacket.java new file mode 100644 index 00000000..3f20ab27 --- /dev/null +++ b/src/main/java/galena/oreganized/network/packet/KineticHitPacket.java @@ -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 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); + } + +} diff --git a/src/main/java/galena/oreganized/world/KineticDamage.java b/src/main/java/galena/oreganized/world/KineticDamage.java new file mode 100644 index 00000000..391da66d --- /dev/null +++ b/src/main/java/galena/oreganized/world/KineticDamage.java @@ -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 + ); + } + } + +} diff --git a/src/main/java/galena/oreganized/world/event/PlayerEvents.java b/src/main/java/galena/oreganized/world/event/PlayerEvents.java index 36c354cd..ad11b94a 100644 --- a/src/main/java/galena/oreganized/world/event/PlayerEvents.java +++ b/src/main/java/galena/oreganized/world/event/PlayerEvents.java @@ -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; @@ -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 { @@ -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) + ); + } + } + } diff --git a/src/main/resources/assets/oreganized/particles/kinetic_hit.json b/src/main/resources/assets/oreganized/particles/kinetic_hit.json new file mode 100644 index 00000000..1283a46f --- /dev/null +++ b/src/main/resources/assets/oreganized/particles/kinetic_hit.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "oreganized:kinetic_damage" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/oreganized/textures/particle/kinetic_damage.png b/src/main/resources/assets/oreganized/textures/particle/kinetic_damage.png new file mode 100644 index 0000000000000000000000000000000000000000..51da3e581dd6c2011b56344950ff60cd7e2068f7 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`212l#}z{{8*#XuH$Z^~pcpEd`3PDc&y!QmiFGe!>5NfZ_KxzF?pLXMsm# zF#`kNArNL1)$nQn3hH{gIEF}s%XW2gG8hOPs@e4a%vSX-K@ltczDM>+{ej_Sg1wh( h7u;t5V>jagqtI%G<*%!FRsl6Kc)I$ztaD0e0su>JJ_!H- literal 0 HcmV?d00001 diff --git a/src/main/resources/oreganized.mixins.json b/src/main/resources/oreganized.mixins.json index 40acdac0..fbe7f2a2 100644 --- a/src/main/resources/oreganized.mixins.json +++ b/src/main/resources/oreganized.mixins.json @@ -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": {