Rewrite of Solderer code, made it 2 times faster with upgrades

This commit is contained in:
raoulvdberge
2017-07-23 22:21:58 +02:00
parent ec8a82dd56
commit 0b5604fc09
2 changed files with 41 additions and 35 deletions

View File

@@ -2,6 +2,7 @@
### 1.5.14
- Fixed more crashes relating to scrollbar in GUIs (raoulvdberge)
- A Solderer with Speed Upgrades is now 2 times faster (raoulvdberge)
### 1.5.13
- Fixed Wireless Fluid Grid not using up energy (raoulvdberge)

View File

@@ -41,6 +41,14 @@ public class NetworkNodeSolderer extends NetworkNode {
return stack;
}
@Override
protected void onContentsChanged(int slot) {
super.onContentsChanged(slot);
recipe = API.instance().getSoldererRegistry().getRecipe(this);
progress = 0;
}
};
private ItemHandlerBase result = new ItemHandlerBase(1, new ItemHandlerListenerNetworkNode(this)) {
@@ -52,14 +60,12 @@ public class NetworkNodeSolderer extends NetworkNode {
};
private ItemHandlerProxy items = new ItemHandlerProxy(ingredients, result);
private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED);
private boolean wasWorking;
private boolean working;
private ISoldererRecipe recipe;
private boolean working = false;
private boolean wasWorking = false;
private int progress = 0;
private int progress;
public NetworkNodeSolderer(World world, BlockPos pos) {
super(world, pos);
@@ -86,46 +92,47 @@ public class NetworkNodeSolderer extends NetworkNode {
return;
}
if (ingredients.getStackInSlot(1).isEmpty() && ingredients.getStackInSlot(2).isEmpty() && result.getStackInSlot(0).isEmpty()) {
stop();
} else {
ISoldererRecipe newRecipe = API.instance().getSoldererRegistry().getRecipe(ingredients);
if (working) {
if (recipe == null) {
working = false;
if (newRecipe == null) {
stop();
} else if (newRecipe != recipe) {
boolean sameItem = !result.getStackInSlot(0).isEmpty() && API.instance().getComparer().isEqualNoQuantity(result.getStackInSlot(0), newRecipe.getResult());
markDirty();
} else if ((result.getStackInSlot(0).isEmpty() || API.instance().getComparer().isEqualNoQuantity(recipe.getResult(), result.getStackInSlot(0))) && result.getStackInSlot(0).getCount() + recipe.getResult().getCount() <= result.getStackInSlot(0).getMaxStackSize()) {
int increase = 1 + (upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED) * 2);
if (result.getStackInSlot(0).isEmpty() || (sameItem && ((result.getStackInSlot(0).getCount() + newRecipe.getResult().getCount()) <= result.getStackInSlot(0).getMaxStackSize()))) {
recipe = newRecipe;
progress = 0;
working = true;
markDirty();
if (progress + increase > recipe.getDuration()) {
progress = recipe.getDuration();
} else {
progress += increase;
}
} else if (working) {
progress += 1 + upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED);
if (progress >= recipe.getDuration()) {
if (!result.getStackInSlot(0).isEmpty()) {
result.getStackInSlot(0).grow(recipe.getResult().getCount());
} else {
ItemStack resultSlot = result.getStackInSlot(0);
if (resultSlot.isEmpty()) {
result.setStackInSlot(0, recipe.getResult().copy());
} else {
resultSlot.grow(recipe.getResult().getCount());
}
for (int i = 0; i < 3; ++i) {
if (!recipe.getRow(i).isEmpty()) {
ingredients.extractItem(i, recipe.getRow(i).get(0).getCount(), false);
ItemStack ingredientSlot = ingredients.getStackInSlot(i);
if (!ingredientSlot.isEmpty()) {
ingredientSlot.shrink(recipe.getRow(i).get(0).getCount());
}
}
recipe = null;
recipe = API.instance().getSoldererRegistry().getRecipe(ingredients);
progress = 0;
// Don't set working to false yet, wait till the next update because we may have another stack waiting.
}
markDirty();
}
} else if (recipe != null) {
working = true;
markDirty();
}
}
@@ -134,16 +141,14 @@ public class NetworkNodeSolderer extends NetworkNode {
super.onConnectedStateChange(network, state);
if (!state) {
stop();
recipe = null;
progress = 0;
working = false;
} else {
recipe = API.instance().getSoldererRegistry().getRecipe(ingredients);
}
}
private void stop() {
progress = 0;
working = false;
recipe = null;
}
@Override
public void read(NBTTagCompound tag) {
super.read(tag);