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 --- .../machines/multiblock/MultiBlock_CokeOven.java | 163 +++++++++++++++++++++ .../machines/multiblock/MultiBlock_Macerator.java | 48 +++--- .../multiblock/logic/CokeOvenProcessingLogic.java | 64 ++++++++ 3 files changed, 258 insertions(+), 17 deletions(-) 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/machines') 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