diff options
author | Jakub <53441451+kuba6000@users.noreply.github.com> | 2022-12-15 16:53:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-15 16:53:12 +0100 |
commit | 8a581938862a4d612f510a8afed88727a34c3916 (patch) | |
tree | 0307ca87f3c06bbeda6d699aabbc2247b6f38efb /src/main/java | |
parent | 24a9953b153529191c855af0ae2d10f35844095f (diff) | |
download | GT5-Unofficial-8a581938862a4d612f510a8afed88727a34c3916.tar.gz GT5-Unofficial-8a581938862a4d612f510a8afed88727a34c3916.tar.bz2 GT5-Unofficial-8a581938862a4d612f510a8afed88727a34c3916.zip |
MODULAR UI (#34)
* MODULAR UUUUUUUUIIIIIIIIIII
* Tea
* Add recipe to ULTIMATE TEA
* Stupid MT Scripts. I hate it
* Yeet
* More TEA
* Add blocks
* More Modular UIs
* Textures
* Fix custom UI containers
* Texture, tooltip
* UI with tabs
* ButtonWidget
* fix
* Fix
* Texture
* Color is fixed
* More UI work
* Modular UI is hard dependency now
* Spotless
* Simplify
* Format numbers
* A
* Update TeaAcceptorTile.java
* Shadow is fixed, lets gooooo
* hardness
* Mixins mixins mixins
* Tab icons
* Fix crash
* Shop concept
* Bump ModularUI
* Bump Modular UI
* Nooooooooooo
* GREY -> GRAY
* Bump ModularUI
* Bump GT5
* EEC with MUI test
* Include incomplete structure
* REFLECTIONS !!
* Just use slot filter
* Update pos when needed
* Update GT_MetaTileEntity_ExtremeExterminationChamber.java
* Spawner status
* Nice toggle button
* Send messages
* Next toggle button
* Start work on IAADDS
* Scrollable inventory test
* Draw queen slots
* Fix
* Update dependencies.gradle
* Use sync widget
* Add button to enable/disable working
* Configuration in Mega Apiary
* Refactor a bit
* Update ModularUI
* Bump ModularUI
* Bump GT5
* Fix build
* Update dependencies.gradle
* Update build.gradle
* Update dependencies.gradle
* spotless
* Begin working on configuration window
* Update dependencies.gradle
* Deprecated
* Update dependencies.gradle
* Optimize bee storage rendering (2 fps -> 100 fps)
* Make Mega Apiary storage GUI usable
* Configuration window looks ok
* Color is fixed
* TC research
* Disable for now
* Finish tea command
* ok
* Fix
* Update en_US.lang
* ZzZ
* Stuff changed
Diffstat (limited to 'src/main/java')
30 files changed, 1744 insertions, 50 deletions
diff --git a/src/main/java/kubatech/CommonProxy.java b/src/main/java/kubatech/CommonProxy.java index ccd4949137..f34ce3216a 100644 --- a/src/main/java/kubatech/CommonProxy.java +++ b/src/main/java/kubatech/CommonProxy.java @@ -19,15 +19,21 @@ package kubatech; -import static kubatech.loaders.ItemLoader.RegisterItems; +import static kubatech.loaders.BlockLoader.registerBlocks; +import static kubatech.loaders.ItemLoader.registerItems; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.event.*; +import kubatech.api.LoaderReference; import kubatech.commands.CommandConfig; import kubatech.commands.CommandHandler; import kubatech.commands.CommandHelp; +import kubatech.commands.CommandTea; import kubatech.config.Config; import kubatech.loaders.RecipeLoader; +import kubatech.loaders.TCLoader; +import kubatech.savedata.PlayerDataManager; +import net.minecraftforge.common.MinecraftForge; public class CommonProxy { @@ -37,22 +43,28 @@ public class CommonProxy { Config.init(event.getModConfigurationDirectory()); Config.synchronizeConfiguration(); FMLCommonHandler.instance().bus().register(new FMLEventHandler()); - RegisterItems(); - RecipeLoader.addRecipes(); + MinecraftForge.EVENT_BUS.register(new PlayerDataManager()); + registerItems(); + registerBlocks(); + if (LoaderReference.Thaumcraft) TCLoader.load(); } public void init(FMLInitializationEvent event) {} - public void postInit(FMLPostInitializationEvent event) {} + public void postInit(FMLPostInitializationEvent event) { + RecipeLoader.addRecipes(); + } public void serverAboutToStart(FMLServerAboutToStartEvent event) {} public void serverStarting(FMLServerStartingEvent event) { RecipeLoader.addRecipesLate(); + if (LoaderReference.Thaumcraft) TCLoader.lateLoad(); CommandHandler cmd = new CommandHandler(); cmd.addCommand(new CommandHelp()); cmd.addCommand(new CommandConfig()); // cmd.addCommand(new CommandBees()); + cmd.addCommand(new CommandTea()); event.registerServerCommand(cmd); } diff --git a/src/main/java/kubatech/api/LoaderReference.java b/src/main/java/kubatech/api/LoaderReference.java index b9e76a9a30..3215fa1b21 100644 --- a/src/main/java/kubatech/api/LoaderReference.java +++ b/src/main/java/kubatech/api/LoaderReference.java @@ -15,4 +15,6 @@ public class LoaderReference { public static final boolean HarvestCraft = Loader.isModLoaded("harvestcraft"); public static final boolean TwilightForest = Loader.isModLoaded("TwilightForest"); public static final boolean Forestry = Loader.isModLoaded("Forestry"); + public static final boolean DraconicEvolution = Loader.isModLoaded("DraconicEvolution"); + public static final boolean Avaritia = Loader.isModLoaded("Avaritia"); } diff --git a/src/main/java/kubatech/api/enums/ItemList.java b/src/main/java/kubatech/api/enums/ItemList.java index b37bd86c1c..00334d848e 100644 --- a/src/main/java/kubatech/api/enums/ItemList.java +++ b/src/main/java/kubatech/api/enums/ItemList.java @@ -52,7 +52,8 @@ public enum ItemList implements IItemContainer { FermentedTeaLeaf, BruisedTeaLeaf, PartiallyOxidizedTeaLeaf, - ; + TeaAcceptorResearchNote, + TeaAcceptor; private ItemStack mStack; private boolean mHasNotBeenSet = true; diff --git a/src/main/java/kubatech/api/helpers/ReflectionHelper.java b/src/main/java/kubatech/api/helpers/ReflectionHelper.java index 1d7449afc4..7b02fe6c82 100644 --- a/src/main/java/kubatech/api/helpers/ReflectionHelper.java +++ b/src/main/java/kubatech/api/helpers/ReflectionHelper.java @@ -45,6 +45,7 @@ public class ReflectionHelper { boolean exceptionDetected = false; Field f = null; do { + exceptionDetected = false; try { f = cl.getDeclaredField(fieldName); f.setAccessible(true); @@ -61,6 +62,38 @@ public class ReflectionHelper { } } + public static <T> boolean setField(Object obj, String fieldName, T value) { + Class<?> cl = obj.getClass(); + String clName = cl.getName(); + HashMap<String, Field> classmap = classes.computeIfAbsent(clName, s -> new _FieldsMethods()).fields; + try { + if (classmap.containsKey(fieldName)) { + Field f = classmap.get(fieldName); + if (f == null) return false; + f.set(obj, value); + return true; + } + boolean exceptionDetected = false; + Field f = null; + do { + exceptionDetected = false; + try { + f = cl.getDeclaredField(fieldName); + f.setAccessible(true); + } catch (Exception ex) { + exceptionDetected = true; + cl = cl.getSuperclass(); + } + } while (exceptionDetected && !cl.equals(Object.class)); + classmap.put(fieldName, f); + if (f == null) return false; + f.set(obj, value); + return true; + } catch (Exception ex) { + return false; + } + } + public static <T> T getField(Object obj, String fieldName) { return getField(obj, fieldName, null); } @@ -87,6 +120,7 @@ public class ReflectionHelper { boolean exceptionDetected = false; Method m = null; do { + exceptionDetected = false; try { m = cl.getDeclaredMethod(methodName, argsTypes); m.setAccessible(true); diff --git a/src/main/java/kubatech/api/network/CustomTileEntityPacket.java b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java index b81bbb0337..11fb4f848f 100644 --- a/src/main/java/kubatech/api/network/CustomTileEntityPacket.java +++ b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java @@ -128,7 +128,11 @@ public class CustomTileEntityPacket implements IMessage { @Override public IMessage onMessage(CustomTileEntityPacket message, MessageContext ctx) { if (!ModUtils.isClientSided) return null; - World w = Minecraft.getMinecraft().thePlayer.getEntityWorld(); + Minecraft mc = Minecraft.getMinecraft(); + if (mc == null) return null; + if (mc.thePlayer == null) return null; + World w = mc.thePlayer.getEntityWorld(); + if (w == null) return null; if (message.w != w.provider.dimensionId) return null; TileEntity e = w.getTileEntity(message.x, message.y, message.z); if (e == null || e.isInvalid()) return null; diff --git a/src/main/java/kubatech/api/network/LoadConfigPacket.java b/src/main/java/kubatech/api/network/LoadConfigPacket.java index defb139151..03602e89f1 100644 --- a/src/main/java/kubatech/api/network/LoadConfigPacket.java +++ b/src/main/java/kubatech/api/network/LoadConfigPacket.java @@ -26,10 +26,12 @@ import io.netty.buffer.ByteBuf; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; +import kubatech.api.LoaderReference; import kubatech.config.Config; import kubatech.config.OverridesConfig; import kubatech.kubatech; import kubatech.loaders.MobRecipeLoader; +import kubatech.loaders.TCLoader; public class LoadConfigPacket implements IMessage { @@ -85,6 +87,7 @@ public class LoadConfigPacket implements IMessage { public IMessage onMessage(LoadConfigPacket message, MessageContext ctx) { kubatech.info("Received Mob Handler config, parsing"); MobRecipeLoader.processMobRecipeMap(message.mobsToLoad, message.mobsOverrides); + if (LoaderReference.Thaumcraft) TCLoader.lateLoad(); return null; } } diff --git a/src/main/java/kubatech/commands/CommandHandler.java b/src/main/java/kubatech/commands/CommandHandler.java index d1822a1ff8..dfa612fcce 100644 --- a/src/main/java/kubatech/commands/CommandHandler.java +++ b/src/main/java/kubatech/commands/CommandHandler.java @@ -61,7 +61,7 @@ public class CommandHandler extends CommandBase { } } - private static final ArrayList<String> aliases = new ArrayList<>(Collections.singleton("kt")); + private static final List<String> aliases = Collections.singletonList("kt"); public static final HashMap<String, ICommand> commands = new HashMap<>(); @Override diff --git a/src/main/java/kubatech/commands/CommandTea.java b/src/main/java/kubatech/commands/CommandTea.java new file mode 100644 index 0000000000..187b21c789 --- /dev/null +++ b/src/main/java/kubatech/commands/CommandTea.java @@ -0,0 +1,109 @@ +package kubatech.commands; + +import static kubatech.commands.CommandTea.Translations.*; + +import kubatech.savedata.PlayerData; +import kubatech.savedata.PlayerDataManager; +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.StatCollector; + +public class CommandTea extends CommandBase { + enum Translations { + INVALID_OPTION, + PLAYER_NOT_FOUND, + SUCCESS_GET, + SUCCESS_SET, + SUCCESS_ADD, + USAGE, + ; + final String key; + + Translations() { + key = "command.tea." + this.name().toLowerCase(); + } + + public String get() { + return StatCollector.translateToLocal(key); + } + + public String get(Object... args) { + return StatCollector.translateToLocalFormatted(key, args); + } + + public String getKey() { + return key; + } + + @Override + public String toString() { + return get(); + } + } + + @Override + public String getCommandName() { + return "tea"; + } + + @Override + public String getCommandUsage(ICommandSender p_71518_1_) { + return "tea " + USAGE.get(); + } + + @Override + public int getRequiredPermissionLevel() { + return 4; + } + + @Override + public void processCommand(ICommandSender p_71515_1_, String[] p_71515_2_) { + if (p_71515_2_.length < 2) { + p_71515_1_.addChatMessage(new ChatComponentText(INVALID_OPTION.get())); + return; + } + PlayerData playerData = PlayerDataManager.getPlayer(p_71515_2_[0]); + if (playerData == null) { + p_71515_1_.addChatMessage(new ChatComponentText(PLAYER_NOT_FOUND.get())); + return; + } + if (!p_71515_2_[1].equalsIgnoreCase("get") && p_71515_2_.length < 3) { + p_71515_1_.addChatMessage(new ChatComponentText(INVALID_OPTION.get())); + return; + } + switch (p_71515_2_[1].toLowerCase()) { + case "get": + p_71515_1_.addChatMessage(new ChatComponentText(SUCCESS_GET.get(p_71515_2_[0], playerData.teaAmount))); + break; + case "set": { + long tea; + try { + tea = Long.parseLong(p_71515_2_[2]); + } catch (NumberFormatException ex) { + p_71515_1_.addChatMessage(new ChatComponentText(INVALID_OPTION.get())); + return; + } + playerData.teaAmount = tea; + playerData.markDirty(); + p_71515_1_.addChatMessage(new ChatComponentText(SUCCESS_SET.get(p_71515_2_[0], playerData.teaAmount))); + break; + } + case "add": { + long tea; + try { + tea = Long.parseLong(p_71515_2_[2]); + } catch (NumberFormatException ex) { + p_71515_1_.addChatMessage(new ChatComponentText(INVALID_OPTION.get())); + return; + } + playerData.teaAmount += tea; + playerData.markDirty(); + p_71515_1_.addChatMessage(new ChatComponentText(SUCCESS_ADD.get(p_71515_2_[0], playerData.teaAmount))); + break; + } + default: + break; + } + } +} diff --git a/src/main/java/kubatech/kubatech.java b/src/main/java/kubatech/kubatech.java index ca4d06320f..740699aa34 100644 --- a/src/main/java/kubatech/kubatech.java +++ b/src/main/java/kubatech/kubatech.java @@ -42,9 +42,11 @@ import org.apache.logging.log4j.Logger; version = Tags.VERSION, name = Tags.MODNAME, acceptedMinecraftVersions = "[1.7.10]", - dependencies = "required-after:gregtech; " + "required-after:gtnhmixins@[2.0.1,); " + "after:EnderIO; " - + "after:AWWayofTime; " + "after:ExtraUtilities; " + "after: InfernalMobs; " + "after: Thaumcraft; " - + "after: MineTweaker3; " + "after: miscutils; " + "after: harvestcraft; " + "after: Forestry; ") + dependencies = "required-after: gregtech; " + "required-after: gtnhmixins@[2.0.1,); " + + "required-after: modularui; " + "after: EnderIO; " + + "after: AWWayofTime; " + "after: ExtraUtilities; " + "after: InfernalMobs; " + "after: Thaumcraft; " + + "after: MineTweaker3; " + "after: miscutils; " + "after: harvestcraft; " + "after: Forestry; " + + "after: DraconicEvolution; " + "after: Avaritia; " + " after: dreamcraft; ") public class kubatech { public static kubatech instance = null; diff --git a/src/main/java/kubatech/loaders/BlockLoader.java b/src/main/java/kubatech/loaders/BlockLoader.java new file mode 100644 index 0000000000..55e97badc6 --- /dev/null +++ b/src/main/java/kubatech/loaders/BlockLoader.java @@ -0,0 +1,24 @@ +package kubatech.loaders; + +import cpw.mods.fml.common.registry.GameRegistry; +import kubatech.api.enums.ItemList; +import kubatech.loaders.block.KubaBlock; +import kubatech.loaders.block.KubaItemBlock; +import kubatech.loaders.block.blocks.TeaAcceptor; +import kubatech.tileentity.TeaAcceptorTile; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemBlock; + +public class BlockLoader { + + public static final KubaBlock kubaBlock = new KubaBlock(Material.anvil); + public static final ItemBlock kubaItemBlock = new KubaItemBlock(kubaBlock); + + public static void registerBlocks() { + GameRegistry.registerTileEntity(TeaAcceptorTile.class, "KT_TeaAcceptor"); + GameRegistry.registerBlock(kubaBlock, null, "kubablocks"); + GameRegistry.registerItem(kubaItemBlock, "kubablocks"); + + ItemList.TeaAcceptor.set(kubaBlock.registerProxyBlock(new TeaAcceptor())); + } +} diff --git a/src/main/java/kubatech/loaders/ItemLoader.java b/src/main/java/kubatech/loaders/ItemLoader.java index 7df248da60..8db9c9f15f 100644 --- a/src/main/java/kubatech/loaders/ItemLoader.java +++ b/src/main/java/kubatech/loaders/ItemLoader.java @@ -22,6 +22,7 @@ package kubatech.loaders; import static kubatech.api.enums.ItemList.*; import cpw.mods.fml.common.registry.GameRegistry; +import kubatech.loaders.item.ItemProxy; import kubatech.loaders.item.KubaItems; import kubatech.loaders.item.items.Tea; import kubatech.loaders.item.items.TeaCollection; @@ -31,7 +32,7 @@ import kubatech.loaders.item.items.TeaUltimate; public class ItemLoader { public static final KubaItems kubaitems = new KubaItems(); - public static void RegisterItems() { + public static void registerItems() { GameRegistry.registerItem(kubaitems, "kubaitems"); // DON'T EVER CHANGE ORDER IN HERE, ADD NEW ITEMS ON BOTTOM @@ -75,5 +76,8 @@ public class ItemLoader { FermentedTeaLeaf.set(kubaitems.registerProxyItem(new TeaIngredient("fermented_tea_leaf"))); BruisedTeaLeaf.set(kubaitems.registerProxyItem(new TeaIngredient("bruised_tea_leaf"))); PartiallyOxidizedTeaLeaf.set(kubaitems.registerProxyItem(new TeaIngredient("partially_oxidized_tea_leaf"))); + + TeaAcceptorResearchNote.set( + kubaitems.registerProxyItem(new ItemProxy("tea_acceptor_research_note", "research_note"))); } } diff --git a/src/main/java/kubatech/loaders/RecipeLoader.java b/src/main/java/kubatech/loaders/RecipeLoader.java index 2b7fe77719..7bbaaf17e7 100644 --- a/src/main/java/kubatech/loaders/RecipeLoader.java +++ b/src/main/java/kubatech/loaders/RecipeLoader.java @@ -21,6 +21,7 @@ package kubatech.loaders; import static kubatech.api.enums.ItemList.*; +import com.dreammaster.gthandler.CustomItemList; import cpw.mods.fml.common.registry.GameRegistry; import gregtech.api.enums.GT_Values; import gregtech.api.enums.Materials; @@ -270,5 +271,24 @@ public class RecipeLoader { GameRegistry.addSmelting(WhiteTeaLeaf.get(1), WhiteTea.get(1), 10); GameRegistry.addSmelting(YellowTeaLeaf.get(1), YellowTea.get(1), 10); } + if (LoaderReference.Avaritia && LoaderReference.GTNHCoreMod) { + GT_Values.RA.addAssemblylineRecipe( + TeaAcceptorResearchNote.get(1), + 10000, + new Object[] { + LegendaryUltimateTea.get(0), + GameRegistry.findItemStack("Avaritia", "Neutronium_Compressor", 1), + gregtech.api.enums.ItemList.Quantum_Tank_EV.get(1), + CustomItemList.FluidExtractorUHV.get(10), + new Object[] {OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L}, + new Object[] {OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L}, + new Object[] {OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L}, + new Object[] {OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L}, + }, + new FluidStack[] {FluidRegistry.getFluidStack("molten.indalloy140", 28800)}, + TeaAcceptor.get(1), + 6000, + 2_048_000); + } } } diff --git a/src/main/java/kubatech/loaders/TCLoader.java b/src/main/java/kubatech/loaders/TCLoader.java new file mode 100644 index 0000000000..3c4980f251 --- /dev/null +++ b/src/main/java/kubatech/loaders/TCLoader.java @@ -0,0 +1,125 @@ +package kubatech.loaders; + +import cpw.mods.fml.common.registry.GameRegistry; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.stream.Collectors; +import kubatech.api.LoaderReference; +import kubatech.api.enums.ItemList; +import kubatech.api.utils.ItemID; +import kubatech.loaders.item.items.TeaUltimate; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import thaumcraft.api.ThaumcraftApi; +import thaumcraft.api.ThaumcraftApiHelper; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.crafting.InfusionRecipe; +import thaumcraft.api.research.ResearchCategories; +import thaumcraft.api.research.ResearchItem; +import thaumcraft.api.research.ResearchPage; + +public class TCLoader { + private static boolean lateLoaded = false; + + public static void load() {} + + public static void lateLoad() { + if (lateLoaded) return; + lateLoaded = true; + if (!LoaderReference.GTNHCoreMod || !LoaderReference.DraconicEvolution) return; + + final ItemStack[] components = new ItemStack[] { + // ItemList.LegendaryBlackTea.get(1), + // ItemList.LegendaryButterflyTea.get(1), + // ItemList.LegendaryEarlGrayTea.get(1), + ItemList.LegendaryGreenTea.get(1), // EIG + // ItemList.LegendaryLemonTea.get(1), + // ItemList.LegendaryMilkTea.get(1), + // ItemList.LegendaryOolongTea.get(1), + ItemList.LegendaryPeppermintTea.get(1), // HTGR + ItemList.LegendaryPuerhTea.get(1), // EEC + // ItemList.LegendaryRedTea.get(1), + // ItemList.LegendaryWhiteTea.get(1), + ItemList.LegendaryYellowTea.get(1), // IApiary + ItemList.BlackTea.get(1), + ItemList.EarlGrayTea.get(1), + ItemList.GreenTea.get(1), + ItemList.LemonTea.get(1), + ItemList.MilkTea.get(1), + ItemList.OolongTea.get(1), + ItemList.PeppermintTea.get(1), + ItemList.PuerhTea.get(1), + ItemList.WhiteTea.get(1), + ItemList.YellowTea.get(1) + }; + + final HashSet<ItemID> componentsHashed = Arrays.stream(components) + .map(stack -> ItemID.create_NoCopy(stack, true, false, true)) + .collect(Collectors.toCollection(HashSet::new)); + + InfusionRecipe ultimateTeaRecipe; + //noinspection unchecked + ThaumcraftApi.getCraftingRecipes() + .add( + ultimateTeaRecipe = + new InfusionRecipe( + "KT_UltimateTea", + ItemList.LegendaryUltimateTea.get(1), + 10, + new AspectList() + .add(Aspect.MAGIC, 100) + .add(Aspect.HEAL, 100) + .add(Aspect.PLANT, 100) + .add(Aspect.EXCHANGE, 100), + GameRegistry.findItemStack("DraconicEvolution", "dezilsMarshmallow", 1), + components) { + @Override + public boolean matches( + ArrayList<ItemStack> input, + ItemStack central, + World world, + EntityPlayer player) { + if (!central.isItemEqual(getRecipeInput())) return false; + if (!ThaumcraftApiHelper.isResearchComplete( + player.getCommandSenderName(), this.research)) return false; + if (componentsHashed.size() > input.size()) return false; + HashSet<ItemID> hashedInputs = input.stream() + .map(stack -> ItemID.create_NoCopy(stack, true, false, true)) + .collect(Collectors.toCollection(HashSet::new)); + return hashedInputs.containsAll(componentsHashed); + } + }); + ResearchItem research = + new ResearchItem( + "KT_UltimateTea", + "NEWHORIZONS", + new AspectList() + .add(Aspect.MAGIC, 1) + .add(Aspect.HEAL, 1) + .add(Aspect.PLANT, 1) + .add(Aspect.EXCHANGE, 1), + -2, + 4, + 2, + ItemList.LegendaryUltimateTea.get(1)) { + @Override + public String getName() { + return TeaUltimate.getUltimateTeaDisplayName(super.getName()); + } + }; + research.setPages( + new ResearchPage("KT.research.ultimatetea") { + @Override + public String getTranslatedText() { + return TeaUltimate.getUltimateTeaDisplayName(super.getTranslatedText()); + } + }, + new ResearchPage(ultimateTeaRecipe)); + research.setParents("INFUSION", "DEZILSMARSHMALLOW"); + ThaumcraftApi.addWarpToResearch("KT_UltimateTea", 20); + ResearchCategories.addResearch(research); + } +} diff --git a/src/main/java/kubatech/loaders/block/BlockProxy.java b/src/main/java/kubatech/loaders/block/BlockProxy.java new file mode 100644 index 0000000000..1c06fd50d9 --- /dev/null +++ b/src/main/java/kubatech/loaders/block/BlockProxy.java @@ -0,0 +1,76 @@ +package kubatech.loaders.block; + +import static kubatech.loaders.block.KubaBlock.defaultTileEntityUI; + +import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI; +import java.util.List; +import kubatech.Tags; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +public class BlockProxy { + + private final String unlocalizedName; + private final String texturepath; + private IIcon icon; + + public BlockProxy(String unlocalizedName, String texture) { + this.unlocalizedName = "kubablock." + unlocalizedName; + texturepath = Tags.MODID + ":" + texture; + } + + public void itemInit(int ID) {} + + public boolean onActivated(World world, int x, int y, int z, EntityPlayer player) { + if (this instanceof IProxyTileEntityProvider) { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof ITileWithModularUI) { + if (world.isRemote) return true; + if (te instanceof KubaBlock.IModularUIProvider) + ((KubaBlock.IModularUIProvider) te).getUI().open(player, world, x, y, z); + else defaultTileEntityUI.open(player, world, x, y, z); + return true; + } + } + return false; + } + + public void onBlockPlaced(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) {} + + public void registerIcon(IIconRegister iconRegister) { + icon = iconRegister.registerIcon(texturepath); + } + + public IIcon getIcon(int side) { + return icon; + } + + public String getUnlocalizedName() { + return this.unlocalizedName; + } + + public String getDisplayName(ItemStack stack) { + return StatCollector.translateToLocal(this.unlocalizedName + ".name").trim(); + } + + public void addInformation(ItemStack stack, EntityPlayer entity, List<String> tooltipList, boolean showDebugInfo) {} + + public float getHardness() { + return 10.f; + } + + public Material getMaterial() { + return Material.anvil; + } + + public float getResistance() { + return 5.f; + } +} diff --git a/src/main/java/kubatech/loaders/block/IProxyTileEntityProvider.java b/src/main/java/kubatech/loaders/block/IProxyTileEntityProvider.java new file mode 100644 index 0000000000..b2a94c09b7 --- /dev/null +++ b/src/main/java/kubatech/loaders/block/IProxyTileEntityProvider.java @@ -0,0 +1,8 @@ +package kubatech.loaders.block; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public interface IProxyTileEntityProvider { + TileEntity createTileEntity(World world); +} diff --git a/src/main/java/kubatech/loaders/block/KubaBlock.java b/src/main/java/kubatech/loaders/block/KubaBlock.java new file mode 100644 index 0000000000..dd34ce5883 --- /dev/null +++ b/src/main/java/kubatech/loaders/block/KubaBlock.java @@ -0,0 +1,187 @@ +package kubatech.loaders.block; + +import static kubatech.kubatech.KT; + +import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI; +import com.gtnewhorizons.modularui.api.screen.ModularUIContext; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.builder.UIBuilder; +import com.gtnewhorizons.modularui.common.builder.UIInfo; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.List; +import java.util.function.Function; +import kubatech.loaders.BlockLoader; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class KubaBlock extends Block { + + public static final Function<IModularUIContainerCreator, UIInfo<?, ?>> TileEntityUIFactory = + containerConstructor -> UIBuilder.of() + .container((player, world, x, y, z) -> { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof ITileWithModularUI) { + UIBuildContext buildContext = new UIBuildContext(player); + ModularWindow window = ((ITileWithModularUI) te).createWindow(buildContext); + return containerConstructor.createUIContainer( + new ModularUIContext(buildContext, te::markDirty), window); + } + return null; + }) + .gui(((player, world, x, y, z) -> { + if (!world.isRemote) return null; + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof ITileWithModularUI) { + UIBuildContext buildContext = new UIBuildContext(player); + ModularWindow window = ((ITileWithModularUI) te).createWindow(buildContext); + return new ModularGui(containerConstructor.createUIContainer( + new ModularUIContext(buildContext, null), window)); + } + return null; + })) + .build(); + + public static final UIInfo<?, ?> defaultTileEntityUI = TileEntityUIFactory.apply(ModularUIContainer::new); + + static final HashMap<Integer, BlockProxy> blocks = new HashMap<>(); + private static int idCounter = 0; + + public KubaBlock(Material p_i45394_1_) { + super(p_i45394_1_); + setCreativeTab(KT); + } + + public ItemStack registerProxyBlock(BlockProxy block) { + blocks.put(idCounter, block); + block.itemInit(idCounter); + return new ItemStack(BlockLoader.kubaItemBlock, 1, idCounter++); + } + + private BlockProxy getBlock(int id) { + return blocks.get(id); + } + + WeakReference<World> lastAccessor = null; + int X, Y, Z; + + public void setLastBlockAccess(World accessor, int x, int y, int z) { + lastAccessor = new WeakReference<>(accessor); + X = x; + Y = y; + Z = z; + } + + @Override + public boolean hasTileEntity(int meta) { + return getBlock(meta) instanceof IProxyTileEntityProvider; + } + + @SuppressWarnings("unchecked") + @Override + public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, List p_149666_3_) { + for (int i = 0; i < blocks.size(); i++) p_149666_3_.add(new ItemStack(p_149666_1_, 1, i)); + } + + @Override + public void registerBlockIcons(IIconRegister p_149651_1_) { + blocks.values().forEach(b -> b.registerIcon(p_149651_1_)); + } + + @Override + public IIcon getIcon(int p_149691_1_, int p_149691_2_) { + return blocks.get(p_149691_2_).getIcon(p_149691_1_); + } + + @Override + public String getLocalizedName() { + return "KUBABLOCK"; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + if (!hasTileEntity(metadata)) return null; + return ((IProxyTileEntityProvider) getBlock(metadata)).createTileEntity(world); + } + + @Override + public boolean onBlockActivated( + World p_149727_1_, + int p_149727_2_, + int p_149727_3_, + int p_149727_4_, + EntityPlayer p_149727_5_, + int p_149727_6_, + float p_149727_7_, + float p_149727_8_, + float p_149727_9_) { + return getBlock(p_149727_1_.getBlockMetadata(p_149727_2_, p_149727_3_, p_149727_4_)) + .onActivated(p_149727_1_, p_149727_2_, p_149727_3_, p_149727_4_, p_149727_5_); + } + + @Override + public void onBlockPlacedBy( + World p_149689_1_, + int p_149689_2_, + int p_149689_3_, + int p_149689_4_, + EntityLivingBase p_149689_5_, + ItemStack p_149689_6_) { + getBlock(p_149689_6_.getItemDamage()) + .onBlockPlaced(p_149689_1_, p_149689_2_, p_149689_3_, p_149689_4_, p_149689_5_, p_149689_6_); + } + + @Override + public float getBlockHardness(World p_149712_1_, int p_149712_2_, int p_149712_3_, int p_149712_4_) { + return getBlock(p_149712_1_.getBlockMetadata(p_149712_2_, p_149712_3_, p_149712_4_)) + .getHardness(); + } + + @Override + public Material getMaterial() { + if (lastAccessor == null) return super.getMaterial(); + World world = lastAccessor.get(); + if (world == null) { + lastAccessor = null; + return super.getMaterial(); + } + if (world.getBlock(X, Y, Z) != this) return super.getMaterial(); + return getBlock(world.getBlockMetadata(X, Y, Z)).getMaterial(); + } + + @Override + public float getExplosionResistance( + Entity par1Entity, + World world, + int x, + int y, + int z, + double explosionX, + double explosionY, + double explosionZ) { + return getBlock(world.getBlockMetadata(x, y, z)).getResistance(); + } + + @FunctionalInterface + public interface IModularUIContainerCreator { + ModularUIContainer createUIContainer(ModularUIContext context, ModularWindow mainWindow); + } + + @FunctionalInterface + public interface IModularUIProvider { + UIInfo<?, ?> getUI(); + } +} diff --git a/src/main/java/kubatech/loaders/block/KubaItemBlock.java b/src/main/java/kubatech/loaders/block/KubaItemBlock.java new file mode 100644 index 0000000000..eb5197d1bf --- /dev/null +++ b/src/main/java/kubatech/loaders/block/KubaItemBlock.java @@ -0,0 +1,37 @@ +package kubatech.loaders.block; + +import java.util.List; +import kubatech.kubatech; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class KubaItemBlock extends ItemBlock { + public KubaItemBlock(Block p_i45328_1_) { + super(p_i45328_1_); + setHasSubtypes(true); + } + + @Override + public void registerIcons(IIconRegister p_94581_1_) { + super.registerIcons(p_94581_1_); + } + + @Override + public String getUnlocalizedName(ItemStack p_77667_1_) { + return KubaBlock.blocks.get(p_77667_1_.getItemDamage()).getUnlocalizedName(); + } + + @Override + public String getItemStackDisplayName(ItemStack p_77653_1_) { + return KubaBlock.blocks.get(p_77653_1_.getItemDamage()).getDisplayName(p_77653_1_); + } + + @SuppressWarnings("unchecked") + @Override + public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p_77624_3_, boolean p_77624_4_) { + KubaBlock.blocks.get(p_77624_1_.getItemDamage()).addInformation(p_77624_1_, p_77624_2_, p_77624_3_, p_77624_4_); + } +} diff --git a/src/main/java/kubatech/loaders/block/blocks/TeaAcceptor.java b/src/main/java/kubatech/loaders/block/blocks/TeaAcceptor.java new file mode 100644 index 0000000000..97b41efdc0 --- /dev/null +++ b/src/main/java/kubatech/loaders/block/blocks/TeaAcceptor.java @@ -0,0 +1,42 @@ +package kubatech.loaders.block.blocks; + +import java.util.List; +import kubatech.loaders.block.BlockProxy; +import kubatech.loaders.block.IProxyTileEntityProvider; +import kubatech.tileentity.TeaAcceptorTile; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class TeaAcceptor extends BlockProxy implements IProxyTileEntityProvider { + + public TeaAcceptor() { + super("tea_acceptor", "tea_acceptor"); + } + + @Override + public TileEntity createTileEntity(World world) { + return new TeaAcceptorTile(); + } + + @Override + public void onBlockPlaced(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + if (world.isRemote) return; + if (!(player instanceof EntityPlayerMP)) return; + ((TeaAcceptorTile) world.getTileEntity(x, y, z)).setTeaOwner(player.getCommandSenderName()); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer entity, List<String> tooltipList, boolean showDebugInfo) { + tooltipList.add("Accepts Tea items and adds them to your network"); + tooltipList.add("Can accept up to 10 stacks per tick"); + } + + @Override + public float getResistance() { + return 999999999999.f; + } +} diff --git a/src/main/java/kubatech/loaders/item/IItemProxyGUI.java b/src/main/java/kubatech/loaders/item/IItemProxyGUI.java new file mode 100644 index 0000000000..40020c81e9 --- /dev/null +++ b/src/main/java/kubatech/loaders/item/IItemProxyGUI.java @@ -0,0 +1,9 @@ +package kubatech.loaders.item; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface IItemProxyGUI { + ModularWindow createWindow(ItemStack stack, EntityPlayer player); +} diff --git a/src/main/java/kubatech/loaders/item/ItemProxy.java b/src/main/java/kubatech/loaders/item/ItemProxy.java index 03ea390f74..6c2ac6f7ea 100644 --- a/src/main/java/kubatech/loaders/item/ItemProxy.java +++ b/src/main/java/kubatech/loaders/item/ItemProxy.java @@ -19,6 +19,13 @@ package kubatech.loaders.item; +import com.gtnewhorizons.modularui.api.screen.ModularUIContext; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.builder.UIBuilder; +import com.gtnewhorizons.modularui.common.builder.UIInfo; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; import java.util.List; import kubatech.Tags; import net.minecraft.client.renderer.texture.IIconRegister; @@ -31,6 +38,25 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; public class ItemProxy { + private static final UIInfo<?, ?> HeldItemUIInfo = UIBuilder.of() + .container((player, w, x, y, z) -> { + ItemStack stack = player.getHeldItem(); + ItemProxy proxy = KubaItems.getItemProxy(stack); + if (!(proxy instanceof IItemProxyGUI)) return null; + UIBuildContext context = new UIBuildContext(player); + ModularWindow window = ((IItemProxyGUI) proxy).createWindow(stack, player); + return new ModularUIContainer( + new ModularUIContext(context, () -> player.inventoryContainer.detectAndSendChanges()), window); + }) + .gui((player, w, x, y, z) -> { + ItemStack stack = player.getHeldItem(); + ItemProxy proxy = KubaItems.getItemProxy(stack); + if (!(proxy instanceof IItemProxyGUI)) return null; + UIBuildContext context = new UIBuildContext(player); + ModularWindow window = ((IItemProxyGUI) proxy).createWindow(stack, player); + return new ModularGui(new ModularUIContainer(new ModularUIContext(context, null), window)); + }) + .build(); private final String unlocalizedName; private final String texturepath; private IIcon icon; @@ -80,4 +106,9 @@ public class ItemProxy { public int getMaxItemUseDuration() { return 0; } + + public static void openHeldItemGUI(EntityPlayer player) { + ItemStack stack = player.getHeldItem(); + if (KubaItems.getItemProxy(stack) instanceof IItemProxyGUI) HeldItemUIInfo.open(player); + } } diff --git a/src/main/java/kubatech/loaders/item/KubaItems.java b/src/main/java/kubatech/loaders/item/KubaItems.java index b0f8723cde..205622a30b 100644 --- a/src/main/java/kubatech/loaders/item/KubaItems.java +++ b/src/main/java/kubatech/loaders/item/KubaItems.java @@ -25,6 +25,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.HashMap; import java.util.List; +import kubatech.loaders.ItemLoader; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; @@ -56,6 +57,11 @@ public class KubaItems extends Item { return items.get(stack.getItemDamage()); } + public static ItemProxy getItemProxy(ItemStack stack) { + if (!(stack.getItem() instanceof KubaItems)) return null; + return ItemLoader.kubaitems.getItem(stack); + } + private ItemProxy getItem(int damage) { return items.get(damage); } diff --git a/src/main/java/kubatech/loaders/item/items/TeaCollection.java b/src/main/java/kubatech/loaders/item/items/TeaCollection.java index 85b74421b6..c0c20aa244 100644 --- a/src/main/java/kubatech/loaders/item/items/TeaCollection.java +++ b/src/main/java/kubatech/loaders/item/items/TeaCollection.java @@ -32,6 +32,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagString; import net.minecraft.stats.Achievement; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; @@ -66,6 +67,21 @@ public class TeaCollection extends ItemProxy { {1, 3} }; + boolean checkTeaOwner(ItemStack stack, String username) { + NBTTagCompound tag = stack.stackTagCompound; + if (tag == null || !stack.stackTagCompound.hasKey("TeaOwner")) return true; + return stack.stackTagCompound.getString("TeaOwner").equals(username); + } + + private boolean checkOrSetTeaOwner(ItemStack stack, String username) { + NBTTagCompound tag = stack.stackTagCompound; + if (tag == null || !stack.stackTagCompound.hasKey("TeaOwner")) { + stack.setTagInfo("TeaOwner", new NBTTagString(username)); + return true; + } + return stack.stackTagCompound.getString("TeaOwner").equals(username); + } + @Override public void ItemInit(int index) { super.ItemInit(index); @@ -87,9 +103,7 @@ public class TeaCollection extends ItemProxy { @Override public void addInformation(ItemStack stack, EntityPlayer entity, List<String> tooltipList, boolean showDebugInfo) { - if (stack.stackTagCompound != null - && stack.stackTagCompound.hasKey("TeaOwner") - && !stack.stackTagCompound.getString("TeaOwner").equals(entity.getCommandSenderName())) { + if (!checkTeaOwner(stack, entity.getCommandSenderName())) { tooltipList.add(EnumChatFormatting.GRAY + "" + EnumChatFormatting.BOLD + "" + EnumChatFormatting.ITALIC + StatCollector.translateToLocal("kubaitem.notyours")); return; @@ -105,20 +119,16 @@ public class TeaCollection extends ItemProxy { } @Override - public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) { - if (p_77659_1_.stackTagCompound == null || !p_77659_1_.stackTagCompound.hasKey("TeaOwner")) return p_77659_1_; - if (!p_77659_1_.stackTagCompound.getString("TeaOwner").equals(p_77659_3_.getCommandSenderName())) - return p_77659_1_; - p_77659_3_.setItemInUse(p_77659_1_, 32); - return p_77659_1_; + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer entity) { + if (!checkTeaOwner(stack, entity.getCommandSenderName())) return stack; + entity.setItemInUse(stack, 32); + return stack; } @Override public ItemStack onEaten(ItemStack stack, World world, EntityPlayer entity) { if (world.isRemote) return stack; if (!(entity instanceof EntityPlayerMP)) return stack; - if (stack.stackTagCompound == null || !stack.stackTagCompound.hasKey("TeaOwner")) return stack; - if (!stack.stackTagCompound.getString("TeaOwner").equals(entity.getCommandSenderName())) return stack; entity.addChatComponentMessage(new ChatComponentText( EnumChatFormatting.GREEN + StatCollector.translateToLocal("kubaitem.teacollection.mmm"))); entity.triggerAchievement(achievement); @@ -133,11 +143,7 @@ public class TeaCollection extends ItemProxy { @Override public String getDisplayName(ItemStack stack) { if (!ModUtils.isClientSided) return super.getDisplayName(stack); - if (stack.stackTagCompound == null - || (!stack.stackTagCompound.hasKey("TeaOwner") - || stack.stackTagCompound - .getString("TeaOwner") - .equals(Minecraft.getMinecraft().thePlayer.getCommandSenderName()))) + if (checkTeaOwner(stack, Minecraft.getMinecraft().thePlayer.getCommandSenderName())) return super.getDisplayName(stack); return EnumChatFormatting.GOLD + "" + EnumChatFormatting.BOLD + "" + EnumChatFormatting.ITALIC + "???????"; } @@ -146,11 +152,9 @@ public class TeaCollection extends ItemProxy { public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isCurrentItem) { if (world.isRemote) return; if (!(entity instanceof EntityPlayerMP)) return; + checkOrSetTeaOwner(stack, entity.getCommandSenderName()); NBTTagCompound tag = stack.stackTagCompound; - if (tag == null) tag = stack.stackTagCompound = new NBTTagCompound(); if (tag.hasKey("display")) tag.removeTag("display"); - if (tag.hasKey("TeaOwner")) return; - tag.setString("TeaOwner", entity.getCommandSenderName()); } private static class TeaPage extends AchievementPage { diff --git a/src/main/java/kubatech/loaders/item/items/TeaUltimate.java b/src/main/java/kubatech/loaders/item/items/TeaUltimate.java index 1119de63d3..8a1d11a41a 100644 --- a/src/main/java/kubatech/loaders/item/items/TeaUltimate.java +++ b/src/main/java/kubatech/loaders/item/items/TeaUltimate.java @@ -19,13 +19,34 @@ package kubatech.loaders.item.items; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.*; +import java.text.NumberFormat; +import kubatech.api.enums.ItemList; import kubatech.api.utils.ModUtils; import kubatech.api.utils.StringUtils; +import kubatech.loaders.item.IItemProxyGUI; +import kubatech.savedata.PlayerData; +import kubatech.savedata.PlayerDataManager; import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; -public class TeaUltimate extends TeaCollection { +public class TeaUltimate extends TeaCollection implements IItemProxyGUI { public TeaUltimate() { super("ultimate_tea"); } @@ -34,22 +55,135 @@ public class TeaUltimate extends TeaCollection { private static long timeCounter = 0; private static int colorCounter = 0; + public static String getUltimateTeaDisplayName(String displayName) { + long current = System.currentTimeMillis(); + if (current - timeCounter > 100) { + timeCounter = current; + name = StringUtils.applyRainbow( + "ULTIMATE", colorCounter++, EnumChatFormatting.BOLD.toString() + EnumChatFormatting.OBFUSCATED); + } + return String.format(displayName, name + EnumChatFormatting.RESET); + } + @Override public String getDisplayName(ItemStack stack) { if (!ModUtils.isClientSided) return super.getDisplayName(stack); - if (stack.stackTagCompound == null - || (!stack.stackTagCompound.hasKey("TeaOwner") - || stack.stackTagCompound - .getString("TeaOwner") - .equals(Minecraft.getMinecraft().thePlayer.getCommandSenderName()))) { - long current = System.currentTimeMillis(); - if (current - timeCounter > 100) { - timeCounter = current; - name = StringUtils.applyRainbow( - "ULTIMATE", colorCounter++, EnumChatFormatting.BOLD.toString() + EnumChatFormatting.OBFUSCATED); - } - return String.format(super.getDisplayName(stack), name + EnumChatFormatting.RESET); + if (checkTeaOwner(stack, Minecraft.getMinecraft().thePlayer.getCommandSenderName())) { + return getUltimateTeaDisplayName(super.getDisplayName(stack)); } return EnumChatFormatting.GOLD + "" + EnumChatFormatting.BOLD + "" + EnumChatFormatting.ITALIC + "???????"; } + + @Override + public ModularWindow createWindow(ItemStack stack, EntityPlayer player) { + ModularWindow.Builder builder = ModularWindow.builder(200, 150); + builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); + final PlayerData playerData = PlayerDataManager.getPlayer(player.getCommandSenderName()); + IDrawable tab1 = new ItemDrawable(ItemList.LegendaryUltimateTea.get(1)).withFixedSize(18, 18, 4, 6); + IDrawable tab2 = new ItemDrawable(new ItemStack(Blocks.crafting_table)).withFixedSize(18, 18, 4, 6); + IDrawable tab3 = new ItemDrawable(new ItemStack(Items.golden_apple)).withFixedSize(18, 18, 4, 6); + builder.widget(new TabContainer() + .setButtonSize(28, 32) + .addTabButton(new TabButton(0) + .setBackground(false, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f), tab1) + .setBackground(true, ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f), tab1) + .setPos(0, -28)) + .addTabButton(new TabButton(1) + .setBackground(false, ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f), tab2) + .setBackground(true, ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f), tab2) + .setPos(28, -28)) + .addTabButton(new TabButton(2) + .setBackground(false, ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f), tab3) + .setBackground(true, ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f), tab3) + .setPos(56, -28)) + .addPage(new MultiChildWidget() + .addChild(new TextWidget(new Text("STATUS") + .format(EnumChatFormatting.BOLD) + .format(EnumChatFormatting.GOLD) + .shadow()) + .setPos(10, 5)) + .addChild(new DynamicTextWidget(() -> new Text("Tea: " + + (playerData == null + ? "ERROR" + : NumberFormat.getInstance() + .format(playerData.teaAmount))) + .color(Color.GREEN.normal)) + .setPos(20, 20))) + .addPage(new MultiChildWidget() + .addChild(new TextWidget(new Text("EXCHANGE") + .format(EnumChatFormatting.BOLD) + .format(EnumChatFormatting.GOLD) + .shadow()) + .setPos(10, 5)) + .addChild(new ButtonWidget() + .setOnClick((Widget.ClickData clickData, Widget widget) -> { + if (!(player instanceof EntityPlayerMP)) return; + if (playerData == null || playerData.teaAmount < 50_000L) return; + playerData.teaAmount -= 50_000L; + playerData.markDirty(); + if (player.inventory.addItemStackToInventory( + ItemList.TeaAcceptorResearchNote.get(1))) return; + player.entityDropItem(ItemList.TeaAcceptorResearchNote.get(1), 0.5f); + }) + .setBackground(new ItemDrawable().setItem(ItemList.TeaAcceptorResearchNote.get(1))) + .addTooltip("Tea Acceptor Research Note") + .addTooltip(new Text("Cost: " + + NumberFormat.getInstance().format(50_000) + " Tea") + .color(Color.GRAY.normal)) + .setPos(20, 20))) + .addPage( + new MultiChildWidget() + .addChild(new TextWidget(new Text("BENEFITS") + .format(EnumChatFormatting.BOLD) + .format(EnumChatFormatting.GOLD) + .shadow()) + .setPos(10, 5)) + /*.addChild(new ButtonWidget() + .setOnClick((Widget.ClickData clickData, Widget widget) -> { + if (!(player instanceof EntityPlayerMP)) return; + if (playerData == null) return; + playerData.autoRegen = !playerData.autoRegen; + playerData.markDirty(); + }) + .setBackground(new ItemDrawable().setItem(new ItemStack(Items.potionitem, 1, 8193))) + .addTooltip("Regeneration I") + .addTooltip("For 1 minute") + .addTooltip(new Text("Cost: " + + NumberFormat.getInstance().format(75_000) + " Tea") + .color(Color.GRAY.normal)) + // .addTooltip( //Find a way to run that on server, or different approach + // new Text("Autobuy: " + (playerData == null ? "ERROR" : playerData.autoRegen)) + // .color(Color.GREY.normal)) + .setPos(20, 20))*/ )); + return builder.build(); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer entity) { + if (world.isRemote) return stack; + if (!(entity instanceof EntityPlayerMP)) return stack; + if (!checkTeaOwner(stack, entity.getCommandSenderName())) return stack; + openHeldItemGUI(entity); + return stack; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isCurrentItem) { + if (world.isRemote) return; + if (!(entity instanceof EntityPlayerMP)) return; + super.onUpdate(stack, world, entity, slot, isCurrentItem); + if (checkTeaOwner(stack, entity.getCommandSenderName())) { + PlayerData playerData = PlayerDataManager.getPlayer(entity.getCommandSenderName()); + if (playerData == null) return; + playerData.teaAmount++; + playerData.markDirty(); + + if (playerData.autoRegen && playerData.teaAmount > 75_000) { + if (((EntityPlayerMP) entity).getActivePotionEffect(Potion.regeneration) == null) { + ((EntityPlayerMP) entity).addPotionEffect(new PotionEffect(Potion.regeneration.id, 1200, 0, true)); + playerData.teaAmount -= 75_000; + } + } + } + } } diff --git a/src/main/java/kubatech/mixin/Mixin.java b/src/main/java/kubatech/mixin/Mixin.java index 01bb73089a..2a3259ef60 100644 --- a/src/main/java/kubatech/mixin/Mixin.java +++ b/src/main/java/kubatech/mixin/Mixin.java @@ -9,7 +9,8 @@ import java.util.List; public enum Mixin { // Minecraft - EnchantmentHelperMixin("minecraft.EnchantmentHelperMixin", VANILLA); + EnchantmentHelperMixin("minecraft.EnchantmentHelperMixin", VANILLA), + WorldMixin("minecraft.WorldMixin", VANILLA); public final String mixinClass; public final List<TargetedMod> targetedMods; diff --git a/src/main/java/kubatech/mixin/mixins/minecraft/WorldMixin.java b/src/main/java/kubatech/mixin/mixins/minecraft/WorldMixin.java new file mode 100644 index 0000000000..320917c694 --- /dev/null +++ b/src/main/java/kubatech/mixin/mixins/minecraft/WorldMixin.java @@ -0,0 +1,21 @@ +package kubatech.mixin.mixins.minecraft; + +import kubatech.loaders.BlockLoader; +import net.minecraft.block.Block; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@SuppressWarnings("unused") +@Mixin(value = World.class) +public class WorldMixin { + + @SuppressWarnings("ConstantConditions") + @Inject(method = "getBlock", at = @At("RETURN"), require = 1) + private void getBlockDetector(int x, int y, int z, CallbackInfoReturnable<Block> callbackInfoReturnable) { + if (callbackInfoReturnable.getReturnValue() == BlockLoader.kubaBlock) + BlockLoader.kubaBlock.setLastBlockAccess((World) (Object) this, x, y, z); + } +} diff --git a/src/main/java/kubatech/savedata/PlayerData.java b/src/main/java/kubatech/savedata/PlayerData.java new file mode 100644 index 0000000000..1a2866f7ea --- /dev/null +++ b/src/main/java/kubatech/savedata/PlayerData.java @@ -0,0 +1,26 @@ +package kubatech.savedata; + +import net.minecraft.nbt.NBTTagCompound; + +public class PlayerData { + public long teaAmount = 0L; + public boolean autoRegen = false; + + PlayerData(NBTTagCompound NBTData) { + teaAmount = NBTData.getLong("teaAmount"); + autoRegen = NBTData.getBoolean("autoRegen"); + } + + PlayerData() {} + + public NBTTagCompound toNBTData() { + NBTTagCompound NBTData = new NBTTagCompound(); + NBTData.setLong("teaAmount", teaAmount); + NBTData.setBoolean("autoRegen", autoRegen); + return NBTData; + } + + public void markDirty() { + PlayerDataManager.Instance.markDirty(); + } +} diff --git a/src/main/java/kubatech/savedata/PlayerDataManager.java b/src/main/java/kubatech/savedata/PlayerDataManager.java new file mode 100644 index 0000000000..3fcaf1ba25 --- /dev/null +++ b/src/main/java/kubatech/savedata/PlayerDataManager.java @@ -0,0 +1,71 @@ +package kubatech.savedata; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import java.util.HashMap; +import java.util.Map; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.WorldSavedData; +import net.minecraftforge.event.world.WorldEvent; + +public class PlayerDataManager extends WorldSavedData { + + private static final String playerDataName = "KubaTech_PlayerData"; + static PlayerDataManager Instance = null; + private final HashMap<String, PlayerData> players = new HashMap<>(); + + public static void Initialize(World world) { + if (Instance != null) { + Instance.players.clear(); + } + Instance = (PlayerDataManager) world.mapStorage.loadData(PlayerDataManager.class, playerDataName); + if (Instance == null) { + Instance = new PlayerDataManager(); + world.mapStorage.setData(playerDataName, Instance); + } + Instance.markDirty(); + } + + @SuppressWarnings("unused") + public PlayerDataManager(String p_i2141_1_) { + super(p_i2141_1_); + } + + public PlayerDataManager() { + super(playerDataName); + } + + @Override + public void readFromNBT(NBTTagCompound NBTData) { + if (!NBTData.hasKey("size")) return; + players.clear(); + for (int i = 0, imax = NBTData.getInteger("size"); i < imax; i++) { + NBTTagCompound playerNBTData = NBTData.getCompoundTag("Player." + i); + players.put(playerNBTData.getString("username"), new PlayerData(playerNBTData.getCompoundTag("data"))); + } + } + + @Override + public void writeToNBT(NBTTagCompound NBTData) { + NBTData.setInteger("size", players.size()); + int i = 0; + for (Map.Entry<String, PlayerData> playerDataEntry : players.entrySet()) { + NBTTagCompound playerNBTData = new NBTTagCompound(); + playerNBTData.setString("username", playerDataEntry.getKey()); + playerNBTData.setTag("data", playerDataEntry.getValue().toNBTData()); + NBTData.setTag("Player." + (i++), playerNBTData); + } + } + + public static PlayerData getPlayer(String username) { + if (Instance == null) return null; + return Instance.players.computeIfAbsent(username, s -> new PlayerData()); + } + + @SuppressWarnings("unused") + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load event) { + if (event.world.isRemote || event.world.provider.dimensionId != 0) return; + Initialize(event.world); + } +} diff --git a/src/main/java/kubatech/tileentity/TeaAcceptorTile.java b/src/main/java/kubatech/tileentity/TeaAcceptorTile.java new file mode 100644 index 0000000000..529b438526 --- /dev/null +++ b/src/main/java/kubatech/tileentity/TeaAcceptorTile.java @@ -0,0 +1,183 @@ +package kubatech.tileentity; + +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.*; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.builder.UIInfo; +import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; +import com.gtnewhorizons.modularui.common.widget.DynamicTextWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import java.text.NumberFormat; +import java.util.function.BiFunction; +import kubatech.api.enums.ItemList; +import kubatech.api.utils.StringUtils; +import kubatech.loaders.ItemLoader; +import kubatech.loaders.block.KubaBlock; +import kubatech.savedata.PlayerData; +import kubatech.savedata.PlayerDataManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; + +public class TeaAcceptorTile extends TileEntity + implements IInventory, ITileWithModularUI, KubaBlock.IModularUIProvider { + + public TeaAcceptorTile() { + super(); + } + + private String tileOwner = null; + private PlayerData playerData = null; + private long averageInput = 0L; + private long inAmount = 0L; + private int ticker = 0; + + public void setTeaOwner(String teaOwner) { + if (tileOwner == null || tileOwner.isEmpty()) { + tileOwner = teaOwner; + playerData = PlayerDataManager.getPlayer(tileOwner); + markDirty(); + } + } + + @Override + public void readFromNBT(NBTTagCompound NBTData) { + super.readFromNBT(NBTData); + tileOwner = NBTData.getString("tileOwner"); + if (!tileOwner.isEmpty()) { + playerData = PlayerDataManager.getPlayer(tileOwner); + } + } + + @Override + public void writeToNBT(NBTTagCompound NBTData) { + super.writeToNBT(NBTData); + NBTData.setString("tileOwner", tileOwner); + } + + @Override + public void updateEntity() { + if (++ticker % 100 == 0) { + averageInput = inAmount / 100; + inAmount = 0; + } + } + + @Override + public int getSizeInventory() { + return 10; + } + + @Override + public ItemStack getStackInSlot(int p_70301_1_) { + return null; + } + + @Override + public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) { + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int p_70304_1_) { + return null; + } + + @Override + public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) { + if (playerData != null) { + playerData.teaAmount += p_70299_2_.stackSize; + playerData.markDirty(); + inAmount += p_70299_2_.stackSize; + } + } + + @Override + public String getInventoryName() { + return "Tea acceptor"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer p_70300_1_) { + return p_70300_1_.getCommandSenderName().equals(tileOwner); + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + private static final int minDamage = ItemList.BlackTea.get(1).getItemDamage(); + private static final int maxDamage = ItemList.YellowTea.get(1).getItemDamage(); + + @Override + public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { + return p_94041_2_.getItem() == ItemLoader.kubaitems + && p_94041_2_.getItemDamage() >= minDamage + && p_94041_2_.getItemDamage() <= maxDamage; + } + + private static final UIInfo<?, ?> UI = KubaBlock.TileEntityUIFactory.apply(ModularUIContainer::new); + + @Override + public UIInfo<?, ?> getUI() { + return UI; + } + + private static TextWidget posCenteredHorizontally(int y, TextWidget textWidget) { + return (TextWidget) textWidget.setPosProvider(posCenteredHorizontallyProvider.apply(textWidget, y)); + } + + private static final BiFunction<TextWidget, Integer, Widget.PosProvider> posCenteredHorizontallyProvider = + (TextWidget widget, Integer y) -> (Widget.PosProvider) (screenSize, window, parent) -> + new Pos2d((window.getSize().width / 2) - (widget.getSize().width / 2), y); + + @Override + public ModularWindow createWindow(UIBuildContext buildContext) { + ModularWindow.Builder builder = ModularWindow.builder(170, 70); + builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); + EntityPlayer player = buildContext.getPlayer(); + + builder.widgets( + posCenteredHorizontally( + 10, + new TextWidget(new Text("Tea Acceptor") + .format(EnumChatFormatting.BOLD) + .format(EnumChatFormatting.DARK_RED))), + posCenteredHorizontally(30, new DynamicTextWidget(() -> { + if (player.getCommandSenderName().equals(tileOwner)) + return new Text("[Tea]").color(Color.GREEN.normal); + else return new Text("This is not your block").color(Color.RED.normal); + })), + posCenteredHorizontally(40, new DynamicTextWidget(() -> new Text( + (playerData == null + ? "ERROR" + : StringUtils.applyRainbow( + NumberFormat.getInstance().format(playerData.teaAmount), + (int) ((playerData.teaAmount / Math.max(1, averageInput * 10)) + % Integer.MAX_VALUE), + EnumChatFormatting.BOLD.toString()))) + .shadow())), + posCenteredHorizontally(50, new DynamicTextWidget(() -> new Text("IN: " + averageInput + "/t") + .color(Color.BLACK.normal))) + .addTooltip(new Text("Average input from the last 5 seconds").color(Color.GRAY.normal))); + return builder.build(); + } +} diff --git a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java index 80b4b970b4..e8c6da86bf 100644 --- a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java @@ -38,6 +38,13 @@ import com.google.common.collect.Multimap; import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.*; import com.mojang.authlib.GameProfile; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -47,6 +54,7 @@ import crazypants.enderio.EnderIO; import gregtech.api.GregTech_API; import gregtech.api.enums.Materials; import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; @@ -58,6 +66,7 @@ import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_Utility; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.function.Function; import kubatech.Tags; import kubatech.api.LoaderReference; import kubatech.api.helpers.GTHelper; @@ -76,6 +85,7 @@ import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -623,6 +633,195 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber } @Override + public boolean useModularUI() { + return true; + } + + private final Function<Widget, Boolean> isFixed = widget -> getIdealStatus() == getRepairStatus() && mMachine; + private static final Function<Integer, IDrawable[]> toggleButtonBackgroundGetter = val -> { + if (val == 0) return new IDrawable[] {GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_CROSS}; + else return new IDrawable[] {GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_CHECKMARK}; + }; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget(new DrawableWidget() + .setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setPos(7, 4) + .setSize(143, 75) + .setEnabled(widget -> !isFixed.apply(widget))); + final SlotWidget inventorySlot = + new SlotWidget(inventoryHandler, 1).setFilter(stack -> stack.getItem() == poweredSpawnerItem); + /* + Widget.PosProvider provider = (screenSize, window, parent)->{ + if(getRepairStatus() == getIdealStatus() && mMachine) + return new Pos2d(50, 50); + else + return new Pos2d(151, 4); + }; + builder.widget(inventorySlot.setPosProvider(provider).setTicker(widget -> { + if(!widget.getPos().equals(provider.getPos(null, null, null))) + widget.checkNeedsRebuild(); + })); + */ + + DynamicPositionedColumn configurationElements = new DynamicPositionedColumn(); + addConfigurationWidgets(configurationElements, buildContext, inventorySlot); + + builder.widget(new DynamicPositionedColumn() + .setSynced(false) + .widget(inventorySlot) + .widget(new CycleButtonWidget() + .setToggle(() -> getBaseMetaTileEntity().isAllowedToWork(), works -> { + if (works) getBaseMetaTileEntity().enableWorking(); + else getBaseMetaTileEntity().disableWorking(); + + if (!(buildContext.getPlayer() instanceof EntityPlayerMP)) return; + String tChat = GT_Utility.trans("090", "Machine Processing: ") + + (works + ? GT_Utility.trans("088", "Enabled") + : GT_Utility.trans("087", "Disabled")); + if (hasAlternativeModeText()) tChat = getAlternativeModeText(); + GT_Utility.sendChatToPlayer(buildContext.getPlayer(), tChat); + }) + .addTooltip(0, new Text("Disabled").color(Color.RED.dark(3))) + .addTooltip(1, new Text("Enabled").color(Color.GREEN.dark(3))) + .setVariableBackgroundGetter(toggleButtonBackgroundGetter) + .setSize(18, 18) + .addTooltip("Working status")) + .widget(configurationElements.setEnabled( + widget -> !getBaseMetaTileEntity().isActive())) + .widget(new DrawableWidget() + .setDrawable(GT_UITextures.OVERLAY_BUTTON_CROSS) + .setSize(18, 18) + .addTooltip(new Text("Please stop the machine to configure it").color(Color.RED.dark(3))) + .setEnabled(widget -> getBaseMetaTileEntity().isActive())) + .setPos(151, 4)); + + final DynamicPositionedColumn screenElements = new DynamicPositionedColumn(); + drawTexts(screenElements, inventorySlot); + builder.widget(screenElements); + } + + private void addConfigurationWidgets( + DynamicPositionedColumn configurationElements, UIBuildContext buildContext, SlotWidget inventorySlot) { + configurationElements.setSynced(false); + configurationElements.widget(new CycleButtonWidget() + .setToggle(() -> isInRitualMode, v -> { + if (this.mMaxProgresstime > 0) { + GT_Utility.sendChatToPlayer(buildContext.getPlayer(), "Can't change mode when running !"); + return; + } + + isInRitualMode = v; + + if (!(buildContext.getPlayer() instanceof EntityPlayerMP)) return; + if (!isInRitualMode) { + GT_Utility.sendChatToPlayer(buildContext.getPlayer(), "Ritual mode disabled"); + } else { + GT_Utility.sendChatToPlayer(buildContext.getPlayer(), "Ritual mode enabled"); + if (connectToRitual()) + GT_Utility.sendChatToPlayer( + buildContext.getPlayer(), "Successfully connected to the ritual"); + else GT_Utility.sendChatToPlayer(buildContext.getPlayer(), "Can't connect to the ritual"); + } + }) + .setVariableBackgroundGetter(toggleButtonBackgroundGetter) + .setSize(18, 18) + .addTooltip("Ritual mode")); + configurationElements.widget(new CycleButtonWidget() + .setToggle(() -> mIsProducingInfernalDrops, v -> { + if (this.mMaxProgresstime > 0) { + GT_Utility.sendChatToPlayer(buildContext.getPlayer(), "Can't change mode when running !"); + return; + } + + mIsProducingInfernalDrops = v; + + if (!(buildContext.getPlayer() instanceof EntityPlayerMP)) return; + if (!mIsProducingInfernalDrops) + GT_Utility.sendChatToPlayer( + buildContext.getPlayer(), "Mobs will now be prevented from spawning infernal"); + else GT_Utility.sendChatToPlayer(buildContext.getPlayer(), "Mobs can spawn infernal now"); + }) + .setVariableBackgroundGetter(toggleButtonBackgroundGetter) + .setSize(18, 18) + .addTooltip("Is allowed to spawn infernal mobs") + .addTooltip(new Text("Does not affect mobs that are always infernal !").color(Color.GRAY.normal))); + } + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + screenElements.setSynced(false).setSpace(0).setPos(10, 7); + + screenElements.widget(new DynamicPositionedRow() + .setSynced(false) + .widget(new TextWidget("Status: ").setDefaultColor(COLOR_TEXT_GRAY.get())) + .widget(new DynamicTextWidget(() -> { + if (getBaseMetaTileEntity().isActive()) return new Text("Working !").color(Color.GREEN.dark(3)); + else if (getBaseMetaTileEntity().isAllowedToWork()) + return new Text("Enabled").color(Color.GREEN.dark(3)); + else if (getBaseMetaTileEntity().wasShutdown()) + return new Text("Shutdown (CRITICAL)").color(Color.RED.dark(3)); + else return new Text("Disabled").color(Color.RED.dark(3)); + })) + .setEnabled(isFixed)); + screenElements.widget(new DynamicTextWidget(() -> { + ItemStack aStack = mInventory[1]; + if (aStack == null) return new Text("Insert Powered Spawner").color(Color.RED.dark(3)); + else { + Text invalid = new Text("Invalid Spawner").color(Color.RED.dark(3)); + if (aStack.getItem() != poweredSpawnerItem) return invalid; + + if (aStack.getTagCompound() == null) return invalid; + String mobType = aStack.getTagCompound().getString("mobType"); + if (mobType.isEmpty()) return invalid; + + if (!MobNameToRecipeMap.containsKey(mobType)) return invalid; + + return new Text(mobType).color(Color.GREEN.dark(3)); + } + }) + .setEnabled(isFixed)); + + screenElements + .widget(new TextWidget(GT_Utility.trans("132", "Pipe is loose.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mWrench)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("133", "Screws are loose.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mScrewdriver)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("134", "Something is stuck.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mSoftHammer)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("135", "Platings are dented.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mHardHammer)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("136", "Circuitry burned out.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mSolderingTool)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("137", "That doesn't belong there.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mCrowbar)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mMachine)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)); + } + + @Override public int getMaxEfficiency(ItemStack aStack) { return 10000; } diff --git a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_MegaIndustrialApiary.java b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_MegaIndustrialApiary.java index 6015d6de9a..fc60e44fa6 100644 --- a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_MegaIndustrialApiary.java +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_MegaIndustrialApiary.java @@ -30,6 +30,15 @@ import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass; import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.*; import forestry.api.apiculture.*; import forestry.apiculture.blocks.BlockAlveary; import forestry.apiculture.blocks.BlockApicultureType; @@ -38,6 +47,7 @@ import forestry.plugins.PluginApiculture; import gregtech.api.GregTech_API; import gregtech.api.enums.GT_Values; import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; @@ -46,22 +56,27 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energ import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_Utility; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; +import java.io.IOException; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import kubatech.Tags; import kubatech.api.LoaderReference; import kubatech.api.helpers.GTHelper; +import kubatech.api.network.CustomTileEntityPacket; +import kubatech.api.tileentity.CustomTileEntityPacketHandler; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; public class GT_MetaTileEntity_MegaIndustrialApiary - extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_MegaIndustrialApiary> { + extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_MegaIndustrialApiary> + implements CustomTileEntityPacketHandler { private byte mGlassTier = 0; private int mCasing = 0; @@ -73,6 +88,7 @@ public class GT_MetaTileEntity_MegaIndustrialApiary private static final ItemStack royalJelly = PluginApiculture.items.royalJelly.getItemStack(1); private static final int CASING_INDEX = 10; private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int CONFIGURATION_WINDOW_ID = 999; private static final IStructureDefinition<GT_MetaTileEntity_MegaIndustrialApiary> STRUCTURE_DEFINITION = StructureDefinition.<GT_MetaTileEntity_MegaIndustrialApiary>builder() @@ -284,12 +300,18 @@ public class GT_MetaTileEntity_MegaIndustrialApiary else mMaxSlots = 1; } + private CustomTileEntityPacket packet = null; + @Override public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { super.onPostTick(aBaseMetaTileEntity, aTick); if (aBaseMetaTileEntity.isServerSide()) { // TODO: Look for proper fix if (mUpdate < 0) mUpdate = 600; + if (packet == null) packet = new CustomTileEntityPacket((TileEntity) aBaseMetaTileEntity, null); + packet.resetHelperData(); + packet.addData(mMaxSlots); + packet.sendToAllAround(20); } // Beeeee rendering inside ? } @@ -357,7 +379,7 @@ public class GT_MetaTileEntity_MegaIndustrialApiary this.updateSlots(); return false; } - calculateOverclockedNessMulti((int) GT_Values.V[5], 1200, 2, getMaxInputVoltage()); + calculateOverclockedNessMulti(GT_Values.V[5], 1200, 2, getMaxInputVoltage()); this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); this.mEfficiencyIncrease = 10000; this.mOutputItems = new ItemStack[] {this.mStorage.get(0).createIgnobleCopy()}; @@ -472,6 +494,303 @@ public class GT_MetaTileEntity_MegaIndustrialApiary return new ITexture[] {Textures.BlockIcons.getCasingTextureForId(CASING_INDEX)}; } + @Override + public boolean useModularUI() { + return true; + } + + private final Function<Widget, Boolean> isFixed = widget -> getIdealStatus() == getRepairStatus() && mMachine; + + @Override + public void HandleCustomPacket(CustomTileEntityPacket customdata) { + mMaxSlots = customdata.getDataInt(); + } + + private static final Function<Integer, IDrawable[]> toggleButtonBackgroundGetter = val -> { + if (val == 0) return new IDrawable[] {GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_CROSS}; + else return new IDrawable[] {GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_CHECKMARK}; + }; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget(new DrawableWidget() + .setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setPos(7, 4) + .setSize(143, 75) + .setEnabled(widget -> !isFixed.apply(widget))); + + buildContext.addSyncedWindow(CONFIGURATION_WINDOW_ID, this::createConfigurationWindow); + EntityPlayer player = buildContext.getPlayer(); + + // Slot is not needed + + builder.widget(new DynamicPositionedColumn() + .setSynced(false) + .widget(new CycleButtonWidget() + .setToggle(() -> getBaseMetaTileEntity().isAllowedToWork(), works -> { + if (works) getBaseMetaTileEntity().enableWorking(); + else getBaseMetaTileEntity().disableWorking(); + + if (!(player instanceof EntityPlayerMP)) return; + String tChat = GT_Utility.trans("090", "Machine Processing: ") + + (works + ? GT_Utility.trans("088", "Enabled") + : GT_Utility.trans("087", "Disabled")); + if (hasAlternativeModeText()) tChat = getAlternativeModeText(); + GT_Utility.sendChatToPlayer(player, tChat); + }) + .addTooltip(0, new Text("Disabled").color(Color.RED.dark(3))) + .addTooltip(1, new Text("Enabled").color(Color.GREEN.dark(3))) + .setVariableBackgroundGetter(toggleButtonBackgroundGetter) + .setSize(18, 18) + .addTooltip("Working status")) + .widget(new ButtonWidget() + .setOnClick((clickData, widget) -> { + if (!widget.isClient()) widget.getContext().openSyncedWindow(CONFIGURATION_WINDOW_ID); + }) + .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_CYCLIC) + .addTooltip("Configuration") + .setSize(18, 18)) + .setPos(151, 4)); + + final List<ItemStack> drawables = new ArrayList<>(mMaxSlots); + final int perRow = 7; + + Scrollable beesContainer = new Scrollable().setVerticalScroll(); + + if (mMaxSlots > 0) + for (int i = 0, imax = ((mMaxSlots - 1) / perRow); i <= imax; i++) { + DynamicPositionedRow row = new DynamicPositionedRow().setSynced(false); + for (int j = 0, jmax = (i == imax ? (mMaxSlots - 1) % perRow : (perRow - 1)); j <= jmax; j++) { + final int finalI = i * perRow; + final int finalJ = j; + final int ID = finalI + finalJ; + row.widget(new ButtonWidget() + .setOnClick((clickData, widget) -> { + if (!(player instanceof EntityPlayerMP)) return; + if (mStorage.size() <= ID) return; + if (this.mMaxProgresstime > 0) { + GT_Utility.sendChatToPlayer(player, "Can't eject while running !"); + return; + } + BeeSimulator removed = mStorage.remove(ID); + addOutput(removed.queenStack); + GT_Utility.sendChatToPlayer(player, "Queen ejected !"); + }) + .setBackground(() -> new IDrawable[] { + getBaseMetaTileEntity().getGUITextureSet().getItemSlot(), + GT_UITextures.OVERLAY_SLOT_BEE_QUEEN, + new ItemDrawable(drawables.size() > ID ? drawables.get(ID) : null) + .withFixedSize(16, 16, 1, 1) + }) + .dynamicTooltip(() -> { + if (drawables.size() > ID) + return Arrays.asList( + drawables.get(ID).getDisplayName(), + EnumChatFormatting.GRAY + "Left click to eject"); + return Collections.emptyList(); + }) + .setSize(18, 18)); + } + beesContainer.widget(row.setPos(0, i * 18).setEnabled(widget -> { + int y = widget.getPos().y; + int cy = beesContainer.getVerticalScrollOffset(); + int ch = beesContainer.getVisibleHeight(); + return y >= cy - ch && y <= cy + ch; + })); + } + beesContainer.attachSyncer( + new FakeSyncWidget.ListSyncer<>( + () -> mStorage.stream().map(s -> s.queenStack).collect(Collectors.toList()), + l -> { + drawables.clear(); + drawables.addAll(l); + }, + (buffer, i) -> { + try { + buffer.writeItemStackToBuffer(i); + } catch (IOException e) { + throw new RuntimeException(e); + } + }, + buffer -> { + try { + return buffer.readItemStackFromBuffer(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }), + builder); + + builder.widget(beesContainer.setPos(10, 16).setSize(128, 60)); + + final DynamicPositionedColumn screenElements = new DynamicPositionedColumn(); + drawTexts(screenElements, null); + builder.widget(screenElements); + } + + protected ModularWindow createConfigurationWindow(final EntityPlayer player) { + ModularWindow.Builder builder = ModularWindow.builder(200, 100); + builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); + builder.widget(new DrawableWidget() + .setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC) + .setPos(5, 5) + .setSize(16, 16)) + .widget(new TextWidget("Configuration").setPos(25, 9)) + .widget(ButtonWidget.closeWindowButton(true).setPos(185, 3)) + .widget(new Column() + .widget(new CycleButtonWidget() + .setLength(3) + .setGetter(() -> mPrimaryMode) + .setSetter(val -> { + if (this.mMaxProgresstime > 0) { + GT_Utility.sendChatToPlayer(player, "Can't change mode when running !"); + return; + } + mPrimaryMode = val; + + if (!(player instanceof EntityPlayerMP)) return; + switch (mPrimaryMode) { + case 0: + GT_Utility.sendChatToPlayer(player, "Changed primary mode to: Input mode"); + break; + case 1: + GT_Utility.sendChatToPlayer(player, "Changed primary mode to: Output mode"); + break; + case 2: + GT_Utility.sendChatToPlayer( + player, "Changed primary mode to: Operating mode"); + break; + } + }) + .addTooltip(0, new Text("Input").color(Color.YELLOW.dark(3))) + .addTooltip(1, new Text("Output").color(Color.YELLOW.dark(3))) + .addTooltip(2, new Text("Operating").color(Color.GREEN.dark(3))) + .setVariableBackgroundGetter(i -> new IDrawable[] { + ModularUITextures.VANILLA_BACKGROUND, + GT_UITextures.OVERLAY_BUTTON_CYCLIC.withFixedSize(18, 18), + i == 0 + ? new Text("Input") + .color(Color.YELLOW.dark(3)) + .withFixedSize(70 - 18, 18, 15, 0) + : i == 1 + ? new Text("Output") + .color(Color.YELLOW.dark(3)) + .withFixedSize(70 - 18, 18, 15, 0) + : new Text("Operating") + .color(Color.GREEN.dark(3)) + .withFixedSize(70 - 18, 18, 15, 0) + }) + .setSize(70, 18) + .addTooltip("Primary mode")) + .widget(new CycleButtonWidget() + .setLength(2) + .setGetter(() -> mSecondaryMode) + .setSetter(val -> { + if (this.mMaxProgresstime > 0) { + GT_Utility.sendChatToPlayer(player, "Can't change mode when running !"); + return; + } + + mSecondaryMode = val; + + if (!(player instanceof EntityPlayerMP)) return; + switch (mSecondaryMode) { + case 0: + GT_Utility.sendChatToPlayer( + player, "Changed secondary mode to: Normal mode"); + break; + case 1: + GT_Utility.sendChatToPlayer( + player, "Changed secondary mode to: Swarmer mode"); + break; + } + }) + .addTooltip(0, new Text("Normal").color(Color.GREEN.dark(3))) + .addTooltip(1, new Text("Swarmer").color(Color.YELLOW.dark(3))) + .setVariableBackgroundGetter(i -> new IDrawable[] { + ModularUITextures.VANILLA_BACKGROUND, + GT_UITextures.OVERLAY_BUTTON_CYCLIC.withFixedSize(18, 18), + i == 0 + ? new Text("Normal") + .color(Color.GREEN.dark(3)) + .withFixedSize(70 - 18, 18, 15, 0) + : new Text("Swarmer") + .color(Color.YELLOW.dark(3)) + .withFixedSize(70 - 18, 18, 15, 0) + }) + .setSize(70, 18) + .addTooltip("Secondary mode")) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive()) + .setPos(10, 30)) + .widget(new Column() + .widget(new TextWidget("Primary mode").setSize(100, 18)) + .widget(new TextWidget("Secondary mode").setSize(100, 18)) + .setEnabled(widget -> !getBaseMetaTileEntity().isActive()) + .setPos(80, 30)) + .widget(new DrawableWidget() + .setDrawable(GT_UITextures.OVERLAY_BUTTON_CROSS) + .setSize(18, 18) + .setPos(10, 30) + .addTooltip(new Text("Can't change configuration when running !").color(Color.RED.dark(3))) + .setEnabled(widget -> getBaseMetaTileEntity().isActive())); + return builder.build(); + } + + @Override + protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) { + screenElements.setSynced(false).setSpace(0).setPos(10, 7); + + screenElements.widget(new DynamicPositionedRow() + .setSynced(false) + .widget(new TextWidget("Status: ").setDefaultColor(COLOR_TEXT_GRAY.get())) + .widget(new DynamicTextWidget(() -> { + if (getBaseMetaTileEntity().isActive()) return new Text("Working !").color(Color.GREEN.dark(3)); + else if (getBaseMetaTileEntity().isAllowedToWork()) + return new Text("Enabled").color(Color.GREEN.dark(3)); + else if (getBaseMetaTileEntity().wasShutdown()) + return new Text("Shutdown (CRITICAL)").color(Color.RED.dark(3)); + else return new Text("Disabled").color(Color.RED.dark(3)); + })) + .setEnabled(isFixed)); + + screenElements + .widget(new TextWidget(GT_Utility.trans("132", "Pipe is loose.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mWrench)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("133", "Screws are loose.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mScrewdriver)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("134", "Something is stuck.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mSoftHammer)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("135", "Platings are dented.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mHardHammer)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("136", "Circuitry burned out.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mSolderingTool)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("137", "That doesn't belong there.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mCrowbar)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val)); + screenElements + .widget(new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setEnabled(widget -> !mMachine)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val)); + } + private static class BeeSimulator { ItemStack queenStack; boolean isValid; |