aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/kubatech/CommonProxy.java20
-rw-r--r--src/main/java/kubatech/api/LoaderReference.java2
-rw-r--r--src/main/java/kubatech/api/enums/ItemList.java3
-rw-r--r--src/main/java/kubatech/api/helpers/ReflectionHelper.java34
-rw-r--r--src/main/java/kubatech/api/network/CustomTileEntityPacket.java6
-rw-r--r--src/main/java/kubatech/api/network/LoadConfigPacket.java3
-rw-r--r--src/main/java/kubatech/commands/CommandHandler.java2
-rw-r--r--src/main/java/kubatech/commands/CommandTea.java109
-rw-r--r--src/main/java/kubatech/kubatech.java8
-rw-r--r--src/main/java/kubatech/loaders/BlockLoader.java24
-rw-r--r--src/main/java/kubatech/loaders/ItemLoader.java6
-rw-r--r--src/main/java/kubatech/loaders/RecipeLoader.java20
-rw-r--r--src/main/java/kubatech/loaders/TCLoader.java125
-rw-r--r--src/main/java/kubatech/loaders/block/BlockProxy.java76
-rw-r--r--src/main/java/kubatech/loaders/block/IProxyTileEntityProvider.java8
-rw-r--r--src/main/java/kubatech/loaders/block/KubaBlock.java187
-rw-r--r--src/main/java/kubatech/loaders/block/KubaItemBlock.java37
-rw-r--r--src/main/java/kubatech/loaders/block/blocks/TeaAcceptor.java42
-rw-r--r--src/main/java/kubatech/loaders/item/IItemProxyGUI.java9
-rw-r--r--src/main/java/kubatech/loaders/item/ItemProxy.java31
-rw-r--r--src/main/java/kubatech/loaders/item/KubaItems.java6
-rw-r--r--src/main/java/kubatech/loaders/item/items/TeaCollection.java42
-rw-r--r--src/main/java/kubatech/loaders/item/items/TeaUltimate.java160
-rw-r--r--src/main/java/kubatech/mixin/Mixin.java3
-rw-r--r--src/main/java/kubatech/mixin/mixins/minecraft/WorldMixin.java21
-rw-r--r--src/main/java/kubatech/savedata/PlayerData.java26
-rw-r--r--src/main/java/kubatech/savedata/PlayerDataManager.java71
-rw-r--r--src/main/java/kubatech/tileentity/TeaAcceptorTile.java183
-rw-r--r--src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java199
-rw-r--r--src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_MegaIndustrialApiary.java331
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;