diff --git a/src/main/java/gregtech/GregTechMod.java b/src/main/java/gregtech/GregTechMod.java index 0b77ce4b46..83a99ecfa0 100644 --- a/src/main/java/gregtech/GregTechMod.java +++ b/src/main/java/gregtech/GregTechMod.java @@ -3,6 +3,7 @@ import codechicken.lib.CodeChickenLib; import crafttweaker.CraftTweakerAPI; import gregtech.api.GTValues; +import gregtech.api.situation.Situations; import gregtech.api.capability.SimpleCapabilityManager; import gregtech.api.cover.CoverBehaviorUIFactory; import gregtech.api.items.gui.PlayerInventoryUIFactory; @@ -82,6 +83,7 @@ public void onConstruction(FMLConstructionEvent event) { public void onPreInit(FMLPreInitializationEvent event) { GTLog.init(event.getModLog()); NetworkHandler.init(); + Situations.init(); MetaTileEntityUIFactory.INSTANCE.init(); PlayerInventoryUIFactory.INSTANCE.init(); CoverBehaviorUIFactory.INSTANCE.init(); diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index ffcdc23b58..95078f4f97 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -27,6 +27,8 @@ import java.util.List; import java.util.Random; +import static gregtech.api.situation.Situations.*; + public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable { public final RecipeMap recipeMap; @@ -34,6 +36,7 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable protected boolean forceRecipeRecheck; protected ItemStack[] lastItemInputs; protected FluidStack[] lastFluidInputs; + protected Recipe currentRecipe; protected Recipe previousRecipe; protected boolean allowOverclocking = true; @@ -48,6 +51,7 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable protected boolean workingEnabled = true; protected boolean hasNotEnoughEnergy; protected boolean wasActiveAndNeedsUpdate; + protected boolean isInputsEmpty; public AbstractRecipeLogic(MetaTileEntity tileEntity, RecipeMap recipeMap) { super(tileEntity); @@ -107,7 +111,16 @@ public void update() { } if (progressTime == 0) { trySearchNewRecipe(); + if (currentRecipe == null) { + if (isInputsEmpty) { + metaTileEntity.setSituation(IDLE); + } else { + metaTileEntity.setSituation(NO_MATCHING_RECIPE); + } + } } + } else { + metaTileEntity.setSituation(DISABLED_BY_CONTROLLER); } if (wasActiveAndNeedsUpdate) { this.wasActiveAndNeedsUpdate = false; @@ -120,6 +133,7 @@ protected void updateRecipeProgress() { boolean drawEnergy = drawEnergy(recipeEUt); if (drawEnergy || (recipeEUt < 0)) { //as recipe starts with progress on 1 this has to be > only not => to compensate for it + metaTileEntity.setSituation(WORKING); if (++progressTime > maxProgressTime) { completeRecipe(); } @@ -127,6 +141,7 @@ protected void updateRecipeProgress() { //only set hasNotEnoughEnergy if this recipe is consuming recipe //generators always have enough energy this.hasNotEnoughEnergy = true; + metaTileEntity.setSituation(INSUFFICIENT_POWER); //if current progress value is greater than 2, decrement it by 2 if (progressTime >= 2) { if (ConfigHolder.insufficientEnergySupplyWipesRecipeProgress) { @@ -140,25 +155,24 @@ protected void updateRecipeProgress() { protected void trySearchNewRecipe() { long maxVoltage = getMaxVoltage(); - Recipe currentRecipe = null; IItemHandlerModifiable importInventory = getInputInventory(); IMultipleTankHandler importFluids = getInputTank(); - if (previousRecipe != null && previousRecipe.matches(false, importInventory, importFluids)) { + if (this.previousRecipe != null && this.previousRecipe.matches(false, importInventory, importFluids)) { //if previous recipe still matches inputs, try to use it - currentRecipe = previousRecipe; + this.currentRecipe = this.previousRecipe; } else { boolean dirty = checkRecipeInputsDirty(importInventory, importFluids); - if (dirty || forceRecipeRecheck) { + if (dirty || this.forceRecipeRecheck) { this.forceRecipeRecheck = false; //else, try searching new recipe for given inputs - currentRecipe = findRecipe(maxVoltage, importInventory, importFluids); - if (currentRecipe != null) { - this.previousRecipe = currentRecipe; + this.currentRecipe = findRecipe(maxVoltage, importInventory, importFluids); + if (this.currentRecipe != null) { + this.previousRecipe = this.currentRecipe; } } } - if (currentRecipe != null && setupAndConsumeRecipeInputs(currentRecipe)) { - setupRecipe(currentRecipe); + if (this.currentRecipe != null && setupAndConsumeRecipeInputs(this.currentRecipe)) { + setupRecipe(this.currentRecipe); } } @@ -183,6 +197,7 @@ protected Recipe findRecipe(long maxVoltage, IItemHandlerModifiable inputs, IMul protected boolean checkRecipeInputsDirty(IItemHandler inputs, IMultipleTankHandler fluidInputs) { boolean shouldRecheckRecipe = false; + this.isInputsEmpty = true; if (lastItemInputs == null || lastItemInputs.length != inputs.getSlots()) { this.lastItemInputs = new ItemStack[inputs.getSlots()]; Arrays.fill(lastItemInputs, ItemStack.EMPTY); @@ -199,6 +214,8 @@ protected boolean checkRecipeInputsDirty(IItemHandler inputs, IMultipleTankHandl } else if (currentStack.getCount() != lastStack.getCount()) { lastStack.setCount(currentStack.getCount()); shouldRecheckRecipe = true; + } else if (!currentStack.isEmpty()) { + this.isInputsEmpty = false; } } for (int i = 0; i < lastFluidInputs.length; i++) { @@ -212,6 +229,8 @@ protected boolean checkRecipeInputsDirty(IItemHandler inputs, IMultipleTankHandl currentStack.amount != lastStack.amount) { lastStack.amount = currentStack.amount; shouldRecheckRecipe = true; + } else if (currentStack != null) { + this.isInputsEmpty = false; } } return shouldRecheckRecipe; @@ -230,11 +249,20 @@ protected boolean setupAndConsumeRecipeInputs(Recipe recipe) { IItemHandlerModifiable exportInventory = getOutputInventory(); IMultipleTankHandler importFluids = getInputTank(); IMultipleTankHandler exportFluids = getOutputTank(); - return (totalEUt >= 0 ? getEnergyStored() >= (totalEUt > getEnergyCapacity() / 2 ? resultOverclock[0] : totalEUt) : - (getEnergyStored() - resultOverclock[0] <= getEnergyCapacity())) && - MetaTileEntity.addItemsToItemHandler(exportInventory, true, recipe.getAllItemOutputs(exportInventory.getSlots())) && - MetaTileEntity.addFluidsToFluidHandler(exportFluids, true, recipe.getFluidOutputs()) && - recipe.matches(true, importInventory, importFluids); + if (!(totalEUt >= 0 ? getEnergyStored() >= (totalEUt > getEnergyCapacity() / 2 ? resultOverclock[0] : totalEUt) : + (getEnergyStored() - resultOverclock[0] <= getEnergyCapacity()))) { + metaTileEntity.setSituation(INSUFFICIENT_POWER_TO_START); + return false; + } + if (!MetaTileEntity.addItemsToItemHandler(exportInventory, true, recipe.getAllItemOutputs(exportInventory.getSlots()))) { + metaTileEntity.setSituation(OUTPUT_SLOTS_FULL); + return false; + } + if (!MetaTileEntity.addFluidsToFluidHandler(exportFluids, true, recipe.getFluidOutputs())) { + metaTileEntity.setSituation(OUTPUT_TANKS_FULL); + return false; + } + return recipe.matches(true, importInventory, importFluids); } protected int[] calculateOverclock(int EUt, long voltage, int duration) { diff --git a/src/main/java/gregtech/api/capability/impl/RecipeLogicSteam.java b/src/main/java/gregtech/api/capability/impl/RecipeLogicSteam.java index fb2ba79e20..bd520b0326 100644 --- a/src/main/java/gregtech/api/capability/impl/RecipeLogicSteam.java +++ b/src/main/java/gregtech/api/capability/impl/RecipeLogicSteam.java @@ -1,6 +1,7 @@ package gregtech.api.capability.impl; import gregtech.api.GTValues; +import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.damagesources.DamageSources; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.recipes.Recipe; @@ -9,6 +10,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.SoundEvents; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.EntitySelectors; @@ -18,7 +20,13 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.items.IItemHandler; + +import java.util.Arrays; + +import static gregtech.api.situation.Situations.*; public class RecipeLogicSteam extends AbstractRecipeLogic { @@ -143,10 +151,56 @@ public void update() { return; if (this.needsVenting && metaTileEntity.getTimer() % 10 == 0) { tryDoVenting(); + if (isVentingStuck()){ + metaTileEntity.setSituation(BLOCKED_VENT); + } } super.update(); } + protected boolean checkRecipeInputsDirty(IItemHandler inputs, IMultipleTankHandler fluidInputs) { + boolean shouldRecheckRecipe = false; + this.isInputsEmpty = true; + if (lastItemInputs == null || lastItemInputs.length != inputs.getSlots()) { + this.lastItemInputs = new ItemStack[inputs.getSlots()]; + Arrays.fill(lastItemInputs, ItemStack.EMPTY); + } + if (lastFluidInputs == null || lastFluidInputs.length != fluidInputs.getTanks()) { + this.lastFluidInputs = new FluidStack[fluidInputs.getTanks()]; + } + for (int i = 0; i < lastItemInputs.length; i++) { + ItemStack currentStack = inputs.getStackInSlot(i); + ItemStack lastStack = lastItemInputs[i]; + if (!areItemStacksEqual(currentStack, lastStack)) { + this.lastItemInputs[i] = currentStack.isEmpty() ? ItemStack.EMPTY : currentStack.copy(); + shouldRecheckRecipe = true; + } else if (currentStack.getCount() != lastStack.getCount()) { + lastStack.setCount(currentStack.getCount()); + shouldRecheckRecipe = true; + } else if (!currentStack.isEmpty()) { + this.isInputsEmpty = false; + } + } + for (int i = 0; i < lastFluidInputs.length; i++) { + if (fluidInputs.getTankAt(i) == steamFluidTank) + continue; + FluidStack currentStack = fluidInputs.getTankAt(i).getFluid(); + FluidStack lastStack = lastFluidInputs[i]; + if ((currentStack == null && lastStack != null) || + (currentStack != null && !currentStack.isFluidEqual(lastStack))) { + this.lastFluidInputs[i] = currentStack == null ? null : currentStack.copy(); + shouldRecheckRecipe = true; + } else if (currentStack != null && lastStack != null && + currentStack.amount != lastStack.amount) { + lastStack.amount = currentStack.amount; + shouldRecheckRecipe = true; + } else if (currentStack != null) { + this.isInputsEmpty = false; + } + } + return shouldRecheckRecipe; + } + @Override protected boolean setupAndConsumeRecipeInputs(Recipe recipe) { return !this.needsVenting && super.setupAndConsumeRecipeInputs(recipe); diff --git a/src/main/java/gregtech/api/cover/CoverBehavior.java b/src/main/java/gregtech/api/cover/CoverBehavior.java index 38fe8da294..1f7d966087 100644 --- a/src/main/java/gregtech/api/cover/CoverBehavior.java +++ b/src/main/java/gregtech/api/cover/CoverBehavior.java @@ -9,9 +9,9 @@ import com.google.common.collect.Lists; import gregtech.api.GTValues; import gregtech.api.gui.IUIHolder; -import gregtech.api.metatileentity.SimpleMachineMetaTileEntity; import gregtech.api.render.SimpleSidedCubeRenderer.RenderSide; import gregtech.api.render.Textures; +import gregtech.api.situation.Situation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -28,6 +28,9 @@ import java.util.List; import java.util.function.Consumer; +import static gregtech.api.situation.Situations.DISABLED_BY_CONTROLLER; +import static gregtech.api.situation.Situations.IDLE; + /** * Represents cover instance attached on the specific side of meta tile entity * Cover filters out interaction and logic of meta tile entity @@ -41,6 +44,7 @@ public abstract class CoverBehavior implements IUIHolder { public final ICoverable coverHolder; public final EnumFacing attachedSide; private int redstoneSignalOutput; + private Situation situation; public CoverBehavior(ICoverable coverHolder, EnumFacing attachedSide) { this.coverHolder = coverHolder; @@ -209,6 +213,14 @@ public boolean isRemote() { return coverHolder.getWorld().isRemote; } + public Situation getSituation() { + return this.situation; + } + + public void setSituation(Situation situation) { + this.situation = situation; + } + @Override public final void markAsDirty() { coverHolder.markDirty(); diff --git a/src/main/java/gregtech/api/gui/GuiTextures.java b/src/main/java/gregtech/api/gui/GuiTextures.java index c1f1d68b1b..388a9da2bb 100644 --- a/src/main/java/gregtech/api/gui/GuiTextures.java +++ b/src/main/java/gregtech/api/gui/GuiTextures.java @@ -45,6 +45,11 @@ public class GuiTextures { //WIDGET UI RELATED public static final TextureArea SLIDER_BACKGROUND = TextureArea.fullImage("textures/gui/widget/slider_background.png"); public static final TextureArea SLIDER_ICON = TextureArea.fullImage("textures/gui/widget/slider.png"); + public static final TextureArea STATUS_IDLING = TextureArea.fullImage("textures/gui/widget/idling.png"); + public static final TextureArea STATUS_WORKING = TextureArea.fullImage("textures/gui/widget/working.png"); + public static final TextureArea STATUS_ERROR =TextureArea.fullImage("textures/gui/widget/error.png"); + public static final TextureArea STATUS_WARNING =TextureArea.fullImage("textures/gui/widget/warning.png"); + //BRONZE public static final TextureArea BRONZE_BACKGROUND = TextureArea.fullImage("textures/gui/steam/bronze/bronze_gui.png"); diff --git a/src/main/java/gregtech/api/gui/Widget.java b/src/main/java/gregtech/api/gui/Widget.java index d53148ddf6..bff03418da 100644 --- a/src/main/java/gregtech/api/gui/Widget.java +++ b/src/main/java/gregtech/api/gui/Widget.java @@ -12,6 +12,7 @@ import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.RenderItem; +import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; @@ -25,6 +26,7 @@ import javax.annotation.Nullable; import java.awt.*; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -44,6 +46,8 @@ public abstract class Widget { private Position selfPosition; private Position position; private Size size; + protected long hoverStartTime = -1L; + protected boolean isMouseHovered; public Widget(Position selfPosition, Size size) { Preconditions.checkNotNull(selfPosition, "selfPosition"); @@ -229,6 +233,25 @@ protected final void writeClientAction(int id, Consumer packetBuff } } + @SideOnly(Side.CLIENT) + public void drawHoveringTooltip(int mouseX, int mouseY, String tooltipHoverString) { + boolean isHovered = isMouseOverElement(mouseX, mouseY); + boolean wasHovered = isMouseHovered; + if (isHovered && !wasHovered) { + this.isMouseHovered = true; + this.hoverStartTime = System.currentTimeMillis(); + } else if (!isHovered && wasHovered) { + this.isMouseHovered = false; + this.hoverStartTime = 0L; + } else if (isHovered) { + long timeSinceHover = System.currentTimeMillis() - hoverStartTime; + if (timeSinceHover > 1000L && tooltipHoverString != null) { + List hoverList = Arrays.asList(I18n.format(tooltipHoverString).split("/n")); + drawHoveringText(ItemStack.EMPTY, hoverList, 300, mouseX, mouseY); + } + } + } + @SideOnly(Side.CLIENT) protected void drawHoveringText(ItemStack itemStack, List tooltip, int maxTextWidth, int mouseX, int mouseY) { Minecraft mc = Minecraft.getMinecraft(); diff --git a/src/main/java/gregtech/api/gui/widgets/CycleButtonWidget.java b/src/main/java/gregtech/api/gui/widgets/CycleButtonWidget.java index 245460763d..d61d1625a4 100644 --- a/src/main/java/gregtech/api/gui/widgets/CycleButtonWidget.java +++ b/src/main/java/gregtech/api/gui/widgets/CycleButtonWidget.java @@ -33,8 +33,6 @@ public class CycleButtonWidget extends Widget { private IntConsumer setOptionExecutor; protected int currentOption; protected String tooltipHoverString; - protected long hoverStartTime = -1L; - protected boolean isMouseHovered; public CycleButtonWidget(int xPosition, int yPosition, int width, int height, String[] optionNames, IntSupplier currentOptionSupplier, IntConsumer setOptionExecutor) { super(new Position(xPosition, yPosition), new Size(width, height)); @@ -93,21 +91,7 @@ public void drawInBackground(int mouseX, int mouseY, IRenderContext context) { @Override public void drawInForeground(int mouseX, int mouseY) { - boolean isHovered = isMouseOverElement(mouseX, mouseY); - boolean wasHovered = isMouseHovered; - if (isHovered && !wasHovered) { - this.isMouseHovered = true; - this.hoverStartTime = System.currentTimeMillis(); - } else if (!isHovered && wasHovered) { - this.isMouseHovered = false; - this.hoverStartTime = 0L; - } else if (isHovered) { - long timeSinceHover = System.currentTimeMillis() - hoverStartTime; - if (timeSinceHover > 1000L && tooltipHoverString != null) { - List hoverList = Arrays.asList(I18n.format(tooltipHoverString).split("/n")); - drawHoveringText(ItemStack.EMPTY, hoverList, 300, mouseX, mouseY); - } - } + drawHoveringTooltip(mouseX,mouseY,tooltipHoverString); } @Override @@ -140,7 +124,6 @@ public boolean mouseClicked(int mouseX, int mouseY, int button) { return false; } - @Override public void handleClientAction(int id, PacketBuffer buffer) { super.handleClientAction(id, buffer); diff --git a/src/main/java/gregtech/api/gui/widgets/SituationWidget.java b/src/main/java/gregtech/api/gui/widgets/SituationWidget.java new file mode 100644 index 0000000000..d2af413756 --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/SituationWidget.java @@ -0,0 +1,176 @@ +package gregtech.api.gui.widgets; + +import gregtech.api.gui.GuiTextures; +import gregtech.api.gui.IRenderContext; +import gregtech.api.gui.Widget; +import gregtech.api.gui.resources.TextureArea; +import gregtech.api.situation.Situation; +import gregtech.api.situation.SituationTypes; +import gregtech.api.util.Position; +import gregtech.api.util.Size; +import net.minecraft.client.resources.I18n; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import java.util.function.Supplier; + +public class SituationWidget extends Widget { + + private final Supplier currentSituationSupplier; + private boolean isHighPressure = false; + private boolean steam = false; + private Situation currentSituation; + protected String tooltipHoverString; + protected int currentId; + + protected TextureArea area; + + public SituationWidget(int xPosition, int yPosition, int width, int height, Supplier getSituation) { + super(new Position(xPosition, yPosition), new Size(width, height)); + this.currentSituationSupplier = getSituation; + this.currentSituation = getSituation.get(); + setTooltipHoverString(); + setImage(); + } + + public SituationWidget(int xPosition, int yPosition, int width, int height, Supplier getSituation, boolean isHighPressure) { + super(new Position(xPosition, yPosition), new Size(width, height)); + this.steam = true; + this.isHighPressure = isHighPressure; + this.currentSituationSupplier = getSituation; + this.currentSituation = getSituation.get(); + setTooltipHoverString(); + setImage(); + } + + public void setTooltipHoverString() { + if (this.currentSituation != null) { + String situationLocaleName = this.currentSituation.situationLocaleName; + if (steam && situationLocaleName.contains("_power_")) { + situationLocaleName = situationLocaleName.replace("_power_","_steam_"); + } + this.tooltipHoverString = I18n.format(situationLocaleName); + } else { + this.tooltipHoverString = null; + } + } + + public SituationWidget setImage() { + if (this.currentSituation == null) { + this.area = null; + return this; + } + if (isHighPressure) + setImageSteamHighPressure(); + else if (steam) + setImageSteam(); + else { + setImageElectric(); + } + return this; + } + + public SituationWidget setImageSteamHighPressure() { + SituationTypes iconTextures = this.currentSituation.situationTypes; + switch (iconTextures) { + case INFO: + this.area = GuiTextures.STATUS_IDLING; + break; + case WORKING: + this.area = GuiTextures.STATUS_WORKING; + break; + case WARNING: + this.area = GuiTextures.STATUS_WARNING; + break; + case ERROR: + this.area = GuiTextures.STATUS_ERROR; + break; + default: + this.area = null; + } + return this; + } + + public SituationWidget setImageSteam() { + SituationTypes iconTextures = this.currentSituation.situationTypes; + switch (iconTextures) { + case INFO: + this.area = GuiTextures.STATUS_IDLING; + break; + case WORKING: + this.area = GuiTextures.STATUS_WORKING; + break; + case WARNING: + this.area = GuiTextures.STATUS_WARNING; + break; + case ERROR: + this.area = GuiTextures.STATUS_ERROR; + break; + default: + this.area = null; + } + return this; + } + + public SituationWidget setImageElectric() { + if (this.currentSituation == null) { + this.area = null; + return this; + } + SituationTypes iconTextures = this.currentSituation.situationTypes; + switch (iconTextures) { + case INFO: + this.area = GuiTextures.STATUS_IDLING; + break; + case WORKING: + this.area = GuiTextures.STATUS_WORKING; + break; + case WARNING: + this.area = GuiTextures.STATUS_WARNING; + break; + case ERROR: + this.area = GuiTextures.STATUS_ERROR; + break; + default: + this.area = null; + } + return this; + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + if (currentSituationSupplier.get() != null) { + if (currentSituationSupplier.get().id != currentId) { + this.currentId = currentSituationSupplier.get().id; + writeUpdateInfo(1, buf -> buf.writeVarInt(currentId)); + } + } + } + + @Override + public void readUpdateInfo(int id, PacketBuffer buffer) { + super.readUpdateInfo(id, buffer); + if (id == 1) { + this.currentId = buffer.readVarInt(); + this.currentSituation = Situation.getSituationFromId(currentId); + setTooltipHoverString(); + setImage(); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void drawInForeground(int mouseX, int mouseY) { + drawHoveringTooltip(mouseX, mouseY, tooltipHoverString); + } + + @Override + @SideOnly(Side.CLIENT) + public void drawInBackground(int mouseX, int mouseY, IRenderContext context) { + if (area == null) return; + Position position = getPosition(); + Size size = getSize(); + area.draw(position.x, position.y, size.width, size.height); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 7391ea42dc..82d47018ad 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -10,6 +10,7 @@ import codechicken.lib.vec.Matrix4; import com.google.common.base.Preconditions; import gregtech.api.GregTechAPI; +import gregtech.api.situation.Situation; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.impl.FluidHandlerProxy; @@ -88,6 +89,10 @@ public abstract class MetaTileEntity implements ICoverable { private CoverBehavior[] coverBehaviors = new CoverBehavior[6]; + private Situation situation; + private boolean failedToMoveFluids; + private boolean failedToMoveItems; + public MetaTileEntity(ResourceLocation metaTileEntityId) { this.metaTileEntityId = metaTileEntityId; initializeInventory(); @@ -839,6 +844,7 @@ public boolean fillContainerFromInternalTank(IItemHandlerModifiable importItems, } public void pushFluidsIntoNearbyHandlers(EnumFacing... allowedFaces) { + this.failedToMoveFluids = false; PooledMutableBlockPos blockPos = PooledMutableBlockPos.retain(); for (EnumFacing nearbyFacing : allowedFaces) { blockPos.setPos(getPos()).move(nearbyFacing); @@ -852,7 +858,9 @@ public void pushFluidsIntoNearbyHandlers(EnumFacing... allowedFaces) { if (fluidHandler == null || myFluidHandler == null) { continue; } - GTFluidUtils.transferFluids(myFluidHandler, fluidHandler, Integer.MAX_VALUE); + if (GTFluidUtils.transferFluids(myFluidHandler, fluidHandler, Integer.MAX_VALUE) == Integer.MAX_VALUE ) { + this.failedToMoveFluids = true; + } } blockPos.release(); } @@ -914,19 +922,29 @@ public void pullItemsFromNearbyHandlers(EnumFacing... allowedFaces) { blockPos.release(); } - protected static void moveInventoryItems(IItemHandler sourceInventory, IItemHandler targetInventory) { + public boolean failedToMoveItemsOrFluids(){ + return (this.failedToMoveItems || this.failedToMoveFluids); + } + + protected void moveInventoryItems(IItemHandler sourceInventory, IItemHandler targetInventory) { + boolean hasItemsToMove = false; + boolean movedItems = false; + this.failedToMoveItems = false; for (int srcIndex = 0; srcIndex < sourceInventory.getSlots(); srcIndex++) { ItemStack sourceStack = sourceInventory.extractItem(srcIndex, Integer.MAX_VALUE, true); if (sourceStack.isEmpty()) { continue; } + hasItemsToMove = true; ItemStack remainder = ItemHandlerHelper.insertItemStacked(targetInventory, sourceStack, true); int amountToInsert = sourceStack.getCount() - remainder.getCount(); if (amountToInsert > 0) { + movedItems = true; sourceStack = sourceInventory.extractItem(srcIndex, amountToInsert, false); ItemHandlerHelper.insertItemStacked(targetInventory, sourceStack, false); } } + if (hasItemsToMove && !movedItems) this.failedToMoveItems = true; } /** @@ -1041,6 +1059,14 @@ public void setFragile(boolean fragile) { } } + public Situation getSituation() { + return this.situation; + } + + public void setSituation(Situation situation) { + this.situation = situation; + } + public boolean isValidFrontFacing(EnumFacing facing) { return facing != EnumFacing.UP && facing != EnumFacing.DOWN; } diff --git a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java index 21e82d013b..6aeb51365d 100644 --- a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java @@ -11,10 +11,7 @@ import gregtech.api.cover.CoverDefinition; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.DischargerSlotWidget; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.LabelWidget; -import gregtech.api.gui.widgets.ToggleButtonWidget; +import gregtech.api.gui.widgets.*; import gregtech.api.recipes.RecipeMap; import gregtech.api.render.OrientedOverlayRenderer; import gregtech.api.render.Textures; @@ -36,6 +33,8 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; +import static gregtech.api.situation.Situations.*; + public class SimpleMachineMetaTileEntity extends WorkableTieredMetaTileEntity { private boolean hasFrontFacing; @@ -135,6 +134,7 @@ public void update() { pushItemsIntoNearbyHandlers(outputFacing); } } + if (failedToMoveItemsOrFluids()) this.setSituation(TARGET_INVENTORY_FULL); } } @@ -300,8 +300,7 @@ protected ModularUI.Builder createGuiTemplate(EntityPlayer player) { .widget(new LabelWidget(5, 5, getMetaFullName())) .widget(new DischargerSlotWidget(chargerInventory, 0, 79, 62) .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.CHARGER_OVERLAY)) - .widget(new ImageWidget(79, 42, 18, 18, GuiTextures.INDICATOR_NO_ENERGY) - .setPredicate(workable::isHasNotEnoughEnergy)) + .widget(new SituationWidget(80,43,16,16,this::getSituation)) .bindPlayerInventory(player.inventory); int leftButtonStartX = 7; diff --git a/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java index 4edf3a6696..2832af0006 100644 --- a/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java @@ -10,8 +10,8 @@ import gregtech.api.capability.impl.RecipeLogicSteam; import gregtech.api.gui.ModularUI; import gregtech.api.gui.resources.TextureArea; -import gregtech.api.gui.widgets.ImageWidget; import gregtech.api.gui.widgets.LabelWidget; +import gregtech.api.gui.widgets.SituationWidget; import gregtech.api.recipes.ModHandler; import gregtech.api.recipes.RecipeMap; import gregtech.api.render.OrientedOverlayRenderer; @@ -116,8 +116,7 @@ protected TextureArea getFullGuiTexture(String pathTemplate) { public ModularUI.Builder createUITemplate(EntityPlayer player) { return ModularUI.builder(BRONZE_BACKGROUND_TEXTURE, 176, 166) .widget(new LabelWidget(6, 6, getMetaFullName())) - .widget(new ImageWidget(79, 42, 18, 18, getFullGuiTexture("not_enough_steam_%s")) - .setPredicate(() -> workableHandler.isHasNotEnoughEnergy())) + .widget(new SituationWidget(79,42,18,18,this::getSituation, isHighPressure)) .bindPlayerInventory(player.inventory, BRONZE_SLOT_BACKGROUND_TEXTURE); } } diff --git a/src/main/java/gregtech/api/situation/Situation.java b/src/main/java/gregtech/api/situation/Situation.java new file mode 100644 index 0000000000..9fadc79a81 --- /dev/null +++ b/src/main/java/gregtech/api/situation/Situation.java @@ -0,0 +1,32 @@ +package gregtech.api.situation; + +import gregtech.api.util.GTControlledRegistry; + +public class Situation { + + public final static GTControlledRegistry SITUATION_REGISTRY = new GTControlledRegistry<>(Short.MAX_VALUE); + public final String situationName; + public final SituationTypes situationTypes; + public final String situationLocaleName; + public final int id; + + public Situation(int id, String situationName, SituationTypes situationTypes) { + this.id = id; + this.situationName = situationName; + this.situationTypes = situationTypes; + this.situationLocaleName = "gregtech.situation." + this.situationName; + registerSituation(id,situationName,this); + } + + public String getSituationErrorLevel(Situation situation) { + return situation.situationTypes.toString(); + } + + void registerSituation(int id, String situationName, Situation situation){ + SITUATION_REGISTRY.register(id, situationName, situation); + } + + public static Situation getSituationFromId(int id) { + return SITUATION_REGISTRY.getObjectById(id); + } +} diff --git a/src/main/java/gregtech/api/situation/SituationTypes.java b/src/main/java/gregtech/api/situation/SituationTypes.java new file mode 100644 index 0000000000..226acc1709 --- /dev/null +++ b/src/main/java/gregtech/api/situation/SituationTypes.java @@ -0,0 +1,21 @@ +package gregtech.api.situation; + +import net.minecraft.util.IStringSerializable; + +public enum SituationTypes implements IStringSerializable { + WORKING("gregtech.situation.level.warning"), + INFO("gregtech.situation.level.idle"), + ERROR("gregtech.situation.level.error"), + WARNING("gregtech.situation.level.warning"); + + public final String errorLevelName; + + SituationTypes(String errorLevelName) {this.errorLevelName = errorLevelName;} + + @Override + public String getName() { + return errorLevelName; + } +} + + diff --git a/src/main/java/gregtech/api/situation/Situations.java b/src/main/java/gregtech/api/situation/Situations.java new file mode 100644 index 0000000000..8eb9c0300b --- /dev/null +++ b/src/main/java/gregtech/api/situation/Situations.java @@ -0,0 +1,36 @@ +package gregtech.api.situation; + +import gregtech.api.util.GTLog; + +public class Situations { + public static Situation WORKING = new Situation(1, "working", SituationTypes.WORKING); + + public static Situation IDLE = new Situation(2, "idle", SituationTypes.INFO); + public static Situation DISABLED_BY_CONTROLLER = new Situation(3, "disabled_by_controller", SituationTypes.INFO); + + public static Situation EMPTY_SOURCE = new Situation(100, "empty_source", SituationTypes.WARNING); + public static Situation INSUFFICIENT_POWER = new Situation(101, "insufficient_power", SituationTypes.WARNING); + public static Situation INSUFFICIENT_POWER_TO_START = new Situation(102, "insufficient_power_to_start", SituationTypes.WARNING); + public static Situation NO_MATCHING_RECIPE = new Situation(103, "no_matching_recipe", SituationTypes.WARNING); + public static Situation OUTPUT_SLOTS_FULL = new Situation(104, "output_slots_full", SituationTypes.WARNING); + public static Situation OUTPUT_TANKS_FULL = new Situation(105, "output_tanks_full", SituationTypes.WARNING); + public static Situation OUTPUT_INVENTORY_FULL = new Situation(106, "output_inventory_full", SituationTypes.WARNING); + public static Situation TARGET_INVENTORY_FULL = new Situation(107, "target_inventory_full", SituationTypes.WARNING); + + public static Situation NO_IMPORT_INVENTORY = new Situation(1001, "no_import_inventory", SituationTypes.ERROR); + public static Situation NO_EXPORT_INVENTORY = new Situation(1002, "no_export_inventory", SituationTypes.ERROR); + public static Situation NO_IMPORT_TANK = new Situation(1003, "no_import_tank", SituationTypes.ERROR); + public static Situation NO_EXPORT_TANK = new Situation(1004, "no_export_tank", SituationTypes.ERROR); + public static Situation EXPECTED_CAPABILITY_UNAVAILABLE = new Situation(1005, "null_capability", SituationTypes.ERROR); + public static Situation WATER_CHECK_FAILED = new Situation(1006, "water_check_failed", SituationTypes.ERROR); + public static Situation BLOCKED_INTAKES = new Situation(1007, "blocked_intakes", SituationTypes.ERROR); + public static Situation BLOCKED_VENT = new Situation(1008, "blocked_vent", SituationTypes.ERROR); + public static Situation DIMENSION_LACKS_ATMOSPHERE = new Situation(1009, "dimension_lacks_atmosphere", SituationTypes.ERROR); + + + public static void init() { + GTLog.logger.info("Registering situations..."); + } + +} + diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 128a73ea01..978deeda78 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -8,6 +8,7 @@ import gnu.trove.list.TIntList; import gnu.trove.list.array.TIntArrayList; import gregtech.api.GTValues; +import gregtech.api.situation.Situation; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; import gregtech.api.capability.impl.ItemHandlerDelegate; @@ -37,6 +38,8 @@ import javax.annotation.Nonnull; import java.util.*; +import static gregtech.api.situation.Situations.*; + public class CoverConveyor extends CoverBehavior implements CoverWithUI, ITickable, IControllable { public final int tier; @@ -48,6 +51,7 @@ public class CoverConveyor extends CoverBehavior implements CoverWithUI, ITickab protected int itemsLeftToTransferLastSecond; private CoverableItemHandlerWrapper itemHandlerWrapper; protected boolean isWorkingAllowed = true; + protected Situation situation; public CoverConveyor(ICoverable coverable, EnumFacing attachedSide, int tier, int itemsPerSecond) { super(coverable, attachedSide); @@ -93,16 +97,28 @@ public void update() { TileEntity tileEntity = coverHolder.getWorld().getTileEntity(coverHolder.getPos().offset(attachedSide)); IItemHandler itemHandler = tileEntity == null ? null : tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, attachedSide.getOpposite()); IItemHandler myItemHandler = coverHolder.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, attachedSide); - if (itemHandler != null && myItemHandler != null) { + if (itemHandler == null) { + if (conveyorMode == ConveyorMode.IMPORT) setSituation(NO_IMPORT_INVENTORY); + if (conveyorMode == ConveyorMode.EXPORT) setSituation(NO_EXPORT_INVENTORY); + } else { int totalTransferred = doTransferItems(itemHandler, myItemHandler, itemsLeftToTransferLastSecond); this.itemsLeftToTransferLastSecond -= totalTransferred; + if (this.itemsLeftToTransferLastSecond < transferRate) { + setSituation(WORKING); + } else { + setSituation(IDLE); + } } } if (timer % 20 == 0) { this.itemsLeftToTransferLastSecond = transferRate; } + if (!isWorkingAllowed) { + setSituation(DISABLED_BY_CONTROLLER); + } } + protected int doTransferItems(IItemHandler itemHandler, IItemHandler myItemHandler, int maxTransferAmount) { return doTransferItemsAny(itemHandler, myItemHandler, maxTransferAmount); } @@ -392,6 +408,10 @@ public EnumActionResult onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, @Override public T getCapability(Capability capability, T defaultValue) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + if (defaultValue == null ) { + setSituation(EXPECTED_CAPABILITY_UNAVAILABLE); + return null; + } IItemHandler delegate = (IItemHandler) defaultValue; if (itemHandlerWrapper == null || itemHandlerWrapper.delegate != delegate) { this.itemHandlerWrapper = new CoverableItemHandlerWrapper(delegate); @@ -429,6 +449,8 @@ public ModularUI createUI(EntityPlayer player) { ManualImportExportMode.class, this::getManualImportExportMode, this::setManualImportExportMode) .setTooltipHoverString("cover.universal.manual_import_export.mode.description")); + primaryGroup.addWidget(new SituationWidget(80,90,16,16,this::getSituation)); + this.itemFilterContainer.initUI(70, primaryGroup::addWidget); ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 190 + 82) diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index dfb4ec4ecb..37dd637f0e 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -6,6 +6,7 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import gregtech.api.GTValues; +import gregtech.api.situation.Situation; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; import gregtech.api.capability.impl.FluidHandlerDelegate; @@ -35,6 +36,8 @@ import javax.annotation.Nullable; +import static gregtech.api.situation.Situations.*; + public class CoverPump extends CoverBehavior implements CoverWithUI, ITickable, IControllable { public final int tier; @@ -47,6 +50,7 @@ public class CoverPump extends CoverBehavior implements CoverWithUI, ITickable, protected boolean isWorkingAllowed = true; protected final FluidFilterContainer fluidFilter; protected BucketMode bucketMode; + protected Situation situation; public CoverPump(ICoverable coverHolder, EnumFacing attachedSide, int tier, int mbPerTick) { super(coverHolder, attachedSide); @@ -107,6 +111,9 @@ public void update() { if (timer % 20 == 0) { this.fluidLeftToTransferLastSecond = transferRate; } + if (!isWorkingAllowed) { + setSituation(DISABLED_BY_CONTROLLER); + } } protected int doTransferFluids(int transferLimit) { @@ -116,10 +123,18 @@ protected int doTransferFluids(int transferLimit) { blockPos.release(); IFluidHandler fluidHandler = tileEntity == null ? null : tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, attachedSide.getOpposite()); IFluidHandler myFluidHandler = coverHolder.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, attachedSide); - if (fluidHandler == null || myFluidHandler == null) { + if (fluidHandler == null) { + if (pumpMode == PumpMode.IMPORT) setSituation(NO_IMPORT_TANK); + if (pumpMode == PumpMode.EXPORT) setSituation(NO_EXPORT_TANK); return 0; } - return doTransferFluidsInternal(myFluidHandler, fluidHandler, transferLimit); + int transferredFluid = doTransferFluidsInternal(myFluidHandler, fluidHandler, transferLimit); + if (transferredFluid != 0) { + setSituation(WORKING); + } else { + setSituation(IDLE); + } + return transferredFluid; } protected int doTransferFluidsInternal(IFluidHandler myFluidHandler, IFluidHandler fluidHandler, int transferLimit) { @@ -157,7 +172,9 @@ public ModularUI createUI(EntityPlayer player) { primaryGroup.addWidget(new CycleButtonWidget(10, 160, 113, 20, ManualImportExportMode.class, this::getManualImportExportMode, this::setManualImportExportMode) .setTooltipHoverString("cover.universal.manual_import_export.mode.description")); - + + primaryGroup.addWidget(new SituationWidget(80,84,16,16,this::getSituation)); + this.fluidFilter.initUI(88, primaryGroup::addWidget); return ModularUI.builder(GuiTextures.BACKGROUND, 176, 184 + 82) @@ -201,6 +218,10 @@ public void renderCover(CCRenderState renderState, Matrix4 translation, IVertexO @Override public T getCapability(Capability capability, T defaultValue) { if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { + if (defaultValue == null ) { + setSituation(EXPECTED_CAPABILITY_UNAVAILABLE); + return null; + } IFluidHandler delegate = (IFluidHandler) defaultValue; if (fluidHandlerWrapper == null || fluidHandlerWrapper.delegate != delegate) { this.fluidHandlerWrapper = new CoverableFluidHandlerWrapper(delegate); diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAirCollector.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAirCollector.java index 2f4d396960..baca7408e2 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAirCollector.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAirCollector.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.stream.IntStream; +import static gregtech.api.situation.Situations.*; + public class MetaTileEntityAirCollector extends TieredMetaTileEntity { private static final int PRODUCTION_CYCLE_LENGTH = 20; @@ -48,12 +50,19 @@ public void update() { if (!getWorld().isRemote) { long energyToConsume = GTValues.V[getTier()]; - if (checkDimension() && checkOpenSides() && getTimer() % PRODUCTION_CYCLE_LENGTH == 0L && energyContainer.getEnergyStored() >= energyToConsume) { - int fluidAmount = getCollectedFluidAmount(); - FluidStack fluidStack = Materials.Air.getFluid(fluidAmount); - if (exportFluids.fill(fluidStack, false) == fluidAmount) { - exportFluids.fill(fluidStack, true); - energyContainer.removeEnergy(energyToConsume); + if (getTimer() % PRODUCTION_CYCLE_LENGTH == 0L ) { + if (energyContainer.getEnergyStored() >= energyToConsume) { + if (checkDimension() && checkOpenSides()) { + this.setSituation(WORKING); + int fluidAmount = getCollectedFluidAmount(); + FluidStack fluidStack = Materials.Air.getFluid(fluidAmount); + if (exportFluids.fill(fluidStack, false) == fluidAmount) { + exportFluids.fill(fluidStack, true); + energyContainer.removeEnergy(energyToConsume); + } + } + } else { + setSituation(INSUFFICIENT_POWER_TO_START); } } if (getTimer() % 5 == 0) { @@ -69,12 +78,15 @@ private boolean checkOpenSides() { if (getWorld().isAirBlock(getPos().offset(side))) return true; } + setSituation(BLOCKED_INTAKES); return false; } private boolean checkDimension() { int dimensionId = getWorld().provider.getDimension(); - return IntStream.of(ConfigHolder.machineSpecific.airCollectorDimensionBlacklist).noneMatch(x -> x == dimensionId); + boolean air = IntStream.of(ConfigHolder.machineSpecific.airCollectorDimensionBlacklist).noneMatch(x -> x == dimensionId); + if (!air) setSituation(DIMENSION_LACKS_ATMOSPHERE); + return air; } private int getCollectedFluidAmount() { diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java index 8fd28cddcb..7af39aab4f 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java @@ -6,6 +6,7 @@ import gregtech.api.GTValues; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; +import gregtech.api.gui.widgets.SituationWidget; import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.MetaTileEntityHolder; @@ -33,6 +34,8 @@ import javax.annotation.Nullable; import java.util.List; +import static gregtech.api.situation.Situations.*; + public class MetaTileEntityFisher extends TieredMetaTileEntity { private static final int WATER_CHECK_SIZE = 25; @@ -62,7 +65,8 @@ protected ModularUI createUI(EntityPlayer entityPlayer) { 18 + 18 * rowSize + 94) .label(10, 5, getMetaFullName()) .widget(new SlotWidget(importItems, 0, 18, 18, true, true) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.STRING_SLOT_OVERLAY)); + .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.STRING_SLOT_OVERLAY)) + .widget(new SituationWidget(19,38,16,16,this::getSituation)); for (int y = 0; y < rowSize; y++) { for (int x = 0; x < rowSize; x++) { @@ -80,32 +84,41 @@ protected ModularUI createUI(EntityPlayer entityPlayer) { public void update() { super.update(); ItemStack baitStack = importItems.getStackInSlot(0); - if (!getWorld().isRemote && energyContainer.getEnergyStored() >= energyAmountPerFish && getTimer() % fishingTicks == 0L && !baitStack.isEmpty()) { - WorldServer world = (WorldServer) this.getWorld(); - int waterCount = 0; - int edgeSize = (int) Math.sqrt(WATER_CHECK_SIZE); - for (int x = 0; x < edgeSize; x++){ - for (int z = 0; z < edgeSize; z++){ - BlockPos waterCheckPos = getPos().down().add(x - edgeSize / 2, 0, z - edgeSize / 2); - if (world.getBlockState(waterCheckPos).getBlock() instanceof BlockLiquid && - world.getBlockState(waterCheckPos).getMaterial() == Material.WATER) { - waterCount++; + if (!getWorld().isRemote) { + if (baitStack.isEmpty()) { + setSituation(IDLE); + } else if (energyContainer.getEnergyStored() < energyAmountPerFish) { + setSituation(INSUFFICIENT_POWER_TO_START); + } else if (getTimer() % fishingTicks == 0L) { + setSituation(WORKING); + WorldServer world = (WorldServer) this.getWorld(); + int waterCount = 0; + int edgeSize = (int) Math.sqrt(WATER_CHECK_SIZE); + for (int x = 0; x < edgeSize; x++) { + for (int z = 0; z < edgeSize; z++) { + BlockPos waterCheckPos = getPos().down().add(x - edgeSize / 2, 0, z - edgeSize / 2); + if (world.getBlockState(waterCheckPos).getBlock() instanceof BlockLiquid && + world.getBlockState(waterCheckPos).getMaterial() == Material.WATER) { + waterCount++; + } } } - } - if (waterCount == WATER_CHECK_SIZE) { - LootTable table = world.getLootTableManager().getLootTableFromLocation(LootTableList.GAMEPLAY_FISHING); - NonNullList itemStacks = NonNullList.create(); - itemStacks.addAll(table.generateLootForPools(world.rand, new LootContext.Builder(world).build())); - if(addItemsToItemHandler(exportItems, true, itemStacks)) { - addItemsToItemHandler(exportItems, false, itemStacks); - energyContainer.removeEnergy(energyAmountPerFish); - baitStack.shrink(1); + if (waterCount == WATER_CHECK_SIZE) { + LootTable table = world.getLootTableManager().getLootTableFromLocation(LootTableList.GAMEPLAY_FISHING); + NonNullList itemStacks = NonNullList.create(); + itemStacks.addAll(table.generateLootForPools(world.rand, new LootContext.Builder(world).build())); + if (addItemsToItemHandler(exportItems, true, itemStacks)) { + addItemsToItemHandler(exportItems, false, itemStacks); + energyContainer.removeEnergy(energyAmountPerFish); + baitStack.shrink(1); + } + } else { + setSituation(WATER_CHECK_FAILED); } } - } - if(!getWorld().isRemote && getTimer() % 5 == 0) { - pushItemsIntoNearbyHandlers(getFrontFacing()); + if (getTimer() % 5 == 0) { + pushItemsIntoNearbyHandlers(getFrontFacing()); + } } } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 894d6676cc..9133c109c3 100755 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -757,6 +757,32 @@ cover.machine_controller.mode.cover_north=Control Cover (North) cover.machine_controller.mode.cover_east=Control Cover (East) cover.machine_controller.mode.cover_west=Control Cover (West) +gregtech.situation.level.working=WORKING +gregtech.situation.level.idle=IDLING +gregtech.situation.level.warning=WARNING +gregtech.situation.level.error=ERROR +gregtech.situation.idle=Idling +gregtech.situation.disabled_by_controller=Disabled by controller cover +gregtech.situation.working=Working +gregtech.situation.null_capability=Error accessing inventory from this side +gregtech.situation.empty_source=This inventory is empty +gregtech.situation.insufficient_power=Not enough power to run this recipe +gregtech.situation.insufficient_power_to_start=Not enough power to start this recipe +gregtech.situation.insufficient_steam=Not enough steam to run this recipe +gregtech.situation.insufficient_steam_to_start=Not enough steam to start this recipe +gregtech.situation.no_matching_recipe=No recipe found +gregtech.situation.target_inventory_full=The target inventory is full +gregtech.situation.output_slots_full=Output slots are full +gregtech.situation.output_tanks_full=Output tanks are full +gregtech.situation.output_inventory_full=Output slots and tanks are full +gregtech.situation.no_import_inventory=Cant access inventory to import from +gregtech.situation.no_export_inventory=Cant access inventory to export to +gregtech.situation.no_import_tank=Cant access tank to import from +gregtech.situation.no_export_tank=Cant access tank to export to +gregtech.situation.blocked_intakes=Blocked intakes +gregtech.situation.blocked_vent=Blocked vent +gregtech.situation.dimension_lacks_atmosphere=Dimension lacks atmosphere + # %s is a localized material name item.material.oreprefix.oreBlackgranite=Granite %s Ore item.material.oreprefix.oreRedgranite=Granite %s Ore diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/error.png b/src/main/resources/assets/gregtech/textures/gui/widget/error.png new file mode 100644 index 0000000000..45547c961c Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/gui/widget/error.png differ diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/idling.png b/src/main/resources/assets/gregtech/textures/gui/widget/idling.png new file mode 100644 index 0000000000..f1e799440a Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/gui/widget/idling.png differ diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/warning.png b/src/main/resources/assets/gregtech/textures/gui/widget/warning.png new file mode 100644 index 0000000000..bdaa2faa90 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/gui/widget/warning.png differ diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/working.png b/src/main/resources/assets/gregtech/textures/gui/widget/working.png new file mode 100644 index 0000000000..beb54bb3c7 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/gui/widget/working.png differ