Jump to content

[1.16.5] Problem with itemTooltipEvent


cwJn

Recommended Posts

I'm having the strangest problem with my item events, and I can't think of a reason why this could be happening. To start, I have the following event.

//this method needs to remove the armour (toughness) and attack damage from items. Also,
    //use the attack damage and armour to convert to extra damage
    @SubscribeEvent(priority = LOWEST)
    public static void removeVanillaAttributes(ItemAttributeModifierEvent event) {
        ItemStack item = event.getItemStack(); //the item
        if (!(GearApi.isGear(item))) {
            double damage = event.removeAttribute(ATTACK_DAMAGE).stream().mapToDouble(AttributeModifier::getAmount).sum(); //the sum of the damage attribute
            double armor = event.removeAttribute(ARMOR).stream().mapToDouble(AttributeModifier::getAmount).sum(); //the sum of the armor attribute
            IDamageTypes typing = item.getCapability(CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY).orElse(null);
            IDamageResistance res = item.getCapability(CapabilityDamageResistance.DAMAGE_RESISTANCE_CAPABILITY).orElse(null);
            if (typing != null) {
                doDamageTypesCalc(damage, item);
            }
            if (res != null) {
                doResistanceCalc(armor, item);
            }
        } else {
            event.removeAttribute(ATTACK_DAMAGE).stream().mapToDouble(AttributeModifier::getAmount).sum(); //the sum of the damage attribute
            event.removeAttribute(ARMOR).stream().mapToDouble(AttributeModifier::getAmount).sum(); //the sum of the armor attribute
            double armor = GearApi.getStat(item, ItemStats.ARMOR);
            double damage = GearApi.getStat(item, ItemStats.MELEE_DAMAGE);
            damage += GearApi.getStat(item, ItemStats.RANGED_DAMAGE);
            IDamageTypes typing = item.getCapability(CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY).orElse(null);
            IDamageResistance res = item.getCapability(CapabilityDamageResistance.DAMAGE_RESISTANCE_CAPABILITY).orElse(null);
            if (typing != null) {
                handleSilentGearTool(item, damage);
            }
            if (res != null) {
                handleSilentGearArmour(item, armor);
            }
        }
        event.removeAttribute(ARMOR_TOUGHNESS); //remove redundant stat
    }

All of the calculation helper methods work the same way, so I'll just use the doDamageTypesCalc as example.

private static void doDamageTypesCalc(double val, ItemStack item) {
        item.getCapability(CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY).ifPresent(c -> {
            //we only want to change the capability if it hasn't been affected yet. This assumes if an item has a damage capability, it isn't all 0.
            if (c.getSlashDamage() == 0 && c.getPunctureDamage() == 0 && c.getImpactDamage() == 0 && c.getFireDamage() == 0 && c.getLightningDamage() == 0 && c.getIceDamage() == 0 && c.getDarkDamage() == 0 && c.getHolyDamage() == 0 && c.getMagicDamage() == 0) {
                System.out.println("recognized damage capability as all 0, updating damage.");
                WeaponItemData data = JSONHandler.getWeaponData(item.getItem().getRegistryName()); // get data from config file
                double[] damageConversions = data.getDmgConversion(); //get item's conversion ratios
                float i = data.getImpactDmg(); //get base damages
                float p = data.getPunctureDmg();
                float s = data.getSlashDmg();
                float f = data.getFireDmg();
                float l = data.getLightningDmg();
                float ic = data.getIceDmg();
                float d = data.getDarkDmg();
                float h = data.getHolyDmg();
                float m = data.getMagicDmg();
                double id, pd, sd, fd, ld, icd, dd, hd, md;
                id = (val * damageConversions[0]) + i; //add them together
                pd = (val * damageConversions[1]) + p;
                sd = (val * damageConversions[2]) + s;
                fd = (val * damageConversions[3]) + f;
                ld = (val * damageConversions[4]) + l;
                icd = (val * damageConversions[5]) + ic;
                dd = (val * damageConversions[6]) + d;
                hd = (val * damageConversions[7]) + h;
                md = (val * damageConversions[8]) + m;
                int sharpnessLevel = EnchantmentHelper.getItemEnchantmentLevel(SHARPNESS, item);
                //System.out.println("sharpness level: " + sharpnessLevel);
                c.setImpactDamage((float) id);
                c.setPunctureDamage((float) pd);
                c.setSlashDamage((float) sd);
                c.setFireDamage((float) fd);
                c.setLightningDamage((float) ld);
                c.setIceDamage((float) icd);
                c.setDarkDamage((float) dd);
                c.setHolyDamage((float) hd);
                c.setMagicDamage((float) md);
            }
        });
    }

In this method, I use a custom capability to update the weapon's "damage typing". (ignore the system print lines, they are used for debugging and will be removed). This method works correctly, which then brings me to my event that adds a tooltip to display these properties.

@SubscribeEvent(priority = LOWEST)
    public static void addExtraDamageTooltip(ItemTooltipEvent event) {

        ItemStack item = event.getItemStack();
        IDamageResistance res = item.getCapability(CapabilityDamageResistance.DAMAGE_RESISTANCE_CAPABILITY).orElse(null);
        IDamageTypes dmg = item.getCapability(CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY).orElse(null);

        if (res != null) {
            //MAKE VARIABLES
            float ir = res.getImpactResistance();
            float pr = res.getPunctureResistance();
            float sr = res.getSlashResistance();
            float fr = res.getFireResistance();
            float lr = res.getLightningResistance();
            float icr = res.getIceResistance();
            float dr = res.getDarkResistance();
            float hr = res.getHolyResistance();
            float mr = res.getMagicResistance();
            IFormattableTextComponent impactText;
            IFormattableTextComponent punctureText;
            IFormattableTextComponent slashText;
            IFormattableTextComponent fireText;
            IFormattableTextComponent lightningText;
            IFormattableTextComponent iceText;
            IFormattableTextComponent darkText;
            IFormattableTextComponent holyText;
            IFormattableTextComponent magicText;
            IFormattableTextComponent resistanceText;
            IFormattableTextComponent irText;
            IFormattableTextComponent prText;
            IFormattableTextComponent srText;
            IFormattableTextComponent frText;
            IFormattableTextComponent lrText;
            IFormattableTextComponent icrText;
            IFormattableTextComponent drText;
            IFormattableTextComponent hrText;
            IFormattableTextComponent mrText;

            resistanceText = new TranslationTextComponent("----------Damage Resistances----------");
            impactText = new TranslationTextComponent("Impact Resistance: ");
            punctureText = new TranslationTextComponent("Puncture Resistance: ");
            slashText = new TranslationTextComponent("Slash Resistance: ");
            fireText = new TranslationTextComponent("Fire Resistance: ");
            lightningText = new TranslationTextComponent("Lightning Resistance: ");
            iceText = new TranslationTextComponent("Ice Resistance: ");
            darkText = new TranslationTextComponent("Dark Resistance: ");
            holyText = new TranslationTextComponent("Divine Resistance: ");
            magicText = new TranslationTextComponent("Magic Resistance: ");
            irText = new TranslationTextComponent(df.format(ir));
            prText = new TranslationTextComponent(df.format(pr));
            srText = new TranslationTextComponent(df.format(sr));
            frText = new TranslationTextComponent(df.format(fr));
            lrText = new TranslationTextComponent(df.format(lr));
            icrText = new TranslationTextComponent(df.format(icr));
            drText = new TranslationTextComponent(df.format(dr));
            hrText = new TranslationTextComponent(df.format(hr));
            mrText = new TranslationTextComponent(df.format(mr));

            event.getToolTip().add(TextUtil.withColor(resistanceText, Color.MAGENTA).withStyle(TextFormatting.BOLD));
            event.getToolTip().add(TextUtil.withColor(impactText, Color.GREEN).append(TextUtil.withColor(irText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(punctureText, Color.GREEN).append(TextUtil.withColor(prText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(slashText, Color.GREEN).append(TextUtil.withColor(srText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(fireText, Color.ORANGERED).append(TextUtil.withColor(frText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(lightningText, Color.YELLOW).append(TextUtil.withColor(lrText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(iceText, Color.LIGHTBLUE).append(TextUtil.withColor(icrText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(darkText, Color.DARKVIOLET).append(TextUtil.withColor(drText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(holyText, Color.FLORALWHITE).append(TextUtil.withColor(hrText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(magicText, Color.CORNFLOWERBLUE).append(TextUtil.withColor(mrText, Color.LIGHTSTEELBLUE)));
        } else if (dmg != null) {

            float id = dmg.getImpactDamage();
            float pd = dmg.getPunctureDamage();
            float sd = dmg.getSlashDamage();
            float fd = dmg.getFireDamage();
            float ld = dmg.getLightningDamage();
            float icd = dmg.getIceDamage();
            float dd = dmg.getDarkDamage();
            float hd = dmg.getHolyDamage();
            float md = dmg.getMagicDamage();
            IFormattableTextComponent impactText;
            IFormattableTextComponent punctureText;
            IFormattableTextComponent slashText;
            IFormattableTextComponent fireText;
            IFormattableTextComponent lightningText;
            IFormattableTextComponent iceText;
            IFormattableTextComponent darkText;
            IFormattableTextComponent holyText;
            IFormattableTextComponent magicText;
            IFormattableTextComponent damageText;
            IFormattableTextComponent idText;
            IFormattableTextComponent pdText;
            IFormattableTextComponent sdText;
            IFormattableTextComponent fdText;
            IFormattableTextComponent ldText;
            IFormattableTextComponent icdText;
            IFormattableTextComponent ddText;
            IFormattableTextComponent hdText;
            IFormattableTextComponent mdText;

            damageText = new TranslationTextComponent("----------Damage Typing----------");
            impactText = new TranslationTextComponent("Impact Damage: ");
            punctureText = new TranslationTextComponent("Puncture Damage: ");
            slashText = new TranslationTextComponent("Slash Damage: ");
            fireText = new TranslationTextComponent("Fire Damage: ");
            lightningText = new TranslationTextComponent("Lightning Damage: ");
            iceText = new TranslationTextComponent("Ice Damage: ");
            darkText = new TranslationTextComponent("Dark Damage: ");
            holyText = new TranslationTextComponent("Divine Damage: ");
            magicText = new TranslationTextComponent("Magic Damage: ");
            idText = new TranslationTextComponent(df.format(id));
            pdText = new TranslationTextComponent(df.format(pd));
            sdText = new TranslationTextComponent(df.format(sd));
            fdText = new TranslationTextComponent(df.format(fd));
            ldText = new TranslationTextComponent(df.format(ld));
            icdText = new TranslationTextComponent(df.format(icd));
            ddText = new TranslationTextComponent(df.format(dd));
            hdText = new TranslationTextComponent(df.format(hd));
            mdText = new TranslationTextComponent(df.format(md));

            event.getToolTip().add(TextUtil.withColor(damageText, Color.MAGENTA).withStyle(TextFormatting.BOLD));
            event.getToolTip().add(TextUtil.withColor(impactText, Color.LIGHTGREEN).append(TextUtil.withColor(idText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(punctureText, Color.LIGHTGREEN).append(TextUtil.withColor(pdText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(slashText, Color.LIGHTGREEN).append(TextUtil.withColor(sdText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(fireText, Color.ORANGERED).append(TextUtil.withColor(fdText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(lightningText, Color.YELLOW).append(TextUtil.withColor(ldText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(iceText, Color.LIGHTBLUE).append(TextUtil.withColor(icdText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(darkText, Color.DARKVIOLET).append(TextUtil.withColor(ddText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(holyText, Color.FLORALWHITE).append(TextUtil.withColor(hdText, Color.LIGHTSTEELBLUE)));
            event.getToolTip().add(TextUtil.withColor(magicText, Color.CORNFLOWERBLUE).append(TextUtil.withColor(mdText, Color.LIGHTSTEELBLUE)));
        }
    }

 

The issue I'm having, is with the if statement check that I have surrounding my doDamageTypesCalc helper method (the one that checks if all those things are == 0). If I remove that if statement, the itemTooltip event starts displaying all 0's. I have no idea what could be causing the issue. I'm not sure if it will help, but these are my DamageType capability classes:

public class CapabilityDamageTypes {

    @CapabilityInject(IDamageTypes.class)
    public static Capability<IDamageTypes> DAMAGE_TYPES_CAPABILITY = null;

    public static void register() {
        CapabilityManager.INSTANCE.register(IDamageTypes.class, new Storage(), new Factory());
    }

    private static class Storage implements Capability.IStorage<IDamageTypes> {

        @Nullable
        @Override
        public INBT writeNBT(Capability<IDamageTypes> capability, IDamageTypes instance, Direction side) {
            CompoundNBT tag = new CompoundNBT();
            tag.putFloat("slash", instance.getSlashDamage());
            tag.putFloat("impact", instance.getImpactDamage());
            tag.putFloat("puncture", instance.getPunctureDamage());
            tag.putFloat("fire", instance.getFireDamage());
            tag.putFloat("lightning", instance.getLightningDamage());
            tag.putFloat("ice", instance.getIceDamage());
            tag.putFloat("dark", instance.getDarkDamage());
            tag.putFloat("holy", instance.getHolyDamage());
            tag.putFloat("magic", instance.getMagicDamage());
            tag.putString("mobDamageType", instance.getMobDamageType());
            return tag;
        }

        @Override
        public void readNBT(Capability<IDamageTypes> capability, IDamageTypes instance, Direction side, INBT nbt) {
            float slash = ((CompoundNBT) nbt).getFloat("slash");
            float impact = ((CompoundNBT) nbt).getFloat("impact");
            float puncture = ((CompoundNBT) nbt).getFloat("puncture");
            float fire = ((CompoundNBT) nbt).getFloat("fire");
            float lightning = ((CompoundNBT) nbt).getFloat("lightning");
            float ice = ((CompoundNBT) nbt).getFloat("ice");
            float dark = ((CompoundNBT) nbt).getFloat("dark");
            float holy = ((CompoundNBT) nbt).getFloat("holy");
            float magic = ((CompoundNBT) nbt).getFloat("magic");
            String mobDamageType = ((CompoundNBT) nbt).getString("mobDamageType");

            instance.setSlashDamage(slash);
            instance.setImpactDamage(impact);
            instance.setPunctureDamage(puncture);
            instance.setFireDamage(fire);
            instance.setLightningDamage(lightning);
            instance.setIceDamage(ice);
            instance.setDarkDamage(dark);
            instance.setHolyDamage(holy);
            instance.setMagicDamage(magic);
            instance.setMobDamageType(mobDamageType);
        }
    }

    private static class Factory implements Callable<IDamageTypes> {

        @Override
        public IDamageTypes call() throws Exception {
            return new DamageTypes(0, 0, 0, 0, 0, 0, 0, 0, 0, "IMPACT");
        }

    }

}
public class DamageTypesProvider implements ICapabilitySerializable<CompoundNBT> {

    private DamageTypes damage;
    private LazyOptional<IDamageTypes> damageOptional;

    public void invalidate() {
        damageOptional.invalidate();
    }

    public DamageTypesProvider(float I, float P, float S, float F, float L, float IC, float D, float H, float M, String mobDamageType) {
        damage = new DamageTypes(I, P, S, F, L, IC, D, H, M, mobDamageType);
        damageOptional = LazyOptional.of(() -> damage);
    }

    @Nonnull
    @Override
    public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
        return cap == CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY ? damageOptional.cast() : LazyOptional.empty();
    }

    @Override
    public CompoundNBT serializeNBT() {
        if (CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY == null) {
            return new CompoundNBT();
        } else {
            return (CompoundNBT) CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY.writeNBT(damage, null);
        }
    }

    @Override
    public void deserializeNBT(CompoundNBT nbt) {
        if (CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY != null) {
            CapabilityDamageTypes.DAMAGE_TYPES_CAPABILITY.readNBT(damage, null, nbt);
        }
    }

}

 

Link to comment
Share on other sites

24 minutes ago, diesieben07 said:

Why are you modifying your capability data in ItemAttributeModifierEvent? This makes no sense. That event should be purely reading data and adding attribute modifiers based upon that data.

This is not how TranslationTextComponent is used. Use StringTextComponent for a hardcoded string. But you should use a language file.

It's because I need to take the original item's attack damage attribute and convert it to data in my capability. So the original attribute needs to be removed, and I also need that data.

Link to comment
Share on other sites

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.