From 254ebca012d36fc575298d4bcf58d2ba198aa985 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 2 Oct 2020 23:32:57 +0300 Subject: [PATCH] Initial hammers --- psd/tool_items.psd | Bin 34511 -> 35539 bytes .../java/ru/betterend/item/EndHammer.java | 89 ++++++++++++++++++ .../mixin/common/PlayerEntityMixin.java | 66 +++++++++++++ .../ru/betterend/registry/ItemRegistry.java | 3 + .../betterend/models/item/iron_hammer.json | 6 ++ .../betterend/textures/item/iron_hammer.png | Bin 0 -> 325 bytes .../resources/betterend.mixins.common.json | 1 + 7 files changed, 165 insertions(+) create mode 100644 src/main/java/ru/betterend/item/EndHammer.java create mode 100644 src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java create mode 100644 src/main/resources/assets/betterend/models/item/iron_hammer.json create mode 100644 src/main/resources/assets/betterend/textures/item/iron_hammer.png diff --git a/psd/tool_items.psd b/psd/tool_items.psd index 30df8a149dd26cd410a7774f5284d6a3f76ea647..915f175e801cc40faa9ce33b597a88f7d80293eb 100644 GIT binary patch delta 2547 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 diff --git a/src/main/java/ru/betterend/item/EndHammer.java b/src/main/java/ru/betterend/item/EndHammer.java new file mode 100644 index 00000000..e67a5622 --- /dev/null +++ b/src/main/java/ru/betterend/item/EndHammer.java @@ -0,0 +1,89 @@ +package ru.betterend.item; + +import java.util.UUID; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.ImmutableMultimap.Builder; + +import io.netty.util.internal.ThreadLocalRandom; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ToolItem; +import net.minecraft.item.ToolMaterial; +import net.minecraft.item.Vanishable; +import net.minecraft.tag.BlockTags; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; + +public class EndHammer extends ToolItem implements Vanishable { + + public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = MathHelper.randomUuid(ThreadLocalRandom.current()); + + private final float attackDamage; + private final Multimap attributeModifiers; + + public EndHammer(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) { + super(material, settings); + + this.attackDamage = attackDamage + material.getAttackDamage(); + Builder builder = ImmutableMultimap.builder(); + builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", this.attackDamage, EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION)); + this.attributeModifiers = builder.build(); + } + + public float getAttackDamage() { + return this.attackDamage; + } + + public boolean canMine(BlockState state, World world, BlockPos pos, PlayerEntity miner) { + return !miner.isCreative() || state.getMaterial().equals(Material.STONE); + } + + public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { + if (state.isOf(Blocks.COBWEB)) { + return 15.0F; + } else { + Material material = state.getMaterial(); + return material != Material.PLANT && material != Material.REPLACEABLE_PLANT && material != Material.UNUSED_PLANT && !state.isIn(BlockTags.LEAVES) && material != Material.GOURD ? 1.0F : 1.5F; + } + } + + public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { + stack.damage(1, attacker, ((entity) -> { + entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); + })); + + return true; + } + + public boolean postMine(ItemStack stack, World world, BlockState state, BlockPos pos, LivingEntity miner) { + if (state.getHardness(world, pos) != 0.0F) { + stack.damage(2, miner, ((entity) -> { + entity.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); + })); + } + + return true; + } + + public boolean isEffectiveOn(BlockState state) { + return state.getMaterial().equals(Material.STONE); + } + + public Multimap getAttributeModifiers(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getAttributeModifiers(slot); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java new file mode 100644 index 00000000..25957ae6 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/PlayerEntityMixin.java @@ -0,0 +1,66 @@ +package ru.betterend.mixin.common; + +import java.util.Collection; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; + +@Mixin(PlayerEntity.class) +public abstract class PlayerEntityMixin extends LivingEntity { + + protected PlayerEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + + @ModifyArg(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;takeKnockback(FDD)V", ordinal = 0)) + private float increaseKnockback(float value, double x, double z) { + PlayerEntity player = (PlayerEntity) (Object) this; + value += this.getKnockback(player.getMainHandStack().getItem()); + return value; + } + + @Inject(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;onAttacking(Lnet/minecraft/entity/Entity;)V", shift = Shift.BEFORE)) + public void attack(Entity target, CallbackInfo cinfo) { + if (target instanceof LivingEntity) { + PlayerEntity player = (PlayerEntity) (Object) this; + int baseKnockback = EnchantmentHelper.getKnockback(player); + if (isSprinting() && getAttackCooldownProgress(0.5F) > 0.9F) { + baseKnockback++; + } + if (baseKnockback == 0) { + Item tool = player.getMainHandStack().getItem(); + LivingEntity livingTarget = (LivingEntity) target; + livingTarget.takeKnockback((float) this.getKnockback(tool), MathHelper.sin(yaw * 0.017453292F), -MathHelper.cos(yaw * 0.017453292F)); + } + } + } + + @Shadow + abstract float getAttackCooldownProgress(float base); + + private double getKnockback(Item tool) { + if (tool == null) return 0.0D; + Collection modifiers = tool.getAttributeModifiers(EquipmentSlot.MAINHAND).get(EntityAttributes.GENERIC_ATTACK_KNOCKBACK); + if (modifiers.size() > 0) { + return modifiers.iterator().next().getValue(); + } + return 0.0D; + } +} diff --git a/src/main/java/ru/betterend/registry/ItemRegistry.java b/src/main/java/ru/betterend/registry/ItemRegistry.java index bfe23815..f6771232 100644 --- a/src/main/java/ru/betterend/registry/ItemRegistry.java +++ b/src/main/java/ru/betterend/registry/ItemRegistry.java @@ -13,12 +13,14 @@ import net.minecraft.item.Items; import net.minecraft.item.ShovelItem; import net.minecraft.item.SwordItem; import net.minecraft.item.ToolItem; +import net.minecraft.item.ToolMaterials; import net.minecraft.tag.Tag; import net.minecraft.util.registry.Registry; import ru.betterend.BetterEnd; import ru.betterend.item.EndArmorMaterial; import ru.betterend.item.EndAxe; +import ru.betterend.item.EndHammer; import ru.betterend.item.EndHoe; import ru.betterend.item.EndPickaxe; import ru.betterend.item.EndToolMaterial; @@ -55,6 +57,7 @@ public class ItemRegistry { public static ToolItem AETERNIUM_PICKAXE = registerTool("aeternium_pickaxe", new EndPickaxe(EndToolMaterial.AETERNIUM, 1, -2.8F, new Item.Settings().group(CreativeTab.END_TAB))); public static ToolItem AETERNIUM_AXE = registerTool("aeternium_axe", new EndAxe(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, new Item.Settings().group(CreativeTab.END_TAB))); public static ToolItem AETERNIUM_HOE = registerTool("aeternium_hoe", new EndHoe(EndToolMaterial.AETERNIUM, -3, 0.0F, new Item.Settings().group(CreativeTab.END_TAB))); + public static ToolItem IRON_HAMMER = registerTool("iron_hammer", new EndHammer(ToolMaterials.IRON, 4.0F, -3.0F, 0.2D, new Item.Settings().group(CreativeTab.END_TAB))); protected static Item registerItem(String name, Item item) { if (item != Items.AIR) { diff --git a/src/main/resources/assets/betterend/models/item/iron_hammer.json b/src/main/resources/assets/betterend/models/item/iron_hammer.json new file mode 100644 index 00000000..f738e323 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/iron_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/iron_hammer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/item/iron_hammer.png b/src/main/resources/assets/betterend/textures/item/iron_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..713b51911e3de2a5072ffc11decda4b1bf6a8d87 GIT binary patch literal 325 zcmV-L0lNN)P)