Daeruin Posted September 23, 2017 Posted September 23, 2017 (edited) 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, 2017 by Daeruin Marking solved Quote
Daeruin Posted September 26, 2017 Author Posted September 26, 2017 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. Quote
Choonster Posted September 26, 2017 Posted September 26, 2017 (edited) 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, 2017 by Choonster 1 Quote 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.
Daeruin Posted September 27, 2017 Author Posted September 27, 2017 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; } Quote
Recommended Posts
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.