From 655cc902d3df19a1ac2bfaa38cc928ed629d0171 Mon Sep 17 00:00:00 2001 From: BlueWeabo Date: Sat, 1 Apr 2023 17:06:06 +0300 Subject: Implement Power Logic, Pollution Logic and Processing Logic for MuTEs and many other things (#1823) * update bs 2 * fuel consumption and energy implementation. clean up * don't register XD * some clean up * coke oven work * semi-working coke oven somehow i broke the activating of the multiblock * power logic * PowerLogic * clean up, saving loading nbt * small cleanup and pollution * pollution working :P * Energy mostly working, wallsharing * processing logic * fix npe and deregister * review requests * missed one * remove extra 0 --- .../casings/functional/MotorCasing.java | 11 ++ .../casings/upgrade/InventoryUpgrade.java | 104 +++++++++++++ .../machines/multiblock/MultiBlock_CokeOven.java | 163 +++++++++++++++++++++ .../machines/multiblock/MultiBlock_Macerator.java | 48 +++--- .../multiblock/logic/CokeOvenProcessingLogic.java | 64 ++++++++ 5 files changed, 373 insertions(+), 17 deletions(-) create mode 100644 src/main/java/gregtech/common/tileentities/casings/functional/MotorCasing.java create mode 100644 src/main/java/gregtech/common/tileentities/casings/upgrade/InventoryUpgrade.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_CokeOven.java create mode 100644 src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java (limited to 'src/main/java/gregtech/common/tileentities') diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/MotorCasing.java b/src/main/java/gregtech/common/tileentities/casings/functional/MotorCasing.java new file mode 100644 index 0000000000..32a53d418a --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/casings/functional/MotorCasing.java @@ -0,0 +1,11 @@ +package gregtech.common.tileentities.casings.functional; + +import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing; + +public class MotorCasing extends FunctionalCasing { + + @Override + public String getTileEntityName() { + return "gt.multitileentity.multiblock.functional.motor"; + } +} diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/InventoryUpgrade.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/InventoryUpgrade.java new file mode 100644 index 0000000000..de144caf11 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/InventoryUpgrade.java @@ -0,0 +1,104 @@ +package gregtech.common.tileentities.casings.upgrade; + +import java.util.UUID; + +import net.minecraft.nbt.NBTTagCompound; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.multitileentity.interfaces.IMultiBlockController; +import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; +import gregtech.api.net.GT_Packet_MultiTileEntity; + +public class InventoryUpgrade extends UpgradeCasing { + + public UUID mInventoryID; + public static final int INPUT = 0; + public static final int OUTPUT = 1; + public static final int BOTH = 2; + private String mInventoryName = "inventory"; + private int mInventorySize; + private int mType = BOTH; + + public String getInventoryName() { + return mInventoryName; + } + + public void setInventoryName(String aInventoryName) { + mInventoryName = aInventoryName; + } + + @Override + protected void customWork(IMultiBlockController aTarget) { + int tInvSize = mInventorySize; + if (mType == BOTH) { + tInvSize /= 2; + } + aTarget.registerInventory(mInventoryName, mInventoryID.toString(), tInvSize, mType); + } + + @Override + public String getTileEntityName() { + return "gt.multitileentity.multiblock.inventory"; + } + + @Override + public void readMultiTileNBT(NBTTagCompound aNBT) { + super.readMultiTileNBT(aNBT); + if (aNBT.hasKey(NBT.UPGRADE_INVENTORY_UUID)) { + mInventoryID = UUID.fromString(aNBT.getString(NBT.UPGRADE_INVENTORY_UUID)); + } else { + mInventoryID = UUID.randomUUID(); + } + mInventorySize = aNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE); + mInventoryName = aNBT.getString(NBT.UPGRADE_INVENTORY_NAME); + + } + + @Override + public void writeMultiTileNBT(NBTTagCompound aNBT) { + super.writeMultiTileNBT(aNBT); + aNBT.setString(NBT.UPGRADE_INVENTORY_UUID, mInventoryID.toString()); + aNBT.setString(NBT.UPGRADE_INVENTORY_NAME, mInventoryName); + } + + @Override + protected void onBaseTEDestroyed() { + super.onBaseTEDestroyed(); + unregisterInventories(); + } + + private void unregisterInventories() { + final IMultiBlockController controller = getTarget(false); + if (controller != null) { + controller.unregisterInventory(mInventoryName, mInventoryID.toString(), mType); + } + } + + @Override + public boolean hasGui(byte aSide) { + return true; + } + + @Override + public void addUIWidgets(Builder builder, UIBuildContext buildContext) { + builder.widget(new TextFieldWidget().setGetter(() -> mInventoryName).setSetter((val) -> { + mInventoryName = val; + final IMultiBlockController controller = getTarget(false); + if (controller != null) { + controller.changeInventoryName(mInventoryName, mInventoryID.toString(), mType); + } + }).setSize(100, 25).setPos(50, 30)); + } + + @Override + public GT_Packet_MultiTileEntity getClientDataPacket() { + final GT_Packet_MultiTileEntity packet = super.getClientDataPacket(); + String name = getInventoryName(); + packet.setInventoryName(name); + return packet; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_CokeOven.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_CokeOven.java new file mode 100644 index 0000000000..b69909d9fb --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_CokeOven.java @@ -0,0 +1,163 @@ +package gregtech.common.tileentities.machines.multiblock; + +import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN; +import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizon.structurelib.util.Vec3Impl; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import gregtech.GT_Mod; +import gregtech.api.enums.GT_Values; +import gregtech.api.logic.PollutionLogic; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.logic.interfaces.PollutionLogicHost; +import gregtech.api.logic.interfaces.ProcessingLogicHost; +import gregtech.api.multitileentity.enums.GT_MultiTileCasing; +import gregtech.api.multitileentity.multiblock.base.MultiBlockController; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.common.tileentities.machines.multiblock.logic.CokeOvenProcessingLogic; + +public class MultiBlock_CokeOven extends MultiBlockController + implements PollutionLogicHost, ProcessingLogicHost { + + private static IStructureDefinition STRUCTURE_DEFINITION = null; + private static final Vec3Impl OFFSET = new Vec3Impl(1, 1, 0); + private static final String MAIN = "Main"; + private static final PollutionLogic POLLUTION_LOGIC = new PollutionLogic().setPollutionAmount(10); + private final ProcessingLogic PROCESSING_LOGIC = new CokeOvenProcessingLogic(); + + public MultiBlock_CokeOven() { + super(); + setElectric(false); + } + + @Override + public void construct(ItemStack trigger, boolean hintsOnly) { + buildState.startBuilding(getStartingStructureOffset()); + buildPiece(MAIN, trigger, hintsOnly, buildState.stopBuilding()); + } + + @Override + public boolean checkMachine() { + buildState.startBuilding(getStartingStructureOffset()); + return checkPiece(MAIN, buildState.stopBuilding()); + } + + @Override + public int survivalConstruct(ItemStack trigger, int elementBudget, ISurvivalBuildEnvironment env) { + buildState.startBuilding(getStartingStructureOffset()); + return survivalBuildPiece(MAIN, trigger, buildState.stopBuilding(), elementBudget, env, false); + } + + @Override + public short getCasingRegistryID() { + return 0; + } + + @Override + public short getCasingMeta() { + return GT_MultiTileCasing.CokeOven.getId(); + } + + @Override + protected GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Coke Oven").addInfo("Used for charcoal").beginStructureBlock(3, 3, 3, true) + .addCasingInfoExactly("Coke Oven Bricks", 25, false) + .addPollutionAmount(POLLUTION_LOGIC.getPollutionAmount()).toolTipFinisher(GT_Values.AuthorBlueWeabo); + return tt; + } + + @Override + public Vec3Impl getStartingStructureOffset() { + return OFFSET; + } + + @Override + public IStructureDefinition getStructureDefinition() { + if (STRUCTURE_DEFINITION == null) { + STRUCTURE_DEFINITION = StructureDefinition.builder().addShape( + MAIN, + new String[][] { { "AAA", "A~A", "AAA" }, { "AAA", "A-A", "AAA" }, { "AAA", "AAA", "AAA" } }) + .addElement( + 'A', + addMultiTileCasing("gt.multitileentity.casings", getCasingMeta(), ITEM_IN | ITEM_OUT)) + .build(); + } + return STRUCTURE_DEFINITION; + } + + @Override + protected boolean hasFluidInput() { + return false; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget(new SlotWidget(inputInventory, 0).setPos(18, 18).setSize(18, 18)); + builder.widget(new SlotWidget(outputInventory, 0).setPos(36, 36).setSize(18, 18)); + builder.widget(createButtons()); + } + + @Override + protected void addTitleTextStyle(ModularWindow.Builder builder, String title) { + final int TAB_PADDING = 3; + final int TITLE_PADDING = 2; + int titleWidth = 0, titleHeight = 0; + if (NetworkUtils.isClient()) { + final FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + // noinspection unchecked + final List titleLines = fontRenderer + .listFormattedStringToWidth(title, getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2); + titleWidth = titleLines.size() > 1 ? getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2 + : fontRenderer.getStringWidth(title); + // noinspection PointlessArithmeticExpression + titleHeight = titleLines.size() * fontRenderer.FONT_HEIGHT + (titleLines.size() - 1); + } + + final DrawableWidget tab = new DrawableWidget(); + final TextWidget text = new TextWidget(title).setDefaultColor(getTitleColor()) + .setTextAlignment(Alignment.CenterLeft).setMaxWidth(titleWidth); + if (GT_Mod.gregtechproxy.mTitleTabStyle == 1) { + tab.setDrawable(getGUITextureSet().getTitleTabAngular()).setPos(0, -(titleHeight + TAB_PADDING) + 1) + .setSize(getGUIWidth(), titleHeight + TAB_PADDING * 2); + text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight + TAB_PADDING); + } else { + tab.setDrawable(getGUITextureSet().getTitleTabDark()).setPos(0, -(titleHeight + TAB_PADDING * 2) + 1) + .setSize(titleWidth + (TAB_PADDING + TITLE_PADDING) * 2, titleHeight + TAB_PADDING * 2 - 1); + text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight); + } + builder.widget(tab).widget(text); + } + + @Override + public String getLocalName() { + return StatCollector.translateToLocal("gt.multiBlock.controller.cokeOven"); + } + + @Override + public PollutionLogic getPollutionLogic() { + return POLLUTION_LOGIC; + } + + @Override + public ProcessingLogic getProcessingLogic() { + return PROCESSING_LOGIC; + } +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java index ddf232680d..3c0619e667 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java @@ -16,6 +16,7 @@ import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHIN import net.minecraft.block.Block; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import org.apache.commons.lang3.tuple.Pair; @@ -23,6 +24,7 @@ import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureDefinition; import com.gtnewhorizon.structurelib.util.Vec3Impl; +import gregtech.api.enums.SoundResource; import gregtech.api.enums.TierEU; import gregtech.api.interfaces.ITexture; import gregtech.api.multitileentity.multiblock.base.MultiBlock_Stackable; @@ -33,7 +35,11 @@ import gregtech.api.util.GT_Recipe.GT_Recipe_Map; public class MultiBlock_Macerator extends MultiBlock_Stackable { - private IStructureDefinition STRUCTURE_DEFINITION = null; + private static IStructureDefinition STRUCTURE_DEFINITION = null; + + public MultiBlock_Macerator() { + super(); + } @Override public String getTileEntityName() { @@ -52,30 +58,32 @@ public class MultiBlock_Macerator extends MultiBlock_Stackable tItemInputs : getItemInputsForEachInventory()) { - if (processRecipe(aStack, tItemInputs.getLeft(), tItemInputs.getRight())) { + if (processRecipe(tItemInputs.getLeft(), tItemInputs.getRight())) { return true; } } return false; } else { ItemStack[] tItemInputs = getInventoriesForInput().getStacks().toArray(new ItemStack[0]); - return processRecipe(aStack, tItemInputs, null); + return processRecipe(tItemInputs, null); } } - private boolean processRecipe(ItemStack aStack, ItemStack[] aItemInputs, String aInventory) { + private boolean processRecipe(ItemStack[] aItemInputs, String aInventory) { GT_Recipe_Map tRecipeMap = GT_Recipe_Map.sMaceratorRecipes; GT_Recipe tRecipe = tRecipeMap.findRecipe(this, false, TierEU.IV, null, aItemInputs); if (tRecipe == null) { @@ -185,9 +193,15 @@ public class MultiBlock_Macerator extends MultiBlock_Stackable input.stackSize; + } + + protected ItemStack findRecipe(ItemStack input) { + for (int oreId : getOreIDs(input)) { + if (oreId == COAL_ORE_ID) { + return GT_OreDictUnificator.get("fuelCoke", null, 1); + } else if (oreId == COAL_BLOCK_ORE_ID) { + timeMultiplier = 9; + return GT_ModHandler.getModItem("Railcraft", "cube", 1, 0); + } else if (oreId == WOOD_ORE_ID) { + return new ItemStack(Items.coal, 1, 1); + } else if (oreId == SUGARCANE_ORE_ID) { + return GT_OreDictUnificator.get("itemCharcoalSugar", null, 1); + } else if (oreId == SUGAR_CHARCOAL_ORE_ID) { + return GT_OreDictUnificator.get("itemCokeSugar", null, 1); + } else if (oreId == CACTUS_ORE_ID) { + return GT_OreDictUnificator.get("itemCharcoalCactus", null, 1); + } else if (oreId == CACTUS_CHARCOAL_ORE_ID) { + return GT_OreDictUnificator.get("itemCokeCactus", null, 1); + } + } + return null; + } +} -- cgit