mirror of
https://github.com/GTNewHorizons/TinkersConstruct.git
synced 2026-10-25 20:32:32 +00:00
Fix durability wrapping to 1/1 on maxed-out tools (#340)
This commit is contained in:
1 parent
638eb36f00
commit
52f603e4a1
6 files changed
+25
-14
No files matched your search
@@ -23,6 +23,11 @@ import tconstruct.library.util.IToolPart;
|
|||||||
|
|
||||||
public class ToolBuilder {
|
public class ToolBuilder {
|
||||||
|
|
||||||
|
/** Caps a durability value to what the int NBT tag can hold, instead of letting it wrap around. */
|
||||||
|
public static int clampDurability(long durability) {
|
||||||
|
return (int) Math.max(Integer.MIN_VALUE, Math.min(Integer.MAX_VALUE, durability));
|
||||||
|
}
|
||||||
|
|
||||||
public static ToolBuilder instance = new ToolBuilder();
|
public static ToolBuilder instance = new ToolBuilder();
|
||||||
|
|
||||||
public HashMap<String, ToolRecipe> recipeList = new HashMap<>();
|
public HashMap<String, ToolRecipe> recipeList = new HashMap<>();
|
||||||
@@ -170,7 +175,8 @@ public class ToolBuilder {
|
|||||||
|
|
||||||
if (extra != -1) extraMat = TConstructRegistry.getMaterial(extra);
|
if (extra != -1) extraMat = TConstructRegistry.getMaterial(extra);
|
||||||
|
|
||||||
int durability = headMat.durability();
|
// long: the head durabilities summed below can exceed Integer.MAX_VALUE
|
||||||
|
long durability = headMat.durability();
|
||||||
int heads = 1;
|
int heads = 1;
|
||||||
int handles = 0;
|
int handles = 0;
|
||||||
float modifier = 1f;
|
float modifier = 1f;
|
||||||
@@ -212,7 +218,7 @@ public class ToolBuilder {
|
|||||||
modifier /= handles;
|
modifier /= handles;
|
||||||
}
|
}
|
||||||
|
|
||||||
durability = (int) (durability / heads * (0.5 + heads * 0.5) * modifier * item.getDurabilityModifier());
|
durability = (long) (durability / heads * (0.5 + heads * 0.5) * modifier * item.getDurabilityModifier());
|
||||||
attack = attack / heads + item.getDamageVsEntity(null);
|
attack = attack / heads + item.getDamageVsEntity(null);
|
||||||
if (attack % heads != 0) attack++;
|
if (attack % heads != 0) attack++;
|
||||||
|
|
||||||
@@ -236,8 +242,8 @@ public class ToolBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compound.getCompoundTag("InfiTool").setInteger("Damage", 0); // Damage is damage to the tool
|
compound.getCompoundTag("InfiTool").setInteger("Damage", 0); // Damage is damage to the tool
|
||||||
compound.getCompoundTag("InfiTool").setInteger("TotalDurability", durability);
|
compound.getCompoundTag("InfiTool").setInteger("TotalDurability", clampDurability(durability));
|
||||||
compound.getCompoundTag("InfiTool").setInteger("BaseDurability", durability);
|
compound.getCompoundTag("InfiTool").setInteger("BaseDurability", clampDurability(durability));
|
||||||
compound.getCompoundTag("InfiTool").setInteger("BonusDurability", 0); // Modifier
|
compound.getCompoundTag("InfiTool").setInteger("BonusDurability", 0); // Modifier
|
||||||
compound.getCompoundTag("InfiTool").setFloat("ModDurability", 0f); // Modifier
|
compound.getCompoundTag("InfiTool").setFloat("ModDurability", 0f); // Modifier
|
||||||
compound.getCompoundTag("InfiTool").setBoolean("Broken", false);
|
compound.getCompoundTag("InfiTool").setBoolean("Broken", false);
|
||||||
|
|||||||
@@ -376,7 +376,8 @@ public class AbilityHelper {
|
|||||||
if (damagedTool) return;
|
if (damagedTool) return;
|
||||||
|
|
||||||
int damage = tags.getCompoundTag("InfiTool").getInteger("Damage");
|
int damage = tags.getCompoundTag("InfiTool").getInteger("Damage");
|
||||||
int damageTrue = damage + dam;
|
// long: on a tool near max durability, damage + dam can exceed Integer.MAX_VALUE
|
||||||
|
long damageTrue = (long) damage + dam;
|
||||||
int maxDamage = tags.getCompoundTag("InfiTool").getInteger("TotalDurability");
|
int maxDamage = tags.getCompoundTag("InfiTool").getInteger("TotalDurability");
|
||||||
if (damageTrue <= 0) {
|
if (damageTrue <= 0) {
|
||||||
tags.getCompoundTag("InfiTool").setInteger("Damage", 0);
|
tags.getCompoundTag("InfiTool").setInteger("Damage", 0);
|
||||||
@@ -384,7 +385,7 @@ public class AbilityHelper {
|
|||||||
} else if (damageTrue > maxDamage) {
|
} else if (damageTrue > maxDamage) {
|
||||||
breakTool(stack, tags, entity);
|
breakTool(stack, tags, entity);
|
||||||
} else {
|
} else {
|
||||||
tags.getCompoundTag("InfiTool").setInteger("Damage", damage + dam);
|
tags.getCompoundTag("InfiTool").setInteger("Damage", (int) damageTrue);
|
||||||
int toolDamage = (damage * 100 / maxDamage) + 1;
|
int toolDamage = (damage * 100 / maxDamage) + 1;
|
||||||
int stackDamage = stack.getItemDamage();
|
int stackDamage = stack.getItemDamage();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -691,7 +691,7 @@ public abstract class ToolCore extends Item implements IEnergyContainerItem, IEq
|
|||||||
int energy = tags.getInteger("Energy");
|
int energy = tags.getInteger("Energy");
|
||||||
int max = getMaxEnergyStored(stack);
|
int max = getMaxEnergyStored(stack);
|
||||||
if (energy > 0) {
|
if (energy > 0) {
|
||||||
int damage = ((max - energy) * 100) / max;
|
int damage = (int) (((long) max - energy) * 100 / max);
|
||||||
if (damage == 0 && max - energy > 0) damage = 1;
|
if (damage == 0 && max - energy > 0) damage = 1;
|
||||||
super.setDamage(stack, damage);
|
super.setDamage(stack, damage);
|
||||||
return damage;
|
return damage;
|
||||||
@@ -700,7 +700,8 @@ public abstract class ToolCore extends Item implements IEnergyContainerItem, IEq
|
|||||||
int dur = tags.getCompoundTag("InfiTool").getInteger("Damage");
|
int dur = tags.getCompoundTag("InfiTool").getInteger("Damage");
|
||||||
int max = tags.getCompoundTag("InfiTool").getInteger("TotalDurability");
|
int max = tags.getCompoundTag("InfiTool").getInteger("TotalDurability");
|
||||||
int damage = 0;
|
int damage = 0;
|
||||||
if (max > 0) damage = (dur * 100) / max;
|
// long: a tool with more than ~21M durability wraps dur * 100 once it is worn enough
|
||||||
|
if (max > 0) damage = (int) ((long) dur * 100 / max);
|
||||||
|
|
||||||
// rounding.
|
// rounding.
|
||||||
if (damage == 0 && dur > 0) damage = 1;
|
if (damage == 0 && dur > 0) damage = 1;
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public abstract class AmmoItem extends ToolCore implements IBattlegearWeapon, IA
|
|||||||
if (!stack.hasTagCompound()) return toAdd;
|
if (!stack.hasTagCompound()) return toAdd;
|
||||||
NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool");
|
NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool");
|
||||||
int oldCount = tags.getInteger("Ammo");
|
int oldCount = tags.getInteger("Ammo");
|
||||||
int newCount = Math.min(oldCount + toAdd, getMaxAmmo(stack));
|
int newCount = (int) Math.min((long) oldCount + toAdd, getMaxAmmo(stack));
|
||||||
setAmmo(newCount, stack);
|
setAmmo(newCount, stack);
|
||||||
return toAdd - (newCount - oldCount);
|
return toAdd - (newCount - oldCount);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package tconstruct.modifiers.tools;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
|
||||||
|
import tconstruct.library.crafting.ToolBuilder;
|
||||||
import tconstruct.library.modifier.ItemModifier;
|
import tconstruct.library.modifier.ItemModifier;
|
||||||
import tconstruct.util.config.PHConstruct;
|
import tconstruct.util.config.PHConstruct;
|
||||||
|
|
||||||
@@ -37,18 +38,20 @@ public class ModDurability extends ItemModifier {
|
|||||||
NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool");
|
NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool");
|
||||||
|
|
||||||
int base = tags.getInteger("BaseDurability");
|
int base = tags.getInteger("BaseDurability");
|
||||||
int bonus = tags.getInteger("BonusDurability");
|
long bonus = tags.getInteger("BonusDurability");
|
||||||
float modDur = tags.getFloat("ModDurability");
|
float modDur = tags.getFloat("ModDurability");
|
||||||
|
|
||||||
bonus += durability;
|
bonus += durability;
|
||||||
modDur += modifier;
|
modDur += modifier;
|
||||||
tags.setBoolean("Broken", false);
|
tags.setBoolean("Broken", false);
|
||||||
|
|
||||||
int total = (int) ((base + bonus) * (modDur + 1f));
|
// long: base + bonus can exceed Integer.MAX_VALUE, and a wrapped sum would trip the <= 0 check below.
|
||||||
|
// The multiply is still done in float, so a tool that doesn't overflow gets exactly the value it got before.
|
||||||
|
long total = (long) ((base + bonus) * (modDur + 1f));
|
||||||
if (total <= 0) total = 1;
|
if (total <= 0) total = 1;
|
||||||
|
|
||||||
tags.setInteger("TotalDurability", total);
|
tags.setInteger("TotalDurability", ToolBuilder.clampDurability(total));
|
||||||
tags.setInteger("BonusDurability", bonus);
|
tags.setInteger("BonusDurability", ToolBuilder.clampDurability(bonus));
|
||||||
tags.setFloat("ModDurability", modDur);
|
tags.setFloat("ModDurability", modDur);
|
||||||
|
|
||||||
if (PHConstruct.miningLevelIncrease) {
|
if (PHConstruct.miningLevelIncrease) {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class WeaponryActiveToolMod extends ActiveToolMod {
|
|||||||
int rem = ammo.consumeAmmo(1, stack);
|
int rem = ammo.consumeAmmo(1, stack);
|
||||||
return rem > 0;
|
return rem > 0;
|
||||||
} else if (ammo.getAmmoCount(stack) > 0) {
|
} else if (ammo.getAmmoCount(stack) > 0) {
|
||||||
int d = tags.getInteger("Damage") + damage;
|
long d = (long) tags.getInteger("Damage") + damage;
|
||||||
int max = tags.getInteger("TotalDurability");
|
int max = tags.getInteger("TotalDurability");
|
||||||
if (d > max) {
|
if (d > max) {
|
||||||
tags.setInteger("Damage", 0);
|
tags.setInteger("Damage", 0);
|
||||||
|
|||||||
Reference in new issue
Block a user