API fixes, Recipe#match etc

- Fixed partically centrifuge (UI desync, glitchy recipe logic, nbt
save)
- Fixed RecipeLogic NBT save issue, has resetting recipe progress
- Added one interface to work with RecipeLogic
- Fixed syntax errors in generators
This commit is contained in:
TheDarkDnKTv 2021-02-01 03:55:48 +02:00
parent 6612f3c058
commit 1ecc44f5f2
24 changed files with 313 additions and 406 deletions

View file

@ -1,4 +1,6 @@
# A port of GregTech 4 to Minecraft 1.7.10
# GregTech 4
Port of GregTech 4 to Minecraft 1.7.10 with improved compat and bugfixes
Our website [click](https://nukepowered.info)

View file

@ -0,0 +1,36 @@
package gregtechmod.api.interfaces;
import gregtechmod.api.recipe.Recipe;
import net.minecraft.item.ItemStack;
/**
* @author TheDarkDnKTv
* Using for mark classes working with RecipeLogic class
*/
public interface IRecipeWorkable {
public IGregTechTileEntity getBaseMetaTileEntity();
public int getMinimumStoredEU();
public void startProcess();
public void endProcess();
public void stutterProcess();
public boolean allowToCheckRecipe();
public boolean spaceForOutput(Recipe recipe);
public ItemStack getStackInSlot(int slotIdx);
/**
* Array of input slot ids
*/
public int[] getInputSlots();
/**
* Array of output slot ids
*/
public int[] getOutputSlots();
}

View file

@ -700,8 +700,8 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE
@Override public boolean hasCustomInventoryName() {return false;}
@Override public ItemStack getStackInSlotOnClosing(int slot) {ItemStack stack = getStackInSlot(slot); if (stack != null) setInventorySlotContents(slot, null); return stack;}
@Override public void onMachineBlockUpdate() {if (hasValidMetaTileEntity()) mMetaTileEntity.onMachineBlockUpdate();}
@Override public int getProgress() {return hasValidMetaTileEntity()?mMetaTileEntity.getRecipeLogic().getProgressTime():0;}
@Override public int getMaxProgress() {return hasValidMetaTileEntity()?mMetaTileEntity.getRecipeLogic().getMaxProgressTime():0;}
@Override public int getProgress() {return hasValidMetaTileEntity()?mMetaTileEntity.getRecipeLogic() != null?mMetaTileEntity.getRecipeLogic().getProgressTime():0:0;}
@Override public int getMaxProgress() {return hasValidMetaTileEntity()?mMetaTileEntity.getRecipeLogic() != null?mMetaTileEntity.getRecipeLogic().getMaxProgressTime():0:0;}
@Override public boolean increaseProgress(int aProgressAmountInTicks) {return hasValidMetaTileEntity()?mMetaTileEntity.increaseProgress(aProgressAmountInTicks)!=aProgressAmountInTicks:false;}
@Override public boolean hasThingsToDo() {return getMaxProgress()>0;}
@Override public void enableWorking() {if (!mWorks) mWorkUpdate = true; mWorks = true;}
@ -1529,6 +1529,7 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE
aStack = GT_OreDictUnificator.get(aStack);
if (GT_Utility.areStacksEqual(tStack, aStack) && tStack.stackSize + aStack.stackSize <= Math.min(aStack.getMaxStackSize(), getInventoryStackLimit())) {
tStack.stackSize+=aStack.stackSize;
mInventoryChanged = true;
return true;
}
return false;

View file

@ -32,9 +32,9 @@ public class GT_MetaTileEntity_E_Furnace extends GT_MetaTileEntity_BasicMachine
// An empty constructor, which is needed for several Java reasons
public GT_MetaTileEntity_E_Furnace(List<Recipe> recipeMap) {
super(recipeMap);
recipeLogic.setHandler(() -> {
recipeLogic.setRecipeProvider(() -> {
ItemStack output;
if (mInventory[2] != null && null != (output = GT_ModHandler.getSmeltingOutput(mInventory[2], true, mInventory[3]))) {
if (mInventory[2] != null && null != (output = GT_ModHandler.getSmeltingOutput(mInventory[2], false, mInventory[3]))) {
if (mInventory[2].stackSize == 0) mInventory[2] = null;
// It shall cook at 3 EU/t, if this Machine is overclocked then it will consume more
// The time it usually needs, the Heating Coils re decreasing this Time, and if the Machine is overclocked, then it gets processed faster

View file

@ -12,13 +12,18 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity_BasicTank {
protected List<Recipe> recipeMap;
protected int efficiency;
public GT_MetaTileEntity_BasicGenerator(int aID, String aName) {
public GT_MetaTileEntity_BasicGenerator(int aID, String aName, List<Recipe> recipeMap, int efficiency) {
super(aID, aName);
this.recipeMap = recipeMap;
this.efficiency = efficiency;
}
public GT_MetaTileEntity_BasicGenerator() {
public GT_MetaTileEntity_BasicGenerator(List<Recipe> recipeMap, int efficiency) {
this.recipeMap = recipeMap;
this.efficiency = efficiency;
}
@Override public boolean isSimpleMachine() {return false;}
@ -68,28 +73,24 @@ public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity
if (getBaseMetaTileEntity().isServerSide()) getBaseMetaTileEntity().setActive(getBaseMetaTileEntity().isAllowedToWork() && getBaseMetaTileEntity().getUniversalEnergyStored() >= getBaseMetaTileEntity().getOutputVoltage() + getMinimumStoredEU());
}
public abstract List<Recipe> getRecipes();
public abstract int getEfficiency();
public int getFuelValue(FluidStack aLiquid) {
if (aLiquid == null) return 0;
FluidStack tLiquid;
for (Recipe tFuel : getRecipes()) if ((tLiquid = GT_Utility.getFluidForFilledItem(tFuel.getRepresentativeInput(0))) != null) if (aLiquid.isFluidEqual(tLiquid)) return (int)(((long)tFuel.mStartEU * getEfficiency()) / 100);
for (Recipe tFuel : recipeMap) if ((tLiquid = GT_Utility.getFluidForFilledItem(tFuel.getFirstInputs()[0])) != null) if (aLiquid.isFluidEqual(tLiquid)) return (int)(((long)tFuel.mStartEU * efficiency) / 100);
return 0;
}
public int getFuelValue(ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) return 0;
Recipe tFuel = Recipe.findEqualRecipe(true, false, getRecipes(), aStack);
if (tFuel != null) return (int)((tFuel.mStartEU * 1000L * getEfficiency()) / 100);
Recipe tFuel = Recipe.findEqualRecipe(true, false, recipeMap, aStack);
if (tFuel != null) return (int)((tFuel.mStartEU * 1000L * efficiency) / 100);
return 0;
}
public ItemStack getEmptyContainer(ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) return null;
Recipe tFuel = Recipe.findEqualRecipe(true, false, getRecipes(), aStack);
if (tFuel != null) return GT_Utility.copy(tFuel.getOutput(0));
Recipe tFuel = Recipe.findEqualRecipe(true, false, recipeMap, aStack);
if (tFuel != null) return GT_Utility.copy(tFuel.getOutputs()[0]);
return GT_Utility.getContainerItem(aStack);
}

View file

@ -4,6 +4,7 @@ import java.util.List;
import java.util.Map;
import gregtechmod.api.GregTech_API;
import gregtechmod.api.interfaces.IRecipeWorkable;
import gregtechmod.api.metatileentity.MetaTileEntity;
import gregtechmod.api.recipe.Recipe;
import gregtechmod.api.recipe.RecipeLogic;
@ -22,8 +23,8 @@ import net.minecraft.util.ChatComponentTranslation;
* This is the main construct for my Basic Machines such as the Automatic Extractor
* Extend this class to make a simple Machine
*/
public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity {
public boolean bAlloyInputFromOutputSide = false, bOutput = false, bOutputBlocked = false, bItemTransfer = false, bSeperatedInputs = false, bHasBeenUpdated = false, bStuttering = false;
public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity implements IRecipeWorkable {
public boolean bAlloyInputFromOutputSide = false, bOutput = false, bItemTransfer = false, bSeperatedInputs = false, bHasBeenUpdated = false, bStuttering = false;
public int mMainFacing = -1;
protected RecipeLogic recipeLogic;
@ -60,7 +61,7 @@ public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity {
@Override public int dechargerSlotCount() {return getElectricTier()>0?1:0;}
@Override public boolean isAccessAllowed(EntityPlayer aPlayer) {return true;}
@Override public RecipeLogic getRecipeLogic() {return recipeLogic;}
// @Override public int increaseProgress(int aProgress) {mProgresstime += aProgress; return mMaxProgresstime-mProgresstime;} // TODO recipe logic related
@Override public int increaseProgress(int aProgress) {recipeLogic.increaseProgressTime(aProgress);return recipeLogic.getMaxProgressTime()-recipeLogic.getProgressTime();}
@Override public boolean isLiquidInput (byte aSide) {return aSide != mMainFacing;}
@Override public boolean isLiquidOutput(byte aSide) {return aSide != mMainFacing;}
@ -89,7 +90,6 @@ public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity {
@Override
public void onPostTick() {
if (getBaseMetaTileEntity().isServerSide()) {
boolean tSucceeded = false;
if (mMainFacing < 2 && getBaseMetaTileEntity().getFrontFacing() > 1) {
mMainFacing = getBaseMetaTileEntity().getFrontFacing();
}
@ -98,32 +98,9 @@ public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity {
getBaseMetaTileEntity().setFrontFacing(getBaseMetaTileEntity().getBackFacing());
}
recipeLogic.update();
// if (mMaxProgresstime > 0) {
// if (mProgresstime < 0 || getBaseMetaTileEntity().decreaseStoredEnergyUnits(mEUt*(int)Math.pow(4, getBaseMetaTileEntity().getOverclockerUpgradeCount()), false)) {
// if ((mProgresstime+=(int)Math.pow(2, getBaseMetaTileEntity().getOverclockerUpgradeCount()))>=mMaxProgresstime) {
// if (!getBaseMetaTileEntity().addStackToSlot(3, mOutputItem1)) getBaseMetaTileEntity().addStackToSlot(4, mOutputItem1);
// if (!getBaseMetaTileEntity().addStackToSlot(3, mOutputItem2)) getBaseMetaTileEntity().addStackToSlot(4, mOutputItem2);
// mOutputItem1 = null;
// mOutputItem2 = null;
// mProgresstime = 0;
// mMaxProgresstime = 0;
// tSucceeded = true;
// endProcess();
// }
// bStuttering = false;
// } else {
// if (!bStuttering) {
// stutterProcess();
// if (useStandardStutterSound()) sendSound((byte)8);
// bStuttering = true;
// }
// }
// } else {
// getBaseMetaTileEntity().setActive(false);
// }
boolean succeded = recipeLogic.update();
if (bItemTransfer && (mInventory[3] != null || mInventory[4] != null) && getBaseMetaTileEntity().getFrontFacing() != mMainFacing && doesAutoOutput() && (tSucceeded || bOutputBlocked || getBaseMetaTileEntity().hasInventoryBeenModified() || getBaseMetaTileEntity().getTimer()%600 == 0) && getBaseMetaTileEntity().isUniversalEnergyStored(500)) {
if (bItemTransfer && (mInventory[3] != null || mInventory[4] != null) && getBaseMetaTileEntity().getFrontFacing() != mMainFacing && doesAutoOutput() && (succeded || getBaseMetaTileEntity().hasInventoryBeenModified() || getBaseMetaTileEntity().getTimer()%600 == 0) && getBaseMetaTileEntity().isUniversalEnergyStored(500)) {
TileEntity tTileEntity2 = getBaseMetaTileEntity().getTileEntityAtSide(getBaseMetaTileEntity().getFrontFacing());
int tCost = GT_Utility.moveOneItemStack(getBaseMetaTileEntity(), tTileEntity2, getBaseMetaTileEntity().getFrontFacing(), getBaseMetaTileEntity().getBackFacing(), null, false, (byte)64, (byte)1, (byte)64, (byte)1);
if (tCost > 0) {
@ -134,36 +111,6 @@ public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity {
}
}
}
if (mInventory[3] == null && mInventory[4] == null) bOutputBlocked = false; // FIXME output blocked wtf
// if (getBaseMetaTileEntity().isAllowedToWork()) {
// if (mMaxProgresstime <= 0 && (tSucceeded || getBaseMetaTileEntity().hasInventoryBeenModified() || getBaseMetaTileEntity().getTimer()%600 == 0 || getBaseMetaTileEntity().hasWorkJustBeenEnabled()) && getBaseMetaTileEntity().isUniversalEnergyStored(getMinimumStoredEU()-100)) {
// checkRecipe();
// if (mInventory[1] != null && mInventory[1].stackSize <= 0) mInventory[1] = null;
// if (mInventory[2] != null && mInventory[2].stackSize <= 0) mInventory[2] = null;
// if (mMaxProgresstime > 0) {
// mOutputItem1 = GT_OreDictUnificator.get(true, mOutputItem1);
// mOutputItem2 = GT_OreDictUnificator.get(true, mOutputItem2);
// if (GT_Utility.isDebugItem(mInventory[5])) mMaxProgresstime = 1;
// } else {
// mOutputItem1 = null;
// mOutputItem2 = null;
// }
// if (mOutputItem1 != null && mOutputItem1.stackSize > 64) mOutputItem1.stackSize = 64;
// if (mOutputItem2 != null && mOutputItem2.stackSize > 64) mOutputItem2.stackSize = 64;
//
// if (mMaxProgresstime > 0) {
// startProcess();
// }
// }
// } else {
// if (!bStuttering) {
// stutterProcess();
// if (useStandardStutterSound()) sendSound((byte)8);
// bStuttering = true;
// }
// }
}
}
@ -182,11 +129,12 @@ public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity {
return mMainFacing<2?aSide==aFacing?aActive?getFrontFacingActive():getFrontFacingInactive():aSide==0?aActive?getBottomFacingActive():getBottomFacingInactive():aSide==1?aActive?getTopFacingActive():getTopFacingInactive():aActive?getSideFacingActive():getSideFacingInactive():aSide==mMainFacing?aActive?getFrontFacingActive():getFrontFacingInactive():(showPipeFacing()&&aSide==aFacing)?aSide==0?getBottomFacingPipe():aSide==1?getTopFacingPipe():getSideFacingPipe():aSide==0?aActive?getBottomFacingActive():getBottomFacingInactive():aSide==1?aActive?getTopFacingActive():getTopFacingInactive():aActive?getSideFacingActive():getSideFacingInactive();
}
public boolean spaceForOutput(ItemStack aOutput1, ItemStack aOutput2) {
@Override
public boolean spaceForOutput(Recipe recipe) {
ItemStack aOutput1 = recipe.getOutputs()[0], aOutput2 = recipe.getOutputs().length > 1 ? recipe.getOutputs()[1] : null;
if (mInventory[3] == null || aOutput1 == null || (mInventory[3].stackSize + aOutput1.stackSize <= mInventory[3].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[3], aOutput1)))
if (mInventory[4] == null || aOutput2 == null || (mInventory[4].stackSize + aOutput2.stackSize <= mInventory[4].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[4], aOutput2)))
return true;
bOutputBlocked = true;
return false;
}
@ -303,7 +251,7 @@ public abstract class GT_MetaTileEntity_BasicMachine extends MetaTileEntity {
/** Called whenever the Machine aborted a Process but still works on it, useful for Sound Effects */
public void stutterProcess() {
//
if (useStandardStutterSound()) sendSound((byte)8);
}
public boolean useStandardStutterSound() {

View file

@ -49,8 +49,8 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity {
@Override public boolean isFacingValid(byte aFacing) {return true;}
@Override public boolean isAccessAllowed(EntityPlayer aPlayer) {return true;}
@Override public boolean isValidSlot(int aIndex) {return aIndex > 0;}
@Override public int getProgresstime() {return mProgresstime;}
@Override public int maxProgresstime() {return mMaxProgresstime;}
public int getProgresstime() {return mProgresstime;}
public int maxProgresstime() {return mMaxProgresstime;}
@Override public int increaseProgress(int aProgress) {return aProgress;}
@Override public int getInvSize() {return 2;}

View file

@ -8,11 +8,14 @@ import gregtechmod.api.util.GT_Log;
import gregtechmod.api.util.GT_ModHandler;
import gregtechmod.api.util.GT_OreDictUnificator;
import gregtechmod.api.util.GT_Utility;
import gregtechmod.api.util.ItemStackKey;
import static gregtechmod.api.recipe.RecipeMaps.*;
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
@ -95,24 +98,39 @@ public class Recipe {
assert inputSlots.length > 0 : "Recipe check failed, inputSlots size < 1";
Map<Integer, ItemStack> decreaseMap = new HashMap<>();
for (ItemStack[] validItems : mInputs) { // Iterating slots
for (ItemStack validItem : validItems) { // Iterating valid items for slot
for (int slot : inputSlots) { // Iterating machine's input
ItemStack slotStack = tile.getStackInSlot(slot);
if (slotStack != null) {
if (isItemStackMatch(slotStack, validItem)) {
decreaseMap.put(slot, validItem);
Map<Integer, ItemStack> slotStacks = new HashMap<>();
for (int i : inputSlots) {
ItemStack stack = tile.getStackInSlot(i);
if (stack != null)
slotStacks.put(i, stack);
}
} else continue;
for (ItemStack[] slot : mInputs) {
Map<ItemStackKey, Integer> variants = Arrays.stream(slot)
.collect(Collectors.toMap(stack -> ItemStackKey.from(stack), stack -> stack.stackSize));
Iterator<Entry<Integer, ItemStack>> iter = slotStacks.entrySet().iterator();
while (iter.hasNext()) {
Entry<Integer, ItemStack> value = iter.next();
ItemStackKey temp = ItemStackKey.from(value.getValue());
if ((variants.keySet().contains(temp))) {
ItemStack recipeItem = temp.get();
recipeItem.stackSize = variants.get(temp);
ItemStack slotItem = value.getValue();
if (recipeItem.stackSize <= slotItem.stackSize) {
decreaseMap.put(value.getKey(), recipeItem);
iter.remove();
break;
} else return false;
}
return false;
}
}
if (decrease) for (Entry<Integer, ItemStack> e : decreaseMap.entrySet()) {
if (decrease && decreaseMap.size() == mInputs.length) for (Entry<Integer, ItemStack> e : decreaseMap.entrySet()) {
tile.decrStackSize(e.getKey(), e.getValue().stackSize);
}
return !decreaseMap.isEmpty();
return decreaseMap.size() == mInputs.length;
}
private boolean isItemStackMatch(ItemStack invStack, ItemStack recipeStack) {

View file

@ -4,7 +4,8 @@ import java.lang.ref.WeakReference;
import java.util.List;
import java.util.function.Supplier;
import gregtechmod.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
import gregtechmod.api.interfaces.IGregTechTileEntity;
import gregtechmod.api.interfaces.IRecipeWorkable;
import gregtechmod.api.util.GT_Log;
import gregtechmod.api.util.GT_Utility;
import net.minecraft.inventory.IInventory;
@ -17,58 +18,70 @@ import net.minecraft.nbt.NBTTagCompound;
*
*/
public class RecipeLogic {
public final WeakReference<GT_MetaTileEntity_BasicMachine> metaTileEntity;
public final WeakReference<IRecipeWorkable> metaTileEntity;
public final List<Recipe> recipeMap;
protected Supplier<Recipe> recipeHandler;
public int batterySlot = 5;
public boolean moveItems = true;
/** Do not consume inputs on custom recipe provider, it is only should <b><i>provide</i></b> a recipe instance */
protected Supplier<Recipe> customRecipeProvider;
protected int maxProgressTime;
protected int progressTime;
protected int EUt;
private int overclockersCount;
private Recipe previousRecipe;
private boolean needRecipeRecheck;
private boolean stuttering;
private boolean wasNoEnergy;
public RecipeLogic(List<Recipe> recipeMap, GT_MetaTileEntity_BasicMachine machine) {
public RecipeLogic(List<Recipe> recipeMap, IRecipeWorkable machine) {
this.recipeMap = recipeMap;
maxProgressTime = 0;
progressTime = 0;
EUt = 0;
overclockersCount = 0;
stuttering = false;
wasNoEnergy = false;
metaTileEntity = new WeakReference<>(machine);
needRecipeRecheck = true;
}
public void update() {
overclockersCount = getMachine().getBaseMetaTileEntity().getOverclockerUpgradeCount();
moveItems();
if (getMachine().getBaseMetaTileEntity().isAllowedToWork()) {
if (getMachine().getBaseMetaTileEntity().hasInventoryBeenModified() || getMachine().getBaseMetaTileEntity().hasWorkJustBeenEnabled())
needRecipeRecheck = true;
public boolean update() {
boolean success = false;
IGregTechTileEntity base = getMachine().getBaseMetaTileEntity();
overclockersCount = base.getOverclockerUpgradeCount();
if (moveItems) moveItems();
if (base.isAllowedToWork()) {
if (progressTime > 0) {
updateRecipeProgress();
int tmp = progressTime;
success = updateRecipeProgress();
if (tmp == 0 && !success) {
throw new IllegalStateException();
}
}
if (progressTime == 0 && needRecipeRecheck) {
if (isInputNonEmpty()) {
if (progressTime == 0) {
if (base.hasInventoryBeenModified() || base.hasWorkJustBeenEnabled() || success || base.getTimer() % 600 == 0 || wasNoEnergy) {
if (isInputNonEmpty() && base.isUniversalEnergyStored(getMachine().getMinimumStoredEU() - 100)) {
trySerachRecipe();
wasNoEnergy = false;
} else {
previousRecipe = null;
needRecipeRecheck = false;
getMachine().getBaseMetaTileEntity().setActive(false);
wasNoEnergy = true;
base.setActive(false);
}
}
}
}
public void setHandler(Supplier<Recipe> handler) {
recipeHandler = handler;
return success;
}
protected void updateRecipeProgress() {
public void setRecipeProvider(Supplier<Recipe> handler) {
customRecipeProvider = handler;
}
protected boolean updateRecipeProgress() {
if (getMachine().getBaseMetaTileEntity().decreaseStoredEnergyUnits(EUt * (int)Math.pow(4, overclockersCount), false)) {
if ((progressTime += (int)Math.pow(2, overclockersCount)) >= maxProgressTime) {
progressTime = 0;
@ -77,21 +90,22 @@ public class RecipeLogic {
endRecipe(previousRecipe);
getMachine().endProcess();
return true;
}
} else {
getMachine().getBaseMetaTileEntity().setActive(false);
if (!getMachine().bStuttering) {
if (!stuttering) {
getMachine().stutterProcess();
if (getMachine().useStandardStutterSound()) getMachine().sendSound((byte)8);
getMachine().bStuttering = true;
stuttering = true;
}
}
return false;
}
protected void trySerachRecipe() {
if (getMachine().allowToCheckRecipe()) {
if (previousRecipe != null) {
if (previousRecipe.match(false, getMachine().getBaseMetaTileEntity(), getMachineInputs())) { // TODO add I/O item handlers to MTE
if (previousRecipe.match(false, getMachine().getBaseMetaTileEntity(), getMachine().getInputSlots())) { // TODO add I/O item handlers to MTE
startRecipe(previousRecipe);
} else {
previousRecipe = null;
@ -99,15 +113,13 @@ public class RecipeLogic {
}
} else {
// find new recipe
Recipe resRec = recipeHandler != null ? recipeHandler.get() :
Recipe resRec = customRecipeProvider != null ? customRecipeProvider.get() :
recipeMap.stream()
.filter(rec -> rec.match(false, getMachine().getBaseMetaTileEntity(), getMachineInputs()))
.filter(rec -> rec.match(false, getMachine().getBaseMetaTileEntity(), getMachine().getInputSlots()))
.findFirst().orElse(null);
if (resRec != null)
startRecipe(resRec);
}
needRecipeRecheck = false;
}
}
@ -126,12 +138,12 @@ public class RecipeLogic {
}
protected void startRecipe(Recipe recipe) {
if (getMachine().spaceForOutput(recipe.getOutputs()[0], recipe.getOutputs().length > 1 ? recipe.getOutputs()[1] : null)) {
if (getMachine().spaceForOutput(recipe)) {
previousRecipe = recipe;
maxProgressTime = recipe.mDuration;
maxProgressTime = GT_Utility.isDebugItem(getMachine().getStackInSlot(batterySlot)) ? 1 : recipe.mDuration;
progressTime = 1;
EUt = recipe.mEUt;
recipe.match(true, getMachine().getBaseMetaTileEntity(), getMachineInputs());
recipe.match(true, getMachine().getBaseMetaTileEntity(), getMachine().getInputSlots());
getMachine().getBaseMetaTileEntity().setActive(true);
getMachine().startProcess();
}
@ -139,9 +151,9 @@ public class RecipeLogic {
protected void endRecipe(Recipe recipe) {
ItemStack[] outputs = recipe.getOutputs();
if (outputs.length <= getMachineOutputs().length) {
if (outputs.length <= getMachine().getOutputSlots().length) {
for (ItemStack out : outputs) {
for (int i : getMachineOutputs()) {
for (int i : getMachine().getOutputSlots()) {
if (getMachine().getBaseMetaTileEntity().addStackToSlot(i, out.copy())) {
break;
}
@ -151,35 +163,27 @@ public class RecipeLogic {
GT_Log.log.catching(new IllegalStateException("Found recipe with more items output machine has slots!"));
}
getMachine().bStuttering = false;
stuttering = false;
getMachine().endProcess();
}
private boolean isInputNonEmpty() {
for (int i : getMachineInputs()) {
for (int i : getMachine().getInputSlots()) {
ItemStack s = getMachine().getStackInSlot(i);
if (s != null && s.stackSize > 0) return true;
}
return false;
}
/**
* Specify machine input slots
*/
protected int[] getMachineInputs() {
return new int[] {1, 2};
}
protected int[] getMachineOutputs() {
return new int[] {3, 4};
}
private GT_MetaTileEntity_BasicMachine getMachine() {
private IRecipeWorkable getMachine() {
return metaTileEntity.get();
}
public void increaseProgressTime(int amount) {
progressTime += amount;
}
public boolean isActive() {
return maxProgressTime > 0;
}
@ -201,12 +205,12 @@ public class RecipeLogic {
data1.setInteger("TotalTime", maxProgressTime);
data1.setInteger("CurrentTime", progressTime);
data1.setInteger("EUt", EUt);
data.setTag("RecipeLogic", data1);
data.setTag("RecipeLogic", data1); // TODO save recipe items to NBT!
}
public void loadFromNBT(NBTTagCompound data) {
NBTTagCompound data1 = data.getCompoundTag("RecipeLogic");
if (data1 != null) {
if (data1 != null && (maxProgressTime == 0 && progressTime == 0 && EUt == 0)) {
maxProgressTime = data1.getInteger("TotalTime");
progressTime = data1.getInteger("CurrentTime");
EUt = data1.getInteger("EUt");

View file

@ -32,6 +32,4 @@ public class RecipeMaps {
public static final List<Recipe> sDenseLiquidFuels = new ArrayList<Recipe>();
public static final List<Recipe> sPlasmaFuels = new ArrayList<Recipe>();
public static final List<Recipe> sMagicFuels = new ArrayList<Recipe>();
}

View file

@ -4,15 +4,8 @@ import gregtechmod.api.gui.GT_ContainerMetaTile_Machine;
import gregtechmod.api.gui.GT_Slot_Holo;
import gregtechmod.api.gui.GT_Slot_Output;
import gregtechmod.api.interfaces.IGregTechTileEntity;
import gregtechmod.common.tileentities.machines.GT_MetaTileEntity_Centrifuge;
import java.util.Iterator;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class GT_Container_Centrifuge extends GT_ContainerMetaTile_Machine {
@ -30,35 +23,6 @@ public class GT_Container_Centrifuge extends GT_ContainerMetaTile_Machine {
addSlotToContainer(new GT_Slot_Holo (mTileEntity, 6, 110, 65, false, false, 64));
}
public int mProgress, mMaxProgress, mProgressScale;
@SuppressWarnings("rawtypes")
public void detectAndSendChanges() {
super.detectAndSendChanges();
if (mTileEntity.isClientSide() || mTileEntity.getMetaTileEntity() == null) return;
mProgress = ((GT_MetaTileEntity_Centrifuge)mTileEntity.getMetaTileEntity()).getProgresstime();
mMaxProgress = ((GT_MetaTileEntity_Centrifuge)mTileEntity.getMetaTileEntity()).maxProgresstime();
mProgressScale = Math.max(0, Math.min(10, (mProgress>0?1:0) + (mProgress * 10) / (mMaxProgress<1?1:mMaxProgress)));
Iterator var2 = this.crafters.iterator();
while (var2.hasNext()) {
ICrafting var1 = (ICrafting)var2.next();
var1.sendProgressBarUpdate(this, 100, mProgress);
var1.sendProgressBarUpdate(this, 101, mMaxProgress);
var1.sendProgressBarUpdate(this, 102, mProgressScale);
}
}
@SideOnly(Side.CLIENT)
public void updateProgressBar(int par1, int par2) {
super.updateProgressBar(par1, par2);
switch (par1) {
case 100: mProgress = par2; break;
case 101: mMaxProgress = par2; break;
case 102: mProgressScale = par2; break;
}
}
public int getSlotCount() {
return 6;
}

View file

@ -18,11 +18,10 @@ public class GT_GUIContainer_Centrifuge extends GT_GUIContainerMetaTile_Machine
@Override
protected void drawGuiContainerForegroundLayer(int par1, int par2) {
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 94, 4210752);
fontRenderer.drawString("Industrial", 110, 4, 4210752);
fontRenderer.drawString("Centrifuge", 110, 12, 4210752);
if ((((GT_Container_Centrifuge)mContainer).mDisplayErrorCode & 1) != 0)
fontRenderer.drawString("Insufficient Energy Line!", 8, ySize - 94, 4210752);
fontRenderer.drawSplitString(StatCollector.translateToLocal("metatileentity.NOT_ENOUGH_ENERGY"), 8, ySize - 102, 90, 4210752);
else
fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 94, 4210752);
}
@ -35,7 +34,8 @@ public class GT_GUIContainer_Centrifuge extends GT_GUIContainerMetaTile_Machine
drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
if (mContainer != null && mContainer.mProgressTime>0) {
int tScale = ((GT_Container_Centrifuge)mContainer).mProgressScale;
int tScale = Math.max(0, Math.min(10,
(mContainer.mProgressTime>0?1:0) + (mContainer.mProgressTime * 10) / (mContainer.mMaxProgressTime<1?1:mContainer.mMaxProgressTime)));
drawTexturedModalRect(x + 83, y + 33 - tScale, 193, 33 - tScale, 10, tScale);
drawTexturedModalRect(x + 78 - tScale, y + 38, 188 - tScale, 38 , tScale, 10);
drawTexturedModalRect(x + 83, y + 53, 193, 53, 10, tScale);

View file

@ -4,6 +4,7 @@ import gregtechmod.api.enums.OrePrefixes;
import gregtechmod.api.interfaces.IGregTechTileEntity;
import gregtechmod.api.metatileentity.MetaTileEntity;
import gregtechmod.api.recipe.Recipe;
import gregtechmod.api.recipe.RecipeMaps;
import gregtechmod.api.util.GT_ModHandler;
import gregtechmod.api.util.GT_OreDictUnificator;
import gregtechmod.api.util.GT_Utility;
@ -100,7 +101,7 @@ public class GT_MetaTileEntity_ElectricTypeSorter extends GT_MetaTileEntity_Elec
OrePrefixes tPrefix = OrePrefixes.getPrefix(sTypeList[mMode]);
if (((mMode == 11 && mInventory[0].getItem() instanceof ItemFood) || (mMode == 12 && Recipe.findEqualRecipe(false, false, Recipe.sGrinderRecipes, mInventory[0], GT_ModHandler.getWaterCell(1)) != null) || (tPrefix != null && tPrefix.contains(mInventory[0])) || GT_OreDictUnificator.isItemStackInstanceOf(mInventory[0], sTypeList[mMode]))) {
if (((mMode == 11 && mInventory[0].getItem() instanceof ItemFood) || (mMode == 12 && Recipe.findEqualRecipe(false, false, RecipeMaps.sGrinderRecipes, mInventory[0], GT_ModHandler.getWaterCell(1)) != null) || (tPrefix != null && tPrefix.contains(mInventory[0])) || GT_OreDictUnificator.isItemStackInstanceOf(mInventory[0], sTypeList[mMode]))) {
getBaseMetaTileEntity().decreaseStoredEnergyUnits(tPrice = GT_Utility.moveOneItemStack(getBaseMetaTileEntity(), getBaseMetaTileEntity().getIInventoryAtSide(mTargetDirection), getBaseMetaTileEntity().getBackFacing(), GT_Utility.getOppositeSide(mTargetDirection), null, false, mTargetStackSize!=0?(byte)mTargetStackSize:64, mTargetStackSize!=0?(byte)mTargetStackSize:1, (byte)64, (byte)1)*3, true);
}
if (tPrice <= 0) {

View file

@ -64,8 +64,8 @@ public class GT_MetaTileEntity_TesseractGenerator extends MetaTileEntity {
@Override public boolean isAccessAllowed(EntityPlayer aPlayer) {return true;}
@Override public boolean ownerControl() {return true;}
@Override public boolean unbreakable() {return true;}
@Override public int getProgresstime() {return sTesseractGenerators.get(mFrequency) == this && isWorking >= 20 ? 999 : 0;}
@Override public int maxProgresstime() {return 1000;}
public int getProgresstime() {return sTesseractGenerators.get(mFrequency) == this && isWorking >= 20 ? 999 : 0;}
public int maxProgresstime() {return 1000;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {

View file

@ -45,8 +45,8 @@ public class GT_MetaTileEntity_TesseractTerminal extends MetaTileEntity {
@Override public int getInvSize() {return 0;}
@Override public boolean isAccessAllowed(EntityPlayer aPlayer) {return true;}
@Override public boolean ownerControl() {return true;}
@Override public int getProgresstime() {return getTesseract(mFrequency, false) != null ? 999 : 0;}
@Override public int maxProgresstime() {return 1000;}
public int getProgresstime() {return getTesseract(mFrequency, false) != null ? 999 : 0;}
public int maxProgresstime() {return 1000;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {

View file

@ -14,21 +14,21 @@ import net.minecraft.item.ItemStack;
public class GT_MetaTileEntity_DieselGenerator extends GT_MetaTileEntity_BasicGenerator {
public GT_MetaTileEntity_DieselGenerator(int aID, String aName) {
super(aID, aName);
public GT_MetaTileEntity_DieselGenerator(int aID, String aName, List<Recipe> recipeMap, int efficiency) {
super(aID, aName, recipeMap, efficiency);
}
public GT_MetaTileEntity_DieselGenerator() {}
public GT_MetaTileEntity_DieselGenerator(List<Recipe> recipeMap, int efficiency) {
super(recipeMap, efficiency);
}
@Override public boolean isFacingValid(byte aFacing) {return aFacing > 1;}
@Override public int maxEUOutput() {return this.getBaseMetaTileEntity().isAllowedToWork() ? 12 : 0;}
@Override public void onRightclick(EntityPlayer aPlayer) {this.getBaseMetaTileEntity().openGUI(aPlayer, 117);}
@Override public List<Recipe> getRecipes() {return Recipe.sDieselFuels;}
@Override public int getEfficiency() {return 100;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
return new GT_MetaTileEntity_DieselGenerator();
return new GT_MetaTileEntity_DieselGenerator(recipeMap, efficiency);
}
@Override

View file

@ -10,21 +10,21 @@ import net.minecraft.entity.player.EntityPlayer;
public class GT_MetaTileEntity_GasTurbine extends GT_MetaTileEntity_BasicGenerator {
public GT_MetaTileEntity_GasTurbine(int aID, String aName) {
super(aID, aName);
public GT_MetaTileEntity_GasTurbine(int aID, String aName, List<Recipe> recipeMap, int efficiency) {
super(aID, aName, recipeMap, efficiency);
}
public GT_MetaTileEntity_GasTurbine() {}
public GT_MetaTileEntity_GasTurbine(List<Recipe> recipeMap, int efficiency) {
super(recipeMap, efficiency);
}
@Override public boolean isFacingValid(byte aFacing) {return true;}
@Override public int maxEUOutput() {return this.getBaseMetaTileEntity().isAllowedToWork() ? 16 : 0;}
@Override public void onRightclick(EntityPlayer aPlayer) {this.getBaseMetaTileEntity().openGUI(aPlayer, 118);}
@Override public List<Recipe> getRecipes() {return Recipe.sTurbineFuels;}
@Override public int getEfficiency() {return 75;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
return new GT_MetaTileEntity_GasTurbine();
return new GT_MetaTileEntity_GasTurbine(recipeMap, efficiency);
}
@Override

View file

@ -13,21 +13,21 @@ import net.minecraft.world.biome.BiomeGenBase;
public class GT_MetaTileEntity_MagicEnergyConverter extends GT_MetaTileEntity_BasicGenerator {
public GT_MetaTileEntity_MagicEnergyConverter(int aID, String aName) {
super(aID, aName);
public GT_MetaTileEntity_MagicEnergyConverter(int aID, String aName, List<Recipe> recipeMap, int efficiency) {
super(aID, aName, recipeMap, efficiency);
}
public GT_MetaTileEntity_MagicEnergyConverter() {}
public GT_MetaTileEntity_MagicEnergyConverter(List<Recipe> recipeMap, int efficiency) {
super(recipeMap, efficiency);
}
@Override public boolean isFacingValid(byte aFacing) {return true;}
@Override public int maxEUOutput() {return this.getBaseMetaTileEntity().isAllowedToWork() ? 24 : 0;}
@Override public void onRightclick(EntityPlayer aPlayer) {this.getBaseMetaTileEntity().openGUI(aPlayer, 125);}
@Override public List<Recipe> getRecipes() {return Recipe.sMagicFuels;}
@Override public int getEfficiency() {return 100;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
return new GT_MetaTileEntity_MagicEnergyConverter();
return new GT_MetaTileEntity_MagicEnergyConverter(recipeMap, efficiency);
}
@Override

View file

@ -10,23 +10,23 @@ import net.minecraft.entity.player.EntityPlayer;
public class GT_MetaTileEntity_PlasmaGenerator extends GT_MetaTileEntity_BasicGenerator {
public GT_MetaTileEntity_PlasmaGenerator(int aID, String aName) {
super(aID, aName);
public GT_MetaTileEntity_PlasmaGenerator(int aID, String aName, List<Recipe> recipeMap, int efficiency) {
super(aID, aName, recipeMap, efficiency);
}
public GT_MetaTileEntity_PlasmaGenerator() {}
public GT_MetaTileEntity_PlasmaGenerator(List<Recipe> recipeMap, int efficiency) {
super(recipeMap, efficiency);
}
@Override public boolean isFacingValid(byte aFacing) {return true;}
@Override public int maxEUOutput() {return this.getBaseMetaTileEntity().isAllowedToWork() ? 2048 : 0;}
@Override public void onRightclick(EntityPlayer aPlayer) {this.getBaseMetaTileEntity().openGUI(aPlayer, 121);}
@Override public List<Recipe> getRecipes() {return Recipe.sPlasmaFuels;}
@Override public int getEfficiency() {return 100;}
@Override public boolean isOutputFacing(byte aSide) {return aSide == this.getBaseMetaTileEntity().getFrontFacing();}
@Override public int maxEUStore() {return 1000000000;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
return new GT_MetaTileEntity_PlasmaGenerator();
return new GT_MetaTileEntity_PlasmaGenerator(recipeMap, efficiency);
}
@Override

View file

@ -10,21 +10,21 @@ import net.minecraft.entity.player.EntityPlayer;
public class GT_MetaTileEntity_SemifluidGenerator extends GT_MetaTileEntity_BasicGenerator {
public GT_MetaTileEntity_SemifluidGenerator(int aID, String aName) {
super(aID, aName);
public GT_MetaTileEntity_SemifluidGenerator(int aID, String aName, List<Recipe> recipeMap, int efficiency) {
super(aID, aName, recipeMap, efficiency);
}
public GT_MetaTileEntity_SemifluidGenerator() {}
public GT_MetaTileEntity_SemifluidGenerator(List<Recipe> recipeMap, int efficiency) {
super(recipeMap, efficiency);
}
@Override public boolean isFacingValid(byte aFacing) {return false;}
@Override public int maxEUOutput() {return this.getBaseMetaTileEntity().isAllowedToWork() ? 8 : 0;}
@Override public void onRightclick(EntityPlayer aPlayer) {this.getBaseMetaTileEntity().openGUI(aPlayer, 120);}
@Override public List<Recipe> getRecipes() {return Recipe.sDenseLiquidFuels;}
@Override public int getEfficiency() {return 100;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
return new GT_MetaTileEntity_SemifluidGenerator();
return new GT_MetaTileEntity_SemifluidGenerator(recipeMap, efficiency);
}
@Override

View file

@ -10,21 +10,21 @@ import net.minecraft.entity.player.EntityPlayer;
public class GT_MetaTileEntity_ThermalGenerator extends GT_MetaTileEntity_BasicGenerator {
public GT_MetaTileEntity_ThermalGenerator(int aID, String aName) {
super(aID, aName);
public GT_MetaTileEntity_ThermalGenerator(int aID, String aName, List<Recipe> recipeMap, int efficiency) {
super(aID, aName, recipeMap, efficiency);
}
public GT_MetaTileEntity_ThermalGenerator() {}
public GT_MetaTileEntity_ThermalGenerator(List<Recipe> recipeMap, int efficiency) {
super(recipeMap, efficiency);
}
@Override public boolean isFacingValid(byte aFacing) { return false;}
@Override public int maxEUOutput() {return this.getBaseMetaTileEntity().isAllowedToWork() ? 24 : 0;}
@Override public void onRightclick(EntityPlayer aPlayer) {this.getBaseMetaTileEntity().openGUI(aPlayer, 119);}
@Override public List<Recipe> getRecipes() {return Recipe.sHotFuels;}
@Override public int getEfficiency() {return 80;}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
return new GT_MetaTileEntity_ThermalGenerator();
return new GT_MetaTileEntity_ThermalGenerator(recipeMap, efficiency);
}
@Override

View file

@ -5,30 +5,41 @@ import java.util.Map;
import gregtechmod.api.GregTech_API;
import gregtechmod.api.interfaces.IGregTechTileEntity;
import gregtechmod.api.interfaces.IRecipeWorkable;
import gregtechmod.api.metatileentity.MetaTileEntity;
import gregtechmod.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
import gregtechmod.api.recipe.Recipe;
import gregtechmod.api.recipe.RecipeLogic;
import gregtechmod.api.recipe.RecipeMaps;
import gregtechmod.api.util.GT_Log;
import gregtechmod.api.util.GT_ModHandler;
import gregtechmod.api.util.GT_Utility;
import gregtechmod.api.util.InfoBuilder;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidStack;
public class GT_MetaTileEntity_Centrifuge extends GT_MetaTileEntity_BasicTank {
public class GT_MetaTileEntity_Centrifuge extends GT_MetaTileEntity_BasicTank implements IRecipeWorkable {
private byte mSpeed = 0;
private int mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0;
private ItemStack mOutputItem1, mOutputItem2, mOutputItem3, mOutputItem4;
private RecipeLogic recipeLogic;
private int mSpeed = 0;
public GT_MetaTileEntity_Centrifuge(int aID, String mName) {
super(aID, mName);
init();
}
public GT_MetaTileEntity_Centrifuge() {
init();
}
private void init() {
recipeLogic = new RecipeLogic(RecipeMaps.sCentrifugeRecipes, this);
recipeLogic.moveItems = false;
// recipeLogic.setRecipeProvider(() -> {
//
// return null;
// });
}
@Override public boolean isTransformerUpgradable() {return true;}
@ -46,9 +57,8 @@ public class GT_MetaTileEntity_Centrifuge extends GT_MetaTileEntity_BasicTank {
@Override public int getInvSize() {return 7;}
@Override public void onRightclick(EntityPlayer aPlayer) {getBaseMetaTileEntity().openGUI(aPlayer, 146);}
@Override public boolean isAccessAllowed(EntityPlayer aPlayer) {return true;}
@Override public int getProgresstime() {return mProgresstime;}
@Override public int maxProgresstime() {return mMaxProgresstime;}
@Override public int increaseProgress(int aProgress) {mProgresstime += aProgress; return mMaxProgresstime-mProgresstime;}
@Override public RecipeLogic getRecipeLogic() {return recipeLogic;}
@Override public int increaseProgress(int aProgress) {recipeLogic.increaseProgressTime(aProgress); return recipeLogic.getMaxProgressTime()-recipeLogic.getProgressTime();}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
@ -58,55 +68,13 @@ public class GT_MetaTileEntity_Centrifuge extends GT_MetaTileEntity_BasicTank {
@Override
public void saveNBTData(NBTTagCompound aNBT) {
super.saveNBTData(aNBT);
aNBT.setInteger("mEUt", mEUt);
aNBT.setInteger("mProgresstime", mProgresstime);
aNBT.setInteger("mMaxProgresstime", mMaxProgresstime);
if (mOutputItem1 != null) {
NBTTagCompound tNBT = new NBTTagCompound();
mOutputItem1.writeToNBT(tNBT);
aNBT.setTag("mOutputItem1", tNBT);
}
if (mOutputItem2 != null) {
NBTTagCompound tNBT = new NBTTagCompound();
mOutputItem2.writeToNBT(tNBT);
aNBT.setTag("mOutputItem2", tNBT);
}
if (mOutputItem3 != null) {
NBTTagCompound tNBT = new NBTTagCompound();
mOutputItem3.writeToNBT(tNBT);
aNBT.setTag("mOutputItem3", tNBT);
}
if (mOutputItem4 != null) {
NBTTagCompound tNBT = new NBTTagCompound();
mOutputItem4.writeToNBT(tNBT);
aNBT.setTag("mOutputItem4", tNBT);
}
recipeLogic.loadFromNBT(aNBT);
}
@Override
public void loadNBTData(NBTTagCompound aNBT) {
super.loadNBTData(aNBT);
mEUt = aNBT.getInteger("mEUt");
mProgresstime = aNBT.getInteger("mProgresstime");
mMaxProgresstime = aNBT.getInteger("mMaxProgresstime");
NBTTagCompound tNBT1 = (NBTTagCompound)aNBT.getTag("mOutputItem1");
if (tNBT1 != null) {
mOutputItem1 = GT_Utility.loadItem(tNBT1);
}
NBTTagCompound tNBT2 = (NBTTagCompound)aNBT.getTag("mOutputItem2");
if (tNBT2 != null) {
mOutputItem2 = GT_Utility.loadItem(tNBT2);
}
NBTTagCompound tNBT3 = (NBTTagCompound)aNBT.getTag("mOutputItem3");
if (tNBT3 != null) {
mOutputItem3 = GT_Utility.loadItem(tNBT3);
}
NBTTagCompound tNBT4 = (NBTTagCompound)aNBT.getTag("mOutputItem4");
if (tNBT4 != null) {
mOutputItem4 = GT_Utility.loadItem(tNBT4);
}
recipeLogic.loadFromNBT(aNBT);
}
@Override public boolean doesFillContainers() {return false;}
@ -123,130 +91,61 @@ public class GT_MetaTileEntity_Centrifuge extends GT_MetaTileEntity_BasicTank {
@Override
public void onPostTick() {
if (getBaseMetaTileEntity().isServerSide()) {
if (getBaseMetaTileEntity().getOverclockerUpgradeCount() >=2) {
mSpeed = 2;
} else if (getBaseMetaTileEntity().getOverclockerUpgradeCount() == 1) {
mSpeed = 1;
} else {
mSpeed = 0;
}
if (mMaxProgresstime > 0) {
getBaseMetaTileEntity().setActive(true);
if (mProgresstime < 0 || getBaseMetaTileEntity().decreaseStoredEnergyUnits(mEUt*(int)Math.pow(4, getBaseMetaTileEntity().getOverclockerUpgradeCount()), false)) {
if ((mProgresstime+=(int)Math.pow(2, getBaseMetaTileEntity().getOverclockerUpgradeCount()))>=mMaxProgresstime) {
addOutputProducts();
mOutputItem1 = null;
mOutputItem2 = null;
mOutputItem3 = null;
mOutputItem4 = null;
mProgresstime = 0;
mMaxProgresstime = 0;
getBaseMetaTileEntity().setErrorDisplayID(0);
}
} else {
getBaseMetaTileEntity().setActive(false);
if (GregTech_API.sConstantEnergy) {
mProgresstime = -10;
getBaseMetaTileEntity().setErrorDisplayID(1);
}
}
} else {
getBaseMetaTileEntity().setActive(false);
if (getBaseMetaTileEntity().isAllowedToWork() && getBaseMetaTileEntity().getUniversalEnergyStored() > 100) checkRecipe();
}
mSpeed = getBaseMetaTileEntity().getOverclockerUpgradeCount();
recipeLogic.update();
}
}
private void addOutputProducts() {
if (mOutputItem1 != null)
if (mInventory[2] == null)
mInventory[2] = GT_Utility.copy(mOutputItem1);
else if (GT_Utility.areStacksEqual(mInventory[2], mOutputItem1))
mInventory[2].stackSize = Math.min(mOutputItem1.getMaxStackSize(), mOutputItem1.stackSize + mInventory[2].stackSize);
if (mOutputItem2 != null)
if (mInventory[3] == null)
mInventory[3] = GT_Utility.copy(mOutputItem2);
else if (GT_Utility.areStacksEqual(mInventory[3], mOutputItem2))
mInventory[3].stackSize = Math.min(mOutputItem2.getMaxStackSize(), mOutputItem2.stackSize + mInventory[3].stackSize);
if (mOutputItem3 != null)
if (mInventory[4] == null)
mInventory[4] = GT_Utility.copy(mOutputItem3);
else if (GT_Utility.areStacksEqual(mInventory[4], mOutputItem3))
mInventory[4].stackSize = Math.min(mOutputItem3.getMaxStackSize(), mOutputItem3.stackSize + mInventory[4].stackSize);
if (mOutputItem4 != null)
if (mInventory[5] == null)
mInventory[5] = GT_Utility.copy(mOutputItem4);
else if (GT_Utility.areStacksEqual(mInventory[5], mOutputItem4))
mInventory[5].stackSize = Math.min(mOutputItem4.getMaxStackSize(), mOutputItem4.stackSize + mInventory[5].stackSize);
}
private boolean spaceForOutput(Recipe aRecipe) {
if (mInventory[2] == null || aRecipe.getOutput(0) == null || (mInventory[2].stackSize + aRecipe.getOutput(0).stackSize <= mInventory[2].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[2], aRecipe.getOutput(0))))
if (mInventory[3] == null || aRecipe.getOutput(1) == null || (mInventory[3].stackSize + aRecipe.getOutput(1).stackSize <= mInventory[3].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[3], aRecipe.getOutput(1))))
if (mInventory[4] == null || aRecipe.getOutput(2) == null || (mInventory[4].stackSize + aRecipe.getOutput(2).stackSize <= mInventory[4].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[4], aRecipe.getOutput(2))))
if (mInventory[5] == null || aRecipe.getOutput(3) == null || (mInventory[5].stackSize + aRecipe.getOutput(3).stackSize <= mInventory[5].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[5], aRecipe.getOutput(3))))
public boolean spaceForOutput(Recipe aRecipe) {
if (mInventory[2] == null || aRecipe.getOutputs()[0] == null || (mInventory[2].stackSize + aRecipe.getOutputs()[0].stackSize <= mInventory[2].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[2], aRecipe.getOutputs()[0])))
if (mInventory[3] == null || aRecipe.getOutputs()[1] == null || (mInventory[3].stackSize + aRecipe.getOutputs()[1].stackSize <= mInventory[3].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[3], aRecipe.getOutputs()[1])))
if (mInventory[4] == null || aRecipe.getOutputs()[2] == null || (mInventory[4].stackSize + aRecipe.getOutputs()[2].stackSize <= mInventory[4].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[4], aRecipe.getOutputs()[2])))
if (mInventory[5] == null || aRecipe.getOutputs()[3] == null || (mInventory[5].stackSize + aRecipe.getOutputs()[3].stackSize <= mInventory[5].getMaxStackSize() && GT_Utility.areStacksEqual(mInventory[5], aRecipe.getOutputs()[3])))
return true;
GT_Log.log.error("NO space: " + mInventory[2] + " " + mInventory[3] + " " + mInventory[4] + " " + mInventory[5]);
return false;
}
private boolean checkRecipe() {
Recipe tRecipe = Recipe.findEqualRecipe(false, false, Recipe.sCentrifugeRecipes, mInventory[0], mInventory[1]);
if (tRecipe != null) {
if (spaceForOutput(tRecipe) && tRecipe.isRecipeInputEqual(true, true, mInventory[0], mInventory[1])) {
if (mInventory[0] != null) if (mInventory[0].stackSize == 0) mInventory[0] = null;
if (mInventory[1] != null) if (mInventory[1].stackSize == 0) mInventory[1] = null;
mMaxProgresstime = tRecipe.mDuration;
mEUt = tRecipe.mEUt;
mOutputItem1 = GT_Utility.copy(tRecipe.getOutput(0));
mOutputItem2 = GT_Utility.copy(tRecipe.getOutput(1));
mOutputItem3 = GT_Utility.copy(tRecipe.getOutput(2));
mOutputItem4 = GT_Utility.copy(tRecipe.getOutput(3));
return true;
}
}
if (mFluid != null) {
ItemStack tStack = GT_Utility.fillFluidContainer(mFluid, new ItemStack(Items.bucket, 1));
FluidStack tFluid = GT_Utility.getFluidForFilledItem(tStack);
if (tStack != null && tFluid != null) {
tStack.stackSize = mFluid.amount / tFluid.amount;
int tAmount = tStack.stackSize;
tRecipe = Recipe.findEqualRecipe(false, false, Recipe.sCentrifugeRecipes, tStack, mInventory[1]);
if (tRecipe != null) {
if (spaceForOutput(tRecipe) && tRecipe.isRecipeInputEqual(true, true, tStack, mInventory[1])) {
mFluid.amount -= (tAmount - tStack.stackSize) * tFluid.amount;
if (mFluid.amount <= 0) mFluid = null;
if (mInventory[1] != null) if (mInventory[1].stackSize == 0) mInventory[1] = null;
mMaxProgresstime = tRecipe.mDuration;
mEUt = tRecipe.mEUt;
mOutputItem1 = GT_Utility.copy(tRecipe.getOutput(0));
mOutputItem2 = GT_Utility.copy(tRecipe.getOutput(1));
mOutputItem3 = GT_Utility.copy(tRecipe.getOutput(2));
if (!GT_Utility.areStacksEqual(tRecipe.getOutput(3), new ItemStack(Items.bucket, 1))) mOutputItem4 = GT_Utility.copy(tRecipe.getOutput(3));
return true;
}
}
}
}
// if (mFluid != null) {
// ItemStack tStack = GT_Utility.fillFluidContainer(mFluid, new ItemStack(Items.bucket, 1));
// FluidStack tFluid = GT_Utility.getFluidForFilledItem(tStack);
// if (tStack != null && tFluid != null) {
// tStack.stackSize = mFluid.amount / tFluid.amount;
// int tAmount = tStack.stackSize;
// tRecipe = Recipe.findEqualRecipe(false, false, Recipe.sCentrifugeRecipes, tStack, mInventory[1]);
// if (tRecipe != null) {
// if (spaceForOutput(tRecipe) && tRecipe.isRecipeInputEqual(true, true, tStack, mInventory[1])) {
// mFluid.amount -= (tAmount - tStack.stackSize) * tFluid.amount;
// if (mFluid.amount <= 0) mFluid = null;
// if (mInventory[1] != null) if (mInventory[1].stackSize == 0) mInventory[1] = null;
// mMaxProgresstime = tRecipe.mDuration;
// mEUt = tRecipe.mEUt;
// mOutputItem1 = GT_Utility.copy(tRecipe.getOutput(0));
// mOutputItem2 = GT_Utility.copy(tRecipe.getOutput(1));
// mOutputItem3 = GT_Utility.copy(tRecipe.getOutput(2));
// if (!GT_Utility.areStacksEqual(tRecipe.getOutput(3), new ItemStack(Items.bucket, 1))) mOutputItem4 = GT_Utility.copy(tRecipe.getOutput(3));
// return true;
// }
// }
// }
// }
return false;
}
@Override
public int getTextureIndex(byte aSide, byte aFacing, boolean aActive, boolean aRedstone) {
if (aSide == 0) return 32;
if (aSide == 1) return aActive?mSpeed==2?44:mSpeed==1?43:42:41;
return aActive?mSpeed==2?28:mSpeed==1?27:26:25;
if (aSide == 1) return aActive ? mSpeed >= 2 ? 44 : mSpeed == 1 ? 43 : 42 : 41;
return aActive ? mSpeed >= 2 ? 28 : mSpeed == 1 ? 27 : 26 : 25;
}
@Override
public Map<String, List<Object>> getInfoData() {
return InfoBuilder.create()
.newKey("sensor.progress.percentage", mProgresstime * 100.0D / mMaxProgresstime)
.newKey("sensor.progress.secs", mProgresstime / 20)
.newKey("sensor.progress.secs", mMaxProgresstime / 20)
.newKey("sensor.progress.percentage", recipeLogic.getProgressTime() * 100.0D / recipeLogic.getMaxProgressTime())
.newKey("sensor.progress.secs", recipeLogic.getProgressTime() / 20)
.newKey("sensor.progress.secs", recipeLogic.getMaxProgressTime() / 20)
.build();
}
@ -276,9 +175,43 @@ public class GT_MetaTileEntity_Centrifuge extends GT_MetaTileEntity_BasicTank {
@Override
public byte getUpdateData() {
return mSpeed;
return (byte) mSpeed;
}
@Override public int getTankPressure() {return -100;}
@Override public int getCapacity() {return 64000;}
@Override
public void startProcess() {}
@Override
public void endProcess() {
getBaseMetaTileEntity().setErrorDisplayID(0);
}
@Override
public void stutterProcess() {
if (GregTech_API.sConstantEnergy) {
int val = (int) (recipeLogic.getMaxProgressTime() * 0.1D);
if (recipeLogic.getProgressTime() > val)
recipeLogic.increaseProgressTime(-val);
getBaseMetaTileEntity().setErrorDisplayID(1);
}
}
@Override
public boolean allowToCheckRecipe() {
return true;
}
@Override
public int[] getInputSlots() {
return new int[] {0, 1};
}
@Override
public int[] getOutputSlots() {
return new int[] {2, 3, 4, 5};
}
}

View file

@ -44,16 +44,16 @@ public class GT_MetaTileEntityLoader implements Runnable {
new GT_MetaTileEntity_QuantumTank ( 30, "GT_QuantumTank");
new GT_MetaTileEntity_ImplosionCompressor ( 31, "GT_ImplosionCompressor");
new GT_MetaTileEntity_Sawmill ( 32, "GT_Sawmill");
new GT_MetaTileEntity_DieselGenerator ( 33, "GT_DieselGenerator");
new GT_MetaTileEntity_GasTurbine ( 34, "GT_GasTurbine");
new GT_MetaTileEntity_ThermalGenerator ( 35, "GT_ThermalGenerator");
new GT_MetaTileEntity_SemifluidGenerator ( 36, "GT_SemifluidGenerator");
new GT_MetaTileEntity_PlasmaGenerator ( 37, "GT_PlasmaGenerator");
new GT_MetaTileEntity_DieselGenerator ( 33, "GT_DieselGenerator" , RecipeMaps.sDieselFuels , 100);
new GT_MetaTileEntity_GasTurbine ( 34, "GT_GasTurbine" , RecipeMaps.sTurbineFuels , 75 );
new GT_MetaTileEntity_ThermalGenerator ( 35, "GT_ThermalGenerator" , RecipeMaps.sHotFuels , 80 );
new GT_MetaTileEntity_SemifluidGenerator ( 36, "GT_SemifluidGenerator" , RecipeMaps.sDenseLiquidFuels , 100);
new GT_MetaTileEntity_PlasmaGenerator ( 37, "GT_PlasmaGenerator" , RecipeMaps.sPlasmaFuels , 100);
new GT_MetaTileEntity_VacuumFreezer ( 38, "GT_VacuumFreezer");
new GT_MetaTileEntity_ElectricRegulatorAdvanced ( 39, "GT_RegulatorAdvanced");
new GT_MetaTileEntity_DragonEggEnergySiphon ( 40, "GT_DragonEggEnergySiphon");
new GT_MetaTileEntity_ChemicalReactor ( 41, "GT_ChemicalReactor");
new GT_MetaTileEntity_MagicEnergyConverter ( 42, "GT_MagicConverter");
new GT_MetaTileEntity_MagicEnergyConverter ( 42, "GT_MagicConverter" , RecipeMaps.sMagicFuels , 100);
new GT_MetaTileEntity_MagicEnergyAbsorber ( 43, "GT_MagicAbsorber");
new GT_MetaTileEntity_DistillationTower ( 44, "GT_DistillationTower");
new GT_MetaTileEntity_Safe ( 45, "GT_Safe");

View file

@ -348,6 +348,7 @@ metatileentity.TRANSFORMERS.tooltip=%d Transformer Upgrades
metatileentity.ENERGYCELLS.tooltip=%d Energy Cell Upgrades
metatileentity.STEAMTANKS.tooltip=%d Steam Tank Upgrades
metatileentity.EUSTORAGES.tooltip=%d Additional EU-Storage
metatileentity.NOT_ENOUGH_ENERGY=Insufficient Energy Line!
item.180k_Helium_Coolantcell.name=180k Helium Coolant Cell
item.180k_NaK_Coolantcell.name=180k NaK Coolantcell