diff options
Diffstat (limited to 'src/main/java/gregtech/api/util/shutdown')
6 files changed, 424 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java new file mode 100644 index 0000000000..29b99a644a --- /dev/null +++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java @@ -0,0 +1,63 @@ +package gregtech.api.util.shutdown; + +import static gregtech.api.util.GT_ModHandler.getWater; +import static gregtech.api.util.GT_Utility.formatNumbers; + +import java.util.Objects; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +public class ReasonOutOfFluid implements ShutDownReason { + + private FluidStack requiredFluid; + + ReasonOutOfFluid(@NotNull FluidStack requiredFluid) { + this.requiredFluid = requiredFluid; + } + + @NotNull + @Override + public String getID() { + return "out_of_fluid"; + } + + @NotNull + @Override + public String getDisplayString() { + return Objects.requireNonNull( + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.out_of_fluid", + requiredFluid.getLocalizedName(), + formatNumbers(requiredFluid.amount))); + } + + @NotNull + @Override + public ShutDownReason newInstance() { + return new ReasonOutOfFluid(getWater(0)); + } + + @Override + public void encode(@NotNull PacketBuffer buffer) { + buffer.writeInt(requiredFluid.getFluidID()); + buffer.writeInt(requiredFluid.amount); + } + + @Override + public void decode(PacketBuffer buffer) { + int fluidID = buffer.readInt(); + Fluid fluid = FluidRegistry.getFluid(fluidID); + requiredFluid = new FluidStack(fluid, buffer.readInt()); + } + + @Override + public boolean wasCritical() { + return true; + } +} diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java new file mode 100644 index 0000000000..f4a46f2d30 --- /dev/null +++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java @@ -0,0 +1,62 @@ +package gregtech.api.util.shutdown; + +import static gregtech.api.util.GT_Utility.formatNumbers; + +import java.util.Objects; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +public class ReasonOutOfItem implements ShutDownReason { + + private ItemStack requiredItem; + + ReasonOutOfItem(@NotNull ItemStack requiredItem) { + this.requiredItem = requiredItem; + } + + @NotNull + @Override + public String getID() { + return "out_of_item"; + } + + @NotNull + @Override + public String getDisplayString() { + return Objects.requireNonNull( + StatCollector.translateToLocalFormatted( + "GT5U.gui.text.out_of_item", + requiredItem.getDisplayName(), + formatNumbers(requiredItem.stackSize))); + } + + @NotNull + @Override + public ShutDownReason newInstance() { + return new ReasonOutOfItem(new ItemStack(Items.feather, 0)); + } + + @Override + public void encode(@NotNull PacketBuffer buffer) { + try { + buffer.writeItemStackToBuffer(requiredItem); + } catch (Exception ignored) {} + } + + @Override + public void decode(PacketBuffer buffer) { + try { + requiredItem = buffer.readItemStackFromBuffer(); + } catch (Exception ignored) {} + } + + @Override + public boolean wasCritical() { + return true; + } +} diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java new file mode 100644 index 0000000000..0c3f7e0b64 --- /dev/null +++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java @@ -0,0 +1,61 @@ +package gregtech.api.util.shutdown; + +import static gregtech.api.util.GT_Utility.formatNumbers; + +import java.util.Objects; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +public class ReasonOutOfStuff implements ShutDownReason { + + private String required; + private int amount; + + ReasonOutOfStuff(@NotNull String required, int amount) { + this.required = required; + this.amount = amount; + } + + @NotNull + @Override + public String getID() { + return "out_of_stuff"; + } + + @NotNull + @Override + public String getDisplayString() { + return Objects.requireNonNull( + StatCollector.translateToLocalFormatted("GT5U.gui.text.out_of_stuff", required, formatNumbers(amount))); + } + + @NotNull + @Override + public ShutDownReason newInstance() { + return new ReasonOutOfStuff("stuff", 1); + } + + @Override + public void encode(@NotNull PacketBuffer buffer) { + buffer.writeInt(amount); + try { + buffer.writeStringToBuffer(required); + } catch (Exception ignored) {} + } + + @Override + public void decode(PacketBuffer buffer) { + amount = buffer.readInt(); + try { + required = buffer.readStringFromBuffer(32768); + } catch (Exception ignored) {} + } + + @Override + public boolean wasCritical() { + return true; + } +} diff --git a/src/main/java/gregtech/api/util/shutdown/ShutDownReason.java b/src/main/java/gregtech/api/util/shutdown/ShutDownReason.java new file mode 100644 index 0000000000..0815936a55 --- /dev/null +++ b/src/main/java/gregtech/api/util/shutdown/ShutDownReason.java @@ -0,0 +1,41 @@ +package gregtech.api.util.shutdown; + +import javax.annotation.Nonnull; + +import net.minecraft.network.PacketBuffer; + +public interface ShutDownReason { + + /** + * @return Unique registry ID + */ + @Nonnull + String getID(); + + /** + * @return Actual text to show on client GUI + */ + @Nonnull + String getDisplayString(); + + /** + * Create new instance to receive packet. + */ + @Nonnull + ShutDownReason newInstance(); + + /** + * Encode value to sync. + */ + void encode(@Nonnull PacketBuffer buffer); + + /** + * Decode synced value. + */ + void decode(PacketBuffer buffer); + + /** + * @return Whether the reason is critical. + */ + boolean wasCritical(); +} diff --git a/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java b/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java new file mode 100644 index 0000000000..298c5db237 --- /dev/null +++ b/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java @@ -0,0 +1,118 @@ +package gregtech.api.util.shutdown; + +import static gregtech.api.util.GT_ModHandler.getWater; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Nonnull; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +public class ShutDownReasonRegistry { + + private static final Map<String, ShutDownReason> registry = new HashMap<>(); + + /** + * Registers ShutDownReason. No duplicated IDs are allowed. + * + * @param sample Sample object to register + */ + public static void register(ShutDownReason sample) { + if (isRegistered(sample.getID())) { + throw new IllegalStateException( + String.format( + "ID %s is already registered for %s", + sample.getID(), + registry.get(sample.getID()) + .getClass() + .getCanonicalName())); + } + registry.put(sample.getID(), sample); + } + + public static ShutDownReason getSampleFromRegistry(String id) { + if (!isRegistered(id)) { + throw new RuntimeException("Unknown id: " + id); + } + return registry.get(id); + } + + public static boolean isRegistered(String id) { + return registry.containsKey(id); + } + + /** + * Shut down due to power loss. + */ + @Nonnull + public static final ShutDownReason POWER_LOSS = SimpleShutDownReason.ofCritical("power_loss"); + /** + * Failed to output the pollution. + */ + @Nonnull + public static final ShutDownReason POLLUTION_FAIL = SimpleShutDownReason.ofCritical("pollution_fail"); + /** + * Shut down due to incomplete structure. + */ + @Nonnull + public static final ShutDownReason STRUCTURE_INCOMPLETE = SimpleShutDownReason.ofNormal("structure_incomplete"); + /** + * Shut down due to machine damage. + */ + @Nonnull + public static final ShutDownReason NO_REPAIR = SimpleShutDownReason.ofNormal("no_repair"); + /** + * No valid turbine found. + */ + @Nonnull + public static final ShutDownReason NO_TURBINE = SimpleShutDownReason.ofNormal("no_turbine"); + /** + * No correct machine part in controller slot. + */ + @Nonnull + public static final ShutDownReason NO_MACHINE_PART = SimpleShutDownReason.ofNormal("no_machine_part"); + /** + * Default unknown state. + */ + @Nonnull + public static final ShutDownReason NONE = SimpleShutDownReason.ofNormal("none"); + /** + * Critical unknown state. + */ + @Nonnull + public static final ShutDownReason CRITICAL_NONE = SimpleShutDownReason.ofCritical("none"); + + /** + * Fluid that needs to be constantly supplied are out. E.g. PCB coolant with cooling upgrades enabled. + */ + @Nonnull + public static ShutDownReason outOfFluid(@Nonnull FluidStack required) { + return new ReasonOutOfFluid(required); + } + + /** + * Item that needs to be constantly supplied are out. + */ + @Nonnull + public static ShutDownReason outOfItem(@Nonnull ItemStack required) { + return new ReasonOutOfItem(required); + } + + /** + * Stuff that needs to be constantly supplied are out. + */ + @Nonnull + public static ShutDownReason outOfStuff(@Nonnull String required, int amount) { + return new ReasonOutOfStuff(required, amount); + } + + static { + register(new SimpleShutDownReason("", false)); + register(new ReasonOutOfFluid(getWater(0))); + register(new ReasonOutOfItem(new ItemStack(Items.feather, 1))); + register(new ReasonOutOfStuff("stuff", 1)); + } +} diff --git a/src/main/java/gregtech/api/util/shutdown/SimpleShutDownReason.java b/src/main/java/gregtech/api/util/shutdown/SimpleShutDownReason.java new file mode 100644 index 0000000000..92763fa431 --- /dev/null +++ b/src/main/java/gregtech/api/util/shutdown/SimpleShutDownReason.java @@ -0,0 +1,79 @@ +package gregtech.api.util.shutdown; + +import java.util.Objects; + +import javax.annotation.Nonnull; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; + +/** + * Simple implementation of {@link ShutDownReason}. You can create new object without registering it. + */ +public class SimpleShutDownReason implements ShutDownReason { + + private String key; + private boolean wasCritical; + + public SimpleShutDownReason(String key, boolean isCritical) { + this.key = key; + this.wasCritical = isCritical; + } + + @NotNull + @Override + public String getID() { + return "simple_result"; + } + + @NotNull + @Override + public String getDisplayString() { + return Objects.requireNonNull(StatCollector.translateToLocal("GT5U.gui.text." + key)); + } + + @NotNull + @Override + public ShutDownReason newInstance() { + return new SimpleShutDownReason("", false); + } + + @Override + public void encode(@NotNull PacketBuffer buffer) { + buffer.writeBoolean(wasCritical); + NetworkUtils.writeStringSafe(buffer, key); + } + + @Override + public void decode(PacketBuffer buffer) { + wasCritical = buffer.readBoolean(); + key = NetworkUtils.readStringSafe(buffer); + } + + @Override + public boolean wasCritical() { + return wasCritical; + } + + /** + * Creates new reason with critical state. Add your localized description with `GT5U.gui.text.{key}`. + * This is already registered to registry. + */ + @Nonnull + public static ShutDownReason ofCritical(String key) { + return new SimpleShutDownReason(key, true); + } + + /** + * Creates new reason with normal state. Add your localized description with `GT5U.gui.text.{key}`. + * This is already registered to registry. + */ + @Nonnull + public static ShutDownReason ofNormal(String key) { + return new SimpleShutDownReason(key, false); + } +} |