Jump to content

[1.11.2] [SOLVED] Increased attack damage via NBT not working


Recommended Posts

Posted (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 by Daeruin
Marking solved
Posted

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.

nasty-tool-tip.png

Posted (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 by Choonster
  • Like 1

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.

Posted
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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.