Jump to content

cwJn

Members
  • Posts

    24
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

cwJn's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. The pack I made is at the top of the load order and therefore should have top priority over game resources. I've also checked whether or not the file works at all by overriding localizations from my own mod, and that works fine. EDIT: The problem was Archaeology API. I took a look at their source code and for some reason they include the entire minecraft lang file in their resources. I still have no idea why I can't override it, but at this point I'm too burnt out to care.
  2. I had already tried what you recommended on this post and it didn't work. I tried to use a resource pack instead which afaik should be able to override vanilla assets but for some reason can't in my case.
  3. I am using a resource pack to override a few names of attributes and items from vanilla Minecraft. The pack is correctly formatted and loads fine, and even other lines of text in the same file work properly. The resourcepack is at the top of the loadorder for resourcepacks, which, as far as I know, means it has highest priority in terms of overrides. My game is set on the correct language, that being American english. Does anyone know what the problem could be? Below is a screenshot of the pack file structure, and below that is the contents of en_us.json. Thanks! https://gyazo.com/ad37cf5601c5429f6df4506620488784 { "attribute.name.generic.attack_damage": "Physical Damage", "attribute.name.generic.armor": "Physical Defence", "attribute.name.generic.armor_toughness": "Weight", "effect.minecraft.fire_resistance": "Flame Immunity", "item.minecraft.tipped_arrow.effect.fire_resistance": "Arrow of Flame Immunity", "item.minecraft.potion.effect.fire_resistance": "Potion of Flame Immunity", "item.minecraft.splash_potion.effect.fire_resistance": "Splash Potion of Flame Immunity", "item.minecraft.lingering_potion.effect.fire_resistance": "Lingering Potion of Flame Immunity" }
  4. In my mod, I make a few overrides to Minecraft's vanilla localizations by adding the following file resources/assets/minecraft/lang/en_us.json { "attribute.name.generic.attack_damage": "Physical Damage", "attribute.name.generic.armor": "Physical Defence", "attribute.name.generic.armor_toughness": "Weight", "effect.minecraft.fire_resistance": "Flame Immunity", "item.minecraft.tipped_arrow.effect.fire_resistance": "Arrow of Flame Immunity", "item.minecraft.potion.effect.fire_resistance": "Potion of Flame Immunity", "item.minecraft.splash_potion.effect.fire_resistance": "Splash Potion of Flame Immunity", "item.minecraft.lingering_potion.effect.fire_resistance": "Lingering Potion of Flame Immunity" } This works as intended in my IDE, but when using the mod in a CurseForge modpack the localizations aren't overriden. Does anyone know why this may be the case?
  5. This makes sense. I'm just confused as to why they use separate UUIDs for attack damage and attack speed. Shouldn't it work as intended if they use the same UUID, since attack damage and attack speed are different stats?
  6. Working with attribute modifiers, but the explanation given on the wiki doesn't seem to match up with how they work in the base game. On the wiki, they state that every attribute modifier must have a different UUID to correctly be applied to the player. In the base game, however, each armour piece (head, chest, legs, feet) seems to have a UUID which it uses for armour, armour toughness, AND knockback resistance. These attribute modifiers have the same UUID, but different name strings and different attributes they are modifying. On the other hand, DiggerItem and SwordItem use different UUIDs for attack damage and attack speed, different name strings, and also obviously have different attributes. Can anyone provide clarification on how the UUIDs of attribute modifiers work?
  7. Why? Do you know a better way of doing it?
  8. 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.
  9. 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); } } }
  10. This is the capability inject and provider for one of my capabilities. All of them are coded the exact same way. 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"); } } } package com.cwjn.hardstuckintegration.Capabilities.DamageTypes; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.LazyOptional; import javax.annotation.Nonnull; import javax.annotation.Nullable; public class DamageTypesProvider implements ICapabilitySerializable<CompoundNBT> { //private final DamageTypes damage = new DamageTypes(); //private final LazyOptional<IDamageTypes> damageOptional = LazyOptional.of(() -> damage); 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); } } }
  11. @SubscribeEvent public static void ItemHandler(AttachCapabilitiesEvent<ItemStack> event) { ItemStack item = event.getObject(); if (GearApi.isGear(item)) { SGearTraitHelperProvider provider = new SGearTraitHelperProvider(); event.addCapability(TRAIT_HELPER_KEY, provider); event.addListener(provider::invalidate); } if (isArmour(item) || item.getItem() instanceof ICoreArmor) { DamageResistanceProvider provider = new DamageResistanceProvider(0, 0, 0, 0, 0, 0, 0, 0, 0); event.addCapability(RES_KEY, provider); event.addListener(provider::invalidate); } else if (isWeapon(item) || item.getItem() instanceof ICoreTool) { DamageTypesProvider provider = new DamageTypesProvider(0, 0, 0, 0, 0, 0, 0, 0, 0, "IMPACT"); event.addCapability(DMG_KEY, provider); event.addListener(provider::invalidate); } }
  12. So I thought that when a capability is attached to an item/entity/etc... the capability will stay until whatever it's attached to is gone. But this doesn't seem to be the case, as when I printed to console whenever a capability is attached, it seems as though a new version of the capability is attached to an item every time I select it in my hotbar, hover over it in inventory, etc. Is this how it's supposed to work? If so, why?
  13. Hi, as the title says, I need to overwrite another mod's data/resources. I tried just adding files of the same directory and name, but they don't overwrite and are just ignored. Is this something to do with load order or do I need to make a separate datapack for this to work?
  14. I have to use events for this because I have to operate on every single item in the game. This is the code I'm worried about. I can't think of a better way to do this though. @Mod.EventBusSubscriber(modid = HardstuckIntegration.modID) public class ItemEvents { private static DecimalFormat df = new DecimalFormat("#.##"); //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 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 if (armor > 0) { //make sure there is actually armor to convert doResistanceCalc(armor, item); //attach capabilities to the item by converting its base stats and taking the config into account } if (damage > 0) { //make sure there is actually damage to convert doDamageTypesCalc(damage, item); //attach capabilities to the item by converting its base stats and taking the config into account } event.removeAttribute(ARMOR_TOUGHNESS); //remove redundant stat } private static void doResistanceCalc(double val, ItemStack item) { item.getCapability(CapabilityDamageResistance.DAMAGE_RESISTANCE_CAPABILITY).ifPresent(c -> { //we only want to change the capability if it hasn't been affected yet. This assumes if an item has a resistance capability, it isn't all 0. if (c.getImpactResistance() == 0 && c.getPunctureResistance() == 0 && c.getSlashResistance() == 0 && c.getFireResistance() == 0 && c.getLightningResistance() == 0 && c.getIceResistance() == 0) { ArmourItemData data = JSONHandler.getArmourData(item.getItem().getRegistryName()); // get the data from config file double[] resistanceConversions = data.getResConversion(); //get item's conversion ratios float i = data.getImpactRes(); // get item's base resistances float p = data.getPunctureRes(); float s = data.getSlashRes(); float f = data.getFireRes(); float l = data.getLightningRes(); float ic = data.getIceRes(); double IRes, PRes, SRes, FRes, LRes, ICRes; IRes = (val * resistanceConversions[0]) + i; //add them together. PRes = (val * resistanceConversions[1]) + p; SRes = (val * resistanceConversions[2]) + s; FRes = (val * resistanceConversions[3]) + f; LRes = (val * resistanceConversions[4]) + l; ICRes = (val * resistanceConversions[5]) + ic; c.setImpactResistance((float) IRes); c.setPunctureResistance((float) PRes); c.setSlashResistance((float) SRes); c.setFireResistance((float) FRes); c.setLightningResistance((float) LRes); c.setIceResistance((float) ICRes); } }); } 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) { 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(); double id, pd, sd, fd, ld, icd; 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; c.setImpactDamage((float) id); c.setPunctureDamage((float) pd); c.setSlashDamage((float) sd); c.setFireDamage((float) fd); c.setLightningDamage((float) ld); c.setIceDamage((float) icd); } }); } @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(); IFormattableTextComponent impactText; IFormattableTextComponent punctureText; IFormattableTextComponent slashText; IFormattableTextComponent fireText; IFormattableTextComponent lightningText; IFormattableTextComponent iceText; IFormattableTextComponent resistanceText; IFormattableTextComponent irText; IFormattableTextComponent prText; IFormattableTextComponent srText; IFormattableTextComponent frText; IFormattableTextComponent lrText; IFormattableTextComponent icrText; 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: "); 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)); event.getToolTip().add(TextUtil.withColor(resistanceText, Color.MEDIUMPURPLE).withStyle(TextFormatting.BOLD)); event.getToolTip().add(TextUtil.withColor(impactText, Color.LIGHTGREEN).append(TextUtil.withColor(irText, Color.LIGHTSTEELBLUE))); event.getToolTip().add(TextUtil.withColor(punctureText, Color.LIGHTGREEN).append(TextUtil.withColor(prText, Color.LIGHTSTEELBLUE))); event.getToolTip().add(TextUtil.withColor(slashText, Color.LIGHTGREEN).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))); } if (dmg != null) { double attackSpeedMainhand = item.getItem().getDefaultInstance().getAttributeModifiers(EquipmentSlotType.MAINHAND).get(ATTACK_SPEED).stream().mapToDouble(AttributeModifier::getAmount).sum(); double attackSpeedOffhand = item.getItem().getDefaultInstance().getAttributeModifiers(EquipmentSlotType.OFFHAND).get(ATTACK_SPEED).stream().mapToDouble(AttributeModifier::getAmount).sum(); float id = dmg.getImpactDamage(); float pd = dmg.getPunctureDamage(); float sd = dmg.getSlashDamage(); float fd = dmg.getFireDamage(); float ld = dmg.getLightningDamage(); float icd = dmg.getIceDamage(); IFormattableTextComponent impactText; IFormattableTextComponent punctureText; IFormattableTextComponent slashText; IFormattableTextComponent fireText; IFormattableTextComponent lightningText; IFormattableTextComponent iceText; IFormattableTextComponent damageText; IFormattableTextComponent idText; IFormattableTextComponent pdText; IFormattableTextComponent sdText; IFormattableTextComponent fdText; IFormattableTextComponent ldText; IFormattableTextComponent icdText; 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: "); 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)); event.getToolTip().add(TextUtil.withColor(damageText, Color.MEDIUMPURPLE).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))); } } }
  15. So in my mod I'm attaching a capability to any item which is an armour piece, weapon, or entity. To test my code, I made printed messages to console whenever the event fired. I noticed that these events would be firing multiple times per entity/item being affected. Is this something I need to worry about? I'm not very familiar with the intricacies of how capabilities work. On an unrelated note, I'm getting slightly worried about how my mod will cause the game to lag. I have methods that hook into the ItemAttributeModifier and ItemTooltip events, and use my capabilities to operate on the item's attributes and provide a custom tooltip. I'm not iterating through lists or anything, but it seems as though these events fire every tick the player has the item equipped. While this doesn't lag me in my dev environment, will this have larger ramifications when playing on servers with 4 - 8 players?
×
×
  • Create New...

Important Information

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