diff --git a/src/main/java/pers/towdium/justEnoughCalculation/core/Calculator.java b/src/main/java/pers/towdium/justEnoughCalculation/core/Calculator.java index 943fc76..29911e6 100644 --- a/src/main/java/pers/towdium/justEnoughCalculation/core/Calculator.java +++ b/src/main/java/pers/towdium/justEnoughCalculation/core/Calculator.java @@ -22,7 +22,7 @@ public class Calculator { public Calculator (){} public Calculator (ItemStack itemStack, int amount){ - this(new ItemRecord(itemStack, amount), new LinkedList(), new LinkedList(), true); + this(new ItemRecord(itemStack, amount, false), new LinkedList(), new LinkedList(), true); } public Calculator (ItemRecord itemRecord, List operateRecords, List catalystBuffer, boolean exceedMode){ @@ -41,7 +41,7 @@ public class Calculator { for(ItemStack itemStack : recipe.input){ if(itemStack != null){ calculatorBuilder.add(new Calculator( - new ItemRecord(itemStack, count*recipe.getInputAmount(itemStack)), records, catalystBuffer, true + new ItemRecord(itemStack, count*recipe.getInputAmount(itemStack), false), records, catalystBuffer, true )); } } @@ -77,12 +77,12 @@ public class Calculator { List input = new LinkedList<>(); for(ItemStack itemStack : currentOperate.recipe.output){ if(itemStack != null){ - output.add(new ItemRecord(itemStack, currentOperate.count*ItemStackWrapper.getUnifiedAmount(itemStack))); + output.add(new ItemRecord(itemStack, currentOperate.count*ItemStackWrapper.getUnifiedAmount(itemStack), false)); } } for(ItemStack itemStack : currentOperate.recipe.input){ if(itemStack != null){ - input.add(new ItemRecord(itemStack, currentOperate.count*ItemStackWrapper.getUnifiedAmount(itemStack))); + input.add(new ItemRecord(itemStack, currentOperate.count*ItemStackWrapper.getUnifiedAmount(itemStack), false)); } } return new Calculator.CostRecord(output, input); diff --git a/src/main/java/pers/towdium/justEnoughCalculation/core/ItemRecord.java b/src/main/java/pers/towdium/justEnoughCalculation/core/ItemRecord.java index d2a5f39..85752e4 100644 --- a/src/main/java/pers/towdium/justEnoughCalculation/core/ItemRecord.java +++ b/src/main/java/pers/towdium/justEnoughCalculation/core/ItemRecord.java @@ -11,17 +11,20 @@ public class ItemRecord{ Item item; int meta; long amount; + boolean approx; - public ItemRecord(ItemStack itemStack, long amount){ + public ItemRecord(ItemStack itemStack, long amount, boolean approx){ item = itemStack.getItem(); meta = itemStack.getMetadata(); this.amount = amount; + this.approx = approx; } - public ItemRecord(Item item, int meta, long amount) { + public ItemRecord(Item item, int meta, long amount, boolean approx) { this.item = item; this.meta = meta; this.amount = amount; + this.approx = approx; } @Override @@ -45,6 +48,7 @@ public class ItemRecord{ public boolean add(ItemRecord record){ if (isSameType(record)){ amount += record.amount; + approx = approx || record.approx; return true; }else { return false; @@ -65,6 +69,10 @@ public class ItemRecord{ long i = amount>record.amount ? record.amount : amount; amount -= i; record.amount -= i; + if(approx || record.approx){ + approx = true; + record.approx = true; + } return i!=0; }else { return false; @@ -72,14 +80,27 @@ public class ItemRecord{ } public ItemRecord copy(){ - return new ItemRecord(item, meta, amount); + return new ItemRecord(item, meta, amount, approx); } public ItemStack toItemStack(){ ItemStack itemStack = new ItemStack(item, 1, meta); NBTTagCompound tagCompound = new NBTTagCompound(); tagCompound.setLong("amount", amount); + if(approx){ + tagCompound.setBoolean("approx", true); + } itemStack.setTagCompound(tagCompound); return itemStack; } + + @Override + public boolean equals(Object obj) { + if(obj instanceof ItemRecord){ + ItemRecord record = ((ItemRecord) obj); + return record.approx == approx && record.item == item && record.amount == amount && record.meta == meta; + }else { + return false; + } + } } diff --git a/src/main/java/pers/towdium/justEnoughCalculation/core/ItemStackWrapper.java b/src/main/java/pers/towdium/justEnoughCalculation/core/ItemStackWrapper.java index 0da2ace..8c4f212 100644 --- a/src/main/java/pers/towdium/justEnoughCalculation/core/ItemStackWrapper.java +++ b/src/main/java/pers/towdium/justEnoughCalculation/core/ItemStackWrapper.java @@ -24,10 +24,6 @@ public class ItemStackWrapper { } } - public static int getNormalAmount(ItemStack itemStack){ - return itemStack.stackSize*100; - } - public static String getDisplayAmount(ItemStack itemStack){ if(itemStack != null){ if(itemStack.getTagCompound() != null){ @@ -39,7 +35,7 @@ public class ItemStackWrapper { if(i != 0){ return i + "%"; }else{ - return String.valueOf((l+99)/100); + return getSimplifiedString((l+99)/100, itemStack.getTagCompound().getBoolean("approx")); } }else { return String.valueOf(itemStack.stackSize); @@ -58,6 +54,7 @@ public class ItemStackWrapper { if(itemStack.hasTagCompound()){ int i = itemStack.getTagCompound().getInteger("percentage"); itemStack.stackSize = (i+99)/100; + itemStack.setTagCompound(null); }else { itemStack.stackSize = 1; } @@ -65,6 +62,42 @@ public class ItemStackWrapper { return itemStack; } + public static String getSimplifiedString(long l, boolean approx){ + String s; + if(l<999){ + s = String.valueOf(l); + }else if(l<9999){ + s = String.format("%.2fK", (double)l/1000); + }else if(l<99999){ + s = String.format("%.1fK", (double)l/1000); + }else if(l<999999){ + s = String.format("%.0fK", (double)l/1000); + }else if(l<9999999){ + s = String.format("%.2fM", (double)l/1000000); + }else if(l<99999999){ + s = String.format("%.1fM", (double)l/1000000); + }else if(l<999999999){ + s = String.format("%.0fM", (double)l/1000000); + }else if(l<9999999999L){ + s = String.format("%.2fB", (double)l/1000000000); + }else if(l<99999999999L){ + s = String.format("%.1fB", (double)l/1000000000); + }else if(l<999999999999L){ + s = String.format("%.0fB", (double)l/1000000000); + }else if(l<9999999999999L){ + s = String.format("%.2fT", (double)l/1000000000000L); + }else if(l<99999999999999L){ + s = String.format("%.1fT", (double)l/1000000000000L); + }else { + s = String.format("%.0fT", (double)l/1000000000000L); + } + if(approx){ + return "≈" + s; + }else { + return s; + } + } + public static class NBT { public static void initNBT(ItemStack itemStack){ if(!itemStack.hasTagCompound()){ diff --git a/src/main/java/pers/towdium/justEnoughCalculation/core/Recipe.java b/src/main/java/pers/towdium/justEnoughCalculation/core/Recipe.java index ab6f213..ceff79c 100644 --- a/src/main/java/pers/towdium/justEnoughCalculation/core/Recipe.java +++ b/src/main/java/pers/towdium/justEnoughCalculation/core/Recipe.java @@ -68,6 +68,28 @@ public class Recipe { return -1; } + public int getExactInputIndex(ItemStack itemStack){ + for(int i = 0; i<12; i++){ + if(ItemStackWrapper.isStackEqual(input[i], itemStack)){ + return i; + } + } + return -1; + } + + public int getInputIndex(ItemStack itemStack){ + for(int i = 0; i<12; i++){ + if(ItemStackWrapper.isTypeEqual(input[i], itemStack)){ + return i; + } + } + return -1; + } + + public boolean getHasExactInput(ItemStack itemStack){ + return getExactInputIndex(itemStack) != -1; + } + public int getOutputAmount(ItemStack itemStack){ for(int i = 0; i<4; i++){ if(ItemStackWrapper.isTypeEqual(output[i], itemStack)){ @@ -90,6 +112,10 @@ public class Recipe { return getOutputIndex(itemStack) != -1; } + public boolean getHasInput(ItemStack itemStack){ + return getInputIndex(itemStack) != -1; + } + @Override public boolean equals(Object obj) { if(obj instanceof Recipe){ @@ -138,6 +164,20 @@ public class Recipe { return builder.build(); } + public boolean isApprox(){ + for(ItemStack itemstack : input){ + if(itemstack != null && itemstack.hasTagCompound() && itemstack.getTagCompound().hasKey("percentage")){ + return true; + } + } + for(ItemStack itemstack : output){ + if(itemstack != null && itemstack.hasTagCompound() && itemstack.getTagCompound().hasKey("percentage")){ + return true; + } + } + return false; + } + public static class ByteBufUtl{ public static Recipe fromByte(ByteBuf buf){ short a = buf.readShort(); diff --git a/src/main/java/pers/towdium/justEnoughCalculation/gui/guis/calculator/GuiCalculator.java b/src/main/java/pers/towdium/justEnoughCalculation/gui/guis/calculator/GuiCalculator.java index cccc1e0..e4a088b 100644 --- a/src/main/java/pers/towdium/justEnoughCalculation/gui/guis/calculator/GuiCalculator.java +++ b/src/main/java/pers/towdium/justEnoughCalculation/gui/guis/calculator/GuiCalculator.java @@ -266,7 +266,7 @@ public class GuiCalculator extends GuiTooltipScreen{ Calculator.CostRecord record = calculator.getCost(); record.unify(); costRecord = record; - } catch (Exception e){ + } catch (NumberFormatException e){ textFieldAmount.setTextColor(16711680); TimerTask r = new TimerTask() { @Override