Posted September 23, 20178 yr I have implemented a custom recipe class that adds NBT data to the crafting output's ItemStack. It's just an integer that I want to use to increase the player's attack damage when using the tool. In my custom tool class, I have overridden Forge's ItemStack-sensitive version of getAttributeModifiers to look at the ItemStack's NBT data. I've also created a custom tool tip for the item, and I can see in my custom tool tip that the NBT data is there. But the player's attack damage is not changing when holding the item. What am I missing? Code for the custom tool: Spoiler public class PrimalToolAxe extends ItemTool { protected String registryName; private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(new Block[] { Blocks.PLANKS, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.LIT_PUMPKIN, Blocks.MELON_BLOCK, Blocks.LADDER, Blocks.WOODEN_BUTTON, Blocks.WOODEN_PRESSURE_PLATE }); public PrimalToolAxe(String registryName, ToolMaterial material) { super(material, EFFECTIVE_ON); this.registryName = registryName; this.setRegistryName(registryName); this.setUnlocalizedName(getRegistryName().toString()); this.setCreativeTab(PrimalCreativeTabs.tabPrimalcraft); this.damageVsEntity = 1.0F + material.getDamageVsEntity(); } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean isAdvanced) { String s = "Damage: +" + getActualDamage(stack); tooltip.add(s); } @Override public Multimap<String, AttributeModifier> getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { Multimap<String, AttributeModifier> multimap = super.getItemAttributeModifiers(equipmentSlot); if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", (double) getActualDamage(stack), 0)); multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4000000953674316D, 0)); } return multimap; } private int getActualDamage(ItemStack stack) { int damage = (int) this.damageVsEntity; if (stack.hasTagCompound() && stack.getTagCompound().hasKey("damageIncrease")) { damage += stack.getTagCompound().getInteger("damageIncrease"); } return damage; } } Edited September 27, 20178 yr by Daeruin Marking solved
September 26, 20178 yr Author I must have read in a dozen different places that you should override Item#getAttributeModifiers (particularly Forge's ItemStack-sensitive version of it) in order to set a custom attack modifier on a tool, similar to how ItemSword does it. Yet it isn't working for me. getAttributeModifers gets called when displaying the tool tip, but not when it comes to actually applying damage. I finally found this nice method from Choonster that does work, however it results in this big nasty tool tip (see attachment) that I think comes from ItemStack#getToolTip. My item is a weapon that has to be held in your main hand to attack with, so this tool tip doesn't make sense. I was hoping someone would have a quick answer for how I control this tool tip.
September 26, 20178 yr On 23/09/2017 at 4:40 PM, Daeruin said: I have implemented a custom recipe class that adds NBT data to the crafting output's ItemStack. It's just an integer that I want to use to increase the player's attack damage when using the tool. In my custom tool class, I have overridden Forge's ItemStack-sensitive version of getAttributeModifiers to look at the ItemStack's NBT data. I've also created a custom tool tip for the item, and I can see in my custom tool tip that the NBT data is there. But the player's attack damage is not changing when holding the item. What am I missing? If you set a breakpoint in the method, is it called when you equip/unequip the tool? By calling super.getItemAttributeModifiers, you're creating a Multimap that already has AttributeModifiers with the ATTACK_DAMAGE_MODIFIER/ATTACK_SPEED_MODIFIER UUIDs. You then add your own AttributeModifiers with these UUIDs, which could be the cause of your issue. Try creating an empty Multimap instead. 5 hours ago, Daeruin said: I finally found this nice method from Choonster that does work, however it results in this big nasty tool tip (see attachment) that I think comes from ItemStack#getToolTip. My item is a weapon that has to be held in your main hand to attack with, so this tool tip doesn't make sense. I was hoping someone would have a quick answer for how I control this tool tip. That code is from 1.8, before dual-wielding was added along with slot-specific AttributeModifiers and the attack speed attribute. You can see the 1.12.2 version of that code here. Edited September 26, 20178 yr by Choonster Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
September 27, 20178 yr Author 15 hours ago, Choonster said: By calling super.getItemAttributeModifiers, you're creating a Multimap that already has AttributeModifiers with the ATTACK_DAMAGE_MODIFIER/ATTACK_SPEED_MODIFIER UUIDs. You then add your own AttributeModifiers with these UUIDs, which could be the cause of your issue. Try creating an empty Multimap instead. That was it. I really appreciate your help, especially since nobody else seemed inclined to reply. Updated getAttributeModifiers method: Spoiler @Override public Multimap<String, AttributeModifier> getAttributeModifiers(EntityEquipmentSlot equipmentSlot, ItemStack stack) { Multimap<String, AttributeModifier> multimap = HashMultimap.<String, AttributeModifier>create(); if (equipmentSlot == EntityEquipmentSlot.MAINHAND) { multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", (double) getActualDamage(stack), 0)); multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4000000953674316D, 0)); } return multimap; }
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.