From db900d3b60293c8c2b3e9298e5c6fbd1a3ca9b52 Mon Sep 17 00:00:00 2001 From: Stan Hebben Date: Fri, 27 Jun 2014 22:33:32 +0200 Subject: [PATCH] - Added 1.6.4 port - Fixed /mt name command - Renames MC17 to MC172, in preparation of the 1.7.10 port --- .gitignore | 1 + .../api/event/AbstractEventManager.java | 395 ++++++++++++++++++ .../minetweaker/api/event/IEventManager.java | 4 +- .../IPlayerAttackEntityEventHandler.java | 4 +- .../event/IPlayerBonemealEventHandler.java | 4 +- .../IPlayerChangedDimensionEventHandler.java | 7 +- .../api/event/IPlayerCraftedEventHandler.java | 4 +- .../event/IPlayerDeathDropsEventHandler.java | 4 +- .../event/IPlayerFillBucketEventHandler.java | 4 +- .../IPlayerInteractEntityEventHandler.java | 4 +- .../event/IPlayerInteractEventHandler.java | 4 +- .../event/IPlayerLoggedInEventHandler.java | 7 +- .../event/IPlayerLoggedOutEventHandler.java | 4 +- .../IPlayerOpenContainerEventHandler.java | 4 +- .../api/event/IPlayerPickupEventHandler.java | 4 +- .../event/IPlayerPickupItemEventHandler.java | 4 +- .../event/IPlayerPickupXpEventHandler.java | 4 +- .../api/event/IPlayerRespawnEventHandler.java | 4 +- .../event/IPlayerSleepInBedEventHandler.java | 20 + .../api/event/IPlayerSmeltedEventHandler.java | 4 +- .../api/event/IPlayerUseHoeEventHandler.java | 20 + .../IPlayerUseItemStartEventHandler.java | 20 + .../event/IPlayerUseItemTickEventHandler.java | 20 + .../api/event/PlayerSleepInBedEvent.java | 50 +++ .../api/event/PlayerUseHoeEvent.java | 104 +++++ .../api/event/PlayerUseItemStartEvent.java | 51 +++ .../api/event/PlayerUseItemTickEvent.java | 58 +++ .../main/java/minetweaker/util/EventList.java | 87 ++++ .../java/minetweaker/util/IEventHandler.java | 15 + MineTweaker3-MC164-Main/build.gradle | 55 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 50514 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../minetweaker/mc164/MineTweakerCommand.java | 394 +++++++++++++++++ .../minetweaker/mc164/MineTweakerLogger.java | 90 ++++ .../minetweaker/mc164/MineTweakerMod.java | 138 ++++++ .../mc164/MineTweakerRegistry.java | 19 + .../mc164/brackets/ItemBracketHandler.java | 176 ++++++++ .../mc164/brackets/LiquidBracketHandler.java | 82 ++++ .../mc164/brackets/OreBracketHandler.java | 75 ++++ .../minetweaker/mc164/data/NBTConverter.java | 169 ++++++++ .../minetweaker/mc164/data/NBTUpdater.java | 47 +++ .../mc164/furnace/FuelTweaker.java | 91 ++++ .../mc164/furnace/MCFurnaceManager.java | 222 ++++++++++ .../mc164/furnace/SetFuelPattern.java | 21 + .../mc164/item/MCItemDefinition.java | 22 + .../minetweaker/mc164/item/MCItemStack.java | 254 +++++++++++ .../mc164/liquid/MCLiquidDefinition.java | 270 ++++++++++++ .../mc164/liquid/MCLiquidStack.java | 109 +++++ .../minetweaker/mc164/mods/MCLoadedMods.java | 44 ++ .../java/minetweaker/mc164/mods/MCMod.java | 42 ++ .../mc164/network/MCConnectionHandler.java | 72 ++++ .../mc164/network/MCPacketHandler.java | 31 ++ .../minetweaker/mc164/oredict/MCOreDict.java | 22 + .../mc164/oredict/MCOreDictEntry.java | 316 ++++++++++++++ .../minetweaker/mc164/player/MCPlayer.java | 39 ++ .../mc164/recipes/MCCraftingInventory.java | 173 ++++++++ .../mc164/recipes/MCRecipeManager.java | 358 ++++++++++++++++ .../mc164/recipes/RecipeConverter.java | 123 ++++++ .../mc164/recipes/ShapedRecipeAdvanced.java | 46 ++ .../mc164/recipes/ShapedRecipeBasic.java | 43 ++ .../mc164/recipes/ShapedRecipeOre.java | 37 ++ .../recipes/ShapelessRecipeAdvanced.java | 45 ++ .../mc164/recipes/ShapelessRecipeBasic.java | 38 ++ .../mc164/recipes/ShapelessRecipeOre.java | 37 ++ .../mc164/util/MineTweakerHacks.java | 135 ++++++ .../mc164/util/MineTweakerObfuscation.java | 21 + .../mc164/util/MineTweakerUtil.java | 56 +++ .../src/main/resources/mcmod.info | 12 + .../build.gradle | 18 +- .../minetweaker/mc172/FMLEventHandler.java | 0 .../minetweaker/mc172/ForgeEventHandler.java | 0 .../minetweaker/mc172/MineTweakerCommand.java | 43 +- .../minetweaker/mc172/MineTweakerLogger.java | 0 .../minetweaker/mc172/MineTweakerMod.java | 0 .../mc172/MineTweakerRegistry.java | 0 .../mc172/brackets/ItemBracketHandler.java | 0 .../mc172/brackets/LiquidBracketHandler.java | 0 .../mc172/brackets/OreBracketHandler.java | 0 .../minetweaker/mc172/data/NBTConverter.java | 0 .../minetweaker/mc172/data/NBTUpdater.java | 0 .../mc172/furnace/FuelTweaker.java | 0 .../mc172/furnace/MCFurnaceManager.java | 0 .../mc172/furnace/SetFuelPattern.java | 0 .../mc172/item/MCItemDefinition.java | 0 .../minetweaker/mc172/item/MCItemStack.java | 0 .../mc172/liquid/MCLiquidDefinition.java | 0 .../mc172/liquid/MCLiquidStack.java | 0 .../minetweaker/mc172/mods/MCLoadedMods.java | 0 .../java/minetweaker/mc172/mods/MCMod.java | 0 .../MineTweakerLoadScriptsHandler.java | 0 .../network/MineTweakerLoadScriptsPacket.java | 0 .../minetweaker/mc172/oredict/MCOreDict.java | 0 .../mc172/oredict/MCOreDictEntry.java | 0 .../minetweaker/mc172/player/MCPlayer.java | 0 .../mc172/recipes/MCCraftingInventory.java | 0 .../mc172/recipes/MCRecipeManager.java | 0 .../mc172/recipes/RecipeConverter.java | 0 .../mc172/recipes/ShapedRecipeAdvanced.java | 0 .../mc172/recipes/ShapedRecipeBasic.java | 0 .../mc172/recipes/ShapedRecipeOre.java | 0 .../recipes/ShapelessRecipeAdvanced.java | 0 .../mc172/recipes/ShapelessRecipeBasic.java | 0 .../mc172/recipes/ShapelessRecipeOre.java | 0 .../mc172/util/MineTweakerHacks.java | 0 .../mc172/util/MineTweakerObfuscation.java | 0 .../mc172/util/MineTweakerUtil.java | 0 .../src/main/resources/mcmod.info | 0 .../build.gradle | 2 +- ...strialcraft-2-2.1.476-experimental-api.jar | Bin ...strialcraft-2-2.1.476-experimental-dev.jar | Bin .../mods/ic2/IC2BracketHandler.java | 0 .../mods/ic2/IC2ExplosionWhitelist.java | 0 .../minetweaker/mods/ic2/IC2RecipeInput.java | 0 .../mods/ic2/MachineAddRecipeAction.java | 0 .../mods/ic2/expand/ItemExpansion.java | 0 .../mods/ic2/machines/Compressor.java | 0 .../mods/ic2/machines/Extractor.java | 0 .../mods/ic2/machines/Macerator.java | 0 .../mods/ic2/machines/MetalFormer.java | 0 .../mods/ic2/machines/OreWasher.java | 0 .../mods/ic2/machines/ThermalCentrifuge.java | 0 .../build.gradle | 2 +- .../libs/NotEnoughItems-1.7.2-1.0.1-dev.jar | Bin .../libs/NotEnoughItems-1.7.2-1.0.1-src.jar | Bin .../main/java/minetweaker/mods/nei/NEI.java | 0 build.gradle | 27 +- 126 files changed, 4880 insertions(+), 57 deletions(-) create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/AbstractEventManager.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSleepInBedEventHandler.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseHoeEventHandler.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemStartEventHandler.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemTickEventHandler.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerSleepInBedEvent.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseHoeEvent.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemStartEvent.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemTickEvent.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/util/EventList.java create mode 100644 MineTweaker3-API/src/main/java/minetweaker/util/IEventHandler.java create mode 100644 MineTweaker3-MC164-Main/build.gradle create mode 100644 MineTweaker3-MC164-Main/gradle/wrapper/gradle-wrapper.jar create mode 100644 MineTweaker3-MC164-Main/gradle/wrapper/gradle-wrapper.properties create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerCommand.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerLogger.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerRegistry.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/ItemBracketHandler.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/LiquidBracketHandler.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/OreBracketHandler.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTConverter.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTUpdater.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/FuelTweaker.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/MCFurnaceManager.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/SetFuelPattern.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemDefinition.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidDefinition.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidStack.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCLoadedMods.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCMod.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCConnectionHandler.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCPacketHandler.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDict.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/player/MCPlayer.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCCraftingInventory.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeAdvanced.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeBasic.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeOre.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeAdvanced.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeBasic.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeOre.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerHacks.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerObfuscation.java create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerUtil.java create mode 100644 MineTweaker3-MC164-Main/src/main/resources/mcmod.info rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/build.gradle (66%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/FMLEventHandler.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/ForgeEventHandler.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/MineTweakerCommand.java (92%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/MineTweakerLogger.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/MineTweakerMod.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/MineTweakerRegistry.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/brackets/OreBracketHandler.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/data/NBTConverter.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/data/NBTUpdater.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/furnace/FuelTweaker.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/furnace/MCFurnaceManager.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/furnace/SetFuelPattern.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/item/MCItemDefinition.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/item/MCItemStack.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/liquid/MCLiquidDefinition.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/liquid/MCLiquidStack.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/mods/MCLoadedMods.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/mods/MCMod.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/oredict/MCOreDict.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/player/MCPlayer.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/MCCraftingInventory.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/ShapedRecipeAdvanced.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/ShapedRecipeBasic.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/ShapedRecipeOre.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeAdvanced.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeBasic.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeOre.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/util/MineTweakerHacks.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/util/MineTweakerObfuscation.java (100%) rename {MineTweaker3-MC17-Main => MineTweaker3-MC172-Main}/src/main/java/minetweaker/mc172/util/MineTweakerUtil.java (100%) rename MineTweaker3-MC17-Main/src/main/resources/mod.info => MineTweaker3-MC172-Main/src/main/resources/mcmod.info (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/build.gradle (95%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/libs/industrialcraft-2-2.1.476-experimental-api.jar (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/libs/industrialcraft-2-2.1.476-experimental-dev.jar (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/IC2BracketHandler.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/IC2ExplosionWhitelist.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/IC2RecipeInput.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/MachineAddRecipeAction.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/expand/ItemExpansion.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/machines/Compressor.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/machines/Extractor.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/machines/Macerator.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/machines/MetalFormer.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/machines/OreWasher.java (100%) rename {MineTweaker3-MC17-Mod-IC2 => MineTweaker3-MC172-Mod-IC2}/src/main/java/minetweaker/mods/ic2/machines/ThermalCentrifuge.java (100%) rename {MineTweaker3-MC17-Mod-NEI => MineTweaker3-MC172-Mod-NEI}/build.gradle (95%) rename {MineTweaker3-MC17-Mod-NEI => MineTweaker3-MC172-Mod-NEI}/libs/NotEnoughItems-1.7.2-1.0.1-dev.jar (100%) rename {MineTweaker3-MC17-Mod-NEI => MineTweaker3-MC172-Mod-NEI}/libs/NotEnoughItems-1.7.2-1.0.1-src.jar (100%) rename {MineTweaker3-MC17-Mod-NEI => MineTweaker3-MC172-Mod-NEI}/src/main/java/minetweaker/mods/nei/NEI.java (100%) diff --git a/.gitignore b/.gitignore index e7c93ee..4f3f251 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build run /MineTweaker3-Web/nbproject/private/ /MineTweaker3-Web/doc +/MineTweaker3-MC164-Main/eclipse diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/AbstractEventManager.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/AbstractEventManager.java new file mode 100644 index 0000000..ae508bf --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/AbstractEventManager.java @@ -0,0 +1,395 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.util.EventList; + +/** + * + * @author Stan + */ +public class AbstractEventManager implements IEventManager { + // ########################## + // ### PlayerCraftedEvent ### + // ########################## + + private final EventList elPlayerCrafted = new EventList(); + + @Override + public IEventHandle onPlayerCrafted(IPlayerCraftedEventHandler ev) { + return elPlayerCrafted.add(ev); + } + + public boolean hasPlayerCrafted() { + return elPlayerCrafted.hasHandlers(); + } + + public void publishPlayerCrafted(PlayerCraftedEvent event) { + elPlayerCrafted.publish(event); + } + + // ########################## + // ### PlayerSmeltedEvent ### + // ########################## + + private final EventList elPlayerSmelted = new EventList(); + + @Override + public IEventHandle onPlayerSmelted(IPlayerSmeltedEventHandler ev) { + return elPlayerSmelted.add(ev); + } + + public boolean hasPlayerSmelted() { + return elPlayerSmelted.hasHandlers(); + } + + public void publishPlayerSmelted(PlayerSmeltedEvent event) { + elPlayerSmelted.publish(event); + } + + // ################################### + // ### PlayerChangedDimensionEvent ### + // ################################### + + private final EventList elPlayerChangedDimension = new EventList(); + + @Override + public IEventHandle onPlayerChangedDimension(IPlayerChangedDimensionEventHandler ev) { + return elPlayerChangedDimension.add(ev); + } + + public boolean hasPlayerChangedDimension() { + return elPlayerChangedDimension.hasHandlers(); + } + + public void publishPlayerChangedDimension(PlayerChangedDimensionEvent event) { + elPlayerChangedDimension.publish(event); + } + + // ########################### + // ### PlayerLoggedInEvent ### + // ########################### + + private final EventList elPlayerLoggedIn = new EventList(); + + @Override + public IEventHandle onPlayerLoggedIn(IPlayerLoggedInEventHandler ev) { + return elPlayerLoggedIn.add(ev); + } + + public boolean hasPlayerLoggedIn() { + return elPlayerLoggedIn.hasHandlers(); + } + + public void publishPlayerLoggedIn(PlayerLoggedInEvent event) { + elPlayerLoggedIn.publish(event); + } + + // ############################ + // ### PlayerLoggedOutEvent ### + // ############################ + + private final EventList elPlayerLoggedOut = new EventList(); + + @Override + public IEventHandle onPlayerLoggedOut(IPlayerLoggedOutEventHandler ev) { + return elPlayerLoggedOut.add(ev); + } + + public boolean hasPlayerLoggedOut() { + return elPlayerLoggedOut.hasHandlers(); + } + + public void publishPlayerLoggedOut(PlayerLoggedOutEvent event) { + elPlayerLoggedOut.publish(event); + } + + // ########################## + // ### PlayerRespawnEvent ### + // ########################## + + private final EventList elPlayerRespawn = new EventList(); + + @Override + public IEventHandle onPlayerRespawn(IPlayerRespawnEventHandler ev) { + return elPlayerRespawn.add(ev); + } + + public boolean hasPlayerRespawn() { + return elPlayerRespawn.hasHandlers(); + } + + public void publishPlayerRespawn(PlayerRespawnEvent event) { + elPlayerRespawn.publish(event); + } + + // ############################### + // ### PlayerAttackEntityEvent ### + // ############################### + + private final EventList elPlayerAttackEntity = new EventList(); + + @Override + public IEventHandle onPlayerAttackEntity(IPlayerAttackEntityEventHandler ev) { + return elPlayerAttackEntity.add(ev); + } + + public boolean hasPlayerAttackEntity() { + return elPlayerAttackEntity.hasHandlers(); + } + + public void publishPlayerAttackEntity(PlayerAttackEntityEvent event) { + elPlayerAttackEntity.publish(event); + } + + // ########################### + // ### PlayerBonemealEvent ### + // ########################### + + private final EventList elPlayerBonemeal = new EventList(); + + @Override + public IEventHandle onPlayerBonemeal(IPlayerBonemealEventHandler ev) { + return elPlayerBonemeal.add(ev); + } + + public boolean hasPlayerBonemeal() { + return elPlayerBonemeal.hasHandlers(); + } + + public void publishPlayerBonemeal(PlayerBonemealEvent event) { + elPlayerBonemeal.publish(event); + } + + // ################################# + // ### PlayerInteractEntityEvent ### + // ################################# + + private final EventList elPlayerInteractEntity = new EventList(); + + @Override + public IEventHandle onPlayerInteractEntity(IPlayerInteractEntityEventHandler ev) { + return elPlayerInteractEntity.add(ev); + } + + public boolean hasPlayerInteractEntity() { + return elPlayerInteractEntity.hasHandlers(); + } + + public void publishPlayerInteractEntity(PlayerInteractEntityEvent event) { + elPlayerInteractEntity.publish(event); + } + + // ######################### + // ### PlayerPickupEvent ### + // ######################### + + private final EventList elPlayerPickup = new EventList(); + + @Override + public IEventHandle onPlayerPickup(IPlayerPickupEventHandler ev) { + return elPlayerPickup.add(ev); + } + + public boolean hasPlayerPickup() { + return elPlayerPickup.hasHandlers(); + } + + public void publishPlayerPickup(PlayerPickupEvent event) { + elPlayerPickup.publish(event); + } + + // ############################# + // ### PlayerPickupItemEvent ### + // ############################# + + private final EventList elPlayerPickupItem = new EventList(); + + @Override + public IEventHandle onPlayerPickupItem(IPlayerPickupItemEventHandler ev) { + return elPlayerPickupItem.add(ev); + } + + public boolean hasPlayerPickupItem() { + return elPlayerPickupItem.hasHandlers(); + } + + public void publishPlayerPickupItem(PlayerPickupItemEvent event) { + elPlayerPickupItem.publish(event); + } + + // ############################# + // ### PlayerFillBucketEvent ### + // ############################# + + private final EventList elPlayerFillBucket = new EventList(); + + @Override + public IEventHandle onPlayerFillBucket(IPlayerFillBucketEventHandler ev) { + return elPlayerFillBucket.add(ev); + } + + public boolean hasPlayerFillBucket() { + return elPlayerFillBucket.hasHandlers(); + } + + public void publishPlayerFillBucket(PlayerFillBucketEvent event) { + elPlayerFillBucket.publish(event); + } + + // ############################# + // ### PlayerDeathDropsEvent ### + // ############################# + + private final EventList elPlayerDeathDrops = new EventList(); + + @Override + public IEventHandle onPlayerDeathDrops(IPlayerDeathDropsEventHandler ev) { + return elPlayerDeathDrops.add(ev); + } + + public boolean hasPlayerDeathDrops() { + return elPlayerDeathDrops.hasHandlers(); + } + + public void publishPlayerDeathDrops(PlayerDeathDropsEvent event) { + elPlayerDeathDrops.publish(event); + } + + // ########################### + // ### PlayerInteractEvent ### + // ########################### + + private final EventList elPlayerInteract = new EventList(); + + @Override + public IEventHandle onPlayerInteract(IPlayerInteractEventHandler ev) { + return elPlayerInteract.add(ev); + } + + public boolean hasPlayerInteract() { + return elPlayerInteract.hasHandlers(); + } + + public void publishPlayerInteract(PlayerInteractEvent event) { + elPlayerInteract.publish(event); + } + + // ################################ + // ### PlayerOpenContainerEvent ### + // ################################ + + private final EventList elPlayerOpenContainer = new EventList(); + + @Override + public IEventHandle onPlayerOpenContainer(IPlayerOpenContainerEventHandler ev) { + return elPlayerOpenContainer.add(ev); + } + + public boolean hasPlayerOpenContainer() { + return elPlayerOpenContainer.hasHandlers(); + } + + public void publishPlayerOpenContainer(PlayerOpenContainerEvent event) { + elPlayerOpenContainer.publish(event); + } + + // ########################### + // ### PlayerPickupXpEvent ### + // ########################### + + private final EventList elPlayerPickupXp = new EventList(); + + @Override + public IEventHandle onPlayerPickupXp(IPlayerPickupXpEventHandler ev) { + return elPlayerPickupXp.add(ev); + } + + public boolean hasPlayerPickupXp() { + return elPlayerPickupXp.hasHandlers(); + } + + public void publishPlayerPickup(PlayerPickupXpEvent event) { + elPlayerPickupXp.publish(event); + } + + // ############################# + // ### PlayerSleepInBedEvent ### + // ############################# + + private final EventList elPlayerSleepInBed = new EventList(); + + @Override + public IEventHandle onPlayerSleepInBed(IPlayerSleepInBedEventHandler ev) { + return elPlayerSleepInBed.add(ev); + } + + public boolean hasPlayerSleepInBed() { + return elPlayerSleepInBed.hasHandlers(); + } + + public void publishPlayerSleepInBed(PlayerSleepInBedEvent event) { + elPlayerSleepInBed.publish(event); + } + + // ######################### + // ### PlayerUseHoeEvent ### + // ######################### + + private final EventList elPlayerUseHoe = new EventList(); + + @Override + public IEventHandle onPlayerUseHoe(IPlayerUseHoeEventHandler ev) { + return elPlayerUseHoe.add(ev); + } + + public boolean hasPlayerUseHoe() { + return elPlayerUseHoe.hasHandlers(); + } + + public void publishPlayerUseHoe(PlayerUseHoeEvent event) { + elPlayerUseHoe.publish(event); + } + + // ############################### + // ### PlayerUseItemStartEvent ### + // ############################### + + private final EventList elPlayerUseItemStart = new EventList(); + + @Override + public IEventHandle onPlayerUseItemStart(IPlayerUseItemStartEventHandler ev) { + return elPlayerUseItemStart.add(ev); + } + + public boolean hasPlayerUseItemStart() { + return elPlayerUseItemStart.hasHandlers(); + } + + public void publishPlayerUseItemStart(PlayerUseItemStartEvent event) { + elPlayerUseItemStart.publish(event); + } + + // ############################## + // ### PlayerUseItemTickEvent ### + // ############################## + + private final EventList elPlayerUseItemTick = new EventList(); + + @Override + public IEventHandle onPlayerUseItemTick(IPlayerUseItemTickEventHandler ev) { + return elPlayerUseItemTick.add(ev); + } + + public boolean hasPlayerUseItemTick() { + return elPlayerUseItemTick.hasHandlers(); + } + + public void publishPlayerUseItemTick(PlayerUseItemTickEvent event) { + elPlayerUseItemTick.publish(event); + } +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IEventManager.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IEventManager.java index dd7228d..d06f2d6 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IEventManager.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IEventManager.java @@ -44,7 +44,7 @@ public interface IEventManager { public IEventHandle onPlayerPickupXp(IPlayerPickupXpEventHandler ev); - /*public IEventHandle onPlayerSleepInBed(IPlayerSleepInBedEventHandler ev); + public IEventHandle onPlayerSleepInBed(IPlayerSleepInBedEventHandler ev); public IEventHandle onPlayerUseHoe(IPlayerUseHoeEventHandler ev); @@ -52,7 +52,7 @@ public interface IEventManager { public IEventHandle onPlayerUseItemTick(IPlayerUseItemTickEventHandler ev); - public IEventHandle onPlayerUseItemStop(IPlayerUseItemStopEventHandler ev); + /*public IEventHandle onPlayerUseItemStop(IPlayerUseItemStopEventHandler ev); public IEventHandle onPlayerUseItemFinish(IPlayerUserItemFinishEventHandler ev); diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerAttackEntityEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerAttackEntityEventHandler.java index 32ec0b8..b7ecc9e 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerAttackEntityEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerAttackEntityEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerAttackEntityEventHandler") -public interface IPlayerAttackEntityEventHandler { +public interface IPlayerAttackEntityEventHandler extends IEventHandler { + @Override public void handle(PlayerAttackEntityEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerBonemealEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerBonemealEventHandler.java index 79a5487..bdd85b8 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerBonemealEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerBonemealEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerBonemealEventHandler") -public interface IPlayerBonemealEventHandler { +public interface IPlayerBonemealEventHandler extends IEventHandler { + @Override public void handle(PlayerBonemealEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerChangedDimensionEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerChangedDimensionEventHandler.java index 9672d79..ac3f247 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerChangedDimensionEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerChangedDimensionEventHandler.java @@ -6,10 +6,15 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; +import stanhebben.zenscript.annotations.ZenClass; + /** * * @author Stan */ -public interface IPlayerChangedDimensionEventHandler { +@ZenClass("minetweaker.event.IPlayerChangedDimensionEventHandler") +public interface IPlayerChangedDimensionEventHandler extends IEventHandler { + @Override public void handle(PlayerChangedDimensionEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerCraftedEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerCraftedEventHandler.java index 29c779c..69bf511 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerCraftedEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerCraftedEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerCraftedEventHandler") -public interface IPlayerCraftedEventHandler { +public interface IPlayerCraftedEventHandler extends IEventHandler { + @Override public void handle(PlayerCraftedEvent ev); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerDeathDropsEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerDeathDropsEventHandler.java index c6936ac..3b58de3 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerDeathDropsEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerDeathDropsEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerDeathDropsEventHandler") -public interface IPlayerDeathDropsEventHandler { +public interface IPlayerDeathDropsEventHandler extends IEventHandler { + @Override public void handle(PlayerDeathDropsEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerFillBucketEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerFillBucketEventHandler.java index 1c838fd..4db83e6 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerFillBucketEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerFillBucketEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerFillBucketEventHandler") -public interface IPlayerFillBucketEventHandler { +public interface IPlayerFillBucketEventHandler extends IEventHandler { + @Override public void handle(PlayerFillBucketEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEntityEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEntityEventHandler.java index 4e84898..b132ef2 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEntityEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEntityEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerInteractEntityEventHandler") -public interface IPlayerInteractEntityEventHandler { +public interface IPlayerInteractEntityEventHandler extends IEventHandler { + @Override public void handle(PlayerInteractEntityEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEventHandler.java index af89ce3..437845d 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerInteractEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerInteractEventHandler") -public interface IPlayerInteractEventHandler { +public interface IPlayerInteractEventHandler extends IEventHandler { + @Override public void handle(PlayerInteractEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedInEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedInEventHandler.java index a754ac8..fdf2945 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedInEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedInEventHandler.java @@ -6,10 +6,15 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; +import stanhebben.zenscript.annotations.ZenClass; + /** * * @author Stan */ -public interface IPlayerLoggedInEventHandler { +@ZenClass("minetweaker.event.IPlayerLoggedInEventHandler") +public interface IPlayerLoggedInEventHandler extends IEventHandler { + @Override public void handle(PlayerLoggedInEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedOutEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedOutEventHandler.java index f5a8cbd..60268a2 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedOutEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerLoggedOutEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerLoggedOutEventHandler") -public interface IPlayerLoggedOutEventHandler { +public interface IPlayerLoggedOutEventHandler extends IEventHandler { + @Override public void handle(PlayerLoggedOutEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerOpenContainerEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerOpenContainerEventHandler.java index 0f6a93d..f5b6be7 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerOpenContainerEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerOpenContainerEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerOpenContainerEventHandler") -public interface IPlayerOpenContainerEventHandler { +public interface IPlayerOpenContainerEventHandler extends IEventHandler { + @Override public void handle(PlayerOpenContainerEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupEventHandler.java index 9e5f338..a3fa22c 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerPickupEventHandler") -public interface IPlayerPickupEventHandler { +public interface IPlayerPickupEventHandler extends IEventHandler { + @Override public void handle(PlayerPickupEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupItemEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupItemEventHandler.java index fb1a03e..4348f19 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupItemEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupItemEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerPickupItemEventHandler") -public interface IPlayerPickupItemEventHandler { +public interface IPlayerPickupItemEventHandler extends IEventHandler { + @Override public void handle(PlayerPickupItemEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupXpEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupXpEventHandler.java index 5310656..b056453 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupXpEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerPickupXpEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerPickupXpEventHandler") -public interface IPlayerPickupXpEventHandler { +public interface IPlayerPickupXpEventHandler extends IEventHandler { + @Override public void handle(PlayerPickupXpEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerRespawnEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerRespawnEventHandler.java index 698476d..d51ec8d 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerRespawnEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerRespawnEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerRespawnEventHandler") -public interface IPlayerRespawnEventHandler { +public interface IPlayerRespawnEventHandler extends IEventHandler { + @Override public void handle(PlayerRespawnEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSleepInBedEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSleepInBedEventHandler.java new file mode 100644 index 0000000..9f300fb --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSleepInBedEventHandler.java @@ -0,0 +1,20 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.util.IEventHandler; +import stanhebben.zenscript.annotations.ZenClass; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.IPlayerSleepInBedEventHandler") +public interface IPlayerSleepInBedEventHandler extends IEventHandler { + @Override + public void handle(PlayerSleepInBedEvent event); +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSmeltedEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSmeltedEventHandler.java index dd8301b..a3c81ef 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSmeltedEventHandler.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerSmeltedEventHandler.java @@ -6,6 +6,7 @@ package minetweaker.api.event; +import minetweaker.util.IEventHandler; import stanhebben.zenscript.annotations.ZenClass; /** @@ -13,6 +14,7 @@ import stanhebben.zenscript.annotations.ZenClass; * @author Stan */ @ZenClass("minetweaker.event.IPlayerSmeltedEventHandler") -public interface IPlayerSmeltedEventHandler { +public interface IPlayerSmeltedEventHandler extends IEventHandler { + @Override public void handle(PlayerSmeltedEvent event); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseHoeEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseHoeEventHandler.java new file mode 100644 index 0000000..f9fd6d2 --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseHoeEventHandler.java @@ -0,0 +1,20 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.util.IEventHandler; +import stanhebben.zenscript.annotations.ZenClass; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.IPlayerUseHoeEventHandler") +public interface IPlayerUseHoeEventHandler extends IEventHandler { + @Override + public void handle(PlayerUseHoeEvent event); +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemStartEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemStartEventHandler.java new file mode 100644 index 0000000..2986e8d --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemStartEventHandler.java @@ -0,0 +1,20 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.util.IEventHandler; +import stanhebben.zenscript.annotations.ZenClass; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.IPlayerUseItemStartEventHandler") +public interface IPlayerUseItemStartEventHandler extends IEventHandler { + @Override + public void handle(PlayerUseItemStartEvent event); +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemTickEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemTickEventHandler.java new file mode 100644 index 0000000..d294713 --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/IPlayerUseItemTickEventHandler.java @@ -0,0 +1,20 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.util.IEventHandler; +import stanhebben.zenscript.annotations.ZenClass; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.IPlayerUseItemTickEventHandler") +public interface IPlayerUseItemTickEventHandler extends IEventHandler { + @Override + public void handle(PlayerUseItemTickEvent event); +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerSleepInBedEvent.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerSleepInBedEvent.java new file mode 100644 index 0000000..5294ba7 --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerSleepInBedEvent.java @@ -0,0 +1,50 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.api.player.IPlayer; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenGetter; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.PlayerSleepInBedEvent") +public class PlayerSleepInBedEvent { + private final IPlayer player; + private final int x; + private final int y; + private final int z; + + public PlayerSleepInBedEvent(IPlayer player, int x, int y, int z) { + this.player = player; + this.x = x; + this.y = y; + this.z = z; + } + + @ZenGetter("player") + public IPlayer getPlayer() { + return player; + } + + @ZenGetter("x") + public int getX() { + return x; + } + + @ZenGetter("y") + public int getY() { + return y; + } + + @ZenGetter("z") + public int getZ() { + return z; + } +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseHoeEvent.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseHoeEvent.java new file mode 100644 index 0000000..a6fe85d --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseHoeEvent.java @@ -0,0 +1,104 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.api.block.IBlock; +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; +import minetweaker.api.world.IBlockGroup; +import minetweaker.api.world.IDimension; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenGetter; +import stanhebben.zenscript.annotations.ZenMethod; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.PlayerUseHoeEvent") +public class PlayerUseHoeEvent { + private final IPlayer player; + private final IItemStack item; + private final IBlockGroup blocks; + private final int x; + private final int y; + private final int z; + private boolean canceled; + private boolean processed; + + public PlayerUseHoeEvent(IPlayer player, IItemStack item, IBlockGroup blocks, int x, int y, int z) { + this.player = player; + this.item = item; + this.blocks = blocks; + this.x = x; + this.y = y; + this.z = z; + + canceled = false; + processed = false; + } + + @ZenMethod + public void cancel() { + canceled = true; + } + + @ZenMethod + public void process() { + processed = true; + } + + @ZenGetter("canceled") + public boolean isCanceled() { + return canceled; + } + + @ZenGetter("processed") + public boolean isProcessed() { + return processed; + } + + @ZenGetter("player") + public IPlayer getPlayer() { + return player; + } + + @ZenGetter("item") + public IItemStack getItem() { + return item; + } + + @ZenGetter("blocks") + public IBlockGroup getBlocks() { + return blocks; + } + + @ZenGetter("x") + public int getX() { + return x; + } + + @ZenGetter("y") + public int getY() { + return y; + } + + @ZenGetter("z") + public int getZ() { + return z; + } + + @ZenGetter("dimension") + public IDimension getDimension() { + return blocks.getDimension(); + } + + @ZenGetter("block") + public IBlock getBlock() { + return blocks.getBlock(x, y, z); + } +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemStartEvent.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemStartEvent.java new file mode 100644 index 0000000..37ac12f --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemStartEvent.java @@ -0,0 +1,51 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenGetter; +import stanhebben.zenscript.annotations.ZenMethod; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.PlayerUseItemStartEvent") +public class PlayerUseItemStartEvent { + private final IPlayer player; + private final IItemStack item; + private boolean canceled; + + public PlayerUseItemStartEvent(IPlayer player, IItemStack item) { + this.player = player; + this.item = item; + + canceled = false; + } + + @ZenMethod + public void cancel() { + canceled = true; + } + + @ZenGetter("canceled") + public boolean isCanceled() { + return canceled; + } + + @ZenGetter("player") + public IPlayer getPlayer() { + return player; + } + + @ZenGetter("item") + public IItemStack getItem() { + return item; + } +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemTickEvent.java b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemTickEvent.java new file mode 100644 index 0000000..0595e80 --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/event/PlayerUseItemTickEvent.java @@ -0,0 +1,58 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.event; + +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenGetter; +import stanhebben.zenscript.annotations.ZenMethod; + +/** + * + * @author Stan + */ +@ZenClass("minetweaker.event.PlayerUseItemTickEvent") +public class PlayerUseItemTickEvent { + private final IPlayer player; + private final IItemStack item; + private final int duration; + private boolean canceled; + + public PlayerUseItemTickEvent(IPlayer player, IItemStack item, int duration) { + this.player = player; + this.item = item; + this.duration = duration; + + canceled = false; + } + + @ZenMethod + public void cancel() { + canceled = true; + } + + @ZenGetter("canceled") + public boolean isCanceled() { + return canceled; + } + + @ZenGetter("player") + public IPlayer getPlayer() { + return player; + } + + @ZenGetter("item") + public IItemStack getItem() { + return item; + } + + @ZenGetter("duration") + public int getDuration() { + return duration; + } +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/util/EventList.java b/MineTweaker3-API/src/main/java/minetweaker/util/EventList.java new file mode 100644 index 0000000..55db290 --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/util/EventList.java @@ -0,0 +1,87 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.util; + +import minetweaker.api.event.IEventHandle; + +/** + * + * @author Stan + */ +public class EventList { + private EventNode first = null; + private EventNode last = null; + + public IEventHandle add(IEventHandler handler) { + EventNode node = new EventNode(handler, last, null); + + synchronized(this) { + if (first == null) { + first = node; + } + if (last != null) { + last.next = node; + } + last = node; + } + + return node; + } + + public boolean hasHandlers() { + return first != null; + } + + public boolean isEmpty() { + return first == null; + } + + public void publish(T event) { + EventNode current = null; + + synchronized(this) { + current = first; + } + + while (current != null) { + current.handler.handle(event); + + synchronized(this) { + current = current.next; + } + } + } + + private class EventNode implements IEventHandle { + private final IEventHandler handler; + private EventNode next; + private EventNode prev; + + public EventNode(IEventHandler handler, EventNode prev, EventNode next) { + this.handler = handler; + this.prev = prev; + this.next = next; + } + + @Override + public void close() { + synchronized (EventList.this) { + if (prev == null) { + first = next; + } else { + prev.next = next; + } + + if (next == null) { + last = prev; + } else { + next.prev = prev; + } + } + } + } +} diff --git a/MineTweaker3-API/src/main/java/minetweaker/util/IEventHandler.java b/MineTweaker3-API/src/main/java/minetweaker/util/IEventHandler.java new file mode 100644 index 0000000..31a3fcf --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/util/IEventHandler.java @@ -0,0 +1,15 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.util; + +/** + * + * @author Stan + */ +public interface IEventHandler { + public void handle(T event); +} diff --git a/MineTweaker3-MC164-Main/build.gradle b/MineTweaker3-MC164-Main/build.gradle new file mode 100644 index 0000000..3b30a11 --- /dev/null +++ b/MineTweaker3-MC164-Main/build.gradle @@ -0,0 +1,55 @@ +import minetweaker.tasks.RegisterZenClassesTask; + +buildscript { + repositories { + mavenCentral() + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT' + } +} + +apply plugin: 'forge' + +version = "1.6.4-3.0.0" +//group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = project.projectDir.name + +dependencies { + dependencies { + compile project(':ZenScript') + compile project(':MineTweaker3-API') + } +} + +task makeRegistry(type: RegisterZenClassesTask) { + inputDir = file('build/classes/main') + outputDir = file('build/classes/main') + className = 'minetweaker.mc164.MineTweakerRegistry' +} + +tasks.jar.dependsOn(makeRegistry) + +minecraft { + version = "1.6.4-9.11.1.964" +} + +processResources +{ + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/MineTweaker3-MC164-Main/gradle/wrapper/gradle-wrapper.jar b/MineTweaker3-MC164-Main/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..667288ad6c2b3b87c990ece1267e56f0bcbf3622 GIT binary patch literal 50514 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 aliases = Arrays.asList("mt"); + + // ####################################### + // ## ICommand interface implementation ## + // ####################################### + + @Override + public int compareTo(Object arg0) { + return 0; + } + + @Override + public String getCommandName() { + return "minetweaker"; + } + + @Override + public String getCommandUsage(ICommandSender icommandsender) { + return StringUtil.join(new String[] { + "", + "minetweaker reload", + " Reloads all scripts", + "minetweaker names", + " Outputs a list of all item names in the game to the minetweaker log", + "minetweaker liquids", + " Outputs a list of all liquid names in the game to the minetweaker log", + "minetweaker inventory", + " Lists all items in your inventory", + "minetweaker hand", + " Outputs the name of the item in your hand", + "minetweaker oredict", + " Outputs all ore dictionary entries in the game to the minetweaker log", + "minetweaker oredict ", + " Outputs all items in the given ore dictionary entry to the minetweaker log", + "minetweaker mods", + " Outputs all active mod IDs in the game", + "minetweaker name ", + " Outputs the name for the given item ID" + }, "\n"); + } + + @Override + public List getCommandAliases() { + return aliases; + } + + @Override + public void processCommand(ICommandSender icommandsender, String[] arguments) { + if (arguments.length == 0) { + sendChatMessage(icommandsender, "Please provide a command. Use /help minetweaker for more info."); + return; + } + + if (arguments[0].equals("reload")) { + MineTweakerMod.INSTANCE.reload(); + + String message = "Scripts have been reloaded"; + sendChatMessage(icommandsender, message); + } else if (arguments[0].equals("names")) { + for (Item item : Item.itemsList) { + if (item == null) continue; + + String key = item.getUnlocalizedName(); + + String displayName = ""; + + try { + displayName = " -- " + new ItemStack(item, 1, 0).getDisplayName(); + } catch (Exception ex) { + // some mods (such as buildcraft) may throw exceptions when calling + // getDisplayName on a item stack that doesn't contain valid NBT data + } + + String message = "<" + key + ">" + displayName; + MineTweakerAPI.logger.logCommand(message); + } + sendChatMessage(icommandsender, "List generated; see minetweaker.log in your minecraft dir"); + } else if (arguments[0].equals("liquids")) { + for (Map.Entry entry : FluidRegistry.getRegisteredFluids().entrySet()) { + String message = " -- " + entry.getValue().getLocalizedName(); + MineTweakerAPI.logger.logCommand(message); + sendChatMessage(icommandsender, "List generated; see minetweaker.log in your minecraft dir"); + } + } else if (arguments[0].equals("inventory")) { + if (icommandsender instanceof EntityPlayer) { + InventoryPlayer inventory = ((EntityPlayer) icommandsender).inventory; + for(int i = 0; i < inventory.getSizeInventory(); i++) { + ItemStack stack = inventory.getStackInSlot(i); + if (stack != null) { + StringBuilder description = new StringBuilder(); + description.append('<'); + description.append(stack.getItem().getUnlocalizedName()); + if (stack.getItemDamage() > 0) { + description.append(':').append(stack.getItemDamage()); + } + description.append('>'); + + if (stack.stackSize != 1) { + description.append('*').append(stack.stackSize); + } + + sendChatMessage(icommandsender, new MCItemStack(stack).toString()); + } + } + } else { + sendChatMessage(icommandsender, "Inventory command can only be executed by players"); + } + } else if (arguments[0].equals("hand")) { + if (icommandsender instanceof EntityPlayer) { + InventoryPlayer inventory = ((EntityPlayer) icommandsender).inventory; + ItemStack stack = inventory.getCurrentItem(); + if (stack != null) { + StringBuilder description = new StringBuilder(); + description.append('<'); + description.append(stack.getItem().getUnlocalizedName()); + if (stack.getItemDamage() > 0) { + description.append(':').append(stack.getItemDamage()); + } + description.append('>'); + + if (stack.stackSize != 1) { + description.append('*').append(stack.stackSize); + } + + sendChatMessage(icommandsender, new MCItemStack(stack).toString()); + } + } else { + sendChatMessage(icommandsender, "Hand command can only be executed by players"); + } + } else if (arguments[0].equals("oredict")) { + if (arguments.length > 2) { + String entryName = arguments[2]; + List ores = OreDictionary.getOres(entryName); + if (ores.isEmpty()) { + sendChatMessage(icommandsender, "Entry doesn't exist"); + return; + } else { + MineTweakerAPI.logger.logCommand("Ore entries for " + entryName + ":"); + for (ItemStack ore : ores) { + MineTweakerAPI.logger.logCommand(" " + new MCItemStack(ore).toString()); + } + } + } else { + for (String entryName : OreDictionary.getOreNames()) { + MineTweakerAPI.logger.logCommand("Ore entries for " + entryName + ":"); + List ores = OreDictionary.getOres(entryName); + for (ItemStack ore : ores) { + MineTweakerAPI.logger.logCommand(" " + new MCItemStack(ore).toString()); + } + } + } + sendChatMessage(icommandsender, "List generated; see minetweaker.log in your minecraft dir"); + } else if (arguments[0].equals("mods")) { + List mods = Loader.instance().getActiveModList(); + MineTweakerAPI.logger.logCommand("Mods list:"); + for (ModContainer mod : mods) { + sendChatMessage(icommandsender, mod.getModId()); + MineTweakerAPI.logger.logCommand("Mod: " + mod.getModId()); + } + } else if (arguments[0].equals("name")) { + if (arguments.length < 2) { + sendChatMessage(icommandsender, "missing id parameter"); + } else { + try { + int id = Integer.parseInt(arguments[1]); + if (id < 0 || id >= Item.itemsList.length || Item.itemsList[id] == null) { + sendChatMessage(icommandsender, "invalid id"); + } else { + Item item = Item.itemsList[id]; + StringBuilder description = new StringBuilder(); + description.append('<'); + description.append(item.getUnlocalizedName()); + description.append('>'); + sendChatMessage(icommandsender, description.toString()); + } + } catch (NumberFormatException e) { + MineTweakerAPI.logger.logCommand("ID must be an integer"); + } + } + } + + /*if (arguments[0].equals("name")) { + if (arguments.length < 2) { + sendChatMessage(icommandsender, "Please provide an item id"); + } else { + try { + ITweakerItem item = TweakerItem.parse(arguments[1]); + sendChatMessage(icommandsender, "Name for " + item.toIdString() + ": " + MineTweakerUtil.formatItemName(item.getName())); + } catch (TweakerExecuteException ex) { + sendChatMessage(icommandsender, ex.getMessage()); + } catch (TweakerException ex) { + sendChatMessage(icommandsender, ex.getExplanation()); + } + } + } else if (arguments[0].equals("liquid")) { + if (arguments.length < 2) { + sendChatMessage(icommandsender, "Please provide a liquid container item id"); + } else { + try { + TweakerItem item = TweakerItem.parse(arguments[1]); + //#ifdef MC152 + //+if (LiquidContainerRegistry.isLiquid(item.make(1))) { + //+sendChatMessage(icommandsender, "Liquid name: " + item.getName()); + //+} else if (LiquidContainerRegistry.isFilledContainer(item.make(1))) { + //+sendChatMessage(icommandsender, "Liquid name: " + LiquidContainerRegistry.getLiquidForFilledItem(item.make(1)).asItemStack().getItemName()); + //+} else { + //+sendChatMessage(icommandsender, "This item is not a liquid or liquid container"); + //+} + //#else + if (item.getItemId() == 9) { + sendChatMessage(icommandsender, "Liquid name: fluid.tile.water"); + } else if (item.getItemId() == 11) { + sendChatMessage(icommandsender, "Liquid name: fluid.tile.lava"); + } else if (Block.blocksList[item.getItemId()] != null && Block.blocksList[item.getItemId()] instanceof IFluidBlock) { + sendChatMessage(icommandsender, "Liquid name: " + ((IFluidBlock)(Block.blocksList[item.getItemId()])).getFluid().getUnlocalizedName()); + } else if (FluidContainerRegistry.isFilledContainer(item.make(1))) { + sendChatMessage(icommandsender, "Liquid name: " + FluidContainerRegistry.getFluidForFilledItem(item.make(1)).getFluid().getUnlocalizedName()); + } else { + sendChatMessage(icommandsender, "This item is not a liquid or liquid container"); + } + //#endif + } catch (TweakerExecuteException ex) { + sendChatMessage(icommandsender, ex.getMessage()); + } catch (TweakerException ex) { + sendChatMessage(icommandsender, ex.getExplanation()); + } + } + } else if (arguments[0].equals("oredict")) { + if (arguments.length == 1) { + String[] names = OreDictionary.getOreNames(); + Arrays.sort(names); + for (String name : names) { + sendChatMessage(icommandsender, "[" + name + "]"); + ArrayList entries = OreDictionary.getOres(name); + for (ItemStack stack : entries) { + //#ifdef MC152 + //+sendChatMessage(icommandsender, + //+" " + MineTweakerUtil.getItemString(stack) + " - " + + //+MineTweakerUtil.formatItemName(stack.getItemDamage() == OreDictionary.WILDCARD_VALUE ? stack.getItem().getUnlocalizedName() : stack.getItemName())); + //#else + sendChatMessage(icommandsender, + " " + MineTweakerUtil.getItemString(stack) + " - " + + MineTweakerUtil.formatItemName(stack.getItemDamage() == OreDictionary.WILDCARD_VALUE ? stack.getItem().getUnlocalizedName() : stack.getUnlocalizedName())); + //#endif + } + } + } else { + try { + if (Character.isDigit(arguments[1].charAt(0))) { + TweakerItemPattern item = TweakerItem.parse(arguments[1]).asItemPattern(); + for (String name : OreDictionary.getOreNames()) { + for (ItemStack stack : OreDictionary.getOres(name)) { + if (item.matches(stack)) { + sendChatMessage(icommandsender, " " + name); + break; + } + } + } + } else { + for (ItemStack stack : OreDictionary.getOres(arguments[1])) { + //#ifdef MC152 + //+sendChatMessage(icommandsender, + //+" " + MineTweakerUtil.getItemString(stack) + " - " + + //+MineTweakerUtil.formatItemName(stack.getItemDamage() == OreDictionary.WILDCARD_VALUE ? stack.getItem().getUnlocalizedName() : stack.getItemName())); + //#else + sendChatMessage(icommandsender, + " " + MineTweakerUtil.getItemString(stack) + " - " + + MineTweakerUtil.formatItemName(stack.getItemDamage() == OreDictionary.WILDCARD_VALUE ? stack.getItem().getUnlocalizedName() : stack.getUnlocalizedName())); + //#endif + } + } + } catch (TweakerExecuteException ex) { + sendChatMessage(icommandsender, "Invalid item id or ore dictionary entry"); + } catch (TweakerException ex) { + sendChatMessage(icommandsender, "Invalid item id or ore dictionary entry"); + } + } + } else if (arguments[0].equals("recipes")) { + if (arguments.length < 2) { + sendChatMessage(icommandsender, "Please provide an item id"); + return; + } + try { + TweakerItem item = TweakerItem.parse(arguments[1]); + sendChatMessage(icommandsender, "Recipes for item " + item.toIdString()); + + TweakerItemPattern pattern = item.asItemPattern(); + + @SuppressWarnings("unchecked") + List recipes = CraftingManager.getInstance().getRecipeList(); + + for (IRecipe recipe : recipes) { + if (pattern.matches(recipe.getRecipeOutput())) { + sendChatMessage(icommandsender, " " + MineTweakerUtil.getRecipeString(recipe)); + } + } + } catch (TweakerExecuteException ex) { + sendChatMessage(icommandsender, "Invalid item id"); + } catch (TweakerException ex) { + sendChatMessage(icommandsender, "Invalid item id"); + } + } else if (arguments[0].equals("fuel")) { + if (arguments.length < 2) { + sendChatMessage(icommandsender, "Please provide an item id"); + return; + } + try { + TweakerItem item = TweakerItem.parse(arguments[1]); + ItemStack stack = item.make(1); + int value = TileEntityFurnace.getItemBurnTime(stack); + int regValue = GameRegistry.getFuelValue(stack); + + sendChatMessage(icommandsender, "Fuel for " + item.toIdString() + " = " + value); + if (value != regValue) { + sendChatMessage(icommandsender, "The value is hardcoded and cannot be altered."); + } + } catch (TweakerExecuteException ex) { + sendChatMessage(icommandsender, "Invalid item id"); + } catch (TweakerException ex) { + sendChatMessage(icommandsender, "Invalid item id"); + } + } else if (arguments[0].equals("reload")) { + if (!MineTweaker.instance.canRollback()) { + sendChatMessage(icommandsender, "Previous server script contained permanent actions, cannot reload. A restart is required to reload scripts."); + } else { + MineTweaker.instance.reloadScripts(); + sendChatMessage(icommandsender, "Script reloaded, updating all players"); + } + } else if (arguments[0].equals("logdamage=on")) { + DamageTweaker.logDamage = true; + sendChatMessage(icommandsender, "Damage logging turned on"); + sendChatMessage(icommandsender, "Info: logging is sent to the development console"); + } else if (arguments[0].equals("logdamage=off")) { + DamageTweaker.logDamage = false; + sendChatMessage(icommandsender, "Damage logging turned off"); + } else { + sendChatMessage(icommandsender, "Unrecognized minetweaker command"); + }*/ + + //MineCraftCompat.sendChatMessage(icommandsender, "[" + Arrays2.join(arguments, ", ") + "]"); + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender icommandsender) { + return true; + } + + @Override + public List addTabCompletionOptions(ICommandSender icommandsender, + String[] astring) { + return null; + } + + @Override + public boolean isUsernameIndex(String[] astring, int i) { + return false; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerLogger.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerLogger.java new file mode 100644 index 0000000..c759c3a --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerLogger.java @@ -0,0 +1,90 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import minetweaker.runtime.ILogger; + +/** + * + * @author Stan + */ +public class MineTweakerLogger implements ILogger { + private Writer writer; + + public MineTweakerLogger() { + File logFile = new File("minetweaker.log"); + if (logFile.exists()) logFile.delete(); + + try { + writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(logFile))); + } catch (IOException ex) { + + } + } + + @Override + public void logCommand(String message) { + try { + writer.append("COMMAND: "); + writer.append(message); + writer.append('\n'); + writer.flush(); + } catch (IOException ex) { + + } + + System.out.println("COMMAND: " + message); + } + + @Override + public void logInfo(String message) { + try { + writer.append("INFO: "); + writer.append(message); + writer.append('\n'); + writer.flush(); + } catch (IOException ex) { + + } + + System.out.println("INFO: " + message); + } + + @Override + public void logWarning(String message) { + try { + writer.append("WARNING: "); + writer.append(message); + writer.append('\n'); + writer.flush(); + } catch (IOException ex) { + + } + + System.out.println("WARNING: " + message); + } + + @Override + public void logError(String message) { + try { + writer.append("ERROR: "); + writer.append(message); + writer.append('\n'); + writer.flush(); + } catch (IOException ex) { + + } + + System.out.println("ERROR: " + message); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java new file mode 100644 index 0000000..35d5b75 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java @@ -0,0 +1,138 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164; + +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; +import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.event.FMLServerStoppedEvent; +import cpw.mods.fml.common.network.PacketDispatcher; +import java.io.File; +import minetweaker.MineTweakerAPI; +import minetweaker.mc164.furnace.FuelTweaker; +import minetweaker.mc164.furnace.MCFurnaceManager; +import minetweaker.mc164.mods.MCLoadedMods; +import minetweaker.mc164.network.MCPacketHandler; +import minetweaker.mc164.oredict.MCOreDict; +import minetweaker.mc164.recipes.MCRecipeManager; +import minetweaker.mc164.util.MineTweakerHacks; +import minetweaker.runtime.IScriptProvider; +import minetweaker.runtime.providers.ScriptProviderCascade; +import minetweaker.runtime.providers.ScriptProviderDirectory; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.Packet250CustomPayload; + +/** + * Main mod class. Performs some general logic, initialization of the API and + * FML event handling. + * + * @author Stan Hebben + */ +@Mod(modid = MineTweakerMod.MODID, version = MineTweakerMod.MCVERSION + "-3.0.0") +public class MineTweakerMod { + public static final String MODID = "MineTweaker"; + public static final String MCVERSION = "1.7.2"; + + private static final String[] REGISTRIES = { + "minetweaker.mods.ic2.ClassRegistry", + "minetweaker.mods.nei.ClassRegistry" + }; + + @Mod.Instance(MODID) + public static MineTweakerMod INSTANCE; + + private final IScriptProvider scriptsGlobal; + + private boolean iAmServer = false; + + public MineTweakerMod() { + MineTweakerAPI.oreDict = new MCOreDict(); + MineTweakerAPI.recipes = new MCRecipeManager(); + MineTweakerAPI.logger = new MineTweakerLogger(); + MineTweakerAPI.furnace = new MCFurnaceManager(); + MineTweakerAPI.loadedMods = new MCLoadedMods(); + + File globalDir = new File("scripts"); + if (!globalDir.exists()) { + globalDir.mkdirs(); + } + + scriptsGlobal = new ScriptProviderDirectory(globalDir); + MineTweakerAPI.tweaker.setScriptProvider(scriptsGlobal); + } + + public boolean iAmServer() { + return iAmServer; + } + + /** + * Reloads all scripts. + */ + public void reload() { + MineTweakerAPI.tweaker.rollback(); + MineTweakerAPI.tweaker.load(); + + if (iAmServer) { + // execute script on all connected clients + Packet packet = new Packet250CustomPayload( + MCPacketHandler.CHANNEL_SERVERSCRIPT, + MineTweakerAPI.tweaker.getScriptData()); + PacketDispatcher.sendPacketToAllPlayers(packet); + } + } + + // ########################## + // ### FML Event Handlers ### + // ########################## + + @EventHandler + public void onLoad(FMLPreInitializationEvent ev) { + + } + + @EventHandler + public void onPostInit(FMLPostInitializationEvent ev) { + MineTweakerAPI.registerClassRegistry(MineTweakerRegistry.class); + + for (String registry : REGISTRIES) { + MineTweakerAPI.registerClassRegistry(registry); + } + + FuelTweaker.INSTANCE.register(); + } + + @EventHandler + public void onServerAboutToStart(FMLServerAboutToStartEvent ev) { + // starts before loading worlds + // perfect place to start MineTweaker! + + File scriptsDir = new File(MineTweakerHacks.getWorldDirectory(ev.getServer()), "scripts"); + if (!scriptsDir.exists()) { + scriptsDir.mkdir(); + } + + iAmServer = true; + + IScriptProvider scriptsLocal = new ScriptProviderDirectory(scriptsDir); + IScriptProvider cascaded = new ScriptProviderCascade(scriptsGlobal, scriptsLocal); + MineTweakerAPI.tweaker.setScriptProvider(cascaded); + reload(); + } + + @EventHandler + public void onServerStarting(FMLServerStartingEvent ev) { + ev.registerServerCommand(new MineTweakerCommand()); + } + + @EventHandler + public void onServerStopped(FMLServerStoppedEvent ev) { + iAmServer = false; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerRegistry.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerRegistry.java new file mode 100644 index 0000000..d8780f5 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerRegistry.java @@ -0,0 +1,19 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164; + +import java.util.List; + +/** + * + * @author Stan + */ +public class MineTweakerRegistry { + public static void getClasses(List classes) { + // method stub, actual content is generated by build process + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/ItemBracketHandler.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/ItemBracketHandler.java new file mode 100644 index 0000000..d9691fd --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/ItemBracketHandler.java @@ -0,0 +1,176 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.brackets; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import minetweaker.IBracketHandler; +import minetweaker.MineTweakerAPI; +import minetweaker.annotations.BracketHandler; +import minetweaker.mc164.item.MCItemStack; +import minetweaker.api.item.IItemStack; +import minetweaker.api.item.IngredientAny; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; +import stanhebben.zenscript.ZenTokener; +import stanhebben.zenscript.expression.ExpressionInt; +import stanhebben.zenscript.expression.ExpressionJavaCallStatic; +import stanhebben.zenscript.expression.ExpressionString; +import stanhebben.zenscript.expression.partial.IPartialExpression; +import stanhebben.zenscript.parser.Token; +import stanhebben.zenscript.symbols.IZenSymbol; +import stanhebben.zenscript.type.ZenType; +import stanhebben.zenscript.type.natives.JavaMethod; +import stanhebben.zenscript.util.ZenPosition; + +/** + * + * @author Stan + */ +@BracketHandler(priority=100) +public class ItemBracketHandler implements IBracketHandler { + private static final Map itemNames; + + static { + itemNames = new HashMap(); + for (Item item : Item.itemsList) { + if (item == null) continue; + + itemNames.put(item.getUnlocalizedName(), item); + } + } + + public static IItemStack getItem(String name, int meta) { + Item item = itemNames.get(name); + if (item != null) { + return new MCItemStack(new ItemStack(item, 1, meta), true); + } else { + return null; + } + } + + public static IItemStack getItem(int id, int meta) { + Item item = Item.itemsList[id]; + if (item != null) { + return new MCItemStack(new ItemStack(item, 1, meta), true); + } else { + return null; + } + } + + private final IZenSymbol symbolAny; + private final JavaMethod method; + private final JavaMethod method2; + + public ItemBracketHandler() { + symbolAny = MineTweakerAPI.getJavaStaticFieldSymbol(IngredientAny.class, "INSTANCE"); + method = MineTweakerAPI.getJavaMethod( + ItemBracketHandler.class, + "getItem", + String.class, int.class); + method2 = MineTweakerAPI.getJavaMethod( + ItemBracketHandler.class, + "getItem", + int.class, int.class); + } + + @Override + public IZenSymbol resolve(List tokens) { + // any symbol + if (tokens.size() == 1 && tokens.get(0).getValue().equals("*")) { + return symbolAny; + } + + // detect special cases: + // item: at the start means item-specific syntax + // :xxx with xxx an integer means sub-item syntax + // :* means any-subitem-syntax + int fromIndex = 0; + int toIndex = tokens.size(); + int meta = 0; + + if (tokens.size() > 2) { + if (tokens.get(0).getValue().equals("item") && tokens.get(1).getValue().equals(":")) { + fromIndex = 2; + } + if (tokens.get(tokens.size() - 1).getType() == ZenTokener.T_INTVALUE + && tokens.get(tokens.size() - 2).getValue().equals(":")) { + toIndex = tokens.size() - 2; + meta = Integer.parseInt(tokens.get(tokens.size() - 1).getValue()); + } else if (tokens.get(tokens.size() - 1).getValue().equals("*") + && tokens.get(tokens.size() - 2).getValue().equals(":")) { + toIndex = tokens.size() - 2; + meta = OreDictionary.WILDCARD_VALUE; + } + } + + return find(tokens, fromIndex, toIndex, meta); + } + + private IZenSymbol find(List tokens, int startIndex, int endIndex, int meta) { + if (tokens.size() == 1 && tokens.get(0).getType() == ZenTokener.T_INTVALUE) { + int id = Integer.parseInt(tokens.get(0).getValue()); + if (id < 0 || id > Item.itemsList.length || Item.itemsList[id] == null) { + return null; + } + + return new ItemReferenceSymbolId(id, meta); + } + + StringBuilder valueBuilder = new StringBuilder(); + for (int i = startIndex; i < endIndex; i++) { + Token token = tokens.get(i); + valueBuilder.append(token.getValue()); + } + + if (itemNames.containsKey(valueBuilder.toString())) { + return new ItemReferenceSymbol(valueBuilder.toString(), meta); + } + + return null; + } + + private class ItemReferenceSymbol implements IZenSymbol { + private final String name; + private final int meta; + + public ItemReferenceSymbol(String name, int meta) { + this.name = name; + this.meta = meta; + } + + @Override + public IPartialExpression instance(ZenPosition position) { + return new ExpressionJavaCallStatic( + position, + method, + new ExpressionString(position, name), + new ExpressionInt(position, meta, ZenType.INT)); + } + } + + private class ItemReferenceSymbolId implements IZenSymbol { + private final int id; + private final int meta; + + public ItemReferenceSymbolId(int id, int meta) { + this.id = id; + this.meta = meta; + } + + @Override + public IPartialExpression instance(ZenPosition position) { + return new ExpressionJavaCallStatic( + position, + method2, + new ExpressionInt(position, id, ZenType.INT), + new ExpressionInt(position, meta, ZenType.INT)); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/LiquidBracketHandler.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/LiquidBracketHandler.java new file mode 100644 index 0000000..b1eca98 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/LiquidBracketHandler.java @@ -0,0 +1,82 @@ +package minetweaker.mc164.brackets; + +import java.util.List; +import minetweaker.IBracketHandler; +import minetweaker.annotations.BracketHandler; +import minetweaker.mc164.liquid.MCLiquidStack; +import minetweaker.api.liquid.ILiquidStack; +import minetweaker.runtime.GlobalRegistry; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import stanhebben.zenscript.expression.ExpressionJavaCallStatic; +import stanhebben.zenscript.expression.ExpressionString; +import stanhebben.zenscript.expression.partial.IPartialExpression; +import stanhebben.zenscript.parser.Token; +import stanhebben.zenscript.symbols.IZenSymbol; +import stanhebben.zenscript.type.natives.JavaMethod; +import stanhebben.zenscript.util.ZenPosition; + +/** + * + * @author Stan + */ +@BracketHandler +public class LiquidBracketHandler implements IBracketHandler { + public static ILiquidStack getLiquid(String name) { + Fluid fluid = FluidRegistry.getFluid(name); + if (fluid != null) { + return new MCLiquidStack(new FluidStack(fluid, 1)); + } else { + return null; + } + } + + @Override + public IZenSymbol resolve(List tokens) { + if (tokens.size() > 2) { + if (tokens.get(0).getValue().equals("liquid") && tokens.get(1).getValue().equals(":")) { + return find(tokens, 2, tokens.size()); + } + } + + return null; + } + + private IZenSymbol find(List tokens, int startIndex, int endIndex) { + StringBuilder valueBuilder = new StringBuilder(); + for (int i = startIndex; i < endIndex; i++) { + Token token = tokens.get(i); + valueBuilder.append(token.getValue()); + } + + Fluid fluid = FluidRegistry.getFluid(valueBuilder.toString()); + if (fluid != null) { + return new LiquidReferenceSymbol(valueBuilder.toString()); + } + + return null; + } + + private class LiquidReferenceSymbol implements IZenSymbol { + private final String name; + + public LiquidReferenceSymbol(String name) { + this.name = name; + } + + @Override + public IPartialExpression instance(ZenPosition position) { + JavaMethod method = JavaMethod.get( + GlobalRegistry.getTypeRegistry(), + LiquidBracketHandler.class, + "getLiquid", + String.class); + + return new ExpressionJavaCallStatic( + position, + method, + new ExpressionString(position, name)); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/OreBracketHandler.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/OreBracketHandler.java new file mode 100644 index 0000000..7fce89f --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/brackets/OreBracketHandler.java @@ -0,0 +1,75 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.brackets; + +import java.util.List; +import minetweaker.IBracketHandler; +import minetweaker.annotations.BracketHandler; +import minetweaker.mc164.oredict.MCOreDictEntry; +import minetweaker.api.oredict.IOreDictEntry; +import minetweaker.runtime.GlobalRegistry; +import stanhebben.zenscript.expression.ExpressionJavaCallStatic; +import stanhebben.zenscript.expression.ExpressionString; +import stanhebben.zenscript.expression.partial.IPartialExpression; +import stanhebben.zenscript.parser.Token; +import stanhebben.zenscript.symbols.IZenSymbol; +import stanhebben.zenscript.type.natives.JavaMethod; +import stanhebben.zenscript.util.ZenPosition; + +/** + * + * @author Stan + */ +@BracketHandler +public class OreBracketHandler implements IBracketHandler { + public static IOreDictEntry getOre(String name) { + return new MCOreDictEntry(name); + } + + @Override + public IZenSymbol resolve(List tokens) { + if (tokens.size() > 2) { + if (tokens.get(0).getValue().equals("ore") && tokens.get(1).getValue().equals(":")) { + return find(tokens, 2, tokens.size()); + } + } + + return null; + } + + private IZenSymbol find(List tokens, int startIndex, int endIndex) { + StringBuilder valueBuilder = new StringBuilder(); + for (int i = startIndex; i < endIndex; i++) { + Token token = tokens.get(i); + valueBuilder.append(token.getValue()); + } + + return new OreReferenceSymbol(valueBuilder.toString()); + } + + private class OreReferenceSymbol implements IZenSymbol { + private final String name; + + public OreReferenceSymbol(String name) { + this.name = name; + } + + @Override + public IPartialExpression instance(ZenPosition position) { + JavaMethod method = JavaMethod.get( + GlobalRegistry.getTypeRegistry(), + OreBracketHandler.class, + "getOre", + String.class); + + return new ExpressionJavaCallStatic( + position, + method, + new ExpressionString(position, name)); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTConverter.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTConverter.java new file mode 100644 index 0000000..d8cc069 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTConverter.java @@ -0,0 +1,169 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import minetweaker.mc164.util.MineTweakerHacks; +import minetweaker.api.data.DataByte; +import minetweaker.api.data.DataByteArray; +import minetweaker.api.data.DataDouble; +import minetweaker.api.data.DataFloat; +import minetweaker.api.data.DataInt; +import minetweaker.api.data.DataIntArray; +import minetweaker.api.data.DataList; +import minetweaker.api.data.DataLong; +import minetweaker.api.data.DataMap; +import minetweaker.api.data.DataShort; +import minetweaker.api.data.DataString; +import minetweaker.api.data.IData; +import minetweaker.api.data.IDataConverter; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagByteArray; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagDouble; +import net.minecraft.nbt.NBTTagFloat; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagIntArray; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagLong; +import net.minecraft.nbt.NBTTagShort; +import net.minecraft.nbt.NBTTagString; + +/** + * + * @author Stan + */ +public class NBTConverter implements IDataConverter { + private static final NBTConverter INSTANCE = new NBTConverter(); + + public static NBTBase from(IData data) { + return data.convert(INSTANCE); + } + + public static IData from(NBTBase nbt, boolean immutable) { + if (nbt == null) return null; + + switch (nbt.getId()) { + case 1: // byte + return new DataByte(((NBTTagByte) nbt).data); + case 2: // short + return new DataShort(((NBTTagShort) nbt).data); + case 3: // int + return new DataInt(((NBTTagInt) nbt).data); + case 4: // long + return new DataLong(((NBTTagLong) nbt).data); + case 5: // float + return new DataFloat(((NBTTagFloat) nbt).data); + case 6: // double + return new DataDouble(((NBTTagDouble) nbt).data); + case 7: // byte[] + return new DataByteArray(((NBTTagByteArray) nbt).byteArray, immutable); + case 8: // string + return new DataString(((NBTTagString) nbt).data); + case 9: { // list + NBTTagList listTag = (NBTTagList) nbt; + List values = new ArrayList(); + for (int i = 0; i < listTag.tagCount(); i++) { + values.add(from(listTag.tagAt(i), immutable)); + } + return new DataList(values, immutable); + } + case 10: { // compound + Map values = new HashMap(); + NBTTagCompound original = (NBTTagCompound) nbt; + Map tagMap = MineTweakerHacks.getNBTCompoundMap(original); + for (String key : tagMap.keySet()) { + values.put(key, from(original.getTag(key), immutable)); + } + return new DataMap(values, immutable); + } + case 11: // int[] + return new DataIntArray(((NBTTagIntArray) nbt).intArray, immutable); + default: + throw new RuntimeException("Unknown tag type: " + nbt.getId()); + } + } + + public static void updateMap(NBTTagCompound nbt, IData data) { + NBTUpdater updater = new NBTUpdater(nbt); + data.convert(updater); + } + + public NBTConverter() {} + + @Override + public NBTBase fromBool(boolean value) { + return new NBTTagInt(null, value ? 1 : 0); + } + + @Override + public NBTBase fromByte(byte value) { + return new NBTTagByte(null, value); + } + + @Override + public NBTBase fromShort(short value) { + return new NBTTagShort(null, value); + } + + @Override + public NBTBase fromInt(int value) { + return new NBTTagInt(null, value); + } + + @Override + public NBTBase fromLong(long value) { + return new NBTTagLong(null, value); + } + + @Override + public NBTBase fromFloat(float value) { + return new NBTTagFloat(null, value); + } + + @Override + public NBTBase fromDouble(double value) { + return new NBTTagDouble(null, value); + } + + @Override + public NBTBase fromString(String value) { + return new NBTTagString(null, value); + } + + @Override + public NBTBase fromList(List values) { + NBTTagList result = new NBTTagList(); + for (IData value : values) { + result.appendTag(from(value)); + } + return result; + } + + @Override + public NBTBase fromMap(Map values) { + NBTTagCompound result = new NBTTagCompound(); + for (Map.Entry entry : values.entrySet()) { + result.setTag(entry.getKey(), from(entry.getValue())); + } + return result; + } + + @Override + public NBTBase fromByteArray(byte[] value) { + return new NBTTagByteArray(null, value); + } + + @Override + public NBTBase fromIntArray(int[] value) { + return new NBTTagIntArray(null, value); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTUpdater.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTUpdater.java new file mode 100644 index 0000000..6bea533 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/data/NBTUpdater.java @@ -0,0 +1,47 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.data; + +import java.util.Map; +import minetweaker.api.data.IData; +import minetweaker.api.data.IDataConverter; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; + +/** + * + * @author Stan + */ +public class NBTUpdater extends NBTConverter implements IDataConverter { + private final NBTTagCompound nbt; + + public NBTUpdater(NBTTagCompound compound) { + this.nbt = compound; + } + + @Override + public NBTBase fromMap(Map map) { + for (Map.Entry entry : map.entrySet()) { + if (nbt.hasKey(entry.getKey())) { + if (entry.getValue() == null) { + nbt.removeTag(entry.getKey()); + } else { + if (nbt.getTag(entry.getKey()).getId() == 10) { + NBTTagCompound tag = (NBTTagCompound) nbt.getTag(entry.getKey()); + nbt.setTag(entry.getKey(), entry.getValue().convert(new NBTUpdater(nbt))); + } else { + nbt.setTag(entry.getKey(), NBTConverter.from(entry.getValue())); + } + } + } else if (entry.getValue() != null) { + nbt.setTag(entry.getKey(), from(entry.getValue())); + } + } + + return nbt; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/FuelTweaker.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/FuelTweaker.java new file mode 100644 index 0000000..e663442 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/FuelTweaker.java @@ -0,0 +1,91 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.furnace; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import net.minecraft.item.ItemStack; + +import cpw.mods.fml.common.IFuelHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IItemStack; +import minetweaker.mc164.item.MCItemStack; + +public class FuelTweaker { + public static final FuelTweaker INSTANCE = new FuelTweaker(); + + private List original; + private final HashMap> quickList = new HashMap>(); + + private FuelTweaker() {} + + public void register() { + try { + Field fuelHandlers = GameRegistry.class.getDeclaredField("fuelHandlers"); + fuelHandlers.setAccessible(true); + original = (List) fuelHandlers.get(null); + List modified = new ArrayList(); + modified.add(new OverridingFuelHandler()); + fuelHandlers.set(null, modified); + } catch (NoSuchFieldException ex) { + System.out.println("[MineTweaker] Error: could not get GameRegistry fuel handlers field. Cannot use custom fuel values."); + } catch (SecurityException ex) { + System.out.println("[MineTweaker] Error: could not alter GameRegistry fuel handlers field. Cannot use custom fuel values."); + } catch (IllegalAccessException ex) { + System.out.println("[MineTweaker] Error: could not alter GameRegistry fuel handlers field. Cannot use custom fuel values."); + } + } + + public void addFuelPattern(SetFuelPattern pattern) { + List items = pattern.getPattern().getItems(); + if (items == null) { + MineTweakerAPI.logger.logError("Cannot set fuel for <*>"); + return; + } + + for (IItemStack item : pattern.getPattern().getItems()) { + if (!quickList.containsKey(item.getName())) { + quickList.put(item.getName(), new ArrayList()); + } + quickList.get(item.getName()).add(pattern); + } + } + + public void removeFuelPattern(SetFuelPattern pattern) { + for (IItemStack item : pattern.getPattern().getItems()) { + if (!quickList.containsKey(item.getName())) { + quickList.put(item.getName(), new ArrayList()); + } + quickList.get(item.getName()).add(pattern); + } + } + + private class OverridingFuelHandler implements IFuelHandler { + @Override + public int getBurnTime(ItemStack fuel) { + IItemStack stack = new MCItemStack(fuel); + String name = fuel.getUnlocalizedName(); + if (quickList.containsKey(name)) { + for (SetFuelPattern override : quickList.get(name)) { + if (override.getPattern().matches(stack)) { + return override.getValue(); + } + } + } + + int max = 0; + for (IFuelHandler handler : original) { + max = Math.max(max, handler.getBurnTime(fuel)); + } + return max; + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/MCFurnaceManager.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/MCFurnaceManager.java new file mode 100644 index 0000000..eb61d1d --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/MCFurnaceManager.java @@ -0,0 +1,222 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.furnace; + +import cpw.mods.fml.common.registry.GameRegistry; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.recipes.IFurnaceManager; +import minetweaker.mc164.item.MCItemStack; +import minetweaker.mc164.util.MineTweakerUtil; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraftforge.oredict.OreDictionary; + +/** + * + * @author Stan + */ +public class MCFurnaceManager implements IFurnaceManager { + public MCFurnaceManager() { + + } + + @Override + public void remove(IIngredient output, IIngredient input) { + if (output == null) throw new IllegalArgumentException("output cannot be null"); + + Map smeltingList = FurnaceRecipes.smelting().getSmeltingList(); + Map, ItemStack> metaSmeltingList = FurnaceRecipes.smelting().getMetaSmeltingList(); + + List toRemove = new ArrayList(); + List> toRemoveMeta = new ArrayList>(); + List toRemoveValues = new ArrayList(); + List toRemoveMetaValues = new ArrayList(); + + for (Map.Entry entry : smeltingList.entrySet()) { + if (output.matches(new MCItemStack(entry.getValue())) + && (input == null || input.matches(new MCItemStack(new ItemStack(entry.getKey(), 1, 0))))) { + toRemove.add(entry.getKey()); + toRemoveValues.add(entry.getValue()); + } + } + + for (Map.Entry, ItemStack> entry : metaSmeltingList.entrySet()) { + if (output.matches(new MCItemStack(entry.getValue())) + && (input == null || input.matches(new MCItemStack(new ItemStack(entry.getKey().get(0), 1, entry.getKey().get(1)))))) { + toRemoveMeta.add(entry.getKey()); + toRemoveMetaValues.add(entry.getValue()); + } + } + + if (toRemove.isEmpty() && toRemoveMeta.isEmpty()) { + MineTweakerAPI.logger.logWarning("No furnace recipes for " + output.toString()); + } else { + MineTweakerAPI.tweaker.apply(new RemoveAction(toRemove, toRemoveValues, toRemoveMeta, toRemoveMetaValues)); + } + } + + @Override + public void addRecipe(IItemStack output, IIngredient input, double xp) { + List items = input.getItems(); + if (items == null) { + MineTweakerAPI.logger.logError("Cannot turn " + input.toString() + " into a furnace recipe"); + } + + ItemStack[] items2 = MineTweakerUtil.getItemStacks(items); + ItemStack output2 = (ItemStack) output.getInternal(); + MineTweakerAPI.tweaker.apply(new AddRecipeAction(input, items2, output2, xp)); + } + + @Override + public void setFuel(IIngredient item, int fuel) { + MineTweakerAPI.tweaker.apply(new SetFuelAction(new SetFuelPattern(item, fuel))); + } + + @Override + public int getFuel(IItemStack item) { + return GameRegistry.getFuelValue((ItemStack) item.getInternal()); + } + + // ###################### + // ### Action classes ### + // ###################### + + private static class RemoveAction implements IUndoableAction { + private final List items; + private final List values; + private final List> metaItems; + private final List metaValues; + + public RemoveAction(List items, List values, List> metaItems, List metaValues) { + this.items = items; + this.values = values; + this.metaItems = metaItems; + this.metaValues = metaValues; + } + + @Override + public void apply() { + for (Integer item : items) { + FurnaceRecipes.smelting().getSmeltingList().remove(item); + } + for (List item : metaItems) { + FurnaceRecipes.smelting().getMetaSmeltingList().remove(item); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (int i = 0; i < items.size(); i++) { + FurnaceRecipes.smelting().getSmeltingList().put(items.get(i), values.get(i)); + } + for (int i = 0; i < metaItems.size(); i++) { + FurnaceRecipes.smelting().getMetaSmeltingList().put(metaItems.get(i), metaValues.get(i)); + } + } + + @Override + public String describe() { + return "Removing " + items.size() + " furnace recipes"; + } + + @Override + public String describeUndo() { + return "Restoring " + items.size() + " furnace recipes"; + } + } + + private static class AddRecipeAction implements IUndoableAction { + private final IIngredient ingredient; + private final ItemStack[] input; + private final ItemStack output; + private final double xp; + + public AddRecipeAction(IIngredient ingredient, ItemStack[] input, ItemStack output, double xp) { + this.ingredient = ingredient; + this.input = input; + this.output = output; + this.xp = xp; + } + + @Override + public void apply() { + for (ItemStack inputStack : input) { + if (inputStack.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + FurnaceRecipes.smelting().addSmelting(inputStack.itemID, output, (float) xp); + } else { + FurnaceRecipes.smelting().addSmelting(inputStack.itemID, inputStack.getItemDamage(), output, (float) xp); + } + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (ItemStack inputStack : input) { + FurnaceRecipes.smelting().getSmeltingList().remove(inputStack); + } + } + + @Override + public String describe() { + return "Adding furnace recipe for " + ingredient; + } + + @Override + public String describeUndo() { + return "Removing furnace recipe for " + ingredient; + } + } + + private static class SetFuelAction implements IUndoableAction { + private final SetFuelPattern pattern; + + public SetFuelAction(SetFuelPattern pattern) { + this.pattern = pattern; + } + + @Override + public void apply() { + FuelTweaker.INSTANCE.addFuelPattern(pattern); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + FuelTweaker.INSTANCE.removeFuelPattern(pattern); + } + + @Override + public String describe() { + return "Setting fuel for " + pattern.getPattern(); + } + + @Override + public String describeUndo() { + return "Removing fuel for " + pattern.getPattern(); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/SetFuelPattern.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/SetFuelPattern.java new file mode 100644 index 0000000..f1f1274 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/furnace/SetFuelPattern.java @@ -0,0 +1,21 @@ +package minetweaker.mc164.furnace; + +import minetweaker.api.item.IIngredient; + +public class SetFuelPattern { + private final IIngredient pattern; + private final int value; + + public SetFuelPattern(IIngredient pattern, int value) { + this.pattern = pattern; + this.value = value; + } + + public IIngredient getPattern() { + return pattern; + } + + public int getValue() { + return value; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemDefinition.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemDefinition.java new file mode 100644 index 0000000..aefc51a --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemDefinition.java @@ -0,0 +1,22 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.item; + +import minetweaker.api.item.IItemDefinition; +import net.minecraft.item.Item; + +/** + * + * @author Stan + */ +public class MCItemDefinition implements IItemDefinition { + private final Item item; + + public MCItemDefinition(Item item) { + this.item = item; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java new file mode 100644 index 0000000..d03168f --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java @@ -0,0 +1,254 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.item; + +import java.util.Collections; +import java.util.List; +import minetweaker.MineTweakerAPI; +import minetweaker.mc164.data.NBTConverter; +import minetweaker.mc164.liquid.MCLiquidStack; +import minetweaker.api.data.IData; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemCondition; +import minetweaker.api.item.IItemDefinition; +import minetweaker.api.item.IItemStack; +import minetweaker.api.item.IItemTransformer; +import minetweaker.api.item.IngredientItem; +import minetweaker.api.liquid.ILiquidStack; +import minetweaker.util.ArrayUtil; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +/** + * + * @author Stan + */ +public class MCItemStack implements IItemStack { + private final ItemStack stack; + private final List items; + private IData tag = null; + private boolean wildcardSize; + + public MCItemStack(ItemStack itemStack) { + if (itemStack == null) throw new IllegalArgumentException("stack cannot be null"); + + stack = itemStack.copy(); + items = Collections.singletonList(this); + } + + public MCItemStack(ItemStack itemStack, boolean wildcardSize) { + this(itemStack); + + this.wildcardSize = wildcardSize; + } + + private MCItemStack(ItemStack itemStack, IData tag) { + if (itemStack == null) throw new IllegalArgumentException("stack cannot be null"); + + stack = itemStack; + items = Collections.singletonList(this); + this.tag = tag; + } + + @Override + public IItemDefinition getDefinition() { + return new MCItemDefinition(stack.getItem()); + } + + @Override + public String getName() { + return stack.getUnlocalizedName(); + } + + @Override + public String getDisplayName() { + return stack.getDisplayName(); + } + + @Override + public int getDamage() { + return stack.getItemDamage(); + } + + @Override + public IData getTag() { + if (tag == null) { + if (stack.stackTagCompound == null) { + return null; + } + + tag = NBTConverter.from(stack.stackTagCompound, true); + } + return tag; + } + + @Override + public int getMaxDamage() { + return stack.getMaxDamage(); + } + + @Override + public ILiquidStack getLiquid() { + FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(stack); + return liquid == null ? null : new MCLiquidStack(liquid); + } + + @Override + public IIngredient anyDamage() { + if (stack.getItem().getHasSubtypes()) { + MineTweakerAPI.logger.logWarning("subitems don't have damaged states"); + return this; + } else { + ItemStack result = new ItemStack(stack.getItem(), stack.stackSize, OreDictionary.WILDCARD_VALUE); + result.stackTagCompound = stack.stackTagCompound; + return new MCItemStack(result, tag); + } + } + + @Override + public IItemStack withDamage(int damage) { + if (stack.getItem().getHasSubtypes()) { + MineTweakerAPI.logger.logWarning("subitems don't have damaged states"); + return this; + } else { + ItemStack result = new ItemStack(stack.getItem(), stack.stackSize, damage); + result.stackTagCompound = stack.stackTagCompound; + return new MCItemStack(result, tag); + } + } + + @Override + public IItemStack withAmount(int amount) { + ItemStack result = new ItemStack(stack.getItem(), amount, stack.getItemDamage()); + result.stackTagCompound = stack.stackTagCompound; + return new MCItemStack(result, tag); + } + + @Override + public IItemStack withTag(IData tag) { + ItemStack result = new ItemStack(stack.getItem(), stack.stackSize, stack.getItemDamage()); + if (tag == null) { + result.stackTagCompound = null; + } else { + result.stackTagCompound = (NBTTagCompound) NBTConverter.from(tag); + } + return new MCItemStack(result, tag); + } + + @Override + public IItemStack updateTag(IData tagUpdate) { + if (tag == null) { + if (stack.stackTagCompound == null) { + return withTag(tagUpdate); + } + + tag = NBTConverter.from(stack.stackTagCompound, true); + } + + IData updated = tag.update(tagUpdate); + return withTag(updated); + } + + @Override + public String getMark() { + return null; + } + + @Override + public int getAmount() { + return stack.stackSize; + } + + @Override + public List getItems() { + return items; + } + + @Override + public IItemStack amount(int amount) { + return withAmount(amount); + } + + @Override + public IIngredient transform(IItemTransformer transformer) { + return new IngredientItem(this, null, ArrayUtil.EMPTY_CONDITIONS, new IItemTransformer[] { transformer }); + } + + @Override + public IIngredient only(IItemCondition condition) { + return new IngredientItem(this, null, new IItemCondition[] { condition }, ArrayUtil.EMPTY_TRANSFORMERS); + } + + @Override + public IIngredient marked(String mark) { + return new IngredientItem(this, mark, ArrayUtil.EMPTY_CONDITIONS, ArrayUtil.EMPTY_TRANSFORMERS); + } + + @Override + public boolean matches(IItemStack item) { + ItemStack internal = (ItemStack) item.getInternal(); + if (internal == null) { + throw new RuntimeException("Invalid item: " + item); + } + + return internal.getItem() == stack.getItem() + && (wildcardSize || internal.stackSize == stack.stackSize) + && (stack.getItemDamage() == OreDictionary.WILDCARD_VALUE + || stack.getItemDamage() == internal.getItemDamage() + || (!stack.getHasSubtypes() && !stack.getItem().isDamageable())); + } + + @Override + public boolean contains(IIngredient ingredient) { + List iitems = ingredient.getItems(); + if (iitems == null || iitems.size() != 1) return false; + return matches(iitems.get(0)); + } + + @Override + public IItemStack applyTransform(IItemStack item) { + return item; + } + + @Override + public Object getInternal() { + return stack; + } + + // ############################# + // ### Object implementation ### + // ############################# + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + result.append('<'); + result.append(stack.getItem().getUnlocalizedName()); + + if (stack.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + result.append(":*"); + } else if (stack.getItemDamage() > 0) { + result.append(':').append(stack.getItemDamage()); + } + result.append('>'); + + if (stack.getTagCompound() != null) { + result.append(".withTag("); + result.append(NBTConverter.from(stack.getTagCompound(), wildcardSize).toString()); + result.append(")"); + } + + if (!wildcardSize) { + result.append(" * ").append(stack.stackSize); + } + + return result.toString(); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidDefinition.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidDefinition.java new file mode 100644 index 0000000..3d1c186 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidDefinition.java @@ -0,0 +1,270 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.liquid; + +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.liquid.ILiquidDefinition; +import minetweaker.api.liquid.ILiquidStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +/** + * + * @author Stan + */ +public class MCLiquidDefinition implements ILiquidDefinition { + private final Fluid fluid; + + public MCLiquidDefinition(Fluid fluid) { + this.fluid = fluid; + } + + @Override + public String getName() { + return fluid.getName(); + } + + @Override + public String getDisplayName() { + return fluid.getLocalizedName(); + } + + @Override + public ILiquidStack asStack(int millibuckets) { + return new MCLiquidStack(new FluidStack(fluid, millibuckets)); + } + + @Override + public int getLuminosity() { + return fluid.getLuminosity(); + } + + @Override + public void setLuminosity(int value) { + MineTweakerAPI.tweaker.apply(new ActionSetLuminosity(value)); + } + + @Override + public int getDensity() { + return fluid.getDensity(); + } + + @Override + public void setDensity(int density) { + MineTweakerAPI.tweaker.apply(new ActionSetDensity(density)); + } + + @Override + public int getTemperature() { + return fluid.getTemperature(); + } + + @Override + public void setTemperature(int temperature) { + MineTweakerAPI.tweaker.apply(new ActionSetTemperature(temperature)); + } + + @Override + public int getViscosity() { + return fluid.getViscosity(); + } + + @Override + public void setViscosity(int viscosity) { + MineTweakerAPI.tweaker.apply(new ActionSetViscosity(viscosity)); + } + + @Override + public boolean isGaseous() { + return fluid.isGaseous(); + } + + @Override + public void setGaseous(boolean gaseous) { + MineTweakerAPI.tweaker.apply(new ActionSetGaseous(gaseous)); + } + + // ###################### + // ### Action classes ### + // ###################### + + private class ActionSetLuminosity implements IUndoableAction { + private final int oldValue; + private final int newValue; + + public ActionSetLuminosity(int newValue) { + oldValue = getLuminosity(); + this.newValue = newValue; + } + + @Override + public void apply() { + fluid.setLuminosity(newValue); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + fluid.setLuminosity(oldValue); + } + + @Override + public String describe() { + return "Setting " + fluid.getName() + " luminosity to " + newValue; + } + + @Override + public String describeUndo() { + return "Restoring " + fluid.getName() + " luminosity to " + oldValue; + } + } + + private class ActionSetDensity implements IUndoableAction { + private final int oldValue; + private final int newValue; + + public ActionSetDensity(int newValue) { + oldValue = getDensity(); + this.newValue = newValue; + } + + @Override + public void apply() { + fluid.setDensity(newValue); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + fluid.setDensity(oldValue); + } + + @Override + public String describe() { + return "Setting " + fluid.getName() + " density to " + newValue; + } + + @Override + public String describeUndo() { + return "Restoring " + fluid.getName() + " density to " + oldValue; + } + } + + private class ActionSetTemperature implements IUndoableAction { + private final int oldValue; + private final int newValue; + + public ActionSetTemperature(int newValue) { + oldValue = getTemperature(); + this.newValue = newValue; + } + + @Override + public void apply() { + fluid.setTemperature(newValue); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + fluid.setTemperature(oldValue); + } + + @Override + public String describe() { + return "Setting " + fluid.getName() + " temperature to " + newValue; + } + + @Override + public String describeUndo() { + return "Restoring " + fluid.getName() + " temperature to " + oldValue; + } + } + + private class ActionSetViscosity implements IUndoableAction { + private final int oldValue; + private final int newValue; + + public ActionSetViscosity(int newValue) { + oldValue = getViscosity(); + this.newValue = newValue; + } + + @Override + public void apply() { + fluid.setViscosity(newValue); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + fluid.setViscosity(oldValue); + } + + @Override + public String describe() { + return "Setting " + fluid.getName() + " viscosity to " + newValue; + } + + @Override + public String describeUndo() { + return "Restoring " + fluid.getName() + " viscosity to " + oldValue; + } + } + + private class ActionSetGaseous implements IUndoableAction { + private final boolean oldValue; + private final boolean newValue; + + public ActionSetGaseous(boolean newValue) { + oldValue = isGaseous(); + this.newValue = newValue; + } + + @Override + public void apply() { + fluid.setGaseous(newValue); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + fluid.setGaseous(oldValue); + } + + @Override + public String describe() { + return "Setting " + fluid.getName() + " gaseous to " + newValue; + } + + @Override + public String describeUndo() { + return "Restoring " + fluid.getName() + " gaseous to " + oldValue; + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidStack.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidStack.java new file mode 100644 index 0000000..b95e331 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/liquid/MCLiquidStack.java @@ -0,0 +1,109 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.liquid; + +import minetweaker.mc164.data.NBTConverter; +import minetweaker.api.data.IData; +import minetweaker.api.liquid.ILiquidDefinition; +import minetweaker.api.liquid.ILiquidStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.FluidStack; + +/** + * + * @author Stan + */ +public class MCLiquidStack implements ILiquidStack { + private final FluidStack stack; + private IData tag = null; + + public MCLiquidStack(FluidStack stack) { + this.stack = stack; + } + + private MCLiquidStack(FluidStack stack, IData tag) { + this.stack = stack; + this.tag = tag; + } + + @Override + public ILiquidDefinition getDefinition() { + return new MCLiquidDefinition(stack.getFluid()); + } + + @Override + public String getName() { + return stack.getFluid().getName(); + } + + @Override + public String getDisplayName() { + return stack.getFluid().getLocalizedName(); + } + + @Override + public int getAmount() { + return stack.amount; + } + + @Override + public IData getTag() { + if (tag == null) { + if (stack.tag == null) { + return null; + } + + tag = NBTConverter.from(stack.tag, true); + } + + return tag; + } + + @Override + public ILiquidStack withTag(IData data) { + FluidStack result = new FluidStack(stack.fluidID, stack.amount); + result.tag = (NBTTagCompound) NBTConverter.from(data); + return new MCLiquidStack(result, data.immutable()); + } + + @Override + public ILiquidStack withAmount(int amount) { + FluidStack result = new FluidStack(stack.fluidID, amount); + result.tag = stack.tag; + return new MCLiquidStack(result, tag); + } + + @Override + public int getLuminosity() { + return stack.getFluid().getLuminosity(stack); + } + + @Override + public int getDensity() { + return stack.getFluid().getDensity(stack); + } + + @Override + public int getTemperature() { + return stack.getFluid().getTemperature(stack); + } + + @Override + public int getViscosity() { + return stack.getFluid().getViscosity(stack); + } + + @Override + public boolean isGaseous() { + return stack.getFluid().isGaseous(stack); + } + + @Override + public Object getInternal() { + return stack; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCLoadedMods.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCLoadedMods.java new file mode 100644 index 0000000..03304a5 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCLoadedMods.java @@ -0,0 +1,44 @@ +package minetweaker.mc164.mods; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModContainer; +import java.util.Iterator; +import java.util.List; +import minetweaker.api.mods.ILoadedMods; +import minetweaker.api.mods.IMod; +import stanhebben.zenscript.util.MappingIterator; + +/** + * + * @author Stan + */ +public class MCLoadedMods implements ILoadedMods { + public MCLoadedMods() {} + + @Override + public boolean contains(String name) { + return Loader.isModLoaded(name); + } + + @Override + public IMod get(String name) { + for (ModContainer mod : Loader.instance().getActiveModList()) { + if (mod.getModId().equals(name)) { + return new MCMod(mod); + } + } + + return null; + } + + @Override + public Iterator iterator() { + List mods = Loader.instance().getActiveModList(); + return new MappingIterator(mods.iterator()) { + @Override + public IMod map(ModContainer value) { + return new MCMod(value); + } + }; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCMod.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCMod.java new file mode 100644 index 0000000..c56b6e9 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/mods/MCMod.java @@ -0,0 +1,42 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.mods; + +import cpw.mods.fml.common.ModContainer; +import minetweaker.api.mods.IMod; + +/** + * + * @author Stan + */ +public class MCMod implements IMod { + private final ModContainer mod; + + public MCMod(ModContainer mod) { + this.mod = mod; + } + + @Override + public String getId() { + return mod.getModId(); + } + + @Override + public String getName() { + return mod.getName(); + } + + @Override + public String getVersion() { + return mod.getVersion(); + } + + @Override + public String getDescription() { + return mod.getMetadata().description; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCConnectionHandler.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCConnectionHandler.java new file mode 100644 index 0000000..bed0de8 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCConnectionHandler.java @@ -0,0 +1,72 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.network; + +import net.minecraft.network.INetworkManager; +import net.minecraft.network.NetLoginHandler; +import net.minecraft.network.packet.NetHandler; +import net.minecraft.network.packet.Packet1Login; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.server.MinecraftServer; +import cpw.mods.fml.common.network.IConnectionHandler; +import cpw.mods.fml.common.network.Player; +import minetweaker.MineTweakerAPI; + +public class MCConnectionHandler implements IConnectionHandler { + @Override + public void playerLoggedIn(Player player, NetHandler netHandler, + INetworkManager manager) { + /*String[] admins = MineTweaker.instance.getAdmins(); + boolean canSendErrors = false; + if (admins.length == 0) { + canSendErrors = true; + } else { + for (String s : admins) { + if (s.equals(netHandler.getPlayer().getEntityName())) canSendErrors = true; + } + } + if (canSendErrors) { + for (String s : MineTweaker.instance.getErrorMessages()) { + //#ifdef MC152 + //+netHandler.getPlayer().sendChatToPlayer(s); + //#else + netHandler.getPlayer().sendChatToPlayer(ChatMessageComponent.createFromText(s)); + //#endif + } + MineTweaker.instance.onAdminLogin(manager, netHandler); + }*/ + manager.addToSendQueue(new Packet250CustomPayload( + MCPacketHandler.CHANNEL_SERVERSCRIPT, + MineTweakerAPI.tweaker.getScriptData())); + } + + @Override + public String connectionReceived(NetLoginHandler netHandler, + INetworkManager manager) { + return null; + } + + @Override + public void connectionOpened(NetHandler netClientHandler, String server, + int port, INetworkManager manager) { + } + + @Override + public void connectionOpened(NetHandler netClientHandler, + MinecraftServer server, INetworkManager manager) { + } + + @Override + public void connectionClosed(INetworkManager manager) { + //MineTweaker.instance.onLogout(manager); + } + + @Override + public void clientLoggedIn(NetHandler clientHandler, + INetworkManager manager, Packet1Login login) { + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCPacketHandler.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCPacketHandler.java new file mode 100644 index 0000000..cb7f0db --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/network/MCPacketHandler.java @@ -0,0 +1,31 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.network; + +import net.minecraft.network.INetworkManager; +import net.minecraft.network.packet.Packet250CustomPayload; +import cpw.mods.fml.common.network.IPacketHandler; +import cpw.mods.fml.common.network.Player; +import minetweaker.MineTweakerAPI; +import minetweaker.runtime.providers.ScriptProviderMemory; + +public class MCPacketHandler implements IPacketHandler { + public static final String CHANNEL_SERVERSCRIPT = "MTServerScript"; + + @Override + public void onPacketData(INetworkManager manager, + Packet250CustomPayload packet, Player player) { + // catches some special cases caused by unknown reasons + if (packet == null || packet.channel == null || packet.data == null) return; + + if (packet.channel.equals(CHANNEL_SERVERSCRIPT)) { + MineTweakerAPI.tweaker.setScriptProvider(new ScriptProviderMemory(packet.data)); + MineTweakerAPI.tweaker.rollback(); + MineTweakerAPI.tweaker.load(); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDict.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDict.java new file mode 100644 index 0000000..38ee2d2 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDict.java @@ -0,0 +1,22 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.oredict; + +import minetweaker.api.oredict.IOreDict; +import minetweaker.api.oredict.IOreDictEntry; +import net.minecraftforge.oredict.OreDictionary; + +/** + * + * @author Stan + */ +public class MCOreDict implements IOreDict { + @Override + public IOreDictEntry get(String name) { + return new MCOreDictEntry(OreDictionary.getOreID(name)); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java new file mode 100644 index 0000000..c6a30b6 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java @@ -0,0 +1,316 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.oredict; + +import java.util.ArrayList; +import java.util.List; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.mc164.item.MCItemStack; +import minetweaker.mc164.util.MineTweakerHacks; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemCondition; +import minetweaker.api.item.IItemStack; +import minetweaker.api.item.IItemTransformer; +import minetweaker.api.item.IngredientStack; +import minetweaker.api.oredict.IOreDictEntry; +import minetweaker.api.oredict.IngredientOreDict; +import minetweaker.util.ArrayUtil; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +/** + * + * @author Stan + */ +public class MCOreDictEntry implements IOreDictEntry { + private final Integer id; + + public MCOreDictEntry(Integer id) { + this.id = id; + } + + public MCOreDictEntry(String id) { + this.id = OreDictionary.getOreID(id); + } + + // #################################### + // ### IOreDictEntry implementation ### + // #################################### + + @Override + public void add(IItemStack item) { + ItemStack stack = (ItemStack) item.getInternal(); + if (stack == null) { + MineTweakerAPI.logger.logError("not a valid item"); + } else { + MineTweakerAPI.tweaker.apply(new ActionAddItem(id, stack)); + } + } + + @Override + public void addAll(IOreDictEntry entry) { + if (entry instanceof MCOreDictEntry) { + MineTweakerAPI.tweaker.apply(new ActionAddAll(id, ((MCOreDictEntry) entry).id)); + } else { + MineTweakerAPI.logger.logError("not a valid entry"); + } + } + + @Override + public void remove(IItemStack item) { + ItemStack result = null; + for (ItemStack itemStack : OreDictionary.getOres(id)) { + if (item.matches(new MCItemStack(itemStack))) { + result = itemStack; + break; + } + } + + if (result != null) { + MineTweakerAPI.tweaker.apply(new ActionRemoveItem(id, result)); + } + } + + @Override + public boolean contains(IItemStack item) { + for (ItemStack itemStack : OreDictionary.getOres(id)) { + if (item.matches(new MCItemStack(itemStack))) { + return true; + } + } + + return false; + } + + @Override + public void mirror(IOreDictEntry other) { + if (other instanceof MCOreDictEntry) { + MineTweakerAPI.tweaker.apply(new ActionMirror(id, ((MCOreDictEntry) other).id)); + } else { + MineTweakerAPI.logger.logError("not a valid oredict entry"); + } + } + + @Override + public String getMark() { + return null; + } + + @Override + public int getAmount() { + return 1; + } + + @Override + public List getItems() { + List result = new ArrayList(); + for (ItemStack item : OreDictionary.getOres(id)) { + result.add(new MCItemStack(item)); + } + return result; + } + + @Override + public IIngredient amount(int amount) { + return new IngredientStack(this, amount); + } + + @Override + public IIngredient transform(IItemTransformer transformer) { + return new IngredientOreDict(this, null, ArrayUtil.EMPTY_CONDITIONS, new IItemTransformer[] { transformer }); + } + + @Override + public IIngredient only(IItemCondition condition) { + return new IngredientOreDict(this, null, new IItemCondition[] { condition }, ArrayUtil.EMPTY_TRANSFORMERS); + } + + @Override + public IIngredient marked(String mark) { + return new IngredientOreDict(this, mark, ArrayUtil.EMPTY_CONDITIONS, ArrayUtil.EMPTY_TRANSFORMERS); + } + + @Override + public boolean matches(IItemStack item) { + return contains(item); + } + + @Override + public boolean contains(IIngredient ingredient) { + List items = ingredient.getItems(); + for (IItemStack item : items) { + if (!matches(item)) return false; + } + + return true; + } + + @Override + public IItemStack applyTransform(IItemStack item) { + return item; + } + + @Override + public Object getInternal() { + return OreDictionary.getOreName(id); + } + + // ###################### + // ### Action classes ### + // ###################### + + private static class ActionAddItem implements IUndoableAction { + private final Integer id; + private final ItemStack item; + + public ActionAddItem(Integer id, ItemStack item) { + this.id = id; + this.item = item; + } + + @Override + public void apply() { + OreDictionary.registerOre(id, item); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + OreDictionary.getOres(id).remove(item); + } + + @Override + public String describe() { + return "Adding " + item.getDisplayName() + " to ore dictionary entry " + OreDictionary.getOreName(id); + } + + @Override + public String describeUndo() { + return "Removing " + item.getDisplayName() + " from ore dictionary entry " + OreDictionary.getOreName(id); + } + } + + private static class ActionMirror implements IUndoableAction { + private final Integer idTarget; + private final Integer idSource; + + private final ArrayList targetCopy; + + public ActionMirror(Integer idTarget, Integer idSource) { + this.idTarget = idTarget; + this.idSource = idSource; + + targetCopy = OreDictionary.getOres(idTarget); + } + + @Override + public void apply() { + MineTweakerHacks.getOreStacks().put(idTarget, OreDictionary.getOres(idSource)); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + MineTweakerHacks.getOreStacks().put(idTarget, targetCopy); + } + + @Override + public String describe() { + return "Mirroring " + OreDictionary.getOreName(idSource) + " to " + OreDictionary.getOreName(idTarget); + } + + @Override + public String describeUndo() { + return "Undoing mirror of " + OreDictionary.getOreName(idSource) + " to " + OreDictionary.getOreName(idTarget); + } + } + + private static class ActionRemoveItem implements IUndoableAction { + private final Integer id; + private final ItemStack item; + + public ActionRemoveItem(Integer id, ItemStack item) { + this.id = id; + this.item = item; + } + + @Override + public void apply() { + OreDictionary.getOres(id).remove(item); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + OreDictionary.getOres(id).add(item); + } + + @Override + public String describe() { + return "Removing " + item.getDisplayName() + " from ore dictionary entry " + OreDictionary.getOreName(id); + } + + @Override + public String describeUndo() { + return "Restoring " + item.getDisplayName() + " to ore dictionary entry " + OreDictionary.getOreName(id); + } + } + + private static class ActionAddAll implements IUndoableAction { + private final Integer idTarget; + private final Integer idSource; + + public ActionAddAll(Integer idTarget, Integer idSource) { + this.idTarget = idTarget; + this.idSource = idSource; + } + + @Override + public void apply() { + List ores = OreDictionary.getOres(idTarget); + for (ItemStack stack : OreDictionary.getOres(idSource)) { + ores.add(stack); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + List ores = OreDictionary.getOres(idTarget); + for (ItemStack stack : OreDictionary.getOres(idSource)) { + ores.remove(stack); + } + } + + @Override + public String describe() { + return "Copying contents of ore dictionary entry " + OreDictionary.getOreName(idSource) + " to " + OreDictionary.getOreName(idTarget); + } + + @Override + public String describeUndo() { + return "Removing contents of ore dictionary entry " + OreDictionary.getOreName(idSource) + " from " + OreDictionary.getOreName(idTarget); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/player/MCPlayer.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/player/MCPlayer.java new file mode 100644 index 0000000..e98324a --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/player/MCPlayer.java @@ -0,0 +1,39 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.player; + +import minetweaker.mc164.data.NBTConverter; +import minetweaker.api.data.IData; +import minetweaker.api.player.IPlayer; +import net.minecraft.entity.player.EntityPlayer; + +/** + * + * @author Stan + */ +public class MCPlayer implements IPlayer { + private final EntityPlayer player; + + public MCPlayer(EntityPlayer player) { + this.player = player; + } + + @Override + public String getName() { + return player.getCommandSenderName(); + } + + @Override + public IData getData() { + return NBTConverter.from(player.getEntityData(), true); + } + + @Override + public void update(IData data) { + NBTConverter.updateMap(player.getEntityData(), data); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCCraftingInventory.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCCraftingInventory.java new file mode 100644 index 0000000..ad11c65 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCCraftingInventory.java @@ -0,0 +1,173 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import java.util.List; +import minetweaker.mc164.item.MCItemStack; +import minetweaker.mc164.util.MineTweakerHacks; +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; +import minetweaker.api.recipes.ICraftingInventory; +import minetweaker.mc164.player.MCPlayer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.inventory.SlotCrafting; +import net.minecraft.item.ItemStack; + +/** + * + * @author Stan + */ +public class MCCraftingInventory implements ICraftingInventory { + private static final ThreadLocal cache = new ThreadLocal(); + + public static MCCraftingInventory get(InventoryCrafting inventory) { + if (cache.get() == null || cache.get().inventory != inventory) { + MCCraftingInventory result = new MCCraftingInventory(inventory); + cache.set(result); + return result; + } else { + MCCraftingInventory result = cache.get(); + result.update(); + return result; + } + } + + private int width; + private int height; + private final InventoryCrafting inventory; + private IItemStack[] stacks; + private ItemStack[] original; + private int stackCount; + private MCPlayer player; + + private MCCraftingInventory(InventoryCrafting inventory) { + this.inventory = inventory; + width = height = (int) Math.sqrt(inventory.getSizeInventory()); + stacks = new IItemStack[width * height]; + original = new ItemStack[stacks.length]; + stackCount = 0; + update(); + + Container container = MineTweakerHacks.getCraftingContainer(inventory); + List slots = container.inventorySlots; + if (!slots.isEmpty() && slots.get(0) instanceof SlotCrafting) { + SlotCrafting slotCrafting = (SlotCrafting) slots.get(0); + EntityPlayer playerEntity = MineTweakerHacks.getCraftingSlotPlayer(slotCrafting); + player = new MCPlayer(playerEntity); + } else { + player = null; + } + } + + private void update() { + if (inventory.getSizeInventory() != original.length) { + width = height = (int) Math.sqrt(inventory.getSizeInventory()); + stacks = new IItemStack[inventory.getSizeInventory()]; + original = new ItemStack[stacks.length]; + stackCount = 0; + } + + for (int i = 0; i < inventory.getSizeInventory(); i++) { + if (changed(i)) { + //System.out.println("Slot " + i + " changed"); + original[i] = inventory.getStackInSlot(i); + if (inventory.getStackInSlot(i) != null) { + if (stacks[i] == null) stackCount++; + stacks[i] = new MCItemStack(original[i]); + } else { + if (stacks[i] != null) stackCount--; + stacks[i] = null; + } + } + } + //System.out.println("Num stack count: " + stackCount); + } + + @Override + public IPlayer getPlayer() { + return player; + } + + @Override + public int getSize() { + return width * height; + } + + @Override + public int getWidth() { + return width; + } + + @Override + public int getHeight() { + return height; + } + + @Override + public int getStackCount() { + return stackCount; + } + + @Override + public IItemStack getStack(int i) { + return stacks[i]; + } + + @Override + public IItemStack getStack(int x, int y) { + return stacks[y * width + x]; + } + + @Override + public void setStack(int x, int y, IItemStack stack) { + //System.out.println("SetStack(" + x + ", " + y + ") " + stack); + + int ix = y * width + x; + if (stack != stacks[ix]) { + if (stack == null) { + stackCount--; + inventory.setInventorySlotContents(ix, null); + } else { + inventory.setInventorySlotContents(ix, (ItemStack) stack.getInternal()); + + if (stacks[ix] == null) { + stackCount++; + } + } + stacks[ix] = stack; + } + } + + @Override + public void setStack(int i, IItemStack stack) { + //System.out.println("SetStack(" + i + ") " + stack); + + if (stack != stacks[i]) { + if (stack == null) { + stackCount--; + inventory.setInventorySlotContents(i, null); + } else { + inventory.setInventorySlotContents(i, (ItemStack) stack.getInternal()); + + if (stacks[i] == null) { + stackCount++; + } + } + stacks[i] = stack; + } + } + + private boolean changed(int i) { + if (original[i] != inventory.getStackInSlot(i)) return true; + if (original[i] != null && stacks[i].getAmount() != original[i].stackSize) return true; + + return false; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java new file mode 100644 index 0000000..0f03e22 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java @@ -0,0 +1,358 @@ +package minetweaker.mc164.recipes; + +import minetweaker.api.recipes.ShapedRecipe; +import minetweaker.api.recipes.ShapelessRecipe; +import java.util.ArrayList; +import java.util.List; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.mc164.item.MCItemStack; +import minetweaker.mc164.oredict.MCOreDictEntry; +import minetweaker.mc164.util.MineTweakerHacks; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.recipes.IRecipeFunction; +import minetweaker.api.recipes.IRecipeManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +/** + * + * @author Stan + */ +public class MCRecipeManager implements IRecipeManager { + private final List recipes; + + public MCRecipeManager() { + recipes = (List) CraftingManager.getInstance().getRecipeList(); + } + + @Override + public int remove(IIngredient output) { + List toRemove = new ArrayList(); + List removeIndex = new ArrayList(); + for (int i = 0; i < recipes.size(); i++) { + IRecipe recipe = recipes.get(i); + + // certain special recipes have no predefined output. ignore those + // since these cannot be removed with MineTweaker scripts + if (recipe.getRecipeOutput() != null) { + if (output.matches(new MCItemStack(recipe.getRecipeOutput()))) { + toRemove.add(recipe); + removeIndex.add(i); + } + } + } + + MineTweakerAPI.tweaker.apply(new ActionRemoveRecipes(toRemove, removeIndex)); + return toRemove.size(); + } + + @Override + public void addShaped(IItemStack output, IIngredient[][] ingredients, IRecipeFunction function, boolean mirrored) { + if (output.getInternal() == null) { + MineTweakerAPI.logger.logError("invalid output item"); + return; + } + + ShapedRecipe recipe = new ShapedRecipe(output, ingredients, function, mirrored); + IRecipe irecipe = RecipeConverter.convert(recipe); + MineTweakerAPI.tweaker.apply(new ActionAddRecipe(irecipe)); + } + + @Override + public void addShapeless(IItemStack output, IIngredient[] ingredients, IRecipeFunction function) { + if (output.getInternal() == null) { + MineTweakerAPI.logger.logError("invalid output item"); + return; + } + + ShapelessRecipe recipe = new ShapelessRecipe(output, ingredients, function); + IRecipe irecipe = RecipeConverter.convert(recipe); + MineTweakerAPI.tweaker.apply(new ActionAddRecipe(irecipe)); + } + + @Override + public int removeShaped(IIngredient output, IIngredient[][] ingredients) { + int ingredientsWidth = 0; + int ingredientsHeight = 0; + + if (ingredients != null) { + ingredientsHeight = ingredients.length; + + for (int i = 0; i < ingredients.length; i++) { + ingredientsWidth = Math.max(ingredientsWidth, ingredients[i].length); + } + } + + List toRemove = new ArrayList(); + List removeIndex = new ArrayList(); + outer: for (int i = 0; i < recipes.size(); i++) { + IRecipe recipe = recipes.get(i); + + if (recipe.getRecipeOutput() == null || !output.matches(new MCItemStack(recipe.getRecipeOutput()))) { + continue; + } + + if (ingredients != null) { + if (recipe instanceof ShapedRecipes) { + ShapedRecipes srecipe = (ShapedRecipes) recipe; + if (ingredientsWidth != srecipe.recipeWidth || ingredientsHeight != srecipe.recipeHeight) { + continue; + } + + for (int j = 0; j < ingredientsHeight; j++) { + IIngredient[] row = ingredients[j]; + for (int k = 0; k < ingredientsWidth; k++) { + IIngredient ingredient = k > row.length ? null : row[k]; + ItemStack recipeIngredient = srecipe.recipeItems[j * srecipe.recipeWidth + k]; + + if (!matches(recipeIngredient, ingredient)) { + continue outer; + } + } + } + } else if (recipe instanceof ShapedOreRecipe) { + ShapedOreRecipe srecipe = (ShapedOreRecipe) recipe; + int recipeWidth = MineTweakerHacks.getShapedOreRecipeWidth(srecipe); + int recipeHeight = srecipe.getRecipeSize() / recipeWidth; + if (ingredientsWidth != recipeWidth || ingredientsHeight != recipeHeight) { + continue; + } + + for (int j = 0; j < ingredientsHeight; j++) { + IIngredient[] row = ingredients[j]; + for (int k = 0; k < ingredientsWidth; k++) { + IIngredient ingredient = k > row.length ? null : row[k]; + Object input = srecipe.getInput()[j * recipeWidth + k]; + if (!matches(input, ingredient)) { + continue outer; + } + } + } + } + } else { + if (recipe instanceof ShapedRecipe) { + + } else if (recipe instanceof ShapedOreRecipe) { + + } else { + continue; + } + } + + toRemove.add(recipe); + removeIndex.add(i); + } + + MineTweakerAPI.tweaker.apply(new ActionRemoveRecipes(toRemove, removeIndex)); + return toRemove.size(); + } + + @Override + public int removeShapeless(IIngredient output, IIngredient[] ingredients, boolean wildcard) { + List toRemove = new ArrayList(); + List removeIndex = new ArrayList(); + outer: for (int i = 0; i < recipes.size(); i++) { + IRecipe recipe = recipes.get(i); + + if (recipe.getRecipeOutput() == null || !output.matches(new MCItemStack(recipe.getRecipeOutput()))) { + continue; + } + + if (ingredients != null) { + if (recipe instanceof ShapelessRecipes) { + ShapelessRecipes srecipe = (ShapelessRecipes) recipe; + + if (ingredients.length > srecipe.getRecipeSize()) { + continue; + } else if (!wildcard && ingredients.length < srecipe.getRecipeSize()) { + continue; + } + + checkIngredient: for (int j = 0; j < ingredients.length; j++) { + for (int k = 0; k < srecipe.getRecipeSize(); k++) { + if (matches(srecipe.recipeItems.get(k), ingredients[j])) { + continue checkIngredient; + } + } + + continue outer; + } + } else if (recipe instanceof ShapelessOreRecipe) { + ShapelessOreRecipe srecipe = (ShapelessOreRecipe) recipe; + ArrayList inputs = srecipe.getInput(); + + if (inputs.size() < ingredients.length) { + continue; + } if (!wildcard && inputs.size() > ingredients.length) { + continue; + } + + checkIngredient: for (int j = 0; j < ingredients.length; j++) { + for (int k = 0; k < srecipe.getRecipeSize(); k++) { + if (matches(inputs.get(k), ingredients[j])) { + continue checkIngredient; + } + } + + continue outer; + } + } + } else { + if (recipe instanceof ShapelessRecipes) { + + } else if (recipe instanceof ShapelessOreRecipe) { + + } else { + continue; + } + } + + toRemove.add(recipe); + removeIndex.add(i); + } + + MineTweakerAPI.tweaker.apply(new ActionRemoveRecipes(toRemove, removeIndex)); + return toRemove.size(); + } + + @Override + public IItemStack craft(IItemStack[][] contents) { + Container container = new ContainerVirtual(); + + int width = 0; + int height = contents.length; + for (IItemStack[] row : contents) { + width = Math.max(width, row.length); + } + + ItemStack[] iContents = new ItemStack[width * height]; + for (int i = 0; i < height; i++) { + for (int j = 0; j < contents[i].length; j++) { + if (contents[i][j] != null) { + Object internal = contents[i][j].getInternal(); + if (internal != null && (internal instanceof ItemStack)) { + iContents[i * width + j] = (ItemStack) internal; + } + } + } + } + + InventoryCrafting inventory = new InventoryCrafting(container, width, height); + for (int i = 0; i < iContents.length; i++) { + inventory.setInventorySlotContents(i, iContents[i]); + } + ItemStack result = CraftingManager.getInstance().findMatchingRecipe(inventory, null); + if (result == null) { + return null; + } else { + return new MCItemStack(result); + } + } + + private class ContainerVirtual extends Container { + @Override + public boolean canInteractWith(EntityPlayer var1) { + return false; + } + } + + private class ActionRemoveRecipes implements IUndoableAction { + private final List removingIndices; + private final List removingRecipes; + + public ActionRemoveRecipes(List recipes, List indices) { + this.removingIndices = indices; + this.removingRecipes = recipes; + } + + @Override + public void apply() { + for (int i = removingIndices.size() - 1; i >= 0; i--) { + recipes.remove((int) removingIndices.get(i)); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (int i = 0; i < removingIndices.size(); i++) { + recipes.add(removingIndices.get(i), removingRecipes.get(i)); + } + } + + @Override + public String describe() { + return "Removing " + removingIndices.size() + " recipes"; + } + + @Override + public String describeUndo() { + return "Restoring " + removingIndices.size() + " recipes"; + } + } + + private class ActionAddRecipe implements IUndoableAction { + private final IRecipe recipe; + + public ActionAddRecipe(IRecipe recipe) { + this.recipe = recipe; + } + + @Override + public void apply() { + recipes.add(recipe); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + recipes.remove(recipe); + } + + @Override + public String describe() { + return "Adding recipe for " + recipe.getRecipeOutput().getDisplayName(); + } + + @Override + public String describeUndo() { + return "Removing recipe for " + recipe.getRecipeOutput().getDisplayName(); + } + } + + private static boolean matches(Object input, IIngredient ingredient) { + if ((input == null) != (ingredient == null)) { + return false; + } else if (ingredient != null) { + if (input instanceof ItemStack) { + if (!ingredient.matches(new MCItemStack((ItemStack) input))) { + return false; + } + } else if (input instanceof String) { + if (!ingredient.contains(new MCOreDictEntry((String) input))) { + return false; + } + } + } + + return true; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java new file mode 100644 index 0000000..4406224 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java @@ -0,0 +1,123 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import minetweaker.api.recipes.ShapedRecipe; +import minetweaker.api.recipes.ShapelessRecipe; +import java.util.ArrayList; +import java.util.Arrays; +import minetweaker.api.item.IIngredient; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; + +/** + * + * @author Stan + */ +public class RecipeConverter { + private RecipeConverter() {} + + public static final int TYPE_ADVANCED = 0; + public static final int TYPE_ORE = 1; + public static final int TYPE_BASIC = 2; + + private static int getIngredientType(IIngredient pattern) { + Object internal = pattern.getInternal(); + if (internal == null) { + return TYPE_ADVANCED; + } else if (internal instanceof ItemStack) { + return TYPE_BASIC; + } else { + return TYPE_ORE; + } + } + + private static int getRecipeType(IIngredient[] ingredients) { + int type = TYPE_BASIC; + for (IIngredient ingredient : ingredients) { + type = Math.min(type, getIngredientType(ingredient)); + } + return type; + } + + public static IRecipe convert(ShapelessRecipe recipe) { + IIngredient[] ingredients = recipe.getIngredients(); + int type = getRecipeType(ingredients); + + if (type == TYPE_BASIC) { + ItemStack[] items = new ItemStack[ingredients.length]; + for (int i = 0; i < ingredients.length; i++) { + items[i] = (ItemStack) ingredients[i].getInternal(); + } + return new ShapelessRecipeBasic(items, recipe); + } else if (type == TYPE_ORE) { + Object[] items = new Object[ingredients.length]; + for (int i = 0; i < ingredients.length; i++) { + items[i] = ingredients[i].getInternal(); + } + return new ShapelessRecipeOre(items, recipe); + } else { + return new ShapelessRecipeAdvanced(recipe); + } + } + + public static IRecipe convert(ShapedRecipe recipe) { + IIngredient[] ingredients = recipe.getIngredients(); + byte[] posx = recipe.getIngredientsX(); + byte[] posy = recipe.getIngredientsY(); + + // determine recipe type + int type = getRecipeType(ingredients); + + // construct recipe + if (type == TYPE_BASIC) { + System.out.println("Converted to basic recipe"); + ItemStack[] basicIngredients = new ItemStack[recipe.getHeight() * recipe.getWidth()]; + for (int i = 0; i < ingredients.length; i++) { + basicIngredients[posx[i] + posy[i] * recipe.getWidth()] = (ItemStack) ingredients[i].getInternal(); + } + + return new ShapedRecipeBasic(basicIngredients, recipe); + } else if (type == TYPE_ORE) { + System.out.println("Converted to ore recipe"); + Object[] converted = new Object[recipe.getHeight() * recipe.getWidth()]; + for (int i = 0; i < ingredients.length; i++) { + converted[posx[i] + posy[i] * recipe.getWidth()] = ingredients[i].getInternal(); + } + + // arguments contents: + // 1) recipe patterns + // 2) characters + ingredients + + int counter = 0; + String[] parts = new String[recipe.getHeight()]; + ArrayList rarguments = new ArrayList(); + for (int i = 0; i < recipe.getHeight(); i++) { + char[] pattern = new char[recipe.getWidth()]; + for (int j = 0; j < recipe.getWidth(); j++) { + int off = i * recipe.getWidth() + j; + if (converted[off] == null) { + pattern[j] = ' '; + } else { + pattern[j] = (char) ('A' + counter); + rarguments.add(pattern[j]); + rarguments.add(converted[off]); + counter++; + } + } + parts[i] = new String(pattern); + } + + rarguments.addAll(0, Arrays.asList(parts)); + + return new ShapedRecipeOre(rarguments.toArray(), recipe); + } else { + System.out.println("Converted to advanced recipe"); + return new ShapedRecipeAdvanced(recipe); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeAdvanced.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeAdvanced.java new file mode 100644 index 0000000..8a9aafc --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeAdvanced.java @@ -0,0 +1,46 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import minetweaker.api.recipes.ShapedRecipe; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; + +/** + * TODO: NEI integration for this kind of recipes. + * + * @author Stan + */ +public class ShapedRecipeAdvanced implements IRecipe { + private final ShapedRecipe recipe; + + public ShapedRecipeAdvanced(ShapedRecipe recipe) { + this.recipe = recipe; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + return recipe.matches(MCCraftingInventory.get(inventory)); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + return ((ItemStack) recipe.getCraftingResult(MCCraftingInventory.get(inventory)).getInternal()).copy(); + } + + @Override + public int getRecipeSize() { + return recipe.getWidth() * recipe.getHeight(); + } + + @Override + public ItemStack getRecipeOutput() { + return (ItemStack) recipe.getOutput().getInternal(); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeBasic.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeBasic.java new file mode 100644 index 0000000..1353f2f --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeBasic.java @@ -0,0 +1,43 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import minetweaker.api.item.IItemStack; +import minetweaker.api.recipes.ShapedRecipe; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.world.World; + +/** + * + * @author Stan + */ +public class ShapedRecipeBasic extends ShapedRecipes { + private final ShapedRecipe recipe; + + public ShapedRecipeBasic(ItemStack[] basicInputs, ShapedRecipe recipe) { + super(recipe.getWidth(), recipe.getHeight(), basicInputs, (ItemStack) recipe.getOutput().getInternal()); + + this.recipe = recipe; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + return recipe.matches(MCCraftingInventory.get(inventory)); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + IItemStack result = recipe.getCraftingResult(MCCraftingInventory.get(inventory)); + if (result == null) { + return null; + } else { + return ((ItemStack) result.getInternal()).copy(); + } + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeOre.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeOre.java new file mode 100644 index 0000000..88bfc55 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapedRecipeOre.java @@ -0,0 +1,37 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import minetweaker.api.recipes.ShapedRecipe; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapedOreRecipe; + +/** + * + * @author Stan + */ +public class ShapedRecipeOre extends ShapedOreRecipe { + private final ShapedRecipe recipe; + + public ShapedRecipeOre(Object[] contents, ShapedRecipe recipe) { + super((ItemStack) recipe.getOutput().getInternal(), contents); + + this.recipe = recipe; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + return recipe.matches(MCCraftingInventory.get(inventory)); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + return ((ItemStack) recipe.getCraftingResult(MCCraftingInventory.get(inventory)).getInternal()).copy(); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeAdvanced.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeAdvanced.java new file mode 100644 index 0000000..8da3b9e --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeAdvanced.java @@ -0,0 +1,45 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import minetweaker.api.recipes.ShapelessRecipe; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; + +/** + * + * @author Stan + */ +public class ShapelessRecipeAdvanced implements IRecipe { + private final ShapelessRecipe recipe; + + public ShapelessRecipeAdvanced(ShapelessRecipe recipe) { + this.recipe = recipe; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + return recipe.matches(MCCraftingInventory.get(inventory)); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + return ((ItemStack) recipe.getCraftingResult(MCCraftingInventory.get(inventory)).getInternal()).copy(); + } + + @Override + public int getRecipeSize() { + return recipe.getSize(); + } + + @Override + public ItemStack getRecipeOutput() { + return (ItemStack) recipe.getOutput().getInternal(); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeBasic.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeBasic.java new file mode 100644 index 0000000..556c224 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeBasic.java @@ -0,0 +1,38 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import minetweaker.api.recipes.ShapelessRecipe; +import java.util.Arrays; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.world.World; + +/** + * + * @author Stan + */ +public class ShapelessRecipeBasic extends ShapelessRecipes { + private final ShapelessRecipe recipe; + + public ShapelessRecipeBasic(ItemStack[] ingredients, ShapelessRecipe recipe) { + super((ItemStack) recipe.getOutput().getInternal(), Arrays.asList(ingredients)); + + this.recipe = recipe; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + return recipe.matches(MCCraftingInventory.get(inventory)); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + return ((ItemStack) recipe.getCraftingResult(MCCraftingInventory.get(inventory)).getInternal()).copy(); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeOre.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeOre.java new file mode 100644 index 0000000..c4feaf4 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/ShapelessRecipeOre.java @@ -0,0 +1,37 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.recipes; + +import minetweaker.api.recipes.ShapelessRecipe; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +/** + * + * @author Stan + */ +public class ShapelessRecipeOre extends ShapelessOreRecipe { + private final ShapelessRecipe recipe; + + public ShapelessRecipeOre(Object[] ingredients, ShapelessRecipe recipe) { + super((ItemStack) recipe.getOutput().getInternal(), ingredients); + + this.recipe = recipe; + } + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + return recipe.matches(MCCraftingInventory.get(inventory)); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + return ((ItemStack) recipe.getCraftingResult(MCCraftingInventory.get(inventory)).getInternal()).copy(); + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerHacks.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerHacks.java new file mode 100644 index 0000000..3326ca5 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerHacks.java @@ -0,0 +1,135 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.util; + +import java.io.File; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; +import minetweaker.MineTweakerAPI; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.inventory.SlotCrafting;import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; + +/** + * Common class for all runtime hacks (stuff requiring reflection). It is not + * unexpected to have it break with new minecraft versions and may need regular + * adjustment - as such, those have been collected here. + * + * @author Stan Hebben + */ +public class MineTweakerHacks { + private static final Field NBTTAGCOMPOUND_TAGMAP; + private static final Field OREDICTIONARY_ORESTACKS; + private static final Field MINECRAFTSERVER_ANVILFILE; + private static final Field SHAPEDORERECIPE_WIDTH; + + private static final Field INVENTORYCRAFTING_EVENTHANDLER; + private static final Field SLOTCRAFTING_PLAYER; + + static { + NBTTAGCOMPOUND_TAGMAP = getField(NBTTagCompound.class, MineTweakerObfuscation.NBTTAGCOMPOUND_TAGMAP); + OREDICTIONARY_ORESTACKS = getField(OreDictionary.class, MineTweakerObfuscation.OREDICTIONARY_ORESTACKS); + MINECRAFTSERVER_ANVILFILE = getField(MinecraftServer.class, MineTweakerObfuscation.MINECRAFTSERVER_ANVILFILE); + SHAPEDORERECIPE_WIDTH = getField(ShapedOreRecipe.class, new String[] {"width"}); + + INVENTORYCRAFTING_EVENTHANDLER = getField(InventoryCrafting.class, MineTweakerObfuscation.INVENTORYCRAFTING_EVENTHANDLER); + SLOTCRAFTING_PLAYER = getField(SlotCrafting.class, MineTweakerObfuscation.SLOTCRAFTING_PLAYER); + } + + private MineTweakerHacks() {} + + public static Map getNBTCompoundMap(NBTTagCompound tag) { + try { + return (Map) NBTTAGCOMPOUND_TAGMAP.get(tag); + } catch (IllegalArgumentException ex) { + return null; + } catch (IllegalAccessException ex) { + return null; + } + } + + public static Map> getOreStacks() { + try { + return (Map>) OREDICTIONARY_ORESTACKS.get(null); + } catch (IllegalAccessException ex) { + MineTweakerAPI.logger.logError("ERROR - could not load ore dictionary stacks!"); + return null; + } + } + + public static File getAnvilFile(MinecraftServer server) { + try { + return (File) MINECRAFTSERVER_ANVILFILE.get(server); + } catch (IllegalAccessException ex) { + MineTweakerAPI.logger.logError("could not load anvil file!"); + return null; + } + } + + public static File getWorldDirectory(MinecraftServer server) { + if (server.isDedicatedServer()) { + return server.getFile("world"); + } else { + File worldsDir = getAnvilFile(server); + if (worldsDir == null) return null; + + return new File(worldsDir, server.getFolderName()); + } + } + + public static int getShapedOreRecipeWidth(ShapedOreRecipe recipe) { + try { + return SHAPEDORERECIPE_WIDTH.getInt(recipe); + } catch (IllegalAccessException ex) { + MineTweakerAPI.logger.logError("could not load anvil file!"); + return 3; + } + } + + public static Container getCraftingContainer(InventoryCrafting inventory) { + try { + return (Container) INVENTORYCRAFTING_EVENTHANDLER.get(inventory); + } catch (IllegalAccessException ex) { + MineTweakerAPI.logger.logError("could not get inventory eventhandler"); + return null; + } + } + + public static EntityPlayer getCraftingSlotPlayer(SlotCrafting slot) { + try { + return (EntityPlayer) SLOTCRAFTING_PLAYER.get(slot); + } catch (IllegalAccessException ex) { + MineTweakerAPI.logger.logError("could not get inventory eventhandler"); + return null; + } + } + + // ####################### + // ### Private Methods ### + // ####################### + + private static Field getField(Class cls, String[] names) { + for (String name : names) { + try { + Field field = cls.getDeclaredField(name); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException ex) { + } catch (SecurityException ex) { + } + } + + return null; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerObfuscation.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerObfuscation.java new file mode 100644 index 0000000..443130f --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerObfuscation.java @@ -0,0 +1,21 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.util; + +/** + * + * @author Stanneke + */ +public class MineTweakerObfuscation { + private MineTweakerObfuscation() {} + + public static final String[] NBTTAGCOMPOUND_TAGMAP = {"tagMap", "field_74784_a"}; + public static final String[] OREDICTIONARY_ORESTACKS = {"oreStacks"}; + public static final String[] MINECRAFTSERVER_ANVILFILE = {"anvilFile", "field_71308_o"}; + public static final String[] INVENTORYCRAFTING_EVENTHANDLER = {"eventHandler", "field_70465_c"}; + public static final String[] SLOTCRAFTING_PLAYER = {"thePlayer", "field_75238_b"}; +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerUtil.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerUtil.java new file mode 100644 index 0000000..021fed6 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/util/MineTweakerUtil.java @@ -0,0 +1,56 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.util; + +import java.util.List; +import minetweaker.api.item.IItemStack; +import minetweaker.mc164.item.MCItemStack; +import net.minecraft.item.ItemStack; + +/** + * + * @author Stan + */ +public class MineTweakerUtil { + public static ItemStack[] getItemStacks(IItemStack... items) { + ItemStack[] output = new ItemStack[items.length]; + for (int i = 0; i < items.length; i++) { + Object internal = items[i].getInternal(); + if (internal != null && internal instanceof ItemStack) { + output[i] = (ItemStack) internal; + } + } + return output; + } + + public static ItemStack[] getItemStacks(List items) { + ItemStack[] output = new ItemStack[items.size()]; + for (int i = 0; i < items.size(); i++) { + Object internal = items.get(i).getInternal(); + if (internal != null && internal instanceof ItemStack) { + output[i] = (ItemStack) internal; + } + } + return output; + } + + public static IItemStack[] getIItemStacks(ItemStack... items) { + IItemStack[] result = new IItemStack[items.length]; + for (int i = 0; i < items.length; i++) { + result[i] = new MCItemStack(items[i]); + } + return result; + } + + public static IItemStack[] getIItemStacks(List items) { + IItemStack[] result = new IItemStack[items.size()]; + for (int i = 0; i < result.length; i++) { + result[i] = new MCItemStack(items.get(i)); + } + return result; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/resources/mcmod.info b/MineTweaker3-MC164-Main/src/main/resources/mcmod.info new file mode 100644 index 0000000..f072406 --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/resources/mcmod.info @@ -0,0 +1,12 @@ +[ +{ + "modid": "MineTweaker3", + "name": "MineTweaker 3", + "version": "${version}", + "mcversion": "${mcversion}", + "description": "Customize your minecraft experience!", + "url": "http://minetweaker3.powerofbytes.com/wiki/", + "credits": "Stan Hebben", + "authors": [ "Stan Hebben" ], +} +] diff --git a/MineTweaker3-MC17-Main/build.gradle b/MineTweaker3-MC172-Main/build.gradle similarity index 66% rename from MineTweaker3-MC17-Main/build.gradle rename to MineTweaker3-MC172-Main/build.gradle index c7c4c9f..56c0f17 100644 --- a/MineTweaker3-MC17-Main/build.gradle +++ b/MineTweaker3-MC172-Main/build.gradle @@ -19,7 +19,7 @@ buildscript { apply plugin: 'forge' minecraft{version = "1.7.2-10.12.2.1121"} -version = "1.0" +version = "1.7.2-3.0.0" archivesBaseName = project.projectDir.name dependencies { @@ -36,3 +36,19 @@ task makeRegistry(type: RegisterZenClassesTask) { } tasks.jar.dependsOn(makeRegistry) + +processResources +{ + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/FMLEventHandler.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/FMLEventHandler.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/FMLEventHandler.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/FMLEventHandler.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/ForgeEventHandler.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/ForgeEventHandler.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/ForgeEventHandler.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/ForgeEventHandler.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java similarity index 92% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java index e439cb6..795052b 100644 --- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java @@ -73,30 +73,6 @@ public class MineTweakerCommand implements ICommand { " Outputs all active mod IDs in the game", "minetweaker name ", " Outputs the name for the given item ID" -/* "minetweaker name [:]", - " Prints the unlocalized name of the specified item," + - " can be used as item or block name", - "minetweaker liquid [:]", - " Prints the unlocalized liquid name in the specified container," + - " con be used as liquid name", - "minetweaker oredict", - " Prints a list of all ore dictionary entries", - "minetweaker oredict [:]", - " Prints the ore dictionary name(s) for the specified item", - "minetweaker oredict ", - " Prints all items for the specified ore dictionary name", - "minetweaker recipes [:]", - " Prints all recipes for the specified item", - "minetweaker fuel [:]", - " Retrieves the fuel value for the specified item", - "minetweaker reload", - " Reloads the server-side script (experimental)", - "minetweaker logdamage=on", - " Enables damage logging", - "minetweaker logdamage=off", - " Disables damage logging", - "minetweaker reload", - " Reloads the server script"*/ }, "\n"); } @@ -223,11 +199,20 @@ public class MineTweakerCommand implements ICommand { MineTweakerAPI.logger.logCommand("Mod: " + mod.getModId()); } } else if (arguments[0].equals("name")) { - try { - int id = Integer.parseInt(arguments[1]); - - } catch (NumberFormatException e) { - MineTweakerAPI.logger.logCommand("ID must be an integer"); + if (arguments.length < 2) { + sendChatMessage(icommandsender, "missing id parameter"); + } else { + try { + int id = Integer.parseInt(arguments[1]); + Item item = Item.getItemById(id); + StringBuilder description = new StringBuilder(); + description.append('<'); + description.append(Item.itemRegistry.getNameForObject(item)); + description.append('>'); + sendChatMessage(icommandsender, description.toString()); + } catch (NumberFormatException e) { + MineTweakerAPI.logger.logCommand("ID must be an integer"); + } } } diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerLogger.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerLogger.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerLogger.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerLogger.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerRegistry.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerRegistry.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerRegistry.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/MineTweakerRegistry.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/OreBracketHandler.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/brackets/OreBracketHandler.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/OreBracketHandler.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/brackets/OreBracketHandler.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTUpdater.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/data/NBTUpdater.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTUpdater.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/data/NBTUpdater.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/furnace/FuelTweaker.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/furnace/FuelTweaker.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/furnace/FuelTweaker.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/furnace/FuelTweaker.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/furnace/MCFurnaceManager.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/furnace/MCFurnaceManager.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/furnace/MCFurnaceManager.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/furnace/MCFurnaceManager.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/furnace/SetFuelPattern.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/furnace/SetFuelPattern.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/furnace/SetFuelPattern.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/furnace/SetFuelPattern.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/MCItemDefinition.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemDefinition.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/MCItemDefinition.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemDefinition.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidDefinition.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidDefinition.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidDefinition.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidDefinition.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidStack.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidStack.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidStack.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/liquid/MCLiquidStack.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/mods/MCLoadedMods.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/mods/MCLoadedMods.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/mods/MCLoadedMods.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/mods/MCLoadedMods.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/mods/MCMod.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/mods/MCMod.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/mods/MCMod.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/mods/MCMod.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/MCOreDict.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDict.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/MCOreDict.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDict.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/player/MCPlayer.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/player/MCPlayer.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/player/MCPlayer.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/player/MCPlayer.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MCCraftingInventory.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCCraftingInventory.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MCCraftingInventory.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCCraftingInventory.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeAdvanced.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeAdvanced.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeAdvanced.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeAdvanced.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeBasic.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeBasic.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeBasic.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeBasic.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeOre.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeOre.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeOre.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapedRecipeOre.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeAdvanced.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeAdvanced.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeAdvanced.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeAdvanced.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeBasic.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeBasic.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeBasic.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeBasic.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeOre.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeOre.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeOre.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/ShapelessRecipeOre.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/util/MineTweakerHacks.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/util/MineTweakerHacks.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/util/MineTweakerHacks.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/util/MineTweakerHacks.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/util/MineTweakerObfuscation.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/util/MineTweakerObfuscation.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/util/MineTweakerObfuscation.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/util/MineTweakerObfuscation.java diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/util/MineTweakerUtil.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/util/MineTweakerUtil.java similarity index 100% rename from MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/util/MineTweakerUtil.java rename to MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/util/MineTweakerUtil.java diff --git a/MineTweaker3-MC17-Main/src/main/resources/mod.info b/MineTweaker3-MC172-Main/src/main/resources/mcmod.info similarity index 100% rename from MineTweaker3-MC17-Main/src/main/resources/mod.info rename to MineTweaker3-MC172-Main/src/main/resources/mcmod.info diff --git a/MineTweaker3-MC17-Mod-IC2/build.gradle b/MineTweaker3-MC172-Mod-IC2/build.gradle similarity index 95% rename from MineTweaker3-MC17-Mod-IC2/build.gradle rename to MineTweaker3-MC172-Mod-IC2/build.gradle index 256010b..3d5fc83 100644 --- a/MineTweaker3-MC17-Mod-IC2/build.gradle +++ b/MineTweaker3-MC172-Mod-IC2/build.gradle @@ -25,7 +25,7 @@ archivesBaseName = project.projectDir.name dependencies { compile project(':ZenScript') compile project(':MineTweaker3-API') - compile project(':MineTweaker3-MC17-Main') + compile project(':MineTweaker3-MC172-Main') compile files('libs/industrialcraft-2-2.1.476-experimental-api.jar') } diff --git a/MineTweaker3-MC17-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-api.jar b/MineTweaker3-MC172-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-api.jar similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-api.jar rename to MineTweaker3-MC172-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-api.jar diff --git a/MineTweaker3-MC17-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-dev.jar b/MineTweaker3-MC172-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-dev.jar similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-dev.jar rename to MineTweaker3-MC172-Mod-IC2/libs/industrialcraft-2-2.1.476-experimental-dev.jar diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2BracketHandler.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2BracketHandler.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2BracketHandler.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2BracketHandler.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2ExplosionWhitelist.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2ExplosionWhitelist.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2ExplosionWhitelist.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2ExplosionWhitelist.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2RecipeInput.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2RecipeInput.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2RecipeInput.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/IC2RecipeInput.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/MachineAddRecipeAction.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/MachineAddRecipeAction.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/MachineAddRecipeAction.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/MachineAddRecipeAction.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/expand/ItemExpansion.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/expand/ItemExpansion.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/expand/ItemExpansion.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/expand/ItemExpansion.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Compressor.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Compressor.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Compressor.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Compressor.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Extractor.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Extractor.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Extractor.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Extractor.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Macerator.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Macerator.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Macerator.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/Macerator.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/MetalFormer.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/MetalFormer.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/MetalFormer.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/MetalFormer.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/OreWasher.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/OreWasher.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/OreWasher.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/OreWasher.java diff --git a/MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/ThermalCentrifuge.java b/MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/ThermalCentrifuge.java similarity index 100% rename from MineTweaker3-MC17-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/ThermalCentrifuge.java rename to MineTweaker3-MC172-Mod-IC2/src/main/java/minetweaker/mods/ic2/machines/ThermalCentrifuge.java diff --git a/MineTweaker3-MC17-Mod-NEI/build.gradle b/MineTweaker3-MC172-Mod-NEI/build.gradle similarity index 95% rename from MineTweaker3-MC17-Mod-NEI/build.gradle rename to MineTweaker3-MC172-Mod-NEI/build.gradle index 5738abb..32006a3 100644 --- a/MineTweaker3-MC17-Mod-NEI/build.gradle +++ b/MineTweaker3-MC172-Mod-NEI/build.gradle @@ -25,7 +25,7 @@ archivesBaseName = project.projectDir.name dependencies { compile project(':ZenScript') compile project(':MineTweaker3-API') - compile project(':MineTweaker3-MC17-Main') + compile project(':MineTweaker3-MC172-Main') compile files('libs/NotEnoughItems-1.7.2-1.0.1-dev.jar') } diff --git a/MineTweaker3-MC17-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-dev.jar b/MineTweaker3-MC172-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-dev.jar similarity index 100% rename from MineTweaker3-MC17-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-dev.jar rename to MineTweaker3-MC172-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-dev.jar diff --git a/MineTweaker3-MC17-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-src.jar b/MineTweaker3-MC172-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-src.jar similarity index 100% rename from MineTweaker3-MC17-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-src.jar rename to MineTweaker3-MC172-Mod-NEI/libs/NotEnoughItems-1.7.2-1.0.1-src.jar diff --git a/MineTweaker3-MC17-Mod-NEI/src/main/java/minetweaker/mods/nei/NEI.java b/MineTweaker3-MC172-Mod-NEI/src/main/java/minetweaker/mods/nei/NEI.java similarity index 100% rename from MineTweaker3-MC17-Mod-NEI/src/main/java/minetweaker/mods/nei/NEI.java rename to MineTweaker3-MC172-Mod-NEI/src/main/java/minetweaker/mods/nei/NEI.java diff --git a/build.gradle b/build.gradle index dd25456..2892c12 100644 --- a/build.gradle +++ b/build.gradle @@ -25,15 +25,28 @@ task wrapper(type: Wrapper, description: 'Creates and deploys the Gradle wrapper subprojects.each { subproject -> evaluationDependsOn( subproject.path ) } -task assembleMC17(type: Jar, dependsOn: [\ +task assembleMC172(type: Jar, dependsOn: [\ ':ZenScript:build', ':MineTweaker3-API:build', - ':MineTweaker3-MC17-Main:build', - ':MineTweaker3-MC17-Mod-IC2:build', - ':MineTweaker3-MC17-Mod-NEI:build']) { + ':MineTweaker3-MC172-Main:build', + ':MineTweaker3-MC172-Mod-IC2:build', + ':MineTweaker3-MC172-Mod-NEI:build']) { from zipTree(project(":ZenScript").jar.archivePath) from zipTree(project(':MineTweaker3-API').jar.archivePath) - from zipTree(project(':MineTweaker3-MC17-Main').jar.archivePath) - from zipTree(project(':MineTweaker3-MC17-Mod-IC2').jar.archivePath) - from zipTree(project(':MineTweaker3-MC17-Mod-NEI').jar.archivePath) + from zipTree(project(':MineTweaker3-MC172-Main').jar.archivePath) + from zipTree(project(':MineTweaker3-MC172-Mod-IC2').jar.archivePath) + from zipTree(project(':MineTweaker3-MC172-Mod-NEI').jar.archivePath) +} + +task assembleMC164(type: Jar, dependsOn: [\ + ':ZenScript:build', + ':MineTweaker3-API:build', + ':MineTweaker3-MC164-Main:build'/*, + ':MineTweaker3-MC164-Mod-IC2:build', + ':MineTweaker3-MC164-Mod-NEI:build'*/]) { + from zipTree(project(":ZenScript").jar.archivePath) + from zipTree(project(':MineTweaker3-API').jar.archivePath) + from zipTree(project(':MineTweaker3-MC164-Main').jar.archivePath) +/* from zipTree(project(':MineTweaker3-MC164-Mod-IC2').jar.archivePath) + from zipTree(project(':MineTweaker3-MC164-Mod-NEI').jar.archivePath)*/ }