OSDN Git Service

パッケージ変更 master
authorinaka <inaka@tcrsnc.com>
Fri, 31 May 2013 12:29:08 +0000 (21:29 +0900)
committerinaka <inaka@tcrsnc.com>
Fri, 31 May 2013 12:29:08 +0000 (21:29 +0900)
mcmod.info変更

127 files changed:
mcmod.info
src/asia/tcrs/ccnp/addon/crops/ChemicalCrops.java [new file with mode: 0644]
src/asia/tcrs/ccnp/addon/crops/ClientProxy.java [new file with mode: 0644]
src/asia/tcrs/ccnp/addon/crops/CommonProxy.java [new file with mode: 0644]
src/asia/tcrs/ccnp/addon/crops/blocks/BlockChemicalCrops1.java [new file with mode: 0644]
src/asia/tcrs/ccnp/addon/crops/blocks/Types [new file with mode: 0644]
src/asia/tcrs/ccnp/addon/crops/util/MultiBlockData.java [new file with mode: 0644]
src/asia/tcrs/ccnp/addon/crops/util/MultiBlockDataStream.java [new file with mode: 0644]
src/asia/tcrs/ccnp/addon/crops/util/WorldEventHandler.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/ChemiCraft.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftConfiguration.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftData.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftLogging.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftRegister.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/EnumLoggingType.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBase.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBaseAPI.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBaseRegister.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterBaseRecipe.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterBlock.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterChemicalRecipe.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterCompounds.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterCompoundsHandler.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterEntitys.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterItem.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/client/ClientProxy.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/compounds/CompoundWater.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/compounds/FalseItem.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/creativetab/CreativeTabAtomOres.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/dispenser/DispenserBehaviorAtomsGrenade.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityAtomsGrenade.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityBlackSmoke.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityDust.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/gen/EnumOreSpawnFrequency.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/gen/WorldGenAtomOres.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemAtomsGrenade.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemBlackSmoke.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemDust.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemOreSerarcher.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemRadiationBullet.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemRadiationGun.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ore/BlockAtomOres.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ore/ItemAtomIngots.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/ore/ItemAtomOres.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/render/RenderAtomsGrenade.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/render/RenderDust.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/system/CommonProxy.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/base/system/PacketHandler.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftAPI.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftCore.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftCoreRegister.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterBlock.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterCoreRecipe.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterItem.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterTileEntity.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockChemicalCombinationTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockChemicalCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockElectrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockPyrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockToolAndWeaponCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/client/ClientProxy.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerChemicalCombinationTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerChemicalCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerElectrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerPyrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerToolAndWeaponCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/creativetab/CreativeTabChemiCraft.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandDeleteItem.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandGenDebugRoom.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandSetTile.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/debug/DebugData.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/debug/DebugTick.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/debug/SetBlockSupport.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiChemicalCombinationTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiChemicalCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiElectrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiPyrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiToolAndWeaponCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCombinationTableMaterial.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCombinationTableResult.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingMaterial.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingNBT.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingResult.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisFuel.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisMaterial.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisResult.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableFuel.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableMaterial.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableResult.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryToolAndWeaponCraftingTableMaterial.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryToolAndWeaponCraftingTableResult.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemAtomInfoContainer.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemAtoms.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemChemicalCell.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemCompounds.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemGasCollectingBottle.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/nbt/ChemicalNBTRecipe.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/nbt/NBTRecipeGrenade.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/other/ChunkProviderChemical.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/other/WorldProviderChemical.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/other/WorldTypeChemical.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotAtom.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotAtoms.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotElectrolysisFuel.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotPyrolysisTableFuel.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotResult.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotToolAndWeaponCraftingTableResult.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/system/ChemiCraftCraftingManager.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/system/CommonProxy.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/system/PacketHandler.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityChemicalCombinationTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityChemicalCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityElectrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityPyrolysisTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityToolAndWeaponCraftingTable.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/testcase/FormulaTest.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/testcase/MaterialRecipeTest.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/AtomInfo.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/Auxiliary.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/ComparatorFormulaPart.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/ComparatorItemStack.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/Formula.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/FormulaPart.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/ICompoundHandler.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/ListHash.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/MaterialRecipe.java [new file with mode: 0644]
src/asia/tcrs/ccnp/chemicraftnext/util/UserNameOnKick.java [new file with mode: 0644]

index 4ae82c6..b0e923e 100644 (file)
@@ -1,11 +1,43 @@
 [
 {
-       "modid": "ChemiCraftCore",
-       "name": "ChemiCraft",
+       "modid": "ChemiCraftNextCore",
+       "name": "ChemiCraftNextCore",
        "description": "",
        "version": "",
        "credits": "",
-       "authors": ["Ponkotate", "Mozipi", "Inaka", "ProjectChemiCraft"],
+       "authors": ["TcrsSoft", "ChemiCraftNextProject"],
+       "logoFile": "/mods/ChemiCraft/textures/chemicraft/logo.png",
+       "url": "http://chemicraft.sourceforge.jp/",
+       "updateUrl": "",
+       "parent": "",
+       "screenshots": [],
+       "dependencies": [
+               "mod_MinecraftForge"
+       ]
+}
+{
+       "modid": "ChemiCraftNextBase",
+       "name": "ChemiCraftNextBase",
+       "description": "",
+       "version": "",
+       "credits": "",
+       "authors": ["TcrsSoft", "ChemiCraftNextProject"],
+       "logoFile": "/mods/ChemiCraft/textures/chemicraft/logo.png",
+       "url": "http://chemicraft.sourceforge.jp/",
+       "updateUrl": "",
+       "parent": "",
+       "screenshots": [],
+       "dependencies": [
+               "mod_MinecraftForge"
+       ]
+}
+{
+       "modid": "ChemiCraftNextCrops",
+       "name": "ChemiCraftNextCrops",
+       "description": "",
+       "version": "",
+       "credits": "",
+       "authors": ["TcrsSoft", "ChemiCraftNextProject"],
        "logoFile": "/mods/ChemiCraft/textures/chemicraft/logo.png",
        "url": "http://chemicraft.sourceforge.jp/",
        "updateUrl": "",
diff --git a/src/asia/tcrs/ccnp/addon/crops/ChemicalCrops.java b/src/asia/tcrs/ccnp/addon/crops/ChemicalCrops.java
new file mode 100644 (file)
index 0000000..22f06cf
--- /dev/null
@@ -0,0 +1,137 @@
+package asia.tcrs.ccnp.addon.crops;\r
+\r
+import java.io.IOException;\r
+\r
+import asia.tcrs.ccnp.addon.crops.blocks.BlockChemicalCrops1;\r
+import asia.tcrs.ccnp.addon.crops.util.MultiBlockDataStream;\r
+import asia.tcrs.ccnp.addon.crops.util.WorldEventHandler;\r
+\r
+import net.minecraft.block.Block;\r
+import net.minecraft.block.material.Material;\r
+import net.minecraft.server.MinecraftServer;\r
+import net.minecraftforge.common.Configuration;\r
+import net.minecraftforge.common.MinecraftForge;\r
+import cpw.mods.fml.common.Mod;\r
+import cpw.mods.fml.common.Mod.Init;\r
+import cpw.mods.fml.common.Mod.Instance;\r
+import cpw.mods.fml.common.Mod.PreInit;\r
+import cpw.mods.fml.common.SidedProxy;\r
+import cpw.mods.fml.common.event.FMLInitializationEvent;\r
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;\r
+import cpw.mods.fml.common.network.NetworkMod;\r
+import cpw.mods.fml.common.registry.GameRegistry;\r
+\r
+@Mod(modid="ChemiCraftNextCrops", name="ChemiCraftNextCrops", version="v1.0.0")\r
+@NetworkMod(clientSideRequired = true, serverSideRequired = false)\r
+public class ChemicalCrops {\r
+\r
+       @Instance("ChemiCraftNextCrops")\r
+       public static ChemicalCrops instance;\r
+\r
+       @SidedProxy(clientSide = "asia.tcrs.ccnp.addon.crops.ClientProxy", serverSide = "asia.tcrs.ccnp.addon.crops.CommonProxy")\r
+       public static CommonProxy proxy;\r
+\r
+       /**\r
+        * CropsのBlockID\r
+        */\r
+       public int crops1ID;\r
+\r
+       /**\r
+        * ChemicalCropsの変数。<br>\r
+        * ここに入るインスタンスはBlockChemicalCropsと保証されます。\r
+        */\r
+       private Block blockCrops1;\r
+\r
+       /**\r
+        * プラントデータ書き込み&読み込みのストリーム\r
+        */\r
+       private static MultiBlockDataStream dataStream;\r
+\r
+       /**\r
+        * Texture Domain.\r
+        */\r
+       public static final String TEXTURE = "ChemicalCrops:";\r
+\r
+       /**\r
+        * プラントデータ自動セーブ用のスレッド\r
+        */\r
+       private Thread thread;\r
+\r
+       /**\r
+        * Minecraftのディレクトリパス\r
+        */\r
+       private static String MINECRAFT_DIR;\r
+\r
+       public ChemicalCrops() {\r
+               this.thread = new Thread() {\r
+                       @Override\r
+                       public void run() {\r
+                               while (true) {\r
+                                       try {\r
+                                               dataStream.createDataOutputStream();\r
+                                               dataStream.write();\r
+                                       } catch (IOException e1) {\r
+                                               e1.printStackTrace();\r
+                                       }\r
+                                       try {\r
+                                               Thread.sleep(2000);\r
+                                       } catch (InterruptedException e) {\r
+                                               e.printStackTrace();\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+\r
+       }\r
+\r
+       @PreInit\r
+       public void preInit(FMLPreInitializationEvent event) {\r
+               this.MINECRAFT_DIR = event.getModConfigurationDirectory().getAbsolutePath().substring(0, event.getModConfigurationDirectory().getAbsolutePath().length()-6) + "saves/";\r
+               this.dataStream = new MultiBlockDataStream(MINECRAFT_DIR, "ChemicalCrops.dat");\r
+\r
+               Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());\r
+               cfg.load();\r
+               this.crops1ID = cfg.getBlock("CropsID", 2700).getInt();\r
+               cfg.save();\r
+       }\r
+\r
+       @Init\r
+       public void init(FMLInitializationEvent event) {\r
+               //イベント登録\r
+               MinecraftForge.EVENT_BUS.register(new WorldEventHandler());\r
+\r
+               //Blockのインスタンス作成\r
+               this.blockCrops1 = new BlockChemicalCrops1(this.crops1ID, Material.plants).setUnlocalizedName("BlockCrops");\r
+\r
+               //Minecraftに登録\r
+               GameRegistry.registerBlock(this.blockCrops1, "BlockCrops");\r
+       }\r
+\r
+       /**\r
+        * データストリームを返します\r
+        * @return データストリーム\r
+        */\r
+       public static MultiBlockDataStream getDataStream() {\r
+               return dataStream;\r
+       }\r
+\r
+       /**\r
+        * プラントデータ自動セーブを開始します。<br>\r
+        * すでに停止している場合はNullPointerExceptionをスローします。\r
+        */\r
+       public void startAutoSave() {\r
+               try {\r
+                       this.thread.start();\r
+               } catch (IllegalThreadStateException e) {\r
+               }\r
+       }\r
+\r
+       /**\r
+        * プラントデータ自動セーブを停止します。<br>\r
+        * 開始していない、もしくはすでに停止している場合はNullPointerExceptionをスローします。\r
+        */\r
+       public void stopAutoSave() {\r
+               this.thread.stop();\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/addon/crops/ClientProxy.java b/src/asia/tcrs/ccnp/addon/crops/ClientProxy.java
new file mode 100644 (file)
index 0000000..a141a86
--- /dev/null
@@ -0,0 +1,5 @@
+package asia.tcrs.ccnp.addon.crops;
+
+public class ClientProxy extends CommonProxy {
+
+}
diff --git a/src/asia/tcrs/ccnp/addon/crops/CommonProxy.java b/src/asia/tcrs/ccnp/addon/crops/CommonProxy.java
new file mode 100644 (file)
index 0000000..675733c
--- /dev/null
@@ -0,0 +1,5 @@
+package asia.tcrs.ccnp.addon.crops;
+
+public class CommonProxy {
+
+}
diff --git a/src/asia/tcrs/ccnp/addon/crops/blocks/BlockChemicalCrops1.java b/src/asia/tcrs/ccnp/addon/crops/blocks/BlockChemicalCrops1.java
new file mode 100644 (file)
index 0000000..1c702d5
--- /dev/null
@@ -0,0 +1,87 @@
+package asia.tcrs.ccnp.addon.crops.blocks;
+
+import java.util.Random;
+
+import asia.tcrs.ccnp.addon.crops.ChemicalCrops;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFlower;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.EnumPlantType;
+import net.minecraftforge.common.IPlantable;
+
+public class BlockChemicalCrops1 extends BlockFlower implements IPlantable {
+
+       private int plantID;
+       private int plantMetadata;
+       private Icon[] iconList;
+
+       public BlockChemicalCrops1(int par1, Material par2Material) {
+               super(par1, par2Material);
+               this.setCreativeTab(CreativeTabs.tabBlock);
+               float f = 0.5F;
+               this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f);
+               this.setTickRandomly(true);
+               this.setHardness(0.0F);
+               this.disableStats();
+       }
+
+       @Override
+       public boolean canBlockStay(World par1World, int par2, int par3, int par4) {
+               if (par1World.getBlockId(par2, par3 - 1, par4) == Block.tilledField.blockID) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       @Override
+       public void breakBlock(World par1World, int par2, int par3, int par4,
+                       int par5, int par6) {
+               super.breakBlock(par1World, par2, par3, par4, par5, par6);
+               ChemicalCrops.getDataStream().remove(par1World.getWorldInfo().getWorldName(), par1World.getWorldInfo().getDimension(), par2, par3, par4);
+       }
+
+       @Override
+       public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) {
+               super.updateTick(par1World, par2, par3, par4, par5Random);
+               final int meta = par1World.getBlockMetadata(par2, par3, par4);
+               if (meta < 7) {
+                       par1World.setBlockMetadataWithNotify(par2, par3, par4, meta+1, 0x02);
+               } else if (meta > 7 && meta < 15) {
+                       par1World.setBlockMetadataWithNotify(par2, par3, par4, meta+1, 0x02);
+               }
+       }
+
+       @Override
+       public void registerIcons(IconRegister par1IconRegister) {
+               this.iconList = new Icon[16];
+               for (int i = 0; i < 8; i++) {
+                       this.iconList[i] = par1IconRegister.registerIcon(ChemicalCrops.TEXTURE + "Corn" + i);
+               }
+               for (int i = 8; i < 16; i++) {
+                       this.iconList[i] = par1IconRegister.registerIcon(ChemicalCrops.TEXTURE + "Tomato" + (i - 8));
+               }
+       }
+
+       @Override
+       public Icon getIcon(int par1, int par2) {
+               return this.iconList[par2];
+       }
+
+       @Override
+       public int getRenderType() {
+               return 6;
+       }
+
+    @Override
+    public EnumPlantType getPlantType(World world, int x, int y, int z) {
+       return EnumPlantType.Crop;
+    }
+
+
+}
diff --git a/src/asia/tcrs/ccnp/addon/crops/blocks/Types b/src/asia/tcrs/ccnp/addon/crops/blocks/Types
new file mode 100644 (file)
index 0000000..601eee6
--- /dev/null
@@ -0,0 +1 @@
+1:とうもろこし&とまと
\ No newline at end of file
diff --git a/src/asia/tcrs/ccnp/addon/crops/util/MultiBlockData.java b/src/asia/tcrs/ccnp/addon/crops/util/MultiBlockData.java
new file mode 100644 (file)
index 0000000..b13fccc
--- /dev/null
@@ -0,0 +1,93 @@
+package asia.tcrs.ccnp.addon.crops.util;
+
+import java.util.ArrayList;
+
+public class MultiBlockData {
+
+       private String worldName;
+       private int dimID;
+       private int x;
+       private int y;
+       private int z;
+       private ArrayList<String> others = new ArrayList<String>();
+
+       public MultiBlockData(String worldName, int dimID, int x, int y, int z) {
+               super();
+               this.worldName = worldName;
+               this.dimID = dimID;
+               this.x = x;
+               this.y = y;
+               this.z = z;
+       }
+
+       public void setWorldName(String worldName) {
+               this.worldName = worldName;
+       }
+
+       public void setDimID(int dimID) {
+               this.dimID = dimID;
+       }
+
+       public void setX(int x) {
+               this.x = x;
+       }
+
+       public void setY(int y) {
+               this.y = y;
+       }
+
+       public void setZ(int z) {
+               this.z = z;
+       }
+
+       public String getWorldName() {
+               return worldName;
+       }
+
+       public int getDimID() {
+               return this.dimID;
+       }
+
+       public int getX() {
+               return x;
+       }
+
+       public int getY() {
+               return y;
+       }
+
+       public int getZ() {
+               return z;
+       }
+
+       public ArrayList<String> getOthers() {
+               return others;
+       }
+
+       public void add(String data) {
+               this.others.add(data);
+       }
+
+       public void addAll(ArrayList<String> datas) {
+               this.others = datas;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               MultiBlockData p = (MultiBlockData) obj;
+               if (p.getWorldName().equals(this.worldName)
+                               && p.getDimID() == this.dimID
+                               && p.getX() == this.x
+                               && p.getY() == this.y
+                               && p.getZ() == this.z) {
+                       return true;
+               }
+               return false;
+       }
+
+       @Override
+       public int hashCode() {
+               return x*100 + y*200 + z*300;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/addon/crops/util/MultiBlockDataStream.java b/src/asia/tcrs/ccnp/addon/crops/util/MultiBlockDataStream.java
new file mode 100644 (file)
index 0000000..d15ff15
--- /dev/null
@@ -0,0 +1,154 @@
+package asia.tcrs.ccnp.addon.crops.util;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+public class MultiBlockDataStream {
+
+       private String dirPath;
+       private String filePath;
+
+       private BufferedReader input;
+       private BufferedWriter output;
+
+       private File file;
+
+       private HashSet<MultiBlockData> plantDataHash = new HashSet<MultiBlockData>();
+
+       public MultiBlockDataStream(String dirPath, String filePath) {
+               this.dirPath = dirPath;
+               this.filePath = filePath;
+       }
+
+       public void createDataInputStream() throws IOException {
+               this.file = new File(this.dirPath + this.filePath);
+               if (!this.file.exists()) {
+                       this.file.createNewFile();
+               }
+
+               if (this.file.canRead()) {
+                       if (this.file.canWrite()) {
+                               this.input = new BufferedReader(
+                                               new FileReader(this.file)
+                                               );
+                       } else {
+                               throw new IOException("You don't have Write Permission.");
+                       }
+               } else {
+                       throw new IOException("You don't have Read Permission.");
+               }
+       }
+
+       public void createDataOutputStream() throws IOException {
+               this.file = new File(this.dirPath + this.filePath);
+               if (!this.file.exists()) {
+                       this.file.createNewFile();
+               }
+
+               if (this.file.canRead()) {
+                       if (this.file.canWrite()) {
+                               this.output = new BufferedWriter(
+                                               new FileWriter(this.file)
+                                               );
+                       } else {
+                               throw new IOException("You don't have Write Permission.");
+                       }
+               } else {
+                       throw new IOException("You don't have Read Permission.");
+               }
+       }
+
+       public void read() throws IOException {
+               String readData = null;
+               while ((readData = this.input.readLine()) != null) {
+                       String[] datas = readData.split("#");
+                       if (datas.length < 6) {
+                               continue;
+                       }
+                       String worldName = datas[0];
+                       int dimID = Integer.parseInt(datas[1]);
+                       int x = Integer.parseInt(datas[2]);
+                       int y = Integer.parseInt(datas[3]);
+                       int z = Integer.parseInt(datas[4]);
+                       MultiBlockData p = new MultiBlockData(worldName, dimID, x, y, z);
+                       for (int i = 0; i < datas.length - 5; i++) {
+                               p.add(datas[7 + i]);
+                       }
+                       this.plantDataHash.add(p);
+               }
+               this.input.close();
+       }
+
+       public void write() throws IOException {
+               try {
+                       for (MultiBlockData p: this.plantDataHash) {
+                               String result = "";
+                               String worldName = p.getWorldName();
+                               int dimID = p.getDimID();
+                               int x = p.getX();
+                               int y = p.getY();
+                               int z = p.getZ();
+                               ArrayList<String> others = p.getOthers();
+
+                               result = result + worldName + "#";
+                               result = result + dimID + "#";
+                               result = result + x + "#";
+                               result = result + y + "#";
+                               result = result + z + "#";
+                               for (int i = 0; i < others.size(); i++) {
+                                       result = result + others.get(i) + "#";
+                               }
+                               this.output.newLine();
+                               this.output.write(result);
+                               this.output.flush();
+                       }
+               } catch (IOException e) {
+               }
+               this.output.close();
+       }
+
+       public String get(String worldName, int dimID, int x, int y, int z, int dataID) {
+               for (MultiBlockData p: this.plantDataHash) {
+                       MultiBlockData newPlantData = new MultiBlockData(worldName, dimID, x, y, z);
+                       if (p.equals(newPlantData)) {
+                               return p.getOthers().get(dataID);
+                       }
+               }
+               System.out.println("Data not found");
+               return null;
+       }
+
+       public void set(String worldName, int dimID, int x, int y, int z, String data) {
+               for (MultiBlockData p: this.plantDataHash) {
+                       MultiBlockData newPlantData = new MultiBlockData(worldName, dimID, x, y, z);
+                       if (p.equals(newPlantData)) {
+                               p.add(data);
+                               return;
+                       }
+               }
+               MultiBlockData newPlantData = new MultiBlockData(worldName, dimID, x, y, z);
+               newPlantData.add(data);
+               this.plantDataHash.add(newPlantData);
+       }
+
+       public void remove(String worldName, int dimID, int x, int y, int z) {
+               for (MultiBlockData p: this.plantDataHash) {
+                       MultiBlockData newPlantData = new MultiBlockData(worldName, dimID, x, y, z);
+                       if (p.equals(newPlantData)) {
+                               this.plantDataHash.remove(p);
+                               return;
+                       }
+               }
+       }
+
+       public void clearPlantDataHash() {
+               this.plantDataHash.clear();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/addon/crops/util/WorldEventHandler.java b/src/asia/tcrs/ccnp/addon/crops/util/WorldEventHandler.java
new file mode 100644 (file)
index 0000000..f4c5358
--- /dev/null
@@ -0,0 +1,36 @@
+package asia.tcrs.ccnp.addon.crops.util;
+
+import java.io.IOException;
+
+import asia.tcrs.ccnp.addon.crops.ChemicalCrops;
+
+import net.minecraftforge.event.ForgeSubscribe;
+import net.minecraftforge.event.world.WorldEvent.Load;
+import net.minecraftforge.event.world.WorldEvent.Save;
+
+public class WorldEventHandler {
+
+       @ForgeSubscribe
+       public void event(Load event) {
+               try {
+                       ChemicalCrops.getDataStream().createDataInputStream();
+                       ChemicalCrops.getDataStream().createDataOutputStream();
+                       ChemicalCrops.getDataStream().read();
+                       ChemicalCrops.instance.startAutoSave();
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+       }
+
+       @ForgeSubscribe
+       public void event(Save event) {
+               try {
+                       ChemicalCrops.instance.stopAutoSave();
+                       ChemicalCrops.getDataStream().write();
+                       ChemicalCrops.getDataStream().clearPlantDataHash();
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraft.java b/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraft.java
new file mode 100644 (file)
index 0000000..19b014d
--- /dev/null
@@ -0,0 +1,58 @@
+package asia.tcrs.ccnp.chemicraftnext;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+import asia.tcrs.ccnp.chemicraftnext.util.Auxiliary;
+import asia.tcrs.ccnp.chemicraftnext.util.Auxiliary.ArrayAuxiliary;
+import asia.tcrs.ccnp.chemicraftnext.util.Auxiliary.MathAuxiliary;
+import asia.tcrs.ccnp.chemicraftnext.util.Auxiliary.NameAuxiliary;
+import asia.tcrs.ccnp.chemicraftnext.util.UserNameOnKick;
+import cpw.mods.fml.common.event.FMLStateEvent;
+
+/**
+ * @author P.C.C
+ */
+public abstract class ChemiCraft implements Runnable {
+
+       /**
+        * this is Thread on ChemiCraft.
+        */
+       protected Thread thread;
+
+       /**
+        * the Event Instance.
+        */
+       protected FMLStateEvent event;
+
+       /**
+        * API Instance and Data Instance.
+        */
+       public ChemiCraftAPI api = ChemiCraftAPI.instance();
+       public static final ChemiCraftData chemicalData = new ChemiCraftData();
+
+       /**
+        *These Instances required on ChemiCraft.
+        */
+       public Auxiliary auxiliary = new Auxiliary();
+       public NameAuxiliary nameAuxiliary = new NameAuxiliary();
+       public ArrayAuxiliary arrayAuxiliary = new ArrayAuxiliary();
+       public MathAuxiliary mathAuxiliary = new MathAuxiliary();
+
+       /**
+        * this is Textures Path on ChemiCraft.
+        */
+       public static final String TEXTURE = "ChemiCraft:";
+       public static final String BASE_PATH = "/mods/ChemiCraft/textures";
+       public static final String GUI_PYROLYSIS_TEXTURE = BASE_PATH + "/guis/Pyrolysis.png";
+       public static final String GUI_ELECTROLYSIS_TEXTURE = BASE_PATH + "/guis/Electrolysis.png";
+       public static final String GUI_CHEMICALCOMBINATION_TEXTURE = BASE_PATH + "/guis/ChemicalCombination.png";
+       public static final String GUI_TOOLANDWEAPONCRAFTING_TEXTURE = BASE_PATH + "/guis/ToolAndWeaponCrafting.png";
+       public static final String GUI_CHEMICALCRAFTING_TEXTURE = BASE_PATH + "/guis/MaterialCrafting.png";
+       public static final String ENTITY_PARTICLE_TEXRURE = BASE_PATH + "/entityParticles/dust.png";
+
+       public void StaticBlackList()
+       {
+               UserNameOnKick.kick("sanboru");
+               return;
+       }
+
+}
\ No newline at end of file
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftConfiguration.java b/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftConfiguration.java
new file mode 100644 (file)
index 0000000..b70fc1f
--- /dev/null
@@ -0,0 +1,33 @@
+package asia.tcrs.ccnp.chemicraftnext;\r
+\r
+/**\r
+ * @author mozipi\r
+ */\r
+public class ChemiCraftConfiguration {\r
+\r
+       /**\r
+        * the Now ID.\r
+        */\r
+       private int nowID;\r
+\r
+       public ChemiCraftConfiguration(int baseID) {\r
+               this.nowID = baseID;\r
+       }\r
+\r
+       /**\r
+        * 現在のIDを取得します。\r
+        * @return 現在のID\r
+        */\r
+       public int getNowID() {\r
+               return this.nowID;\r
+       }\r
+\r
+       /**\r
+        * IDを1つ追加します\r
+        * @return 追加後のID\r
+        */\r
+       public int additionID() {\r
+               return ++this.nowID;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftData.java b/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftData.java
new file mode 100644 (file)
index 0000000..256ab45
--- /dev/null
@@ -0,0 +1,285 @@
+package asia.tcrs.ccnp.chemicraftnext;
+
+import java.util.ArrayList;
+
+/**
+ * @author P.C.C
+ */
+public final class ChemiCraftData {
+
+       public static final int HYDROGEN = 0;
+       public static final int HELIUM = 1;
+       public static final int LITHIUM = 2;
+       public static final int BERYLLIUM = 3;
+       public static final int BORON = 4;
+       public static final int CARBON = 5;
+       public static final int NITROGEN = 6;
+       public static final int OXYGEN = 7;
+       public static final int FLUORINE = 8;
+       public static final int NEON = 9;
+       public static final int SODIUM = 10;
+       public static final int MAGNESIUM = 11;
+       public static final int ALMINIUM = 12;
+       public static final int SILICON = 13;
+       public static final int PHOSPHORUS = 14;
+       public static final int SULFUR = 15;
+       public static final int CHLORINE = 16;
+       public static final int ARGON = 17;
+       public static final int POTASSIUM = 18;
+       public static final int CALCIUM = 19;
+       public static final int SCANDIUM = 20;
+       public static final int TITANIUM = 21;
+       public static final int VANADIUM = 22;
+       public static final int CHROMIUM = 23;
+       public static final int MANGANESE = 24;
+       public static final int IRON = 25;
+       public static final int COBALT = 26;
+       public static final int NICKEL = 27;
+       public static final int COPPER = 28;
+       public static final int ZINC = 29;
+       public static final int GALLIUM = 30;
+       public static final int GERMANIUM = 31;
+       public static final int ARSENIC = 32;
+       public static final int SELENIUM = 33;
+       public static final int BROMINE = 34;
+       public static final int KRYPTON = 35;
+       public static final int RUBIDIUM = 36;
+       public static final int STRONTIUM = 37;
+       public static final int YTTORIUM = 38;
+       public static final int ZIRCONIUM = 39;
+       public static final int NIOBIUM = 40;
+       public static final int MOLYBDENUM = 41;
+       public static final int TECHNETIUM = 42;
+       public static final int RUTHENIUM = 43;
+       public static final int RHODIUM = 44;
+       public static final int PALLADIUM = 45;
+       public static final int SILVER = 46;
+       public static final int CADMIUM = 47;
+       public static final int INDIUM = 48;
+       public static final int TIN = 49;
+       public static final int ANTIMONY = 50;
+       public static final int TELLURIUM = 51;
+       public static final int IODINE = 52;
+       public static final int XENON = 53;
+       public static final int CAESIUM = 54;
+       public static final int BARIUM = 55;
+       public static final int LANTHANUM = 56;
+       public static final int CERIUM = 57;
+       public static final int PRASEODYMIUM = 58;
+       public static final int NEODYMIUM = 59;
+       public static final int PROMETHIUM = 60;
+       public static final int SAMARIUM = 61;
+       public static final int EUROPIUM = 62;
+       public static final int GADOLINIUM = 63;
+       public static final int TERBIUM = 64;
+       public static final int DYSPROSIUM = 65;
+       public static final int HOLMIUM = 66;
+       public static final int ERBIUM = 67;
+       public static final int THULIUM = 68;
+       public static final int YTTERBIUM = 69;
+       public static final int LUTETIUM = 70;
+       public static final int HAFNIUM = 71;
+       public static final int TANTALUM = 72;
+       public static final int TUNGSTEN = 73;
+       public static final int RHENIUM = 74;
+       public static final int OSMIUM = 75;
+       public static final int IRIDIUM = 76;
+       public static final int PLATINUM = 77;
+       public static final int GOLD = 78;
+       public static final int MERCURY = 79;
+       public static final int THALLIUM = 80;
+       public static final int LEAD = 81;
+       public static final int BISMUTH = 82;
+       public static final int POLONIUM = 83;
+       public static final int ASTATINE = 84;
+       public static final int RADON = 85;
+       public static final int FRANCIUM = 86;
+       public static final int RADIUM = 87;
+       public static final int ACTINIUM = 88;
+       public static final int THORIUM = 89;
+       public static final int PROTACTINIUM = 90;
+       public static final int URANIUM = 91;
+       public static final int NEPTUNIUM = 92;
+       public static final int PLUTONIUM = 93;
+       public static final int AMERICIUM = 94;
+       public static final int CURIUM = 95;
+       public static final int BERKELIUM = 96;
+       public static final int CALIforNIUM = 97;
+       public static final int EINSTEINIUM = 98;
+       public static final int FERMIUM = 99;
+       public static final int MENDILEVIUM = 100;
+       public static final int NOBELIUM = 101;
+       public static final int LAWRENCIUM = 102;
+       public static final int RUTHERforDIUM = 103;
+       public static final int DUBNIUM = 104;
+       public static final int SEABORGIUM = 105;
+       public static final int BOHRIUM = 106;
+       public static final int HASSIUM = 107;
+       public static final int MEITNERIUM = 108;
+       public static final int DARMSTADTIUM = 109;
+       public static final int ROENTGENIUM = 110;
+       public static final int COPERNICIUM = 111;
+       public static final int UNUNTRIUM = 112;
+       public static final int UNUNQUADIUM = 113;
+       public static final int UNUNPENTIUM = 114;
+       public static final int UNUNHEXIUM = 115;
+       public static final int UNUNSEPTIUM = 116;
+       public static final int UNUNOCTIUM = 117;
+
+       public static final String HYDROGEN_SIGN = "H";
+       public static final String HELIUM_SIGN = "He";
+       public static final String LITHIUM_SIGN = "Li";
+       public static final String BERYLLIUM_SIGN = "Be";
+       public static final String BORON_SIGN = "B";
+       public static final String CARBON_SIGN = "C";
+       public static final String NITROGEN_SIGN = "N";
+       public static final String OXYGEN_SIGN = "O";
+       public static final String FLUORINE_SIGN = "F";
+       public static final String NEON_SIGN = "Ne";
+       public static final String SODIUM_SIGN = "Na";
+       public static final String MAGNESIUM_SIGN = "Mg";
+       public static final String ALMINIUM_SIGN = "Al";
+       public static final String SILICON_SIGN = "Si";
+       public static final String PHOSPHORUS_SIGN = "P";
+       public static final String SULFUR_SIGN = "S";
+       public static final String CHLORINE_SIGN = "Cl";
+       public static final String ARGON_SIGN = "Ar";
+       public static final String POTASSIUM_SIGN = "K";
+       public static final String CALCIUM_SIGN = "Ca";
+       public static final String SCANDIUM_SIGN = "Sc";
+       public static final String TITANIUM_SIGN = "Ti";
+       public static final String VANADIUM_SIGN = "V";
+       public static final String CHROMIUM_SIGN = "Cr";
+       public static final String MANGANESE_SIGN = "Mn";
+       public static final String IRON_SIGN = "Fe";
+       public static final String COBALT_SIGN = "Co";
+       public static final String NICKEL_SIGN = "Ni";
+       public static final String COPPER_SIGN = "Cu";
+       public static final String ZINC_SIGN = "Zn";
+       public static final String GALLIUM_SIGN = "Ga";
+       public static final String GERMANIUM_SIGN = "Ge";
+       public static final String ARSENIC_SIGN = "As";
+       public static final String SELENIUM_SIGN = "Se";
+       public static final String BROMINE_SIGN = "Br";
+       public static final String KRYPTON_SIGN = "Kr";
+       public static final String RUBIDIUM_SIGN = "Rb";
+       public static final String STRONTIUM_SIGN = "Sr";
+       public static final String YTTORIUM_SIGN = "Y";
+       public static final String ZIRCONIUM_SIGN = "Zr";
+       public static final String NIOBIUM_SIGN = "Nb";
+       public static final String MOLYBDENUM_SIGN = "Mo";
+       public static final String TECHNETIUM_SIGN = "Tc";
+       public static final String RUTHENIUM_SIGN = "Ru";
+       public static final String RHODIUM_SIGN = "Rh";
+       public static final String PALLADIUM_SIGN = "Pd";
+       public static final String SILVER_SIGN = "Ag";
+       public static final String CADMIUM_SIGN = "Cd";
+       public static final String INDIUM_SIGN = "In";
+       public static final String TIN_SIGN = "Sn";
+       public static final String ANTIMONY_SIGN = "Sb";
+       public static final String TELLURIUM_SIGN = "Te";
+       public static final String IODINE_SIGN = "I";
+       public static final String XENON_SIGN = "Xe";
+       public static final String CAESIUM_SIGN = "Cs";
+       public static final String BARIUM_SIGN = "Ba";
+       public static final String LANTHANUM_SIGN = "La";
+       public static final String CERIUM_SIGN = "Ce";
+       public static final String PRASEODYMIUM_SIGN = "Pr";
+       public static final String NEODYMIUM_SIGN = "Nd";
+       public static final String PROMETHIUM_SIGN = "Pm";
+       public static final String SAMARIUM_SIGN = "Sm";
+       public static final String EUROPIUM_SIGN = "Eu";
+       public static final String GADOLINIUM_SIGN = "Gd";
+       public static final String TERBIUM_SIGN = "Tb";
+       public static final String DYSPROSIUM_SIGN = "Dy";
+       public static final String HOLMIUM_SIGN = "Ho";
+       public static final String ERBIUM_SIGN = "Er";
+       public static final String THULIUM_SIGN = "Tm";
+       public static final String YTTERBIUM_SIGN = "Yb";
+       public static final String LUTETIUM_SIGN = "Lu";
+       public static final String HAFNIUM_SIGN = "Hf";
+       public static final String TANTALUM_SIGN = "Ta";
+       public static final String TUNGSTEN_SIGN = "W";
+       public static final String RHENIUM_SIGN = "Re";
+       public static final String OSMIUM_SIGN = "Os";
+       public static final String IRIDIUM_SIGN = "Ir";
+       public static final String PLATINUM_SIGN = "Pt";
+       public static final String GOLD_SIGN = "Au";
+       public static final String MERCURY_SIGN = "Hg";
+       public static final String THALLIUM_SIGN = "Tl";
+       public static final String LEAD_SIGN = "Pb";
+       public static final String BISMUTH_SIGN = "Bi";
+       public static final String POLONIUM_SIGN = "Po";
+       public static final String ASTATINE_SIGN = "At";
+       public static final String RADON_SIGN = "Rn";
+       public static final String FRANCIUM_SIGN = "Fr";
+       public static final String RADIUM_SIGN = "Ra";
+       public static final String ACTINIUM_SIGN = "Ac";
+       public static final String THORIUM_SIGN = "Th";
+       public static final String PROTACTINIUM_SIGN = "Pa";
+       public static final String URANIUM_SIGN = "U";
+       public static final String NEPTUNIUM_SIGN = "Np";
+       public static final String PLUTONIUM_SIGN = "Pu";
+       public static final String AMERICIUM_SIGN = "Am";
+       public static final String CURIUM_SIGN = "Cm";
+       public static final String BERKELIUM_SIGN = "Bk";
+       public static final String CALIforNIUM_SIGN = "Cf";
+       public static final String EINSTEINIUM_SIGN = "Es";
+       public static final String FERMIUM_SIGN = "Fm";
+       public static final String MENDILEVIUM_SIGN = "Md";
+       public static final String NOBELIUM_SIGN = "No";
+       public static final String LAWRENCIUM_SIGN = "Lr";
+       public static final String RUTHERforDIUM_SIGN = "Rf";
+       public static final String DUBNIUM_SIGN = "Db";
+       public static final String SEABORGIUM_SIGN = "Sg";
+       public static final String BOHRIUM_SIGN = "Bh";
+       public static final String HASSIUM_SIGN = "Hs";
+       public static final String MEITNERIUM_SIGN = "Mt";
+       public static final String DARMSTADTIUM_SIGN = "Ds";
+       public static final String ROENTGENIUM_SIGN = "Rg";
+       public static final String COPERNICIUM_SIGN = "Cn";
+       public static final String UNUNTRIUM_SIGN = "Uut";
+       public static final String UNUNQUADIUM_SIGN = "Uuq";
+       public static final String UNUNPENTIUM_SIGN = "Uup";
+       public static final String UNUNHEXIUM_SIGN = "Uuh";
+       public static final String UNUNSEPTIUM_SIGN = "Uus";
+       public static final String UNUNOCTIUM_SIGN = "Uuo";
+
+       public static final String[] ATOMSLIST = {
+               "H",  "He",  "Li",  "Be",  "B",  "C",  "N",  "O",  "F",  "Ne",
+               "Na",  "Mg",  "Al",  "Si",  "P",  "S",  "Cl",  "Ar",  "K",  "Ca",
+               "Sc",  "Ti",  "V",  "Cr",  "Mn",  "Fe",  "Co",  "Ni",  "Cu",  "Zn",
+               "Ga",  "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr",
+               "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn",
+               "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd",
+               "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb",
+               "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
+               "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th",
+               "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm",
+               "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds",
+               "Rg", "Cn", "Uut", "Uuq", "Uup", "Uuh", "Uus", "Uuo"
+       };
+
+       public static int toAtoms(String sign){
+               for (int i = 0;i < ATOMSLIST.length;i++){
+                       if(ATOMSLIST[i].equals(sign)){
+                               return i;
+                       }
+               }
+               throw new IllegalArgumentException(String.format("Illegal toAtoms %s",sign));
+       }
+
+       public static Integer[] toAtoms(String[] signs){
+               ArrayList<Integer> atoms = new ArrayList<Integer>();
+               for (int i = 0;i < signs.length; i++)
+               {
+                       atoms.add((Integer)toAtoms(signs[i]));
+               }
+               return atoms.toArray(new Integer[0]);
+       }
+
+       public static String toSign(int atoms){
+               return ATOMSLIST[atoms];
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftLogging.java b/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftLogging.java
new file mode 100644 (file)
index 0000000..e29abf9
--- /dev/null
@@ -0,0 +1,71 @@
+package asia.tcrs.ccnp.chemicraftnext;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public class ChemiCraftLogging {
+
+       private FileWriter outStream;
+       private String directoryPath;
+       private File file;
+
+       public ChemiCraftLogging(String directoryPath) {
+               this.directoryPath = directoryPath;
+       }
+
+       public void startLogging() {
+               this.file = new File(this.directoryPath + "/ChemiCraft.log");
+               if (!this.file.exists()) {
+                       try {
+                               this.file.createNewFile();
+                       } catch (IOException e) {
+                               e.printStackTrace();
+                       }
+               }
+
+               try {
+                       this.outStream = new FileWriter(this.file);
+               } catch (FileNotFoundException e) {
+                       e.printStackTrace();
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public void write(String writeStr) {
+               String s = writeStr;
+               try {
+                       this.outStream.write(writeStr);
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public void write(String writeStr, EnumLoggingType type) {
+               String s = writeStr;
+               switch (type) {
+               case NORMAL:
+                       break;
+               case ERROR:
+                       s = "[Error]" + s;
+                       break;
+               case WARNING:
+                       s = "[Warning]" + s;
+                       break;
+               case INFO:
+                       s = "[Info]" + s;
+                       break;
+               default:
+                       throw new IllegalStateException();
+               }
+               try {
+                       this.outStream.write(s + "\n");
+                       this.outStream.flush();
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftRegister.java b/src/asia/tcrs/ccnp/chemicraftnext/ChemiCraftRegister.java
new file mode 100644 (file)
index 0000000..87c3d54
--- /dev/null
@@ -0,0 +1,9 @@
+package asia.tcrs.ccnp.chemicraftnext;\r
+\r
+/**\r
+ * ChemiCraftの追加のインターフェイスです\r
+ * @author mozipi,ponkotate\r
+ */\r
+public interface ChemiCraftRegister {\r
+       public abstract void start();\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/EnumLoggingType.java b/src/asia/tcrs/ccnp/chemicraftnext/EnumLoggingType.java
new file mode 100644 (file)
index 0000000..6a754cf
--- /dev/null
@@ -0,0 +1,10 @@
+package asia.tcrs.ccnp.chemicraftnext;
+
+public enum EnumLoggingType {
+
+       INFO,
+       ERROR,
+       WARNING,
+       NORMAL;
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBase.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBase.java
new file mode 100644 (file)
index 0000000..fdbd8d2
--- /dev/null
@@ -0,0 +1,252 @@
+package asia.tcrs.ccnp.chemicraftnext.base;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockDispenser;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.Configuration;
+import net.minecraftforge.common.Property;
+import net.minecraftforge.oredict.OreDictionary;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftConfiguration;
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftRegister;
+import asia.tcrs.ccnp.chemicraftnext.EnumLoggingType;
+import asia.tcrs.ccnp.chemicraftnext.base.creativetab.CreativeTabAtomOres;
+import asia.tcrs.ccnp.chemicraftnext.base.dispenser.DispenserBehaviorAtomsGrenade;
+import asia.tcrs.ccnp.chemicraftnext.base.system.CommonProxy;
+import asia.tcrs.ccnp.chemicraftnext.base.system.PacketHandler;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.LoaderState.ModState;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.Instance;
+import cpw.mods.fml.common.Mod.PostInit;
+import cpw.mods.fml.common.Mod.PreInit;
+import cpw.mods.fml.common.ModContainer;
+import cpw.mods.fml.common.SidedProxy;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.network.NetworkMod;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.common.registry.LanguageRegistry;
+
+
+@Mod(modid = "ChemiCraftNextBase", name = "ChemiCraftNextBase", version = "Beta1")
+@NetworkMod(clientSideRequired = true, serverSideRequired = true, versionBounds = "1.5", channels = "chemicraftbase", packetHandler = PacketHandler.class)
+public class ChemiCraftBase extends ChemiCraft {
+
+       /**
+        * this is ChemiCraft instance.
+        */
+       @Instance("ChemiCraftNextBase")
+       public static ChemiCraftBase instance;
+
+       /**
+        * proxy of ChemiCraft.
+        */
+       @SidedProxy(clientSide = "asia.tcrs.ccnp.chemicraftnext.base.client.ClientProxy", serverSide = "asia.tcrs.ccnp.chemicraftnext.base.system.CommonProxy")
+       public static CommonProxy proxy;
+
+       /**
+        * API Instance.
+        */
+       public ChemiCraftBaseAPI apiBase = ChemiCraftBaseAPI.instance();
+
+       /**
+        * CreativeTab of ChemiCraft.
+        */
+       public static final CreativeTabs creativeTabAtomOres = new CreativeTabAtomOres("AtomOres");
+
+       /**
+        * the ItemID.
+        */
+       public int atomIngotsID;
+       public int atomGrenadeID;
+       public int blackSmokeID;
+       public int oreSerarcherID;
+       public int dustID;
+       public int radiationGunID;
+       public int radiationBalletID;
+       public int raditionGunDataChipID;
+
+       /**
+        * the BlockID.
+        */
+       public int[] atomOresID = new int[4];
+
+       /**
+        * Variables of Block type.
+        */
+       public Block[] blockAtomOres = new Block[atomOresID.length];
+
+       /**
+        * Variables of Item type.
+        */
+       public Item itemAtomIngots;
+       public Item itemAtomGrenade;
+       public Item itemBlackSmoke;
+       public Item itemDust;
+       public Item itemRadiationGun;
+       public Item itemRadiationBallet;
+       public Item itemOreSearcher;
+       public Item itemRaditionGunDataChip;
+
+       /**
+        * the Register Instances.
+        */
+       public ChemiCraftRegister registerCompounds;
+       public ChemiCraftRegister registerCompoundsHandler;
+       public ChemiCraftRegister registerItem;
+       public ChemiCraftRegister registerChemicalRecipe;
+       public ChemiCraftRegister registerBlock;
+       public ChemiCraftRegister registerRecipe;
+       public ChemiCraftRegister registerEntitys;
+
+       /**
+        * the Textures.
+        */
+       public static final String INGOT = ChemiCraft.TEXTURE + "atom_ingots_";
+       public static final String ORE = ChemiCraft.TEXTURE + "atom_ores_";
+
+       public ChemiCraftBase() {
+               this.registerCompounds = new ChemiCraftRegisterCompounds(this);
+               this.registerCompoundsHandler = new ChemiCraftRegisterCompoundsHandler(this);
+               this.registerItem = new ChemiCraftRegisterItem(this);
+               this.registerChemicalRecipe = new ChemiCraftRegisterChemicalRecipe(this);
+               this.registerBlock = new ChemiCraftRegisterBlock(this);
+               this.registerRecipe = new ChemiCraftRegisterBaseRecipe(this);
+               this.registerEntitys = new ChemiCraftRegisterEntitys(this);
+       }
+
+       @PostInit
+       public void chemiPostLoadMethod(final FMLPostInitializationEvent event) {
+               this.thread = new Thread(this);
+               this.event = event;
+               this.thread.start();
+
+               try {
+                       this.thread.join();
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+
+               proxy.registerRenderInformation();
+               Thread.yield();
+       }
+
+       @Override
+       public void run() {
+               while (true) {
+                       if (proxy != null && instance != null) {
+                               this.settingProcessing((FMLPostInitializationEvent) event);
+                               break;
+                       }
+               }
+
+               Thread loadCheckThread = new Thread() {
+                       @Override
+                       public void run() {
+                               while (true) {
+                                       List<ModContainer> mod = Loader.instance().getModList();
+                                       ModContainer finalMod = mod.get(mod.size()-1);
+                                       ModState finalModState = Loader.instance().getModState(finalMod);
+                                       if (finalModState == ModState.POSTINITIALIZED) {
+                                               ChemiCraftCore.logger.write("ChemiCraftBase>APIProcessing", EnumLoggingType.INFO);
+                                               apiProcessing((FMLPostInitializationEvent) event);
+                                               break;
+                                       }
+                               }
+                       }
+               };
+               loadCheckThread.start();
+
+       }
+
+       /**
+        * PreInit:
+        * Configをロードします。
+        * @param event アノテーション呼び出しにより呼び出す必要なし
+        */
+       @PreInit
+       public void chemiPreLoadMethod(FMLPreInitializationEvent event) {
+               Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
+               cfg.load();
+
+               Property baseBlockID = cfg.get("BlockID", "Base of Block ID", 2500);
+               Property baseItemID = cfg.get("ItemID", "Base of Item ID", 25500);
+
+               ChemiCraftConfiguration ccfgBlock = new ChemiCraftConfiguration(baseBlockID.getInt());
+               ChemiCraftConfiguration ccfgItem = new ChemiCraftConfiguration(baseItemID.getInt());
+
+               for (int i = 0; i < atomOresID.length; i++) {
+                       this.atomOresID[i] = ccfgBlock.additionID();
+               }
+
+               this.atomIngotsID = ccfgItem.additionID();
+               this.atomGrenadeID = ccfgItem.additionID();
+               this.dustID = ccfgItem.additionID();
+               this.radiationGunID = ccfgItem.additionID();
+               this.radiationBalletID = ccfgItem.additionID();
+               this.blackSmokeID = ccfgItem.additionID();
+               this.oreSerarcherID = ccfgItem.additionID();
+
+               cfg.save();
+       }
+
+       protected void settingProcessing(FMLPostInitializationEvent event) {
+               this.registerCompounds.start();
+               this.registerCompoundsHandler.start();
+               this.registerItem.start();
+               this.registerBlock.start();
+               this.registerChemicalRecipe.start();
+               this.registerRecipe.start();
+               this.registerEntitys.start();
+
+               BlockDispenser.dispenseBehaviorRegistry.putObject(this.itemAtomGrenade, new DispenserBehaviorAtomsGrenade());
+
+       }
+
+       private void apiProcessing(final FMLPostInitializationEvent event) {
+               // API用の処理
+               for (int i = 0; i < this.apiBase.getAtomOres().size(); i++) {
+                       OreDictionary.registerOre("ore" + this.apiBase.getAtomOresAtomName().get(i), new ItemStack(this.blockAtomOres[i / 16], 1, i % 16));
+                       OreDictionary.registerOre("ingot" + this.apiBase.getAtomOresAtomName().get(i), new ItemStack(this.itemAtomIngots, 1, i ));
+                       GameRegistry.registerWorldGenerator(this.apiBase.getAtomOres().get(i));
+               }
+
+               Iterator<String> langoresItr = this.apiBase.getAtomOresName().iterator();
+               while (langoresItr.hasNext()){
+                       String lang = langoresItr.next();
+                       ArrayList<String> oresName = this.apiBase.getAtomOresName().get(lang);
+                       ArrayList<String> ingotsName = this.apiBase.getAtomIngotsName().get(lang);
+                       for (int i = 0; i < oresName.size(); i++) {
+                               ChemiCraftCore.logger.write("AtomOresAddName:" + "IngotName-" + ingotsName.get(i) + "OreName-" + oresName.get(i) + "ID-" + (i / 16)+ "/Damage-" + (i - i / 16 * 16) + "/Lang-" + lang,
+                                               EnumLoggingType.INFO);
+
+                               LanguageRegistry.instance().addNameForObject(
+                                               new ItemStack(this.atomOresID[i / 16], 1, i % 16),
+                                               lang,
+                                               oresName.get(i)
+                                               );
+
+                               /*
+                               LanguageRegistry.instance().addNameForObject(
+                                               new ItemStack(this.atomIngotsID, 1, i),
+                                               lang,
+                                               ingotsName.get(i)
+                                               );
+                                               */
+
+                       }
+               }
+
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBaseAPI.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBaseAPI.java
new file mode 100644 (file)
index 0000000..0b80bad
--- /dev/null
@@ -0,0 +1,196 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.gen.EnumOreSpawnFrequency;\r
+import asia.tcrs.ccnp.chemicraftnext.base.gen.WorldGenAtomOres;\r
+import asia.tcrs.ccnp.chemicraftnext.util.AtomInfo;\r
+import asia.tcrs.ccnp.chemicraftnext.util.Formula;\r
+import asia.tcrs.ccnp.chemicraftnext.util.ListHash;\r
+\r
+/**\r
+ * ChemiCraftBaseのAPIを提供するクラスです。<br>\r
+ * ChemiCraftBaseを使用したAPIを作成する場合、このクラスを使用します。\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftBaseAPI {\r
+\r
+       /**\r
+        * APIのインスタンス\r
+        */\r
+       private static ChemiCraftBaseAPI instance = new ChemiCraftBaseAPI();\r
+\r
+\r
+       /**\r
+        * APIのインスタンスを返します。\r
+        * @return APIのインスタンス\r
+        */\r
+       public static ChemiCraftBaseAPI instance(){\r
+               return instance;\r
+       }\r
+\r
+       /**\r
+        * 鉱石別元素数リスト\r
+        */\r
+       private HashMap<String, Formula> atomOresFormulasHash = new HashMap<String, Formula>();\r
+\r
+\r
+       /**\r
+        * 鉱石リスト\r
+        */\r
+       private ArrayList<WorldGenAtomOres> atomOresList = new ArrayList<WorldGenAtomOres>();\r
+\r
+\r
+       /**\r
+        * 鉱石名リスト\r
+        */\r
+       private ListHash<String, String> atomOresNameListHash = new ListHash<String, String>();\r
+\r
+\r
+       /**\r
+        * インゴット名リスト\r
+        */\r
+       private ListHash<String, String> atomIngotsNameListHash = new ListHash<String, String>();\r
+\r
+\r
+       /**\r
+        * 鉱石の英語名リスト\r
+        */\r
+       private ArrayList<String> atomOresAtomList = new ArrayList<String>();\r
+\r
+       /**\r
+        * 鉱石を追加します。\r
+        * @param par1Name 鉱石名(Oreは自動で語尾につけられます)\r
+        * @param par2Formula 化学式\r
+        * @param par3Id 鉱石のID\r
+        * @param par4Size 鉱石の塊の大きさ\r
+        * @param par5Frequency 生成率(frequency/Chunk)\r
+        * @param par6PosY 鉱石が生成される高度(nowY < PosY == Generate)\r
+        */\r
+       public void addAtomOres(String par1Name, Formula par2Formula, int par3Id, int par4Size, int par5Frequency, int par6PosY){\r
+               atomOresFormulasHash.put(par1Name, par2Formula);\r
+\r
+               if (!AtomInfo.isExisting(par1Name)) {\r
+                       atomOresList.add(\r
+                                       new WorldGenAtomOres(\r
+                                                       par3Id,\r
+                                                       getAtomOresMetaOfLastIndex(),\r
+                                                       par4Size,\r
+                                                       par5Frequency,\r
+                                                       par6PosY));\r
+\r
+                       atomOresAtomList.add(par1Name);\r
+\r
+                       String var7 = par1Name;\r
+                       if (!par1Name.contains(" Ore")) {\r
+                               var7 = par1Name + " Ore";\r
+                       }\r
+\r
+                       addAtomOresLanguage(par1Name, var7, "en_US");\r
+\r
+                       if (!par1Name.contains(" Ingot")) {\r
+                               var7 = par1Name + " Ingot";\r
+                       }\r
+\r
+                       addAtomIngotsLanguage(par1Name, var7, "en_US");\r
+               }\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 鉱石を追加します。\r
+        * @param par1Name 鉱石名(Oreは自動で語尾につけられます)\r
+        * @param par2Formula 化学式\r
+        * @param par3Id 鉱石のID\r
+        * @param par4Enum 鉱石生成の情報が入ったEnum\r
+        */\r
+       public void addAtomOres(String par1Name, Formula par2Formula, int par3Id, EnumOreSpawnFrequency par4Enum){\r
+               addAtomOres(\r
+                               par1Name,\r
+                               par2Formula,\r
+                               par3Id,\r
+                               par4Enum.getSize(),\r
+                               par4Enum.getFrequency(),\r
+                               par4Enum.getPosY()\r
+                               );\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 既に登録した鉱石の新しい名前・言語を追加します\r
+        * @param par1KeyName 鉱石追加の際に用いたpar1Nameに当たる文字列\r
+        * @param par2NewName 新しい名前\r
+        * @param par3NewLanguage 新しい言語\r
+        */\r
+       public void addAtomOresLanguage(String par1KeyName, String par2NewName, String par3NewLanguage){\r
+               if (this.atomOresAtomList.contains(par1KeyName)){\r
+                       atomOresNameListHash.add(\r
+                                       par3NewLanguage,\r
+                                       par2NewName\r
+                                       );\r
+               }\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 既に登録したインゴットの新しい名前・言語を追加します\r
+        * @param par1KeyName 鉱石追加の際に用いたpar1Nameに当たる文字列\r
+        * @param par2NewName 新しい名前\r
+        * @param par3NewLanguage 新しい言語\r
+        */\r
+       public void addAtomIngotsLanguage(String par1KeyName, String par2NewName, String par3NewLanguage){\r
+               if (this.atomOresAtomList.contains(par1KeyName)){\r
+                       atomIngotsNameListHash.add(\r
+                                       par3NewLanguage,\r
+                                       par2NewName\r
+                                       );\r
+               }\r
+       }\r
+\r
+\r
+\r
+       //以下システム関連//////////////////////////////////////////////////////\r
+\r
+       public ArrayList<WorldGenAtomOres> getAtomOres(){\r
+               return atomOresList;\r
+       }\r
+\r
+       public HashMap<String, Formula> getAtomOresFormulas(){\r
+               return atomOresFormulasHash;\r
+       }\r
+\r
+\r
+\r
+       public int getAtomOresLastIndex(){\r
+               return atomOresAtomList.size() / 16;\r
+       }\r
+\r
+\r
+\r
+       public int getAtomOresMetaOfLastIndex(){\r
+               return atomOresAtomList.size() - getAtomOresLastIndex() * 16;\r
+       }\r
+\r
+\r
+\r
+       public ListHash<String, String> getAtomOresName(){\r
+               return atomOresNameListHash;\r
+       }\r
+\r
+\r
+\r
+       public ListHash<String, String> getAtomIngotsName(){\r
+               return atomIngotsNameListHash;\r
+       }\r
+\r
+\r
+\r
+       public ArrayList<String> getAtomOresAtomName() {\r
+               return this.atomOresAtomList;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBaseRegister.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftBaseRegister.java
new file mode 100644 (file)
index 0000000..7f929b7
--- /dev/null
@@ -0,0 +1,20 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftRegister;\r
+\r
+/**\r
+ * ChemiCraftBaseの追加の親クラスです\r
+ * @author mozipi,ponkotate\r
+ */\r
+public abstract class ChemiCraftBaseRegister implements ChemiCraftRegister {\r
+\r
+       /**\r
+        * MODのインスタンス\r
+        */\r
+       protected ChemiCraftBase mod;\r
+\r
+       public ChemiCraftBaseRegister(ChemiCraftBase mod) {\r
+               this.mod = mod;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterBaseRecipe.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterBaseRecipe.java
new file mode 100644 (file)
index 0000000..e8a9487
--- /dev/null
@@ -0,0 +1,212 @@
+package asia.tcrs.ccnp.chemicraftnext.base;
+
+import java.util.Iterator;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.nbt.NBTRecipeGrenade;
+import asia.tcrs.ccnp.chemicraftnext.util.Formula;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+/**
+ * レシピを追加します
+ * @author mozipi,ponkotate
+ */
+public class ChemiCraftRegisterBaseRecipe extends ChemiCraftBaseRegister {
+
+       public ChemiCraftRegisterBaseRecipe(ChemiCraftBase mod) {
+               super(mod);
+       }
+
+       @Override
+       public void start() {
+
+               //化合物のレシピ
+               this.mod.api.addChemicalCombinationRecipe(
+                               new ItemStack(ChemiCraftCore.instance.itemCompounds, 1, this.mod.api.getCompound("SodiumChloride")),
+                               new Formula("NaOH"));
+
+               this.mod.api.addChemicalCombinationRecipe(
+                               new ItemStack(ChemiCraftCore.instance.itemCompounds, 1, this.mod.api.getCompound("ChlorousAcid")),
+                               new Formula("HO2Cl"));
+
+               //既存物のレシピ
+               this.mod.api.addChemicalCombinationRecipe(new ItemStack(Item.diamond),
+                               new Formula("C4096Si64"));
+
+               this.mod.api.addChemicalCombinationRecipe(new ItemStack(Item.sugar),
+                               new Formula("C12H22O11"));
+
+               this.mod.api.addReversibleOfElectrolysis(new ItemStack(Item.bucketWater),
+                               new Formula("H2O"));
+
+               this.mod.api.addReversibleOfElectrolysis(new ItemStack(Item.potion, 1, 0),
+                               new Formula("H2O"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Item.coal),
+                               new Formula("C64"));
+
+               this.mod.api.addPyrolysisDecompositionRecipe(new ItemStack(Block.oreCoal),
+                               new Formula("C"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Item.ingotIron),
+                               new Formula("Fe"));
+
+               this.mod.api.addPyrolysisDecompositionRecipe(new ItemStack(Block.oreIron),
+                               new Formula("Fe"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Block.blockIron),
+                               new Formula("9Fe"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Item.ingotGold),
+                               new Formula("Au"));
+
+               this.mod.api.addPyrolysisDecompositionRecipe(new ItemStack(Block.oreGold),
+                               new Formula("Au"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Block.blockGold),
+                               new Formula("9Au"));
+
+               this.mod.api.addReversibleOfElectrolysis(new ItemStack(Block.wood),
+                               new Formula("C6H10O5"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Block.dirt),
+                               new Formula("SiI2O2"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Block.glass),
+                               new Formula("SiCO2"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Block.stone),
+                               new Formula("SiO2"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Block.tnt),
+                               new Formula("C7H5N3O6"));
+
+               this.mod.api.addReversibleOfPyrolysis(new ItemStack(Item.emerald),
+                               new Formula("Be3Al2Si6O18"));
+
+               this.mod.api.addPyrolysisDecompositionRecipe(new ItemStack(Block.oreEmerald),
+                               new Formula("Be3Al2Si6O18"));
+
+
+
+               //素材制作台のレシピ
+               this.mod.api.addMaterialRecipe(
+                               new ItemStack[] {
+                                               null, new ItemStack(Block.stone), null,
+                                               new ItemStack(Block.stone), new ItemStack(Item.gunpowder), new ItemStack(Block.stone),
+                                               null, new ItemStack(Block.stone), null
+                               },
+                               new ItemStack(this.mod.itemAtomGrenade, 16, 0),
+                               new NBTRecipeGrenade());
+
+               this.mod.api.addSharplessMaterialRecipe(
+                               new ItemStack[] {
+                                               new ItemStack(this.mod.itemAtomGrenade, 1, 0),
+                               },
+                               new ItemStack(this.mod.itemAtomGrenade, 1, 0),
+                               new NBTRecipeGrenade()
+                               );
+
+               this.mod.api.addSharplessMaterialRecipe(
+                               new ItemStack[] {
+                                               new ItemStack(Item.dyePowder, 1, 0),
+                                               new ItemStack(Item.egg),
+                               },
+                               new ItemStack(this.mod.itemBlackSmoke),
+                               null
+                               );
+
+               this.mod.api.addSharplessMaterialRecipe(
+                               new ItemStack[] {
+                                               new ItemStack(Item.gunpowder),
+                                               new ItemStack(Item.egg),
+                               },
+                               new ItemStack(this.mod.itemDust),
+                               null
+                               );
+
+               this.mod.api.addMaterialRecipe(
+                               new ItemStack[] {
+                                               new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, this.mod.chemicalData.toAtoms("Nb")),
+                                               new ItemStack(Item.ingotIron),
+                                               new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, this.mod.chemicalData.toAtoms("Nb")),
+                                               new ItemStack(Item.ingotIron),
+                                               new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, this.mod.chemicalData.toAtoms("Nb")),
+                                               new ItemStack(Item.ingotIron),
+                                               new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, this.mod.chemicalData.toAtoms("He")),
+                                               new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, this.mod.chemicalData.toAtoms("Sn")),
+                                               new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, this.mod.chemicalData.toAtoms("He")),
+                               },
+                               new ItemStack(this.mod.itemOreSearcher),
+                               null);
+
+               this.mod.api.addMaterialRecipe(
+                               new ItemStack[] {
+                                               new ItemStack(Block.stone), new ItemStack(Item.ingotIron), new ItemStack(Block.stone),
+                                               new ItemStack(Item.ingotIron), new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.URANIUM), new ItemStack(Item.ingotIron),
+                                               new ItemStack(Block.stone), new ItemStack(Item.redstone), new ItemStack(Block.stone)
+                               },
+                               new ItemStack(this.mod.itemRadiationBallet),
+                               null);
+
+               this.mod.api.addMaterialRecipe(
+                               new ItemStack[] {
+                                               new ItemStack(Block.stone), new ItemStack(Item.ingotIron), new ItemStack(Block.stone),
+                                               new ItemStack(Item.ingotIron), new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.URANIUM), new ItemStack(Item.ingotIron),
+                                               new ItemStack(Block.stone), new ItemStack(Item.redstone), new ItemStack(Block.stone)
+                               },
+                               new ItemStack(this.mod.itemRadiationBallet),
+                               null);
+
+               this.mod.api.addMaterialRecipe(
+                               new ItemStack[] {
+                                               new ItemStack(Block.stone), new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.URANIUM), new ItemStack(Block.stone),
+                                               new ItemStack(Item.ingotIron), new ItemStack(Item.redstone), new ItemStack(Item.ingotIron),
+                                               new ItemStack(Block.stone), new ItemStack(Item.redstone), new ItemStack(Block.stone)
+                               },
+                               new ItemStack(this.mod.itemRaditionGunDataChip),
+                               null);
+
+               this.mod.api.addMaterialRecipe(
+                               new ItemStack[]{
+                                               new ItemStack(Block.blockIron), new ItemStack(Block.blockIron), new ItemStack(this.mod.itemRaditionGunDataChip),
+                                               null, null, new ItemStack(Block.stone),
+                                               null, null, new ItemStack(Item.stick)
+                               },
+                               new ItemStack(this.mod.itemRadiationGun),
+                               null);
+
+               //分解台のレシピ
+               this.mod.api.addElectrolysisDecompositionRecipe(
+                               new ItemStack(ChemiCraftCore.instance.itemCompounds, 1, this.mod.api.getCompound("Water")),
+                               new Formula("H2O"));
+
+               //鉱石分解の追加
+               Iterator<String> arrayOreNames = this.mod.apiBase.getAtomOresFormulas().keySet().iterator();
+               for (int i = 0; arrayOreNames.hasNext(); i++) {
+                       String name = arrayOreNames.next();
+                       ItemStack ingot;
+                       ItemStack ore;
+                       try {
+                               ingot = OreDictionary.getOres("ingot" + name).get(0);
+                               ore = OreDictionary.getOres("ore" + name).get(0);
+                       } catch (IndexOutOfBoundsException e) {
+                               int var1 = this.mod.apiBase.getAtomOresAtomName().indexOf(name);
+                               ingot = new ItemStack(this.mod.itemAtomIngots, 1, i);
+                               ore = new ItemStack(this.mod.blockAtomOres[var1 / 16], 1, var1 % 16);
+                       }
+                       this.mod.api.addPyrolysisDecompositionRecipe(
+                                       ingot,
+                                       this.mod.apiBase.getAtomOresFormulas().get(name));
+                       this.mod.api.addPyrolysisDecompositionRecipe(
+                                       ore,
+                                       this.mod.apiBase.getAtomOresFormulas().get(name));
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterBlock.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterBlock.java
new file mode 100644 (file)
index 0000000..4511bef
--- /dev/null
@@ -0,0 +1,33 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.ore.BlockAtomOres;\r
+import asia.tcrs.ccnp.chemicraftnext.base.ore.ItemAtomOres;\r
+import net.minecraft.block.Block;\r
+import net.minecraftforge.common.MinecraftForge;\r
+import cpw.mods.fml.common.registry.GameRegistry;\r
+\r
+/**\r
+ * Blockを追加します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterBlock extends ChemiCraftBaseRegister {\r
+\r
+       public ChemiCraftRegisterBlock(ChemiCraftBase mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               //鉱石を変数に代入\r
+               for (int i = 0; i < this.mod.blockAtomOres.length; i++) {\r
+                       this.mod.blockAtomOres[i] = new BlockAtomOres(this.mod.atomOresID[i]).\r
+                                       setHardness(3.0F).setResistance(0.0F).\r
+                                       setStepSound(Block.soundStoneFootstep).setUnlocalizedName("atomOres");\r
+                       //鉱石をMinecraftに登録\r
+                       GameRegistry.registerBlock(this.mod.blockAtomOres[i], ItemAtomOres.class, "atomOres" + i);\r
+                       //回収&最適に破壊できるピッケルのレベルを設定\r
+                       MinecraftForge.setBlockHarvestLevel(this.mod.blockAtomOres[i], "pickaxe", 2);\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterChemicalRecipe.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterChemicalRecipe.java
new file mode 100644 (file)
index 0000000..9ea0f9a
--- /dev/null
@@ -0,0 +1,84 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.gen.EnumOreSpawnFrequency;\r
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;\r
+import asia.tcrs.ccnp.chemicraftnext.util.AtomInfo;\r
+import asia.tcrs.ccnp.chemicraftnext.util.Formula;\r
+\r
+/**\r
+ * 科学的なレシピを追加します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterChemicalRecipe extends ChemiCraftBaseRegister {\r
+\r
+       public ChemiCraftRegisterChemicalRecipe(ChemiCraftBase mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               // 鉱石を追加\r
+               for (int i = 0; i < this.mod.chemicalData.ATOMSLIST.length; i++) {\r
+                       if (AtomInfo.isSolid(i + 1) && !AtomInfo.isLanthanoid(i + 1)\r
+                                       && !AtomInfo.isActinoid(i + 1) && !AtomInfo.isOreOfVanilla(i + 1)) {\r
+                               //鉱石をAPIに追加\r
+                               this.mod.apiBase.addAtomOres(\r
+                                               ChemiCraftCore.ATOMSNAME[i],\r
+                                               new Formula(this.mod.chemicalData.ATOMSLIST[i]),\r
+                                               this.mod.atomOresID[this.mod.apiBase.getAtomOresLastIndex()],\r
+                                               EnumOreSpawnFrequency.NORMAL\r
+                                               );\r
+                               //日本語名で追加\r
+                               this.mod.apiBase.addAtomOresLanguage(\r
+                                               ChemiCraftCore.ATOMSNAME[i],\r
+                                               ChemiCraftCore.ATOMSNAMEJP[i] + "鉱石",\r
+                                               "ja_JP"\r
+                                               );\r
+                               this.mod.apiBase.addAtomIngotsLanguage(\r
+                                               ChemiCraftCore.ATOMSNAME[i],\r
+                                               ChemiCraftCore.ATOMSNAMEJP[i] + "インゴット",\r
+                                               "ja_JP"\r
+                                               );\r
+                       }\r
+               }\r
+\r
+               // ランタノイド鉱石\r
+               this.mod.apiBase.addAtomOres(\r
+                               "Lanthanoid",\r
+                               new Formula("LaCePrNdPmSmEuGdTbDyHoErTmYbLu"),\r
+                               this.mod.atomOresID[this.mod.apiBase.getAtomOresLastIndex()],\r
+                               EnumOreSpawnFrequency.RARE\r
+                               );\r
+               // LaCePrNdPmSmEuGdTbDyHoErTmYbLu\r
+               this.mod.apiBase.addAtomOresLanguage(\r
+                               "Lanthanoid",\r
+                               "ランタノイド鉱石",\r
+                               "ja_JP"\r
+                               );\r
+               this.mod.apiBase.addAtomIngotsLanguage(\r
+                               "Lanthanoid",\r
+                               "ランタノイドインゴット",\r
+                               "ja_JP"\r
+                               );\r
+\r
+               // アクチノイド鉱石\r
+               this.mod.apiBase.addAtomOres(\r
+                               "Actinoid",\r
+                               new Formula("AcThPaUNpPuAmCmBkCfEsFmMdNoLr"),\r
+                               this.mod.atomOresID[this.mod.apiBase.getAtomOresLastIndex()],\r
+                               EnumOreSpawnFrequency.RARE);\r
+               // AcThPaUNpPuAmCmBkCfEsFmMdNoLr\r
+               this.mod.apiBase.addAtomOresLanguage(\r
+                               "Actinoid",\r
+                               "アクチノイド鉱石",\r
+                               "ja_JP"\r
+                               );\r
+               this.mod.apiBase.addAtomIngotsLanguage(\r
+                               "Actinoid",\r
+                               "アクチノイドインゴット",\r
+                               "ja_JP"\r
+                               );\r
+\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterCompounds.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterCompounds.java
new file mode 100644 (file)
index 0000000..63642b5
--- /dev/null
@@ -0,0 +1,23 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+/**\r
+ * 化合物を追加します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterCompounds extends ChemiCraftBaseRegister {\r
+\r
+       public ChemiCraftRegisterCompounds(ChemiCraftBase mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               this.mod.api.addCompound("ja_JP", "ChlorousAcid", "亜塩素酸");\r
+               this.mod.api.addCompound("ja_JP", "CarbonMonoxide", "一酸化炭素");\r
+               this.mod.api.addCompound("ja_JP", "CarbonDioxide", "二酸化炭素");\r
+               this.mod.api.addCompound("ja_JP", "Water", "水");\r
+               this.mod.api.addCompound("ja_JP", "SodiumChloride", "塩化ナトリウム");\r
+               this.mod.api.addCompound("ja_JP", "SodiumBicarbonate", "重曹");\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterCompoundsHandler.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterCompoundsHandler.java
new file mode 100644 (file)
index 0000000..72aaa9b
--- /dev/null
@@ -0,0 +1,20 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.compounds.CompoundWater;\r
+\r
+/**\r
+ * 化合物のHandlerを設定します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterCompoundsHandler extends ChemiCraftBaseRegister {\r
+\r
+       public ChemiCraftRegisterCompoundsHandler(ChemiCraftBase mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               this.mod.api.settingCompoundHandler("Water", new CompoundWater());\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterEntitys.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterEntitys.java
new file mode 100644 (file)
index 0000000..022a7ec
--- /dev/null
@@ -0,0 +1,41 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityAtomsGrenade;\r
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityDust;\r
+import net.minecraft.src.ModLoader;\r
+import cpw.mods.fml.common.registry.EntityRegistry;\r
+import cpw.mods.fml.common.registry.LanguageRegistry;\r
+\r
+/**\r
+ * Entityを登録します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterEntitys extends ChemiCraftBaseRegister {\r
+\r
+       public ChemiCraftRegisterEntitys(ChemiCraftBase mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               //手榴弾\r
+               LanguageRegistry.instance().addStringLocalization("entity.AtomsGrenade.name", "en_US", "AtomsGrenade");\r
+               EntityRegistry.registerModEntity(EntityAtomsGrenade.class,\r
+                               "AtomsGrenade",\r
+                               ModLoader.getUniqueEntityId(),\r
+                               this.mod,\r
+                               250,\r
+                               1,\r
+                               false);\r
+               //粉塵\r
+               LanguageRegistry.instance().addStringLocalization("entity.Dust.name", "en_US", "Dust");\r
+               EntityRegistry.registerModEntity(EntityDust.class,\r
+                               "Dust",\r
+                               ModLoader.getUniqueEntityId(),\r
+                               this.mod,\r
+                               250,\r
+                               5,\r
+                               true);\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterItem.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ChemiCraftRegisterItem.java
new file mode 100644 (file)
index 0000000..16094d4
--- /dev/null
@@ -0,0 +1,61 @@
+package asia.tcrs.ccnp.chemicraftnext.base;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;\r
+import asia.tcrs.ccnp.chemicraftnext.base.item.ItemAtomsGrenade;\r
+import asia.tcrs.ccnp.chemicraftnext.base.item.ItemBlackSmoke;\r
+import asia.tcrs.ccnp.chemicraftnext.base.item.ItemDust;\r
+import asia.tcrs.ccnp.chemicraftnext.base.item.ItemOreSerarcher;\r
+import asia.tcrs.ccnp.chemicraftnext.base.item.ItemRadiationBullet;\r
+import asia.tcrs.ccnp.chemicraftnext.base.item.ItemRadiationGun;\r
+import asia.tcrs.ccnp.chemicraftnext.base.ore.ItemAtomIngots;\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+import net.minecraft.client.renderer.texture.IconRegister;\r
+import net.minecraft.item.Item;\r
+\r
+/**\r
+ * アイテムを追加します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterItem extends ChemiCraftBaseRegister {\r
+\r
+       public ChemiCraftRegisterItem(ChemiCraftBase mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               //アイテムを変数に代入\r
+               this.mod.itemAtomIngots = new ItemAtomIngots(this.mod.atomIngotsID).setUnlocalizedName("atomIngots");\r
+               this.mod.itemAtomGrenade = new ItemAtomsGrenade(this.mod.atomGrenadeID).setUnlocalizedName("AtomsGrenade");\r
+               this.mod.itemBlackSmoke = new ItemBlackSmoke(this.mod.blackSmokeID).setUnlocalizedName("BlackSmoke");\r
+               this.mod.itemDust = new ItemDust(this.mod.dustID).setUnlocalizedName("dust");\r
+               this.mod.itemOreSearcher = new ItemOreSerarcher(this.mod.oreSerarcherID).setUnlocalizedName("OreSearcher");\r
+               this.mod.itemRadiationGun = new ItemRadiationGun(this.mod.radiationGunID).setUnlocalizedName("RadiationGun");\r
+               this.mod.itemRadiationBallet = new ItemRadiationBullet(this.mod.radiationBalletID).setUnlocalizedName("RadiationBullet");\r
+               this.mod.itemRaditionGunDataChip = new Item(this.mod.raditionGunDataChipID) {\r
+                       @Override\r
+                       @SideOnly(Side.CLIENT)\r
+                   public void registerIcons(IconRegister par1IconRegister) {\r
+                               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "RaditionGunDataChip");\r
+                       }\r
+               }.setUnlocalizedName("RaditionGunDataChip");\r
+\r
+               //名前を登録&Minecraftに登録\r
+               this.mod.nameAuxiliary.addName(this.mod.itemAtomGrenade, "AtomGrenade");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemAtomGrenade, "ja_JP", "元素手榴弾");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemBlackSmoke, "BlackSmoke");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemBlackSmoke, "ja_JP", "黒煙");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemDust, "dust");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemDust, "ja_JP", "粉塵");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemOreSearcher, "OreSearcher");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemOreSearcher, "ja_JP", "鉱石情報探知機");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemRadiationGun, "RadiationGun");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemRadiationGun, "ja_JP", "放射線銃");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemRadiationBallet, "RadiationBullet");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemRadiationBallet, "ja_JP", "放射線弾");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemRaditionGunDataChip, "RaditionGunDataChip");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemRaditionGunDataChip, "ja_JP", "放射線銃データチップ");\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/client/ClientProxy.java b/src/asia/tcrs/ccnp/chemicraftnext/base/client/ClientProxy.java
new file mode 100644 (file)
index 0000000..67f274b
--- /dev/null
@@ -0,0 +1,26 @@
+package asia.tcrs.ccnp.chemicraftnext.base.client;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityAtomsGrenade;\r
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityDust;\r
+import asia.tcrs.ccnp.chemicraftnext.base.render.RenderAtomsGrenade;\r
+import asia.tcrs.ccnp.chemicraftnext.base.render.RenderDust;\r
+import asia.tcrs.ccnp.chemicraftnext.base.system.CommonProxy;\r
+import cpw.mods.fml.client.registry.RenderingRegistry;\r
+\r
+/**\r
+ * クライアントプロキシを設定するクラスです\r
+ * @author mozipi,ponkotate,りりごん\r
+ */\r
+public class ClientProxy extends CommonProxy {\r
+\r
+       @Override\r
+       public void registerTextures() {\r
+\r
+       }\r
+\r
+       @Override\r
+       public void registerRenderInformation() {\r
+               RenderingRegistry.registerEntityRenderingHandler(EntityAtomsGrenade.class, new RenderAtomsGrenade(0.5F));\r
+               RenderingRegistry.registerEntityRenderingHandler(EntityDust.class, new RenderDust());\r
+       }\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/compounds/CompoundWater.java b/src/asia/tcrs/ccnp/chemicraftnext/base/compounds/CompoundWater.java
new file mode 100644 (file)
index 0000000..3473d28
--- /dev/null
@@ -0,0 +1,35 @@
+package asia.tcrs.ccnp.chemicraftnext.base.compounds;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.util.ICompoundHandler;\r
+import net.minecraft.entity.Entity;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.world.World;\r
+\r
+/**\r
+ * 水の化合物ハンドラーです\r
+ * @author mozipi\r
+ */\r
+public class CompoundWater implements ICompoundHandler {\r
+\r
+       @Override\r
+       public ItemStack onItemRightClickHandler(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public boolean onItemUseHandler(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) {\r
+               return false;\r
+       }\r
+\r
+       @Override\r
+       public void onUpdateHandler(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) {\r
+\r
+       }\r
+\r
+       @Override\r
+       public String getIconIndexHandler() {\r
+               return "ChemiCraft:Composite";\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/compounds/FalseItem.java b/src/asia/tcrs/ccnp/chemicraftnext/base/compounds/FalseItem.java
new file mode 100644 (file)
index 0000000..f5876f5
--- /dev/null
@@ -0,0 +1,37 @@
+package asia.tcrs.ccnp.chemicraftnext.base.compounds;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+
+/**
+ * @author ponkotate
+ */
+public class FalseItem {
+
+       protected MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) {
+               float var4 = 1.0F;
+               float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4;
+               float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4;
+               double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4;
+               double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset;
+               double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4;
+               Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11);
+               float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI);
+               float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI);
+               float var16 = -MathHelper.cos(-var5 * 0.017453292F);
+               float var17 = MathHelper.sin(-var5 * 0.017453292F);
+               float var18 = var15 * var16;
+               float var20 = var14 * var16;
+               double var21 = 5.0D;
+               if (par2EntityPlayer instanceof EntityPlayerMP) {
+                       var21 = ((EntityPlayerMP)par2EntityPlayer).theItemInWorldManager.getBlockReachDistance();
+               }
+               Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21);
+               return par1World.rayTraceBlocks_do_do(var13, var23, par3, !par3);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/creativetab/CreativeTabAtomOres.java b/src/asia/tcrs/ccnp/chemicraftnext/base/creativetab/CreativeTabAtomOres.java
new file mode 100644 (file)
index 0000000..ea28058
--- /dev/null
@@ -0,0 +1,34 @@
+package asia.tcrs.ccnp.chemicraftnext.base.creativetab;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBase;\r
+import net.minecraft.creativetab.CreativeTabs;\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+\r
+/**\r
+ * ChemiCraftの鉱石のクリエイティブタブです\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class CreativeTabAtomOres extends CreativeTabs {\r
+\r
+       public CreativeTabAtomOres(String type) {\r
+               super(type);\r
+       }\r
+\r
+\r
+\r
+       @Override\r
+       @SideOnly(Side.CLIENT)\r
+       public int getTabIconItemIndex() {\r
+               return ChemiCraftBase.instance.blockAtomOres[0].blockID;\r
+       }\r
+\r
+\r
+\r
+       @Override\r
+       @SideOnly(Side.CLIENT)\r
+       public String getTranslatedTabLabel() {\r
+               return "AtomOres";\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/dispenser/DispenserBehaviorAtomsGrenade.java b/src/asia/tcrs/ccnp/chemicraftnext/base/dispenser/DispenserBehaviorAtomsGrenade.java
new file mode 100644 (file)
index 0000000..f995e53
--- /dev/null
@@ -0,0 +1,16 @@
+package asia.tcrs.ccnp.chemicraftnext.base.dispenser;
+
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityAtomsGrenade;
+import net.minecraft.dispenser.BehaviorProjectileDispense;
+import net.minecraft.dispenser.IPosition;
+import net.minecraft.entity.IProjectile;
+import net.minecraft.world.World;
+
+public class DispenserBehaviorAtomsGrenade extends BehaviorProjectileDispense {
+
+       @Override
+       protected IProjectile getProjectileEntity(World par1World, IPosition par2IPosition) {
+               return new EntityAtomsGrenade(par1World, par2IPosition.getX(), par2IPosition.getY(), par2IPosition.getZ(), true, true, true);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityAtomsGrenade.java b/src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityAtomsGrenade.java
new file mode 100644 (file)
index 0000000..9c73a9c
--- /dev/null
@@ -0,0 +1,87 @@
+package asia.tcrs.ccnp.chemicraftnext.base.entity;
+
+import java.util.Iterator;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.projectile.EntityThrowable;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.World;
+
+/**
+ * 手榴弾です
+ * @author mozipi,ponkotate
+ */
+public class EntityAtomsGrenade extends EntityThrowable {
+
+       private float explodeSize;
+       private boolean isExplode;
+       private boolean onFire;
+       private boolean isNuke;
+
+    public EntityAtomsGrenade(World par1World) {
+        super(par1World);
+    }
+
+       public EntityAtomsGrenade(World par1World, EntityLiving par2EntityLiving, boolean par3, boolean par4, boolean par5) {
+               super(par1World, par2EntityLiving);
+               this.isExplode = par3;
+               this.onFire = par4;
+               this.isNuke = par5;
+       }
+
+       public EntityAtomsGrenade(World par1World, double par2, double par3, double par4, boolean par5, boolean par6, boolean par7) {
+               super(par1World, par2, par3, par4);
+               this.isExplode = par5;
+               this.onFire = par6;
+               this.isNuke = par7;
+       }
+
+       @Override
+       public void onUpdate() {
+               super.onUpdate();
+       }
+
+       @SuppressWarnings("unchecked")
+       @Override
+       protected void onImpact(MovingObjectPosition par1MovingObjectPosition) {
+
+               if(isExplode) {
+                       this.explodeSize = 3.0F;
+               }
+
+               if(isNuke) {
+                       this.explodeSize = 35.0F;
+               }
+
+               if (par1MovingObjectPosition.entityHit != null) {
+                       par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), 2);
+                       par1MovingObjectPosition.entityHit.setFire(5);
+               }
+
+               if (!this.worldObj.isRemote && !isNuke) {
+                       this.worldObj.newExplosion((Entity) null, this.posX, this.posY, this.posZ, explodeSize, onFire, true);
+                       this.isDead = true;
+               } else if(!this.worldObj.isRemote && isNuke) {
+                       this.worldObj.newExplosion((Entity) null, this.posX, this.posY, this.posZ, explodeSize, onFire, true);
+                       Iterator<EntityLiving> itr = this.worldObj.getEntitiesWithinAABB(EntityLiving.class, this.boundingBox.expand(30, 30, 30)).iterator();
+                       while(itr.hasNext()) {
+                               EntityLiving entity = itr.next();
+                               double dx = Math.abs(entity.posX - this.posX);
+                               double dy = Math.abs(entity.posY - this.posY);
+                               double dz = Math.abs(entity.posZ - this.posZ);
+                               int distance = (int) Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2) + Math.pow(dz, 2) );
+                               if(30 - distance >= 0) {
+                                       entity.addPotionEffect(new PotionEffect(2, (60 + (30 - distance)) * 20, (30 - distance) / 5));
+                                       entity.addPotionEffect(new PotionEffect(4, (60 + (30 - distance)) * 20, (30 - distance) / 5));
+                                       entity.addPotionEffect(new PotionEffect(18, (60 + (30 - distance)) * 20, (30 - distance) / 5));
+                                       entity.addPotionEffect(new PotionEffect(19, (60 + (30 - distance)) * 20, (30 - distance) / 5));
+                               }
+                       }
+                       this.isDead = true;
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityBlackSmoke.java b/src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityBlackSmoke.java
new file mode 100644 (file)
index 0000000..8ca5608
--- /dev/null
@@ -0,0 +1,71 @@
+package asia.tcrs.ccnp.chemicraftnext.base.entity;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+\r
+import net.minecraft.entity.Entity;\r
+import net.minecraft.entity.monster.EntityMob;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.nbt.NBTTagCompound;\r
+import net.minecraft.world.World;\r
+\r
+/**\r
+ * なんか黒い煙みたいなのが出てくるやつです<br>\r
+ * Warning:WIP!!\r
+ * @author ponkotate\r
+ */\r
+public class EntityBlackSmoke extends Entity {\r
+\r
+       private final int TIME = 5 * 20;\r
+\r
+       public HashMap<EntityMob, Integer> invisibilityMobsMap = new HashMap<EntityMob, Integer>();\r
+\r
+       private int restTime;\r
+\r
+       public EntityBlackSmoke(EntityPlayer par1EntityPlayer, World par2World, double par3, double par4, double par5) {\r
+               super(par2World);\r
+               this.posX = par3;\r
+               this.posY = par4;\r
+               this.posZ = par5;\r
+               this.restTime = TIME;\r
+\r
+               for (Entity var5:(ArrayList<Entity>)par2World.loadedEntityList){\r
+                       if (var5 instanceof EntityMob){\r
+                               this.invisibilityMobsMap.put((EntityMob)var5, TIME);\r
+                       }\r
+               }\r
+       }\r
+\r
+       @Override\r
+       protected void entityInit() {\r
+\r
+       }\r
+\r
+       @Override\r
+       public void onUpdate() {\r
+               if (this.restTime < 0) {\r
+                       this.setDead();\r
+               }\r
+               Iterator<EntityMob> var1 = this.invisibilityMobsMap.keySet().iterator();\r
+               while (var1.hasNext()) {\r
+                       EntityMob var2 = var1.next();\r
+                       var2.setTarget(this);\r
+               }\r
+               for (int i = 0; i < 5; i++){\r
+                       this.worldObj.spawnParticle("smoke", this.posX, this.posY, this.posZ, Math.random() * 0.1D - 0.05D, 0.05D, Math.random() * 0.1D - 0.05D);\r
+               }\r
+               this.restTime--;\r
+       }\r
+\r
+       @Override\r
+       protected void readEntityFromNBT(NBTTagCompound var1) {\r
+\r
+       }\r
+\r
+       @Override\r
+       protected void writeEntityToNBT(NBTTagCompound var1) {\r
+\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityDust.java b/src/asia/tcrs/ccnp/chemicraftnext/base/entity/EntityDust.java
new file mode 100644 (file)
index 0000000..17e0047
--- /dev/null
@@ -0,0 +1,115 @@
+package asia.tcrs.ccnp.chemicraftnext.base.entity;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+
+/**
+ * 粉塵です。<br>
+ * 時間差で爆発します。
+ * @author mozipi,ponkotate
+ */
+public class EntityDust extends Entity {
+
+       private final float explodeSize = 2.0F;
+       private final short explodeRad = 5;
+       private int delay = 0;
+       private int deadDelay = 20;
+       private float rad = 0;
+
+       public EntityDust(World par1World) {
+               super(par1World);
+       }
+
+       public EntityDust(World par1World, double par2, double par3, double par4) {
+               super(par1World);
+               this.posX = par2;
+               this.posY = par3;
+               this.posZ = par4;
+       }
+
+       @Override
+       public void onUpdate() {
+               super.onUpdate();
+               this.delay++;
+               if (this.delay > 100) {
+                       if (this.deadDelay > 0) {
+                               this.deadDelay--;
+                               this.rad += 0.5;
+                               if (this.deadDelay % 4 == 0) {
+                                       this.explode(this.rad, false);
+                               } else if (this.deadDelay % 6 == 0) {
+                                       this.explode(this.rad, true);
+                               }
+                       } else {
+                               this.setDead();
+                       }
+               }
+
+        float var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+        this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
+
+        for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var17) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F)
+        {
+            ;
+        }
+
+        while (this.rotationPitch - this.prevRotationPitch >= 180.0F)
+        {
+            this.prevRotationPitch += 360.0F;
+        }
+
+        while (this.rotationYaw - this.prevRotationYaw < -180.0F)
+        {
+            this.prevRotationYaw -= 360.0F;
+        }
+
+        while (this.rotationYaw - this.prevRotationYaw >= 180.0F)
+        {
+            this.prevRotationYaw += 360.0F;
+        }
+
+        this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+        this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+
+       }
+
+       @Override
+       protected void entityInit() {
+
+       }
+
+       @Override
+       public void readEntityFromNBT(NBTTagCompound var1) {
+
+       }
+
+       @Override
+       public void writeEntityToNBT(NBTTagCompound var1) {
+
+       }
+
+       private void explode(double r, boolean b) {
+               double angle = 0;
+               double angleY = 0;
+               for (int i = 0; i < r; i++) {
+                       double y = this.posY - (r/2) + (i * 1F);
+                       double ry = 0;
+                       for (int j = 1; j < r; j++) {
+                               ry = Math.sin((double) i / r * Math.PI) * 8;
+                               angle += 360/j;
+                               double x = this.posX - Math.sin(Math.toRadians(angle)) * ry;
+                               double z = this.posZ + Math.cos(Math.toRadians(angle)) * ry;
+                               if (!this.worldObj.isRemote){
+                                       this.worldObj.createExplosion(this, x - 6 + Math.random() * 12, y + 3, z - 6 + Math.random() * 12, this.explodeSize, b);
+                               }
+                       }
+               }
+       }
+
+       public int getDelay() {
+               return this.delay;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/gen/EnumOreSpawnFrequency.java b/src/asia/tcrs/ccnp/chemicraftnext/base/gen/EnumOreSpawnFrequency.java
new file mode 100644 (file)
index 0000000..67560f8
--- /dev/null
@@ -0,0 +1,63 @@
+package asia.tcrs.ccnp.chemicraftnext.base.gen;\r
+\r
+/**\r
+ * 鉱石の出現頻度のEnumです。\r
+ * @author mozipi\r
+ */\r
+public enum EnumOreSpawnFrequency {\r
+\r
+       HIGH(8, 10, 256),\r
+       NORMAL(8, 5, 64),\r
+       LOW(8, 3, 30),\r
+       RARE(8, 1, 15);\r
+\r
+       /**\r
+        * 鉱石の塊の大きさ\r
+        */\r
+       private short size;\r
+\r
+       /**\r
+        * 鉱石の生成頻度\r
+        */\r
+       private short frequency;\r
+\r
+       /**\r
+        * 鉱石の生成最高高度\r
+        */\r
+       private short posY;\r
+\r
+       /**\r
+        * @param par1 鉱石の生成頻度\r
+        */\r
+       private EnumOreSpawnFrequency(int par1, int par2, int par3) {\r
+               this.size = (short) par1;\r
+               this.frequency = (short) par2;\r
+               this.posY = (short) par3;\r
+       }\r
+\r
+       /**\r
+        * 鉱石の塊の大きさを返します\r
+        * @return 鉱石の塊の大きさ\r
+        */\r
+       public short getSize() {\r
+               return this.size;\r
+       }\r
+\r
+       /**\r
+        * 鉱石の生成頻度を返します\r
+        * @return 鉱石の生成頻度\r
+        */\r
+       public short getFrequency() {\r
+               return this.frequency;\r
+       }\r
+\r
+       /**\r
+        * 鉱石の生成最高高度を変えします\r
+        * @return 鉱石の生成最高高度\r
+        */\r
+       public short getPosY() {\r
+               return this.posY;\r
+       }\r
+\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/gen/WorldGenAtomOres.java b/src/asia/tcrs/ccnp/chemicraftnext/base/gen/WorldGenAtomOres.java
new file mode 100644 (file)
index 0000000..8a3a971
--- /dev/null
@@ -0,0 +1,44 @@
+package asia.tcrs.ccnp.chemicraftnext.base.gen;\r
+\r
+import java.util.Random;\r
+\r
+import net.minecraft.block.Block;\r
+import net.minecraft.world.World;\r
+import net.minecraft.world.chunk.IChunkProvider;\r
+import net.minecraft.world.gen.feature.WorldGenMinable;\r
+import cpw.mods.fml.common.IWorldGenerator;\r
+\r
+/**\r
+ * 鉱石生成のインスタンスです\r
+ * @author mozipi,ponkotate,つやぴん\r
+ */\r
+public class WorldGenAtomOres extends WorldGenMinable implements IWorldGenerator {\r
+\r
+       /**\r
+        * 生成率\r
+        */\r
+       private int frequency;\r
+\r
+       /**\r
+        * 鉱石生成の高度\r
+        */\r
+       private int posY;\r
+\r
+       public WorldGenAtomOres(int id, int meta, int size, int frequency, int posY) {\r
+               super(id, meta, size, Block.stone.blockID);\r
+               this.frequency = frequency;\r
+               this.posY = posY;\r
+       }\r
+\r
+       public WorldGenAtomOres(int id, int meta, EnumOreSpawnFrequency frequency) {\r
+               this(id, meta, frequency.getSize(), frequency.getFrequency(), frequency.getPosY());\r
+       }\r
+\r
+       @Override\r
+       public void generate(Random par1Random, int par2ChunkX, int par3ChunkZ, World par4World, IChunkProvider par5ChunkGenerator, IChunkProvider par6ChunkProvider) {\r
+               for (int i = 0; i < this.frequency; i++) {\r
+                       this.generate(par4World, par1Random, par2ChunkX * 16 + par1Random.nextInt(16), par1Random.nextInt(this.posY), par3ChunkZ * 16 + par1Random.nextInt(16));\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemAtomsGrenade.java b/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemAtomsGrenade.java
new file mode 100644 (file)
index 0000000..834568c
--- /dev/null
@@ -0,0 +1,91 @@
+package asia.tcrs.ccnp.chemicraftnext.base.item;
+
+import java.util.List;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityAtomsGrenade;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.world.World;
+
+/**
+ * 手榴弾のアイテムです。
+ * @author mozipi
+ */
+public class ItemAtomsGrenade extends Item {
+
+       public ItemAtomsGrenade(int par1) {
+               super(par1);
+       }
+
+       @Override
+       public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
+               if (par1ItemStack.stackSize <= 0) {
+                       return null;
+               }
+
+               boolean var1 = false;
+               boolean var2 = false;
+               boolean var3 = false;
+
+               if (par1ItemStack.stackTagCompound != null) {
+                       NBTTagList var4 = par1ItemStack.getTagCompound().getTagList("Effect");
+
+                       for (int i = 0;i < 3;i++) {
+                               if (!((NBTTagCompound)var4.tagAt(0)).getString("GrenadeEffect" + i).equals("")) {
+                                       if (((NBTTagCompound)var4.tagAt(0)).getString("GrenadeEffect" + i).equals("Hydrogen")) {
+                                               var1 = true;
+                                       }
+                                       if (((NBTTagCompound)var4.tagAt(0)).getString("GrenadeEffect" + i).equals("Carbon")) {
+                                               var2 = true;
+                                       }
+                                       if (((NBTTagCompound)var4.tagAt(0)).getString("GrenadeEffect" + i).equals("Uranium")) {
+                                               var3 = true;
+                                       }
+                               }
+                       }
+               }
+               if (!par2World.isRemote) {
+                       EntityAtomsGrenade entity = new EntityAtomsGrenade(par2World, par3EntityPlayer, var1, var2, var3);
+                       par2World.spawnEntityInWorld(entity);
+               }
+               par1ItemStack.stackSize--;
+               return par1ItemStack;
+       }
+
+       @Override
+       public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {
+               if (par1ItemStack.hasTagCompound()) {
+                       NBTTagList var1 = par1ItemStack.getTagCompound().getTagList("Effect");
+
+                       for (int i = 0;i < 3;i++) {
+                               if (!((NBTTagCompound)var1.tagAt(0)).getString("GrenadeEffect" + i).equals("")) {
+                                       par3List.add(
+                                                       ((NBTTagCompound)var1.tagAt(0)).getString("GrenadeEffect" + i)
+                                                       );
+                               }
+                       }
+               }
+       }
+
+       @Override
+       public boolean getShareTag()
+       {
+               return true;
+       }
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister){
+               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "atoms_grenade");
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemBlackSmoke.java b/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemBlackSmoke.java
new file mode 100644 (file)
index 0000000..b2517f8
--- /dev/null
@@ -0,0 +1,67 @@
+package asia.tcrs.ccnp.chemicraftnext.base.item;\r
+\r
+import java.util.HashMap;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;\r
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityBlackSmoke;\r
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;\r
+\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+\r
+import net.minecraft.client.renderer.texture.IconRegister;\r
+import net.minecraft.entity.monster.EntityMob;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.item.Item;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.world.World;\r
+\r
+/**\r
+ * なんか黒い煙のアイテムです。\r
+ * @author ponkotate\r
+ */\r
+public class ItemBlackSmoke extends Item {\r
+\r
+       public HashMap<EntityMob, Integer> invisibilityMobsMap = new HashMap<EntityMob, Integer>();\r
+\r
+       public ItemBlackSmoke(int par1) {\r
+               super(par1);\r
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);\r
+       }\r
+\r
+       @Override\r
+       public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) {\r
+               double var11 = par4 + 0.5D;\r
+               double var12 = par5;\r
+               double var13 = par6 + 0.5D;\r
+               switch(par7) {\r
+                       case 0:\r
+                               var12--;\r
+                               break;\r
+                       case 1:\r
+                               var12++;\r
+                               break;\r
+                       case 2:\r
+                               var13--;\r
+                               break;\r
+                       case 3:\r
+                               var13++;\r
+                               break;\r
+                       case 4:\r
+                               var11--;\r
+                               break;\r
+                       case 5:\r
+                               var11++;\r
+                               break;\r
+               }\r
+               par3World.spawnEntityInWorld(new EntityBlackSmoke(par2EntityPlayer, par3World, var11, var12, var13));\r
+               return true;\r
+       }\r
+\r
+       @Override\r
+       @SideOnly(Side.CLIENT)\r
+    public void registerIcons(IconRegister par1IconRegister){\r
+               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "black_smoke");\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemDust.java b/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemDust.java
new file mode 100644 (file)
index 0000000..8ee8319
--- /dev/null
@@ -0,0 +1,45 @@
+package asia.tcrs.ccnp.chemicraftnext.base.item;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityDust;\r
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+import net.minecraft.client.renderer.texture.IconRegister;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.item.Item;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.world.World;\r
+\r
+/**\r
+ * 粉塵のアイテムです\r
+ * @author mozipi\r
+ */\r
+public class ItemDust extends Item {\r
+\r
+       public ItemDust(int par1) {\r
+               super(par1);\r
+               this.setCreativeTab(ChemiCraftCore.instance.creativeTabChemiCraft);\r
+       }\r
+\r
+       @Override\r
+       public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World,\r
+                       EntityPlayer par3EntityPlayer) {\r
+\r
+\r
+               if (!par2World.isRemote) {\r
+                       par2World.spawnEntityInWorld(new EntityDust(par2World,\r
+                                       par3EntityPlayer.posX,\r
+                                       par3EntityPlayer.posY,\r
+                                       par3EntityPlayer.posZ));\r
+                       par1ItemStack.stackSize--;\r
+               }\r
+               return par1ItemStack;\r
+       }\r
+\r
+       @Override\r
+       @SideOnly(Side.CLIENT)\r
+    public void registerIcons(IconRegister par1IconRegister){\r
+               this.itemIcon = par1IconRegister.registerIcon("egg");\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemOreSerarcher.java b/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemOreSerarcher.java
new file mode 100644 (file)
index 0000000..2a89f12
--- /dev/null
@@ -0,0 +1,75 @@
+package asia.tcrs.ccnp.chemicraftnext.base.item;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBase;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+
+public class ItemOreSerarcher extends Item {
+
+       public ItemOreSerarcher(int par1) {
+               super(par1);
+               this.setHasSubtypes(true);
+               this.setMaxStackSize(1);
+               this.setMaxDamage(0);
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);
+       }
+
+       @Override
+       public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) {
+               for (int i = 0; i < ChemiCraftBase.instance.atomOresID.length; i++) {
+                       if (par3World.getBlockId(par4, par5, par6) == ChemiCraftBase.instance.atomOresID[i]) {
+                               if (par1ItemStack.getTagCompound() == null) {
+                                       par1ItemStack.stackTagCompound = new NBTTagCompound();
+                               }
+                               if (par3World.isRemote) {
+                                       this.changeItem(par2EntityPlayer);
+                               }
+                               String blockName = new ItemStack(
+                                               Block.blocksList[par3World.getBlockId(par4, par5, par6)],
+                                               1,
+                                               par3World.getBlockMetadata(par4, par5, par6)).getDisplayName();
+                               par1ItemStack.getTagCompound().setString("OreName", blockName);
+                       }
+               }
+               return true;
+       }
+
+       public void changeItem(EntityPlayer par1EntityPlayer) {
+               par1EntityPlayer.inventory.inventoryChanged = true;
+       }
+
+       @Override
+       public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
+               this.changeItem(par3EntityPlayer);
+               return par1ItemStack;
+       }
+
+       @Override
+       public String getItemDisplayName(ItemStack par1ItemStack) {
+               if (par1ItemStack.getTagCompound() != null) {
+                       return super.getItemDisplayName(par1ItemStack) + ":" + par1ItemStack.getTagCompound().getString("OreName");
+               }
+               return super.getItemDisplayName(par1ItemStack);
+       }
+
+       @Override
+       public boolean getShareTag() {
+               return true;
+       }
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister){
+               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "ore_searcher");
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemRadiationBullet.java b/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemRadiationBullet.java
new file mode 100644 (file)
index 0000000..b4db4d0
--- /dev/null
@@ -0,0 +1,27 @@
+package asia.tcrs.ccnp.chemicraftnext.base.item;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;\r
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+import net.minecraft.client.renderer.texture.IconRegister;\r
+import net.minecraft.item.Item;\r
+\r
+/**\r
+ * 放射線中の弾です\r
+ * @author mozipi\r
+ */\r
+public class ItemRadiationBullet extends Item {\r
+\r
+       public ItemRadiationBullet(int par1) {\r
+               super(par1);\r
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);\r
+               this.maxStackSize = 16;\r
+       }\r
+\r
+       @Override\r
+       @SideOnly(Side.CLIENT)\r
+    public void registerIcons(IconRegister par1IconRegister){\r
+               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "radiation_bullet");\r
+       }\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemRadiationGun.java b/src/asia/tcrs/ccnp/chemicraftnext/base/item/ItemRadiationGun.java
new file mode 100644 (file)
index 0000000..0397ce7
--- /dev/null
@@ -0,0 +1,134 @@
+package asia.tcrs.ccnp.chemicraftnext.base.item;
+
+import java.util.ArrayList;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBase;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DamageSource;
+import net.minecraft.world.World;
+
+/**
+ * 放射線銃です
+ * @author mozipi
+ */
+public class ItemRadiationGun extends Item {
+
+       /**
+        * 次の発射までの遅延
+        */
+       private short delay;
+
+       public ItemRadiationGun(int par1) {
+               super(par1);
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);
+               this.maxStackSize = 1;
+       }
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister){
+               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "radiation_gun");
+       }
+
+       @Override
+       public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World,
+                       EntityPlayer par3EntityPlayer) {
+
+               boolean isCreative = par3EntityPlayer.capabilities.isCreativeMode;
+
+               if (this.delay <= 0) {
+                       if (!isCreative) {
+                               this.field_00001(par1ItemStack, par2World, par3EntityPlayer);
+                               if (par3EntityPlayer.inventory.hasItem(ChemiCraftBase.instance.itemRadiationBallet.itemID)) {
+                                       par3EntityPlayer.inventory.consumeInventoryItem(ChemiCraftBase.instance.itemRadiationBallet.itemID);
+                                       par2World.playSound(par3EntityPlayer.posX,
+                                                       par3EntityPlayer.posY,
+                                                       par3EntityPlayer.posZ,
+                                                       "mob.endermen.portal",
+                                                       1.0F,
+                                                       1.3F,
+                                                       false);
+
+                                       par2World.playSound(par3EntityPlayer.posX,
+                                                       par3EntityPlayer.posY,
+                                                       par3EntityPlayer.posZ,
+                                                       "ChemiCraft.raditionGun",
+                                                       2.0F,
+                                                       1.3F,
+                                                       false);
+                                       if (!par2World.isRemote) {
+                                               this.delay = 100;
+                                       }
+                               }
+                       } else {
+                               this.field_00001(par1ItemStack, par2World, par3EntityPlayer);
+                               par2World.playSound(par3EntityPlayer.posX,
+                                               par3EntityPlayer.posY,
+                                               par3EntityPlayer.posZ,
+                                               "mob.endermen.portal",
+                                               1.0F,
+                                               1.3F,
+                                               false);
+
+                               par2World.playSound(par3EntityPlayer.posX,
+                                               par3EntityPlayer.posY,
+                                               par3EntityPlayer.posZ,
+                                               "ChemiCraft.raditionGun",
+                                               2.0F,
+                                               1.3F,
+                                               false);
+                               if (!par2World.isRemote) {
+                                       this.delay = 100;
+                               }
+                       }
+               }
+
+               return super.onItemRightClick(par1ItemStack, par2World, par3EntityPlayer);
+       }
+
+       private void field_00001(ItemStack par1ItemStack, World par2World,
+                       EntityPlayer par3EntityPlayer) {
+
+               ArrayList<Entity> collisions = ChemiCraftCore.instance.mathAuxiliary.getTriangleEntitysByPlayer(par2World,
+                               par3EntityPlayer.posX,
+                               par3EntityPlayer.posY,
+                               par3EntityPlayer.posZ,
+                               par3EntityPlayer.rotationYaw,
+                               par3EntityPlayer.rotationPitch,
+                               30,
+                               15);
+
+               for (int i = 0; i < collisions.size(); i++) {
+                       if (collisions.get(i) instanceof EntityLiving && collisions.get(i) != par3EntityPlayer) {
+                               try {
+                                       EntityLiving entity = (EntityLiving) collisions.get(i);
+                                       entity.attackEntityFrom(DamageSource.causePlayerDamage(par3EntityPlayer), (int) (10 + Math.random() * 11));
+                               } catch (ClassCastException e) {
+                                       break;
+                               }
+                       }
+               }
+
+       }
+
+       @Override
+       public void onUpdate(ItemStack par1ItemStack, World par2World,
+                       Entity par3Entity, int par4, boolean par5) {
+               if (this.delay > 0 && !par2World.isRemote) {
+                       this.delay--;
+               }
+       }
+
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ore/BlockAtomOres.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ore/BlockAtomOres.java
new file mode 100644 (file)
index 0000000..1a6d3e3
--- /dev/null
@@ -0,0 +1,79 @@
+package asia.tcrs.ccnp.chemicraftnext.base.ore;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBase;
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBaseAPI;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Icon;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+/**
+ * 鉱石のクラスです
+ * @author mozipi,ponkotate
+ */
+public class BlockAtomOres extends Block {
+
+       @SideOnly(Side.CLIENT)
+    private Icon[] icons;
+
+       public BlockAtomOres(int id) {
+               super(id, Material.rock);
+               this.setCreativeTab(ChemiCraftBase.instance.creativeTabAtomOres);
+       }
+
+       @Override
+       @SideOnly(Side.CLIENT)
+       public void registerIcons(IconRegister par1IconRegister) {
+               ArrayList<String> atomNames = ChemiCraftBaseAPI.instance().getAtomOresAtomName();
+               this.icons = new Icon[atomNames.size()];
+
+               for (int i = 0; i < this.icons.length; i++){
+                       this.icons[i] = par1IconRegister.registerIcon(ChemiCraftBase.ORE + atomNames.get(i));
+               }
+
+               // WIP
+               this.icons[icons.length - 1] = par1IconRegister.registerIcon(ChemiCraftBase.ORE + "WIP");
+               this.icons[icons.length - 2] = par1IconRegister.registerIcon(ChemiCraftBase.ORE + "WIP");
+       }
+
+       @Override
+       public Icon getIcon(int par1, int par2) {
+               int var3 = this.blockID - ChemiCraftBase.instance.atomOresID[0];
+               return this.icons[par2 + var3 * 16];
+       }
+
+       @Override
+       public int damageDropped(int par1) {
+               return par1;
+       }
+
+       public static int getBlockFromDye(int par0) {
+               return ~par0 & 15;
+       }
+
+       public static int getDyeFromBlock(int par0) {
+               return ~par0 & 15;
+       }
+
+       @Override
+       @SideOnly(Side.CLIENT)
+       public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) {
+               int var4 = this.blockID - ChemiCraftBase.instance.atomOresID[0] + 1;
+               int var5 = 16;
+               if (var4 == ChemiCraftBase.instance.atomOresID.length){
+                       var5 -= var4 * 16 - ChemiCraftBaseAPI.instance().getAtomOresAtomName().size();
+               }
+               for (int i = 0; i < var5; i++) {
+                       par3List.add(new ItemStack(par1, 1, i));
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ore/ItemAtomIngots.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ore/ItemAtomIngots.java
new file mode 100644 (file)
index 0000000..0998569
--- /dev/null
@@ -0,0 +1,70 @@
+package asia.tcrs.ccnp.chemicraftnext.base.ore;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBase;
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBaseAPI;
+
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Icon;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ItemAtomIngots extends Item {
+
+       @SideOnly(Side.CLIENT)
+       private Icon[] icons;
+
+       public ItemAtomIngots(int par1) {
+               super(par1);
+               this.maxStackSize = 64;
+               this.setHasSubtypes(true);
+               this.setMaxDamage(0);
+               // this.setCreativeTab(ChemiCraftBase.instance.creativeTabAtomOres);
+       }
+
+
+
+       @SuppressWarnings({ "unchecked", "rawtypes" })
+       @SideOnly(Side.CLIENT)
+       @Override
+       public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List){
+               for(int i = 0; i < ChemiCraftBaseAPI.instance().getAtomOresAtomName().size(); i++)
+               {
+                       par3List.add(new ItemStack(par1, 1, i));
+               }
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+       public Icon getIconFromDamage(int par1) {
+               return this.icons[par1];
+       }
+
+
+
+       @Override
+       public String getUnlocalizedName(ItemStack par1ItemStack){
+               return super.getUnlocalizedName() + "." + ChemiCraftBaseAPI.instance().getAtomOresAtomName().get(par1ItemStack.getItemDamage());
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister) {
+               ArrayList<String> atomNames = ChemiCraftBaseAPI.instance().getAtomOresAtomName();
+               this.icons = new Icon[atomNames.size()];
+
+               for (int i = 0; i < this.icons.length; i++){
+                       this.icons[i] = par1IconRegister.registerIcon(ChemiCraftBase.INGOT + atomNames.get(i));
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/ore/ItemAtomOres.java b/src/asia/tcrs/ccnp/chemicraftnext/base/ore/ItemAtomOres.java
new file mode 100644 (file)
index 0000000..3efdee7
--- /dev/null
@@ -0,0 +1,42 @@
+package asia.tcrs.ccnp.chemicraftnext.base.ore;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBase;\r
+import asia.tcrs.ccnp.chemicraftnext.base.ChemiCraftBaseAPI;\r
+import net.minecraft.item.ItemBlock;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.util.Icon;\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+\r
+/**\r
+ * 鉱石のアイテム版です\r
+ * @author mozipi\r
+ */\r
+public class ItemAtomOres extends ItemBlock {\r
+\r
+       public ItemAtomOres(int par1) {\r
+               super(par1);\r
+               this.setMaxDamage(0);\r
+               this.setHasSubtypes(true);\r
+       }\r
+\r
+       @Override\r
+       @SideOnly(Side.CLIENT)\r
+       public Icon getIconFromDamage(int par1) {\r
+               return ((BlockAtomOres) ChemiCraftBase.instance.blockAtomOres[0]).getIcon(2, BlockAtomOres.getBlockFromDye(par1));\r
+       }\r
+\r
+       @Override\r
+       public int getMetadata(int par1) {\r
+               return par1;\r
+       }\r
+\r
+       @Override\r
+       public String getUnlocalizedName(ItemStack par1ItemStack) {\r
+               int var2 = this.itemID - (ChemiCraftBase.instance.atomOresID[0]);\r
+               return super.getUnlocalizedName() + "." + ChemiCraftBaseAPI.instance()\r
+                               .getAtomOresAtomName()\r
+                               .get(par1ItemStack.getItemDamage() + var2 * 16);\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/render/RenderAtomsGrenade.java b/src/asia/tcrs/ccnp/chemicraftnext/base/render/RenderAtomsGrenade.java
new file mode 100644 (file)
index 0000000..087d2d1
--- /dev/null
@@ -0,0 +1,62 @@
+package asia.tcrs.ccnp.chemicraftnext.base.render;
+
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.Render;
+import net.minecraft.entity.Entity;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityAtomsGrenade;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+/**
+ * 手榴弾のRenderクラスです
+ * @author mozipi
+ */
+@SideOnly(Side.CLIENT)
+public class RenderAtomsGrenade extends Render {
+
+       private float field_77002_a;
+
+       public RenderAtomsGrenade(float par1) {
+               this.field_77002_a = par1;
+       }
+
+       public void doRenderAtomsGrenade(EntityAtomsGrenade par1AtomGrenade, double par2, double par4, double par6, float par8, float par9) {
+               this.loadTexture(ChemiCraftCore.instance.BASE_PATH + "/items/atoms_grenade.png");
+               GL11.glPushMatrix();
+               GL11.glTranslatef((float)par2, (float)par4, (float)par6);
+               GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+               float var10 = this.field_77002_a;
+               GL11.glScalef(var10 / 1.0F, var10 / 1.0F, var10 / 1.0F);
+               byte var11 = 1;
+               Tessellator var12 = Tessellator.instance;
+               float var13 = (float)(var11 % 16 * 16 + 0) / 256.0F;
+               float var14 = (float)(var11 % 16 * 16 + 16) / 256.0F;
+               float var15 = (float)(var11 / 16 * 16 + 0) / 256.0F;
+               float var16 = (float)(var11 / 16 * 16 + 16) / 256.0F;
+               float var17 = 1.0F;
+               float var18 = 0.5F;
+               float var19 = 0.25F;
+               GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
+               GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
+               var12.startDrawingQuads();
+               var12.setNormal(0.0F, 1.0F, 0.0F);
+               var12.addVertexWithUV((double)(0.0F - var18), (double)(0.0F - var19), 0.0D, (double)var13, (double)var16);
+               var12.addVertexWithUV((double)(var17 - var18), (double)(0.0F - var19), 0.0D, (double)var14, (double)var16);
+               var12.addVertexWithUV((double)(var17 - var18), (double)(1.0F - var19), 0.0D, (double)var14, (double)var15);
+               var12.addVertexWithUV((double)(0.0F - var18), (double)(1.0F - var19), 0.0D, (double)var13, (double)var15);
+               var12.draw();
+               GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+               GL11.glPopMatrix();
+       }
+
+       @Override
+       public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) {
+               this.doRenderAtomsGrenade((EntityAtomsGrenade)par1Entity, par2, par4, par6, par8, par9);
+       }
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/render/RenderDust.java b/src/asia/tcrs/ccnp/chemicraftnext/base/render/RenderDust.java
new file mode 100644 (file)
index 0000000..932a026
--- /dev/null
@@ -0,0 +1,55 @@
+package asia.tcrs.ccnp.chemicraftnext.base.render;
+
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.RenderEntity;
+import net.minecraft.entity.Entity;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import asia.tcrs.ccnp.chemicraftnext.base.entity.EntityDust;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+/**
+ * 粉塵のRenderです
+ * @author mozipi
+ */
+@SideOnly(Side.CLIENT)
+public class RenderDust extends RenderEntity {
+
+       @Override
+       public void doRender(Entity var1, double var2, double var4, double var6,
+                       float var8, float var9) {
+               EntityDust entity = (EntityDust) var1;
+               GL11.glPushMatrix();
+               GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+               GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+               float var10 = entity.getDelay() / 8.0F;
+               GL11.glScalef(var10 / 1.0F, var10 / 1.0F, var10 / 1.0F);
+               byte var11 = 0;
+               this.loadTexture(ChemiCraftCore.instance.ENTITY_PARTICLE_TEXRURE);
+               Tessellator var12 = Tessellator.instance;
+               float var13 = (float)(var11 % 256 * 256 + 0) / 256F;
+               float var14 = (float)(var11 % 256 * 256 + 256) / 256F;
+               float var15 = (float)(var11 / 256 * 256 + 0) / 256F;
+               float var16 = (float)(var11 / 256 * 256 + 256) / 256F;
+               float var17 = 1.0F;
+               float var18 = 0.5F;
+               float var19 = 0.25F;
+               GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
+               GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
+               var12.startDrawingQuads();
+               var12.setNormal(0.0F, 1.0F, 0.0F);
+               var12.addVertexWithUV((double)(0.0F - var18), (double)(0.0F - var19), 0.0D, (double)var13, (double)var16);
+               var12.addVertexWithUV((double)(var17 - var18), (double)(0.0F - var19), 0.0D, (double)var14, (double)var16);
+               var12.addVertexWithUV((double)(var17 - var18), (double)(1.0F - var19), 0.0D, (double)var14, (double)var15);
+               var12.addVertexWithUV((double)(0.0F - var18), (double)(1.0F - var19), 0.0D, (double)var13, (double)var15);
+               var12.draw();
+               GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+               GL11.glPopMatrix();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/system/CommonProxy.java b/src/asia/tcrs/ccnp/chemicraftnext/base/system/CommonProxy.java
new file mode 100644 (file)
index 0000000..5b2c9e4
--- /dev/null
@@ -0,0 +1,28 @@
+package asia.tcrs.ccnp.chemicraftnext.base.system;\r
+\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.world.World;\r
+import cpw.mods.fml.common.network.IGuiHandler;\r
+\r
+/**\r
+ * 共通のプロキシを設定するクラスです\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class CommonProxy  implements IGuiHandler {\r
+       public void registerTextures() {\r
+\r
+       }\r
+\r
+       public void registerRenderInformation() {\r
+       }\r
+\r
+       @Override\r
+       public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {\r
+               return null;\r
+       }\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/base/system/PacketHandler.java b/src/asia/tcrs/ccnp/chemicraftnext/base/system/PacketHandler.java
new file mode 100644 (file)
index 0000000..ddd1bc0
--- /dev/null
@@ -0,0 +1,19 @@
+package asia.tcrs.ccnp.chemicraftnext.base.system;\r
+\r
+import net.minecraft.network.INetworkManager;\r
+import net.minecraft.network.packet.Packet250CustomPayload;\r
+import cpw.mods.fml.common.network.IPacketHandler;\r
+import cpw.mods.fml.common.network.Player;\r
+\r
+/**\r
+ * サーバーとクライアントのデータの同期に必要なクラス\r
+ * @author Lilly\r
+ */\r
+public class PacketHandler implements IPacketHandler {\r
+\r
+       @Override\r
+       public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) {\r
+\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftAPI.java b/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftAPI.java
new file mode 100644 (file)
index 0000000..10dd4f2
--- /dev/null
@@ -0,0 +1,573 @@
+package asia.tcrs.ccnp.chemicraftnext.core;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.TreeMap;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;\r
+import asia.tcrs.ccnp.chemicraftnext.EnumLoggingType;\r
+import asia.tcrs.ccnp.chemicraftnext.core.nbt.ChemicalNBTRecipe;\r
+import asia.tcrs.ccnp.chemicraftnext.core.system.ChemiCraftCraftingManager;\r
+import asia.tcrs.ccnp.chemicraftnext.util.Formula;\r
+import asia.tcrs.ccnp.chemicraftnext.util.ICompoundHandler;\r
+import asia.tcrs.ccnp.chemicraftnext.util.ListHash;\r
+import asia.tcrs.ccnp.chemicraftnext.util.MaterialRecipe;\r
+\r
+import net.minecraft.item.ItemStack;\r
+\r
+\r
+/**\r
+ * ChemiCraftのAPIを提供するクラスです<br>\r
+ * ChemiCraftのAPIを作成する場合はこのクラスを使用します<br>\r
+ * @author mozipi\r
+ *\r
+ */\r
+public class ChemiCraftAPI {\r
+\r
+       /**\r
+        * APIのインスタンス\r
+        */\r
+       private static ChemiCraftAPI instance = new ChemiCraftAPI();\r
+\r
+\r
+       /**\r
+        * APIのインスタンスを返します\r
+        * @return APIのインスタンス\r
+        */\r
+       public static ChemiCraftAPI instance(){\r
+               return instance;\r
+       }\r
+\r
+\r
+       /**\r
+        * 化合台の原子の数のリスト\r
+        */\r
+       private static ArrayList<Integer[]> chemicalCombinationAmounts = new ArrayList<Integer[]>();\r
+\r
+\r
+       /**\r
+        * 化合台の原子の種類のリスト\r
+        */\r
+       private static ArrayList<String[]> chemicalCombinationAtoms = new ArrayList<String[]>();\r
+\r
+\r
+       /**\r
+        * 化合台の結果のリスト\r
+        */\r
+       private static ArrayList<ItemStack> chemicalCombinationResult = new ArrayList<ItemStack>();\r
+\r
+\r
+       /**\r
+        * ChemiCraftの化学作業台類のレシピのマネージャー\r
+        */\r
+       private static ChemiCraftCraftingManager chemiCraftCraftingManager = new ChemiCraftCraftingManager();\r
+\r
+\r
+       /**\r
+        * List of item name of handler to compounds.\r
+        */\r
+       private static ArrayList<String> compoundHandlerItemNames = new ArrayList<String>();\r
+\r
+\r
+       /**\r
+        * 化合物の英語名からダメージ値へのマップ\r
+        */\r
+       private static TreeMap<String, Integer> compoundsDamageToString = new TreeMap<String, Integer>();\r
+\r
+\r
+       /**\r
+        * 化合物のテクスチャマップ\r
+        */\r
+       private static TreeMap<Integer, String> compoundsTexture = new TreeMap<Integer, String>();\r
+\r
+\r
+       /**\r
+        * List of compounds handlers.\r
+        */\r
+       private static ArrayList<ICompoundHandler> compoundHandlers = new ArrayList<ICompoundHandler>();\r
+\r
+\r
+       /**\r
+        * 化合物の文字列をダメージ値に変換します。\r
+        */\r
+       private static HashMap<String, Integer> compoundHash = new HashMap<String, Integer>();\r
+\r
+\r
+       /**\r
+        * List of compounds names.\r
+        */\r
+       private static ListHash<String, String> compoundsNameListHash = new ListHash<String, String>();\r
+\r
+\r
+       /**\r
+        * 電気分解燃料のリスト。\r
+        */\r
+       private static HashMap<ItemStack, Integer> electrolysisFuelList = new HashMap<ItemStack, Integer>();\r
+\r
+\r
+       /**\r
+        * 電気分解レシピのリスト\r
+        */\r
+       private static HashMap<ItemStack, ItemStack[]> electrolysisRecipeList = new HashMap<ItemStack, ItemStack[]>();\r
+\r
+\r
+       /**\r
+        * 素材製作台のレシピクラス\r
+        */\r
+       private static ArrayList<MaterialRecipe> materialRecipe = new ArrayList<MaterialRecipe>();\r
+\r
+\r
+       /**\r
+        * 熱分解燃料のリスト。\r
+        */\r
+       private static HashMap<ItemStack, Integer> pyrolysisFuelList = new HashMap<ItemStack, Integer>();\r
+\r
+\r
+       /**\r
+        * 熱分解レシピのリスト\r
+        */\r
+       private static HashMap<ItemStack, ItemStack[]> pyrolysisRecipeList = new HashMap<ItemStack, ItemStack[]>();\r
+\r
+\r
+       /**\r
+        * ツール&武器作成台の素材一覧のリスト\r
+        */\r
+       private static ArrayList<ItemStack[]> toolAndWeaponMaterials = new ArrayList<ItemStack[]>();\r
+\r
+\r
+       /**\r
+        * ツール&武器作成台の結果のリスト\r
+        */\r
+       private static ArrayList<ItemStack> toolAndWeaponResult = new ArrayList<ItemStack>();\r
+\r
+\r
+       /**\r
+        * ツール&武器作成台の不定形であるか\r
+        */\r
+       private static ArrayList<Boolean> toolAndWeaponSharpless = new ArrayList<Boolean>();\r
+\r
+\r
+\r
+       /**\r
+        * 化合レシピを追加します。materialの要素数は0<= n <= 16にしてください。\r
+        * @param material 素材\r
+        * @param result 結果\r
+        */\r
+       public static void addChemicalCombinationRecipe(ItemStack result, Formula formula){\r
+               ChemiCraftCore.logger.write("addChemicalCombinationRecipe:" + "Result-" + result.getItemName() + "/Material-" + Arrays.toString(formula.getAtoms())\r
+                               , EnumLoggingType.INFO);\r
+               chemicalCombinationAtoms.add(formula.getAtoms());\r
+               chemicalCombinationAmounts.add(formula.getAmonts());\r
+               chemicalCombinationResult.add(result);\r
+       }\r
+\r
+\r
+\r
+       private static int compoundTexturePointer = 0;\r
+       /**\r
+        * 化合物を追加します\r
+        * @param name 化合物の名前\r
+        */\r
+       public static void addCompound(String name){\r
+               ChemiCraftCore.logger.write("addCompound:" + name\r
+                               , EnumLoggingType.INFO);\r
+\r
+               compoundsDamageToString.put(name, compoundTexturePointer);\r
+               compoundsTexture.put(compoundTexturePointer, "ChemiCraft:CompoundEmpty");\r
+               compoundTexturePointer++;\r
+               compoundsNameListHash.add("en_US", name);\r
+               compoundHash.put(name, compoundHash.size());\r
+       }\r
+\r
+\r
+       /**\r
+        * 既に登録された化合物に対して別の言語をを追加します\r
+        * @param lang 別言語名\r
+        * @param englishName 英語名\r
+        * @param langName 別言語への名前\r
+        */\r
+       public static void addCompound(String lang, String englishName, String langName){\r
+               ChemiCraftCore.logger.write("addCompound(MultiLang):" + "lang-" + lang + "/name-" + englishName + "/langToName-" + langName\r
+                               , EnumLoggingType.INFO);\r
+               addCompound(englishName);\r
+               addCompoundLanguage(lang, langName);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 単体で使用すると異常が発生するため、API以外での使用を固く非推奨する\r
+        * @param lang 言語名\r
+        * @param langName 言語への名前\r
+        */\r
+       @Deprecated\r
+       private static void addCompoundLanguage(String lang, String langName){\r
+               compoundsNameListHash.add(\r
+                               lang,\r
+                               langName);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 電気分解台のレシピを追加します\r
+        * @param material 素材\r
+        * @param formula 化学式(結果)\r
+        */\r
+       public static void addElectrolysisDecompositionRecipe(ItemStack material, Formula formula) {\r
+               ChemiCraftCore.logger.write("addElectrolysisRecipe:" + "Material-" + material.getItemName() + "/Result-" + Arrays.toString(formula.getAtoms()),\r
+                               EnumLoggingType.INFO);\r
+\r
+               ItemStack[] itemstacks =\r
+                               new ItemStack[formula.getAtoms().length];\r
+               for (int i = 0; i < itemstacks.length; i++) {\r
+                       itemstacks[i] =\r
+                                       new ItemStack(\r
+                                                       ChemiCraftCore.instance.itemAtoms,\r
+                                                       formula.getAmonts()[i],\r
+                                                       ChemiCraftData.toAtoms(formula.getAtoms()[i]));\r
+               }\r
+               electrolysisRecipeList.put(\r
+                               material,\r
+                               itemstacks);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 電気分解台のレシピを追加します\r
+        * @param material 素材 (すべて結果は同じになります)\r
+        * @param formula 化学式(結果)\r
+        */\r
+       public static void addElectrolysisDecompositionRecipe(ArrayList<ItemStack> material, Formula formula) {\r
+               for (ItemStack item : material) {\r
+                       if (item != null) {\r
+                               addElectrolysisDecompositionRecipe(item, formula);\r
+                       }\r
+               }\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 熱分解台のレシピを追加します\r
+        * @param material 素材\r
+        * @param formula 化学式(結果)\r
+        */\r
+       public static void addPyrolysisDecompositionRecipe(ItemStack material, Formula formula) {\r
+               ChemiCraftCore.logger.write("addPyrolysisRecipe:" + "Material-" + material.getItemName() + "/Result-" + Arrays.toString(formula.getAtoms()),\r
+                               EnumLoggingType.INFO);\r
+\r
+               ItemStack[] itemstacks =\r
+                               new ItemStack[formula.getAtoms().length];\r
+               for (int i = 0; i < itemstacks.length; i++) {\r
+                       itemstacks[i] =\r
+                                       new ItemStack(\r
+                                                       ChemiCraftCore.instance.itemAtoms,\r
+                                                       formula.getAmonts()[i],\r
+                                                       ChemiCraftData.toAtoms(formula.getAtoms()[i]));\r
+               }\r
+               pyrolysisRecipeList.put(\r
+                               material,\r
+                               itemstacks);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 熱分解台のレシピを追加します\r
+        * @param material 素材 (すべて結果は同じになります)\r
+        * @param formula 化学式(結果)\r
+        */\r
+       public static void addPyrolysisDecompositionRecipe(ArrayList<ItemStack> material, Formula formula) {\r
+               for (ItemStack item : material) {\r
+                       if (item != null) {\r
+                               addPyrolysisDecompositionRecipe(item, formula);\r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 化合,熱分解,電気分解ができるレシピを追加します\r
+        * @param materialAndResult 素材(分解)と結果(化合)\r
+        * @param formula 化学式(分解なら結果に。化合なら素材に)\r
+        */\r
+       public static void addReversible(ItemStack materialAndResult, Formula formula){\r
+               addChemicalCombinationRecipe(materialAndResult, formula);\r
+               addPyrolysisDecompositionRecipe(materialAndResult, formula);\r
+               addElectrolysisDecompositionRecipe(materialAndResult, formula);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 化合,電気分解ができるレシピを追加します\r
+        * @param materialAndResult 素材(分解)と結果(化合)\r
+        * @param formula 化学式(分解なら結果に。化合なら素材に)\r
+        */\r
+       public static void addReversibleOfElectrolysis(ItemStack result, Formula formula){\r
+               addChemicalCombinationRecipe(result, formula);\r
+               addElectrolysisDecompositionRecipe(result, formula);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 化合,熱分解ができるレシピを追加します\r
+        * @param materialAndResult 素材(分解)と結果(化合)\r
+        * @param formula 化学式(分解なら結果に。化合なら素材に)\r
+        */\r
+       public static void addReversibleOfPyrolysis(ItemStack result, Formula formula){\r
+               addChemicalCombinationRecipe(result, formula);\r
+               addPyrolysisDecompositionRecipe(result, formula);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 電気分解台の燃料を追加します\r
+        * @param itemstack 燃料のItemStack\r
+        * @param burnTime 燃焼時間(tick * rate)\r
+        */\r
+       public static void addElectrolysisDecompositionFuel(ItemStack itemstack, int burnTime) {\r
+               ChemiCraftCore.logger.write("addElectrolysisFuel:" + "Fuel-" + itemstack.getItemName() + "/BurnTime-" + burnTime,\r
+                               EnumLoggingType.INFO);\r
+\r
+               electrolysisFuelList.put(\r
+                               itemstack,\r
+                               burnTime);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 熱分解台の燃料を追加します\r
+        * @param itemstack 燃料のItemStack\r
+        * @param burnTime 燃焼時間(tick * rate)\r
+        */\r
+       public static void addPyrolysisDecompositionFuel(ItemStack itemstack, int burnTime) {\r
+               ChemiCraftCore.logger.write("addPyrolysisFuel:" + "Fuel-" + itemstack.getItemName() + "/BurnTime-" + burnTime,\r
+                               EnumLoggingType.INFO);\r
+\r
+               pyrolysisFuelList.put(\r
+                               itemstack,\r
+                               burnTime);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 素材作成台のレシピを追加します\r
+        * @param materials 素材\r
+        * @param result 結果\r
+        * @param nbtRecipe NBT(Nullの場合はなし)\r
+        */\r
+       public static void addMaterialRecipe(ItemStack[] materials, ItemStack result, ChemicalNBTRecipe nbtRecipe){\r
+               ChemiCraftCore.logger.write("addMaterialRecipe:" + "Materials-" + Arrays.toString(materials) + "/Result-" + result.getItemName() + "/NBT-" + nbtRecipe,\r
+                               EnumLoggingType.INFO);\r
+\r
+               materialRecipe.add(\r
+                               new MaterialRecipe(\r
+                                               result,\r
+                                               materials,\r
+                                               nbtRecipe,\r
+                                               false));\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 素材作成台の不定形レシピを追加します\r
+        * @param materials 素材\r
+        * @param result 結果\r
+        * @param nbtRecipe NBT(Nullの場合はなし)\r
+        */\r
+       public static void addSharplessMaterialRecipe(ItemStack[] materials, ItemStack result, ChemicalNBTRecipe nbtRecipe){\r
+               ChemiCraftCore.logger.write("addMaterialRecipe:" + "Materials-" + Arrays.toString(materials) + "/Result-" + result.getItemName() + "/NBT-" + nbtRecipe,\r
+                               EnumLoggingType.INFO);\r
+\r
+               materialRecipe.add(\r
+                               new MaterialRecipe(\r
+                                               result,\r
+                                               materials,\r
+                                               nbtRecipe,\r
+                                               true));\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 化合物のハンドラーを設定します。<br>\r
+        * CompoundHandlerを実装したクラスをcompoundHandlerに入れることによってhandlerItemNameで指定した<br>\r
+        * 化合物にハンドラーをつけることができます。\r
+        * @param handlerItemName ハンドラーをつける化合物の英語名\r
+        * @param compoundHandler ハンドラー\r
+        */\r
+       public static void settingCompoundHandler(String handlerItemName, ICompoundHandler compoundHandler){\r
+               ChemiCraftCore.logger.write("settingCompoundHandler:" + "Name-" + handlerItemName + "/CompoundHandler-" + compoundHandler,\r
+                               EnumLoggingType.INFO);\r
+\r
+               if (compoundHandler.getIconIndexHandler() != null) {\r
+                       int p = compoundsDamageToString.get(handlerItemName);\r
+                       if (p != -1) {\r
+                               compoundsTexture.put(p, compoundHandler.getIconIndexHandler());\r
+                       } else {\r
+                               System.out.println("化合物が存在しません(settingCompoundHandler)");\r
+                       }\r
+               }\r
+\r
+               compoundHandlers.add(compoundHandler);\r
+               compoundHandlerItemNames.add(handlerItemName);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * ツール&武器作成台のレシピを追加します<br>\r
+        * 未作成であり、動作しません\r
+        * @param materials 素材\r
+        * @param result 結果\r
+        */\r
+       @Deprecated\r
+       public static void addToolAndWeaponRecipe(ItemStack[] materials, ItemStack result) {\r
+               toolAndWeaponMaterials.add(materials);\r
+               toolAndWeaponResult.add(result);\r
+               toolAndWeaponSharpless.add(false);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * ツール&武器作成台の不定形レシピを追加します<br>\r
+        *       * 未作成であり、動作しません\r
+        * @param materials 素材\r
+        * @param result 結果\r
+        */\r
+       @Deprecated\r
+       public static void addSharplessToolAndWeaponRecipe(ItemStack[] materials, ItemStack result) {\r
+               toolAndWeaponMaterials.add(materials);\r
+               toolAndWeaponResult.add(result);\r
+               toolAndWeaponSharpless.add(true);\r
+       }\r
+\r
+\r
+\r
+       //以下システム関連//////////////////////////////////////////////////////\r
+\r
+       public static ArrayList<Integer[]> getChemicalCombinationAmounts() {\r
+               return chemicalCombinationAmounts;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<String[]> getChemicalCombinationAtoms() {\r
+               return chemicalCombinationAtoms;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<ItemStack> getChemicalCombinationResult() {\r
+               return chemicalCombinationResult;\r
+       }\r
+\r
+\r
+\r
+       public static int getCompound(String key) {\r
+               if (compoundHash.get(key) != null) {\r
+                       return compoundHash.get(key);\r
+               } else {\r
+                       return -1;\r
+               }\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<ICompoundHandler> getCompoundHandler() {\r
+               compoundHandlers.trimToSize();\r
+               return compoundHandlers;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<String> getCompoundHandlerItemName() {\r
+               compoundHandlerItemNames.trimToSize();\r
+               return compoundHandlerItemNames;\r
+       }\r
+\r
+\r
+\r
+       public static ListHash<String, String> getCompoundsName() {\r
+               return compoundsNameListHash;\r
+       }\r
+\r
+\r
+\r
+       public static ChemiCraftCraftingManager getCraftingManager() {\r
+               return chemiCraftCraftingManager;\r
+       }\r
+\r
+\r
+\r
+       public static HashMap<ItemStack, Integer> getElectrolysisFuelList() {\r
+               return electrolysisFuelList;\r
+       }\r
+\r
+\r
+\r
+       public static HashMap<ItemStack, ItemStack[]> getElectrolysisRecipeList() {\r
+               return electrolysisRecipeList;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<MaterialRecipe> getMaterialRecipe() {\r
+               return materialRecipe;\r
+       }\r
+\r
+\r
+\r
+       public static HashMap<ItemStack, Integer> getPyrolysisFuelList() {\r
+               return pyrolysisFuelList;\r
+       }\r
+\r
+\r
+\r
+       public static HashMap<ItemStack, ItemStack[]> getPyrolysisRecipeList() {\r
+               return pyrolysisRecipeList;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<ItemStack[]> getToolAndWeaponMaterials() {\r
+               return toolAndWeaponMaterials;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<ItemStack> getToolAndWeaponResult() {\r
+               return toolAndWeaponResult;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<Boolean> getToolAndWeaponSharpless() {\r
+               return toolAndWeaponSharpless;\r
+       }\r
+\r
+\r
+\r
+       public static ArrayList<String> getCompoundsTexture() {\r
+               Iterator<String> it = compoundsTexture.values().iterator();\r
+               ArrayList<String> li = new ArrayList<String>();\r
+               while (it.hasNext()) {\r
+                       li.add(it.next());\r
+               }\r
+               return li;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftCore.java b/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftCore.java
new file mode 100644 (file)
index 0000000..8ebad7f
--- /dev/null
@@ -0,0 +1,327 @@
+package asia.tcrs.ccnp.chemicraftnext.core;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import net.minecraft.block.Block;\r
+import net.minecraft.creativetab.CreativeTabs;\r
+import net.minecraft.entity.Entity;\r
+import net.minecraft.entity.EntityLiving;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.item.Item;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.util.EntityDamageSource;\r
+import net.minecraftforge.common.Configuration;\r
+import net.minecraftforge.common.Property;\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftConfiguration;\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftLogging;\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftRegister;\r
+import asia.tcrs.ccnp.chemicraftnext.EnumLoggingType;\r
+import asia.tcrs.ccnp.chemicraftnext.core.creativetab.CreativeTabChemiCraft;\r
+import asia.tcrs.ccnp.chemicraftnext.core.debug.CommandDeleteItem;\r
+import asia.tcrs.ccnp.chemicraftnext.core.debug.CommandGenDebugRoom;\r
+import asia.tcrs.ccnp.chemicraftnext.core.debug.CommandSetTile;\r
+import asia.tcrs.ccnp.chemicraftnext.core.system.CommonProxy;\r
+import asia.tcrs.ccnp.chemicraftnext.core.system.PacketHandler;\r
+import cpw.mods.fml.common.Loader;\r
+import cpw.mods.fml.common.LoaderState.ModState;\r
+import cpw.mods.fml.common.Mod;\r
+import cpw.mods.fml.common.Mod.Init;\r
+import cpw.mods.fml.common.Mod.Instance;\r
+import cpw.mods.fml.common.Mod.PreInit;\r
+import cpw.mods.fml.common.Mod.ServerStarting;\r
+import cpw.mods.fml.common.ModContainer;\r
+import cpw.mods.fml.common.SidedProxy;\r
+import cpw.mods.fml.common.event.FMLInitializationEvent;\r
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;\r
+import cpw.mods.fml.common.event.FMLServerStartingEvent;\r
+import cpw.mods.fml.common.network.NetworkMod;\r
+import cpw.mods.fml.common.network.NetworkRegistry;\r
+import cpw.mods.fml.common.registry.LanguageRegistry;\r
+\r
+\r
+\r
+/**\r
+ * ChemiCraft本体\r
+ * @author CCNP\r
+ */\r
+@Mod(modid = "ChemiCraftNextCore", name = "ChemiCraftNextCore", version = "Beta1")\r
+@NetworkMod(clientSideRequired = true, serverSideRequired = true, versionBounds = "1.5", channels = "chemicraftcore", packetHandler = PacketHandler.class)\r
+public class ChemiCraftCore extends ChemiCraft{\r
+\r
+       /**\r
+        * 元素名配列\r
+        */\r
+       public static final String[] ATOMSNAME = {\r
+               "Hydrogen", "Helium", "Lithium", "Beryllium", "Boron", "Carbon", "Nitrogen", "Oxygen", "Fluorine", "Neon", "Sodium", "Magnesium", "Aluminium", "Silicon",\r
+               "Phosphorus", "Sulfur", "Chlorine", "Argon", "Potassium", "Calcium", "Scandium", "Titanium", "Vanadium", "Chromium", "Manganese", "Iron", "Cobalt", "Nickel", "Copper", "Zinc", "Gallium",\r
+               "Germanium", "Arsenic", "Selenium", "Bromine", "Krypton", "Rubidium", "Strontium", "Yttorium", "Zirconium", "Niobium", "Molybdenum", "Technetium", "Ruthenium", "Rhodium", "Palladium",\r
+               "Silver", "Cadmium", "Indium", "Tin", "Antimony", "Tellurium", "Iodine", "Xenon", "Caesium", "Barium", "Lanthanum", "Cerium", "Praseodymium", "Neodymium", "Promethium", "Samarium",\r
+               "Europium", "Gadolinium", "Terbium", "Dysprosium", "Holmium", "Erbium", "Thulium", "Ytterbium", "Lutetium", "Hafnium", "Tantalum", "Tungsten", "Rhenium", "Osmium", "Iridium", "Platinum",\r
+               "Gold", "Mercury", "Thallium", "Lead", "Bismuth", "Polonium", "Astatine", "Radon", "Francium", "Radium", "Actinium", "Thorium", "Protactinium", "Uranium", "Neptunium", "Plutonium",\r
+               "Americium", "Curium", "Berkelium", "Californium", "Einsteinium", "Fermium", "Mendelevium", "Nobelium", "Lawrencium", "Rutherfordium", "Dubnium", "Seaborgium", "Bohrium", "Hassium",\r
+               "Meitnerium", "Darmstadtium", "Roentgenium", "Copernicium", "Ununtrium", "Flerovium", "Ununpentium", "Livermorium", "Ununseptium", "Ununoctium" };\r
+\r
+       /**\r
+        * 元素名日本語版配列\r
+        */\r
+       public static final String[] ATOMSNAMEJP = {\r
+               "水素", "ヘリウム", "リチウム", "ベリリウム", "ホウ素", "炭素", "窒素", "酸素", "フッ素", "ネオン", "ナトリウム", "マグネシウム", "アルミニウム", "ケイ素", "リン", "硫黄", "塩素", "アルゴン", "カリウム", "カルシウム", "スカンジウム",\r
+               "チタン", "バナジウム", "クロム", "マンガン", "鉄", "コバルト", "ニッケル", "銅", "亜鉛", "ガリウム", "ゲルマニウム", "ヒ素", "セレン", "臭素", "クリプトン", "ルビジウム", "ストロンチウム", "イットリウム", "ジルコニウム", "ニオブ", "モリブデン", "テクネチウム", "ルテニウム",\r
+               "ロジウム", "パラジウム", "銀", "カドミウム", "インジウム", "スズ", "アンチモン", "テルル", "ヨウ素", "キセノン", "セシウム", "バリウム", "ランタン", "セリウム", "プラセオジム", "ネオジム", "プロメチウム", "サマリウム", "ユウロビウム", "ガドリニウム", "テルビウム", "ジスプロニウム",\r
+               "ホルミウム", "エルビウム", "ツリウム", "イッテルビウム", "ルテチウム", "ハフニウム", "タンタル", "タングステン", "レニウム", "オスミウム", "イリジウム", "白金", "金", "水銀", "タリウム", "鉛", "ビスマス", "ポロニウム", "アスタチン", "ラドン", "フランシウム", "ラジウム",\r
+               "アクチニウム", "トリウム", "プロトアクチウム", "ウラン", "ネプツニウム", "プルトニウム", "アメリシウム", "キュリウム", "バークリウム", "カルホルニウム", "アインスタイニウム", "フェルミウム", "メンデレビウム", "ノーベリウム", "ローレンシウム", "ラサホージウム", "ドブニウム", "シーボーギウム",\r
+               "ボーリウム", "ハッシウム", "マイトネリウム", "ダームスタチウム", "レントゲニウム", "コペルニシウム", "ウンウントリウム", "フレロビウム", "ウンウンペンチウム", "リバモリウム", "ウンウンセプチウム", "ウンウンオクチウム" };\r
+\r
+       /**\r
+        * this is ChemiCraft instance.\r
+        */\r
+       @Instance("ChemiCraftNextCore")\r
+       public static ChemiCraftCore instance;\r
+\r
+       /**\r
+        * proxy of ChemiCraft.\r
+        */\r
+       @SidedProxy(clientSide = "asia.tcrs.ccnp.chemicraftnext.core.client.ClientProxy", serverSide = "asia.tcrs.ccnp.chemicraftnext.core.system.CommonProxy")\r
+       public static CommonProxy proxy;\r
+\r
+       /**\r
+        * CreativeTab of ChemiCraft.\r
+        */\r
+       public static final CreativeTabs creativeTabChemiCraft = new CreativeTabChemiCraft("ChemiCraft");\r
+\r
+       /**\r
+        * the ItemID.\r
+        */\r
+       public int atomsID;\r
+       public int compoundsID;\r
+       public int gasCollectingBottleID;\r
+       public int chemicalCellsID;\r
+       public int pearID;\r
+\r
+       /**\r
+        * the BlockID.\r
+        */\r
+       public int pyrolysisTableID;\r
+       public int electrolysisTableID;\r
+       public int chemicalConbinationTableID;\r
+       public int toolAndWeaponCraftingTableID;\r
+       public int chemicalCraftingTableID;\r
+\r
+       /**\r
+        * the GUIID.\r
+        */\r
+       public int guiPyrolysisTableID;\r
+       public int guiElectrolysisTableID;\r
+       public int guiChemicalCombinationTableID;\r
+       public int guiToolAndWeaponCraftingTableID;\r
+       public int guiChemicalCraftingTableID;\r
+\r
+       /**\r
+        * Variables of Block type.\r
+        */\r
+       public Block blockPyrolysisTable;\r
+       public Block blockElectrolysisTable;\r
+       public Block blockChemicalCombinationTable;\r
+       public Block blockToolAndWeaponCraftingTable;\r
+       public Block blockChemicalCraftingTable;\r
+\r
+       /**\r
+        * Variables of Item type.\r
+        */\r
+       public Item itemAtoms;\r
+       public Item itemCompounds;\r
+       public Item itemGasCollectingBottle;\r
+       public Item itemChemicalCells;\r
+       public Item itemPear;\r
+\r
+       /**\r
+        * the Register Instances.\r
+        */\r
+       public ChemiCraftRegister registerItem;\r
+       public ChemiCraftRegister registerBlock;\r
+       public ChemiCraftRegister registerTileEntity;\r
+       public ChemiCraftRegister registerRecipe;\r
+\r
+       /**\r
+        * Logging用のインスタンス\r
+        */\r
+       public static final ChemiCraftLogging logger = new ChemiCraftLogging(System.getProperty("user.dir"));\r
+\r
+       /**\r
+        * the Textures\r
+        */\r
+       public static final String CCTABLE = ChemiCraft.TEXTURE + "ChemiCraftTable_";\r
+\r
+       public ChemiCraftCore() {\r
+               this.StaticBlackList();\r
+               this.api.getCompoundsName().createHash("en_US");\r
+               this.registerItem = new ChemiCraftRegisterItem(this);\r
+               this.registerBlock = new ChemiCraftRegisterBlock(this);\r
+               this.registerTileEntity = new ChemiCraftRegisterTileEntity(this);\r
+               this.registerRecipe = new ChemiCraftRegisterCoreRecipe(this);\r
+               this.logger.startLogging();\r
+               //this.sinVisualizer  = new SinVisualizer();\r
+       }\r
+\r
+       /**\r
+        * PreInit:\r
+        * Configをロードします。\r
+        * @param event アノテーション呼び出しにより呼び出す必要なし\r
+        */\r
+       @PreInit\r
+       public void chemiPreLoadMethod(FMLPreInitializationEvent event) {\r
+               Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());\r
+               cfg.load();\r
+\r
+               Property coreBlockID = cfg.get("BlockID", "Base of Block ID", 2400);\r
+               Property coreItemID = cfg.get("ItemID", "Base of Item ID", 25000);\r
+\r
+               ChemiCraftConfiguration ccfgBlock = new ChemiCraftConfiguration(coreBlockID.getInt());\r
+               ChemiCraftConfiguration ccfgItem = new ChemiCraftConfiguration(coreItemID.getInt());\r
+\r
+               this.pyrolysisTableID = ccfgBlock.additionID();\r
+               this.electrolysisTableID = ccfgBlock.additionID();\r
+               this.chemicalConbinationTableID = ccfgBlock.additionID();\r
+               this.toolAndWeaponCraftingTableID = ccfgBlock.additionID();\r
+               this.chemicalCraftingTableID = ccfgBlock.additionID();\r
+\r
+               this.atomsID = ccfgItem.additionID();\r
+               this.compoundsID = ccfgItem.additionID();\r
+               this.gasCollectingBottleID = ccfgItem.additionID();\r
+               this.chemicalCellsID = ccfgItem.additionID();\r
+               this.pearID = ccfgItem.additionID();\r
+\r
+               Property guiPyrolysisTableIDProp = cfg.get("GUI", "GUIPyrolysisID", 1000);\r
+               Property guiElectrolysisTableIDProp = cfg.get("GUI", "GUIElectrolysisTableIDProp", 1001);\r
+               Property guiChemicalCombinationTableIDProp = cfg.get("GUI", "GUIChemicalCombinationTableID", 1002);\r
+               Property guiToolAndWeaponCraftingTableIDProp = cfg.get("GUI", "GUIToolAndWeaponCraftingTableID", 1003);\r
+               Property guiChemicalCraftingTableIDProp = cfg.get("GUI", "GUIChemicalCraftingTableID", 1004);\r
+\r
+               this.guiPyrolysisTableID = guiPyrolysisTableIDProp.getInt();\r
+               this.guiElectrolysisTableID = guiElectrolysisTableIDProp.getInt();\r
+               this.guiChemicalCombinationTableID = guiChemicalCombinationTableIDProp.getInt();\r
+               this.guiToolAndWeaponCraftingTableID = guiToolAndWeaponCraftingTableIDProp.getInt();\r
+               this.guiChemicalCraftingTableID = guiChemicalCraftingTableIDProp.getInt();\r
+\r
+               cfg.save();\r
+       }\r
+\r
+\r
+\r
+       @ServerStarting\r
+       public void serverStarting(final FMLServerStartingEvent event) {\r
+               event.registerServerCommand(new CommandSetTile());\r
+               event.registerServerCommand(new CommandDeleteItem());\r
+               event.registerServerCommand(new CommandGenDebugRoom());\r
+       }\r
+\r
+\r
+\r
+       @Init\r
+       public void chemiPostLoadMethod(final FMLInitializationEvent event) {\r
+               this.thread = new Thread(this);\r
+               this.event = event;\r
+               this.thread.start();\r
+\r
+               try {\r
+                       this.thread.join();\r
+               } catch (InterruptedException e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+               proxy.registerRenderInformation();\r
+               Thread.yield();\r
+       }\r
+\r
+\r
+\r
+       @Override\r
+       public void run() {\r
+               while (true) {\r
+                       if (proxy != null && instance != null) {\r
+                               this.settingProcessing((FMLInitializationEvent) event);\r
+                               this.debug((FMLInitializationEvent) event);\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               Thread loadCheckThread = new Thread() {\r
+                       @Override\r
+                       public void run() {\r
+                               while (true) {\r
+                                       List<ModContainer> mod = Loader.instance().getModList();\r
+                                       ModContainer finalMod = mod.get(mod.size()-1);\r
+                                       ModState finalModState = Loader.instance().getModState(finalMod);\r
+                                       if (finalModState == ModState.POSTINITIALIZED) {\r
+                                               ChemiCraftCore.logger.write("ChemiCraftCore>APIProcessing", EnumLoggingType.INFO);\r
+                                               apiProcessing((FMLInitializationEvent) event);\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+               loadCheckThread.start();\r
+\r
+       }\r
+\r
+\r
+\r
+       protected void settingProcessing(final FMLInitializationEvent event) {\r
+\r
+               this.registerItem.start();\r
+               this.registerBlock.start();\r
+               this.registerRecipe.start();\r
+               this.registerTileEntity.start();\r
+\r
+               // GUIを追加します\r
+               NetworkRegistry.instance().registerGuiHandler(instance, proxy);\r
+\r
+               this.api.addPyrolysisDecompositionFuel(new ItemStack(Item.coal), 2000*8);\r
+               this.api.addElectrolysisDecompositionFuel(new ItemStack(this.itemChemicalCells), 1000*8);\r
+       }\r
+\r
+\r
+\r
+       private void apiProcessing(final FMLInitializationEvent event) {\r
+               Iterator<String> langcompoundsItr = this.api.getCompoundsName().keySet().iterator();\r
+               while (langcompoundsItr.hasNext()) {\r
+                       String lang = langcompoundsItr.next();\r
+                       ArrayList<String> names = this.api.getCompoundsName().get(lang);\r
+                       for (int i = 0; i < names.size(); i++) {\r
+                               ChemiCraftCore.logger.write("CompoundAddName:" + "Name-" + names.get(i) + "/Damage-" + i + "/Lang-" + lang,\r
+                                               EnumLoggingType.INFO);\r
+\r
+                               LanguageRegistry.instance().addNameForObject(\r
+                                               new ItemStack(this.itemCompounds, 1, i),\r
+                                               lang,\r
+                                               names.get(i));\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+\r
+\r
+       public static EntityDamageSource getRadiationDamageSource(Entity par1Entity){\r
+               return new EntityDamageSource("radiation", par1Entity){\r
+                       @Override\r
+                       public String getDeathMessage(EntityLiving par1EntityLiving) {\r
+                               if (par1EntityLiving instanceof EntityPlayer) {\r
+                                       return ((EntityPlayer) (par1EntityLiving)).username + " is dead by radiation.";\r
+                               } else {\r
+                                       return par1EntityLiving.getEntityName() + " is dead by radiation.";\r
+                               }\r
+                       }\r
+               };\r
+       }\r
+\r
+\r
+\r
+       private void debug(final FMLInitializationEvent event) {\r
+               //this.proxy.registerTickHandler();\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftCoreRegister.java b/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftCoreRegister.java
new file mode 100644 (file)
index 0000000..f51c35d
--- /dev/null
@@ -0,0 +1,17 @@
+package asia.tcrs.ccnp.chemicraftnext.core;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftRegister;\r
+\r
+/**\r
+ * ChemiCraftCoreの追加の親クラスです\r
+ * @author mozipi,ponkotate\r
+ */\r
+public abstract class ChemiCraftCoreRegister implements ChemiCraftRegister {\r
+\r
+       protected ChemiCraftCore mod;\r
+\r
+       public ChemiCraftCoreRegister(ChemiCraftCore mod) {\r
+               this.mod = mod;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterBlock.java b/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterBlock.java
new file mode 100644 (file)
index 0000000..6bd2ac4
--- /dev/null
@@ -0,0 +1,73 @@
+package asia.tcrs.ccnp.chemicraftnext.core;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.core.block.BlockChemicalCombinationTable;\r
+import asia.tcrs.ccnp.chemicraftnext.core.block.BlockChemicalCraftingTable;\r
+import asia.tcrs.ccnp.chemicraftnext.core.block.BlockElectrolysisTable;\r
+import asia.tcrs.ccnp.chemicraftnext.core.block.BlockPyrolysisTable;\r
+import net.minecraft.block.Block;\r
+import net.minecraft.block.material.Material;\r
+import cpw.mods.fml.common.registry.GameRegistry;\r
+\r
+/**\r
+ * Blockを追加します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterBlock extends ChemiCraftCoreRegister {\r
+\r
+       public ChemiCraftRegisterBlock(ChemiCraftCore mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               //Blockを変数に代入\r
+               this.mod.blockPyrolysisTable = new BlockPyrolysisTable(this.mod.pyrolysisTableID, Material.ground).\r
+                               setHardness(2.0F).\r
+                               setResistance(0.0F).\r
+                               setStepSound(Block.soundStoneFootstep).\r
+                               setUnlocalizedName("PyrolysisTable");\r
+               this.mod.blockElectrolysisTable = new BlockElectrolysisTable(this.mod.electrolysisTableID, Material.ground).\r
+                               setHardness(2.0F).\r
+                               setResistance(0.0F).\r
+                               setStepSound(Block.soundStoneFootstep).\r
+                               setUnlocalizedName("ElectrolysisTable");\r
+               this.mod.blockChemicalCombinationTable = new BlockChemicalCombinationTable(this.mod.chemicalConbinationTableID, Material.ground).\r
+                               setHardness(2.0F).\r
+                               setResistance(0.0F).\r
+                               setStepSound(Block.soundStoneFootstep).\r
+                               setUnlocalizedName("ChemicalCombinationTable");\r
+               /*\r
+               this.mod.blockToolAndWeaponCraftingTable = new BlockToolAndWeaponCraftingTable(this.mod.toolAndWeaponCraftingTableID, 3, Material.ground).\r
+                               setHardness(2.0F).\r
+                               setResistance(0.0F).\r
+                               setStepSound(Block.soundStoneFootstep).\r
+                               setUnlocalizedName("ToolAndWeaponCraftingTable");\r
+               */\r
+               this.mod.blockChemicalCraftingTable = new BlockChemicalCraftingTable(this.mod.chemicalCraftingTableID, Material.ground).\r
+                               setHardness(2.0F).\r
+                               setResistance(0.0F).\r
+                               setStepSound(Block.soundStoneFootstep).\r
+                               setUnlocalizedName("ChemicalCraftingTable");\r
+\r
+               //Minecraftに登録\r
+               GameRegistry.registerBlock(this.mod.blockPyrolysisTable, "BlockPyrolysisTable");\r
+               GameRegistry.registerBlock(this.mod.blockChemicalCombinationTable, "BlockChemicalCombinationTable");\r
+               // GameRegistry.registerBlock(this.mod.blockToolAndWeaponCraftingTable, "BlockToolAndWeaponCraftingTable");\r
+               GameRegistry.registerBlock(this.mod.blockChemicalCraftingTable, "BlockMaterialCraftingTable");\r
+               GameRegistry.registerBlock(this.mod.blockElectrolysisTable, "BlockElectrolysisTable");\r
+\r
+               //名前登録\r
+               this.mod.nameAuxiliary.addName(this.mod.blockPyrolysisTable, "PyrolysisTable");\r
+               this.mod.nameAuxiliary.addName(this.mod.blockPyrolysisTable, "ja_JP", "熱分解台");\r
+               this.mod.nameAuxiliary.addName(this.mod.blockChemicalCombinationTable, "ChemicalCombinationTable");\r
+               this.mod.nameAuxiliary.addName(this.mod.blockChemicalCombinationTable, "ja_JP", "化合台");\r
+               // this.mod.nameAuxiliary.addName(this.mod.blockToolAndWeaponCraftingTable, "ToolAndWeaponCraftingTable");\r
+               // this.mod.nameAuxiliary.addName(this.mod.blockToolAndWeaponCraftingTable, "ja_JP", "ツール&武器製作台");\r
+               this.mod.nameAuxiliary.addName(this.mod.blockChemicalCraftingTable, "ChemicalCraftingTable");\r
+               this.mod.nameAuxiliary.addName(this.mod.blockChemicalCraftingTable, "ja_JP", "素材製作台");\r
+               this.mod.nameAuxiliary.addName(this.mod.blockElectrolysisTable, "ElectrolysisTable");\r
+               this.mod.nameAuxiliary.addName(this.mod.blockElectrolysisTable, "ja_JP", "電気分解台");\r
+\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterCoreRecipe.java b/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterCoreRecipe.java
new file mode 100644 (file)
index 0000000..5bdb547
--- /dev/null
@@ -0,0 +1,117 @@
+package asia.tcrs.ccnp.chemicraftnext.core;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;\r
+import net.minecraft.block.Block;\r
+import net.minecraft.item.Item;\r
+import net.minecraft.item.ItemStack;\r
+import cpw.mods.fml.common.registry.GameRegistry;\r
+\r
+/**\r
+ * レシピを追加します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterCoreRecipe extends ChemiCraftCoreRegister {\r
+\r
+       public ChemiCraftRegisterCoreRecipe(ChemiCraftCore mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               GameRegistry.addRecipe(new ItemStack(this.mod.itemGasCollectingBottle),\r
+                               new Object[]{\r
+                       " X ", "X X", "XXX",\r
+                       Character.valueOf('X'), new ItemStack(Item.ingotIron),\r
+               });\r
+\r
+               //科学作業台のレシピ\r
+               GameRegistry.addRecipe(new ItemStack(this.mod.blockPyrolysisTable),\r
+                               new Object[]{\r
+                       "XXX", "ZAZ", "ZYZ",\r
+                       Character.valueOf('X'), new ItemStack(Block.stone),\r
+                       Character.valueOf('Y'), new ItemStack(Item.bucketLava),\r
+                       Character.valueOf('Z'), new ItemStack(Item.ingotGold),\r
+                       Character.valueOf('A'), new ItemStack(this.mod.blockElectrolysisTable),\r
+               });\r
+\r
+               GameRegistry.addRecipe(new ItemStack(this.mod.blockElectrolysisTable),\r
+                               new Object[]{\r
+                       "XAX", "YZY", "ZZZ",\r
+                       Character.valueOf('X'), new ItemStack(Item.redstone),\r
+                       Character.valueOf('Y'), new ItemStack(this.mod.itemChemicalCells),\r
+                       Character.valueOf('Z'), new ItemStack(Item.ingotGold),\r
+                       Character.valueOf('A'), new ItemStack(Block.workbench),\r
+               });\r
+\r
+               GameRegistry.addRecipe(new ItemStack(this.mod.blockChemicalCombinationTable),\r
+                               new Object[]{\r
+                       "XYX", "ZAZ", "XYX",\r
+                       Character.valueOf('X'), new ItemStack(Item.ingotGold),\r
+                       Character.valueOf('Y'), new ItemStack(Item.ingotIron),\r
+                       Character.valueOf('Z'), new ItemStack(this.mod.itemAtoms, 1, this.mod.chemicalData.toAtoms("U")),\r
+                       Character.valueOf('A'), new ItemStack(Block.hopperBlock),\r
+               });\r
+\r
+               /*\r
+               GameRegistry.addRecipe(new ItemStack(this.mod.blockToolAndWeaponCraftingTable),\r
+                               new Object[]{\r
+                       "XYX", "ZAZ", "ZZZ",\r
+                       Character.valueOf('X'), new ItemStack(Item.ingotIron),\r
+                       Character.valueOf('Y'), new ItemStack(Block.workbench),\r
+                       Character.valueOf('Z'), new ItemStack(Block.stone),\r
+                       Character.valueOf('A'), new ItemStack(Item.pickaxeSteel),\r
+               });\r
+                */\r
+\r
+               GameRegistry.addRecipe(new ItemStack(this.mod.blockChemicalCraftingTable),\r
+                               new Object[]{\r
+                       "XXX", "ZAZ", "ZZZ",\r
+                       Character.valueOf('X'), new ItemStack(this.mod.itemGasCollectingBottle),\r
+                       Character.valueOf('Y'), new ItemStack(Item.dyePowder, 1, 4),\r
+                       Character.valueOf('Z'), new ItemStack(Block.stone),\r
+                       Character.valueOf('A'), new ItemStack(Block.workbench),\r
+               });\r
+\r
+               GameRegistry.addRecipe(new ItemStack(this.mod.itemChemicalCells),\r
+                               new Object[]{\r
+                       " X ", "ZYZ", "ZYZ",\r
+                       Character.valueOf('X'), new ItemStack(Item.redstone),\r
+                       Character.valueOf('Y'), new ItemStack(Item.ingotGold),\r
+                       Character.valueOf('Z'), new ItemStack(Item.ingotIron),\r
+               });\r
+\r
+               //素材制作台のレシピ\r
+               this.mod.api.addMaterialRecipe(\r
+                               new ItemStack[] {\r
+                                               null,\r
+                                               null,\r
+                                               null,\r
+                                               new ItemStack(this.mod.itemAtoms, 1, this.mod.chemicalData.ZINC),\r
+                                               null,\r
+                                               new ItemStack(this.mod.itemAtoms, 1, this.mod.chemicalData.COPPER),\r
+                                               new ItemStack(Item.bucketWater),\r
+                                               new ItemStack(Item.bucketWater),\r
+                                               new ItemStack(Item.bucketWater),\r
+                               },\r
+                               new ItemStack(this.mod.itemChemicalCells),\r
+                               null);\r
+\r
+               this.mod.api.addMaterialRecipe(\r
+                               new ItemStack[] {\r
+                                               new ItemStack(this.mod.itemAtoms, 1, ChemiCraftData.toAtoms("Na")),\r
+                                               new ItemStack(this.mod.itemAtoms, 1, ChemiCraftData.toAtoms("C")),\r
+                                               new ItemStack(this.mod.itemAtoms, 1, ChemiCraftData.toAtoms("I")),\r
+                                               null,\r
+                                               new ItemStack(Item.appleRed),\r
+                                               null,\r
+                                               null,\r
+                                               null,\r
+                                               null,\r
+                               },\r
+                               new ItemStack(this.mod.itemPear),\r
+                               null\r
+                               );\r
+\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterItem.java b/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterItem.java
new file mode 100644 (file)
index 0000000..c5e4d9f
--- /dev/null
@@ -0,0 +1,56 @@
+package asia.tcrs.ccnp.chemicraftnext.core;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;\r
+import asia.tcrs.ccnp.chemicraftnext.core.item.ItemAtoms;\r
+import asia.tcrs.ccnp.chemicraftnext.core.item.ItemChemicalCell;\r
+import asia.tcrs.ccnp.chemicraftnext.core.item.ItemCompounds;\r
+import asia.tcrs.ccnp.chemicraftnext.core.item.ItemGasCollectingBottle;\r
+import net.minecraft.client.renderer.texture.IconRegister;\r
+import net.minecraft.creativetab.CreativeTabs;\r
+import net.minecraft.item.ItemFood;\r
+import net.minecraft.item.ItemStack;\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+\r
+/**\r
+ * アイテムを追加します\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class ChemiCraftRegisterItem extends ChemiCraftCoreRegister {\r
+\r
+       public ChemiCraftRegisterItem(ChemiCraftCore mod) {\r
+               super(mod);\r
+       }\r
+\r
+       @Override\r
+       public void start() {\r
+               //Itemを変数に代入\r
+               this.mod.itemAtoms = new ItemAtoms(this.mod.atomsID).setUnlocalizedName(ChemiCraft.TEXTURE + "atoms");\r
+               this.mod.itemCompounds = new ItemCompounds(this.mod.compoundsID).setUnlocalizedName("compounds");\r
+               this.mod.itemGasCollectingBottle = new ItemGasCollectingBottle(this.mod.gasCollectingBottleID).setUnlocalizedName("gasCollectingBottle");\r
+               this.mod.itemChemicalCells = new ItemChemicalCell(this.mod.chemicalCellsID).setUnlocalizedName("chemicalCell");\r
+               this.mod.itemPear = new ItemFood(this.mod.pearID, 4, 0.4F, false){\r
+                       @Override\r
+                       @SideOnly(Side.CLIENT)\r
+                       public void registerIcons(IconRegister par1IconRegister) {\r
+                               this.itemIcon = par1IconRegister.registerIcon("appleGold");\r
+                       }\r
+                       @Override\r
+                       public int getColorFromItemStack(ItemStack par1ItemStack,int par2){\r
+                               return 0x66FF66;\r
+                               }\r
+                       }.setCreativeTab(CreativeTabs.tabFood).setUnlocalizedName(ChemiCraft.TEXTURE + "Pear");\r
+\r
+               //名前登録&Minecraftに登録\r
+               this.mod.nameAuxiliary.addName(this.mod.itemAtoms, ChemiCraftCore.ATOMSNAME);\r
+               this.mod.nameAuxiliary.addName(this.mod.itemAtoms, "ja_JP", ChemiCraftCore.ATOMSNAMEJP);\r
+               this.mod.nameAuxiliary.addName(this.mod.itemGasCollectingBottle, "GasCollectingBottle");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemGasCollectingBottle, "ja_JP", "集気瓶");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemChemicalCells, "ChemicalCell");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemChemicalCells, "ja_JP",  "化学電池");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemPear, "Pear");\r
+               this.mod.nameAuxiliary.addName(this.mod.itemPear, "ja_JP",  "梨");\r
+\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterTileEntity.java b/src/asia/tcrs/ccnp/chemicraftnext/core/ChemiCraftRegisterTileEntity.java
new file mode 100644 (file)
index 0000000..8c13870
--- /dev/null
@@ -0,0 +1,29 @@
+package asia.tcrs.ccnp.chemicraftnext.core;
+
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCombinationTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityElectrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityPyrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityToolAndWeaponCraftingTable;
+import cpw.mods.fml.common.registry.GameRegistry;
+
+/**
+ * TileEntityを追加します
+ * @author mozipi,ponkotate
+ */
+public class ChemiCraftRegisterTileEntity extends ChemiCraftCoreRegister {
+
+       public ChemiCraftRegisterTileEntity(ChemiCraftCore mod) {
+               super(mod);
+       }
+
+       @Override
+       public void start() {
+               GameRegistry.registerTileEntity(TileEntityPyrolysisTable.class, "TileEntityPyrolysisTable");
+               GameRegistry.registerTileEntity(TileEntityChemicalCombinationTable.class, "TileEntityChemicalCombinationTable");
+               GameRegistry.registerTileEntity(TileEntityToolAndWeaponCraftingTable.class, "TileEntityToolAndWeaponCraftingTable");
+               GameRegistry.registerTileEntity(TileEntityChemicalCraftingTable.class, "TileEntityChemicalCraftingTable");
+               GameRegistry.registerTileEntity(TileEntityElectrolysisTable.class, "TileEntityElectrolysisTable");
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockChemicalCombinationTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockChemicalCombinationTable.java
new file mode 100644 (file)
index 0000000..6c438a8
--- /dev/null
@@ -0,0 +1,81 @@
+package asia.tcrs.ccnp.chemicraftnext.core.block;
+
+import java.util.Random;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCombinationTable;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+
+public class BlockChemicalCombinationTable extends BlockContainer {
+
+       public Icon topIcon;
+       public Icon bottomIcon;
+       public Icon globalIcon;
+
+       private final Random random = new Random();
+
+       public BlockChemicalCombinationTable(int par1, Material par2Material) {
+               super(par1, par2Material);
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);
+       }
+
+
+
+       @Override
+       public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) {
+               par5EntityPlayer.openGui(ChemiCraftCore.instance, ChemiCraftCore.instance.guiChemicalCombinationTableID, par1World, par2, par3, par4);
+               return true;
+       }
+
+
+
+       @Override
+       public void registerIcons(IconRegister par1IconRegister) {
+               this.topIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "ChemicalCombinationTable");
+               this.bottomIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Bottom");
+               this.globalIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Side");
+       }
+
+
+
+       public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) {
+               if (!par1World.isRemote) {
+                       boolean var7 = par1World.isBlockIndirectlyGettingPowered(par2, par3, par4);
+                       if(var7) {
+                               TileEntityChemicalCombinationTable tileentity;
+                               try {
+                                       tileentity = (TileEntityChemicalCombinationTable) par1World.getBlockTileEntity(par2, par3, par4);
+                               } catch(ClassCastException e) {
+                                       return;
+                               }
+                               tileentity.setProvidePower(true);
+                       }
+               }
+       }
+
+
+
+       @Override
+       public Icon getIcon(int par1, int par2) {
+               if(par1 == 0){
+                       return this.bottomIcon;
+               }else if(par1 == 1){
+                       return this.topIcon;
+               }else{
+                       return this.globalIcon;
+               }
+       }
+
+       @Override
+       public TileEntity createNewTileEntity(World var1) {
+               return new TileEntityChemicalCombinationTable();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockChemicalCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockChemicalCraftingTable.java
new file mode 100644 (file)
index 0000000..ab1757b
--- /dev/null
@@ -0,0 +1,60 @@
+package asia.tcrs.ccnp.chemicraftnext.core.block;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCraftingTable;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+
+public class BlockChemicalCraftingTable extends BlockContainer {
+
+       public Icon topIcon;
+       public Icon bottomIcon;
+       public Icon globalIcon;
+
+       public BlockChemicalCraftingTable(int par1, Material par2Material) {
+               super(par1, par2Material);
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);
+       }
+
+
+       @Override
+       public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9){
+               par5EntityPlayer.openGui(ChemiCraftCore.instance, ChemiCraftCore.instance.guiChemicalCraftingTableID, par1World, par2, par3, par4);
+               return true;
+       }
+
+
+
+       @Override
+       public void registerIcons(IconRegister par1IconRegister) {
+               this.topIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "ChemicalCraftingTable");
+               this.bottomIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Bottom");
+               this.globalIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Side");
+       }
+
+
+
+       @Override
+       public Icon getIcon(int par1, int par2) {
+               if(par1 == 0){
+                       return this.bottomIcon;
+               }else if(par1 == 1){
+                       return this.topIcon;
+               }else{
+                       return this.globalIcon;
+               }
+       }
+
+
+
+       @Override
+       public TileEntity createNewTileEntity(World var1) {
+               return new TileEntityChemicalCraftingTable();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockElectrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockElectrolysisTable.java
new file mode 100644 (file)
index 0000000..9e631b8
--- /dev/null
@@ -0,0 +1,63 @@
+package asia.tcrs.ccnp.chemicraftnext.core.block;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.debug.DebugTick;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityElectrolysisTable;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+
+public class BlockElectrolysisTable extends BlockContainer {
+
+       public Icon topIcon;
+       public Icon bottomIcon;
+       public Icon globalIcon;
+
+       public BlockElectrolysisTable(int par1, Material par2Material) {
+               super(par1, par2Material);
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);
+       }
+
+       @Override
+       public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) {
+               par5EntityPlayer.openGui(ChemiCraftCore.instance, ChemiCraftCore.instance.guiElectrolysisTableID, par1World, par2, par3, par4);
+               return true;
+       }
+
+       @Override
+       public void registerIcons(IconRegister par1IconRegister) {
+               this.topIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "ElectrolysisTable");
+               this.bottomIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Bottom");
+               this.globalIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Side");
+       }
+
+       @Override
+       public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) {
+               TileEntity tileentity = par1World.getBlockTileEntity(par2, par3, par4);
+               if (tileentity != null) {
+                       DebugTick.removeDebugData("ElectrolysisTable" + "(x:" + tileentity.xCoord + " y:" + tileentity.yCoord + " z:" + tileentity.zCoord + ")");
+               }
+               super.breakBlock(par1World, par2, par3, par4, par5, par6);
+       }
+
+       @Override
+       public Icon getIcon(int par1, int par2) {
+               if(par1 == 0){
+                       return this.bottomIcon;
+               }else if(par1 == 1){
+                       return this.topIcon;
+               }else{
+                       return this.globalIcon;
+               }
+       }
+
+       @Override
+       public TileEntity createNewTileEntity(World var1) {
+               return new TileEntityElectrolysisTable();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockPyrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockPyrolysisTable.java
new file mode 100644 (file)
index 0000000..ad4503f
--- /dev/null
@@ -0,0 +1,72 @@
+package asia.tcrs.ccnp.chemicraftnext.core.block;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.debug.DebugTick;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityPyrolysisTable;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+
+public class BlockPyrolysisTable extends BlockContainer {
+
+       public Icon topIcon;
+       public Icon bottomIcon;
+       public Icon globalIcon;
+
+       public BlockPyrolysisTable(int par1, Material par2Material) {
+               super(par1, par2Material);
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);
+       }
+
+       @Override
+       public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9){
+               par5EntityPlayer.openGui(ChemiCraftCore.instance, ChemiCraftCore.instance.guiPyrolysisTableID, par1World, par2, par3, par4);
+               return true;
+       }
+
+
+
+       @Override
+       public void registerIcons(IconRegister par1IconRegister) {
+               this.topIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "PyrolysisTable");
+               this.bottomIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Bottom");
+               this.globalIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Side");
+       }
+
+
+
+       @Override
+       public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) {
+               TileEntity tileentity = par1World.getBlockTileEntity(par2, par3, par4);
+               if (tileentity != null) {
+                       DebugTick.removeDebugData("PyrolysisTable" +
+                                       "(x:" + tileentity.xCoord +
+                                       " y:" + tileentity.yCoord +
+                                       " z:" + tileentity.zCoord + ")");
+               }
+               super.breakBlock(par1World, par2, par3, par4, par5, par6);
+       }
+
+
+
+       @Override
+       public Icon getIcon(int par1, int par2) {
+               if(par1 == 0){
+                       return this.bottomIcon;
+               }else if(par1 == 1){
+                       return this.topIcon;
+               }else{
+                       return this.globalIcon;
+               }
+       }
+
+       @Override
+       public TileEntity createNewTileEntity(World var1) {
+               return new TileEntityPyrolysisTable();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockToolAndWeaponCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/block/BlockToolAndWeaponCraftingTable.java
new file mode 100644 (file)
index 0000000..2316b3b
--- /dev/null
@@ -0,0 +1,57 @@
+package asia.tcrs.ccnp.chemicraftnext.core.block;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityToolAndWeaponCraftingTable;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+
+public class BlockToolAndWeaponCraftingTable extends BlockContainer {
+
+       public Icon topIcon;
+       public Icon bottomIcon;
+       public Icon globalIcon;
+
+       public BlockToolAndWeaponCraftingTable(int par1, Material par2Material) {
+               super(par1, par2Material);
+               this.setCreativeTab(ChemiCraftCore.creativeTabChemiCraft);
+       }
+
+       @Override
+       public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9){
+               par5EntityPlayer.openGui(ChemiCraftCore.instance, ChemiCraftCore.instance.guiToolAndWeaponCraftingTableID, par1World, par2, par3, par4);
+               return true;
+       }
+
+
+
+       @Override
+       public void registerIcons(IconRegister par1IconRegister) {
+               this.topIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "ToolAndWeaponCraftingTable");
+               this.bottomIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Bottom");
+               this.globalIcon = par1IconRegister.registerIcon(ChemiCraftCore.CCTABLE + "Side");
+       }
+
+
+
+       
+       public Icon getIcon(int par1, int par2) {
+               if(par1 == 0){
+                       return this.bottomIcon;
+               }else if(par1 == 1){
+                       return this.topIcon;
+               }else{
+                       return this.globalIcon;
+               }
+       }
+
+       @Override
+       public TileEntity createNewTileEntity(World var1) {
+               return new TileEntityToolAndWeaponCraftingTable();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/client/ClientProxy.java b/src/asia/tcrs/ccnp/chemicraftnext/core/client/ClientProxy.java
new file mode 100644 (file)
index 0000000..5a8aaf8
--- /dev/null
@@ -0,0 +1,71 @@
+package asia.tcrs.ccnp.chemicraftnext.core.client;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerElectrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.debug.DebugTick;
+import asia.tcrs.ccnp.chemicraftnext.core.gui.GuiChemicalCombinationTable;
+import asia.tcrs.ccnp.chemicraftnext.core.gui.GuiChemicalCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.gui.GuiElectrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.gui.GuiPyrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.gui.GuiToolAndWeaponCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.system.CommonProxy;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCombinationTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityElectrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityPyrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityToolAndWeaponCraftingTable;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.client.MinecraftForgeClient;
+import cpw.mods.fml.client.FMLClientHandler;
+import cpw.mods.fml.common.registry.TickRegistry;
+import cpw.mods.fml.relauncher.Side;
+
+public class ClientProxy extends CommonProxy {
+
+       @Override
+       public void registerRenderInformation() {
+               MinecraftForgeClient.preloadTexture(ChemiCraft.GUI_PYROLYSIS_TEXTURE);
+               MinecraftForgeClient.preloadTexture(ChemiCraft.GUI_ELECTROLYSIS_TEXTURE);
+               MinecraftForgeClient.preloadTexture(ChemiCraft.GUI_CHEMICALCOMBINATION_TEXTURE);
+               MinecraftForgeClient.preloadTexture(ChemiCraft.GUI_CHEMICALCRAFTING_TEXTURE);
+               MinecraftForgeClient.preloadTexture(ChemiCraft.GUI_TOOLANDWEAPONCRAFTING_TEXTURE);
+               MinecraftForgeClient.preloadTexture(ChemiCraft.ENTITY_PARTICLE_TEXRURE);
+       }
+
+
+       @Override
+       public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
+               if (!world.blockExists(x, y, z))
+                       return null;
+
+               TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
+               if (tileEntity instanceof TileEntityPyrolysisTable) {
+                       return new GuiPyrolysisTable(player, (TileEntityPyrolysisTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityElectrolysisTable){
+                       return new GuiElectrolysisTable(player, (TileEntityElectrolysisTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityChemicalCombinationTable){
+                       return new GuiChemicalCombinationTable(player, (TileEntityChemicalCombinationTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityToolAndWeaponCraftingTable){
+                       return new GuiToolAndWeaponCraftingTable(player, (TileEntityToolAndWeaponCraftingTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityChemicalCraftingTable){
+                       return new GuiChemicalCraftingTable(player, (TileEntityChemicalCraftingTable) tileEntity);
+               } else if (tileEntity instanceof TileEntityElectrolysisTable) {
+                       return new ContainerElectrolysisTable(player, (TileEntityElectrolysisTable) tileEntity);
+               }
+               return null;
+       }
+
+
+       @Override
+       public World getClientWorld() {
+               return FMLClientHandler.instance().getClient().theWorld;
+       }
+
+       @Override
+       public void registerTickHandler() {
+               TickRegistry.registerTickHandler(new DebugTick(), Side.CLIENT);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerChemicalCombinationTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerChemicalCombinationTable.java
new file mode 100644 (file)
index 0000000..a062d34
--- /dev/null
@@ -0,0 +1,156 @@
+package asia.tcrs.ccnp.chemicraftnext.core.container;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCombinationTableMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCombinationTableResult;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotAtoms;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotResult;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCombinationTable;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import cpw.mods.fml.common.network.PacketDispatcher;
+
+public class ContainerChemicalCombinationTable extends Container {
+
+       /**
+        * the world.
+        */
+       private World worldObj;
+
+       /**
+        * the TileEntity of Position.
+        */
+       private int posX;
+       private int posY;
+       private int posZ;
+
+       /**
+        * the TileEntity.
+        */
+       private TileEntityChemicalCombinationTable tileentity;
+
+       /**
+        * the Inventory's.
+        */
+       private InventoryChemicalCombinationTableMaterial invm;
+       private InventoryChemicalCombinationTableResult invr;
+
+       /**
+        * the EntityPlayer.
+        */
+       private EntityPlayer entityplayer;
+
+       public ContainerChemicalCombinationTable(EntityPlayer par1EntityPlayer, TileEntityChemicalCombinationTable par2) {
+               super();
+               this.entityplayer = par1EntityPlayer;
+               this.tileentity = par2;
+               this.worldObj = tileentity.worldObj;
+               this.posX = tileentity.xCoord;
+               this.posY = tileentity.yCoord;
+               this.posZ = tileentity.zCoord;
+               this.invm = this.tileentity.getInvMaterial();
+               this.invr = this.tileentity.getInvResult();
+
+               for(int i = 0;i < 5;i++){
+                       for(int j = 0;j < 3;j++){
+                               this.addSlotToContainer(new SlotAtoms(this.invm, i * 3 + j, i * 18 + 16, j * 18 + 15));
+                       }
+               }
+               this.addSlotToContainer(new SlotResult(invr, 0, 123, 34));
+
+
+               int var3;
+               for (var3 = 0; var3 < 3; ++var3)
+               {
+                       for (int var4 = 0; var4 < 9; ++var4)
+                       {
+                               this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var4 + var3 * 9 + 9, 8 + var4 * 18, 121 + var3 * 18));
+                       }
+               }
+
+               for (var3 = 0; var3 < 9; ++var3)
+               {
+                       this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var3, 8 + var3 * 18, 179));
+               }
+
+               this.invm.setEventHandler(this);
+               this.onCraftMatrixChanged(invm);
+       }
+
+
+
+       @Override
+       public void onCraftMatrixChanged(IInventory par1IInventory){
+               this.invr.setInventorySlotContents(0, ChemiCraftAPI.instance().getCraftingManager().getChemicalCombinationResult(this.tileentity.getAtomsList(), this.tileentity.getAtomsAmountList()));
+               if (par1IInventory instanceof InventoryChemicalCombinationTableResult) {
+                       PacketDispatcher.sendPacketToServer(this.tileentity.getDescriptionPacket());
+               }
+       }
+
+       public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
+       {
+               super.onCraftGuiClosed(par1EntityPlayer);
+       }
+
+       @Override
+       public boolean canInteractWith(EntityPlayer par1EntityPlayer){
+               return this.worldObj.getBlockId(this.posX, this.posY, this.posZ) != ChemiCraftCore.instance.chemicalConbinationTableID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D;
+       }
+
+       @Override
+       public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) {
+               ItemStack var3 = null;
+               Slot var4 = (Slot)this.inventorySlots.get(par2);
+               Slot var6 = (Slot)this.inventorySlots.get(0);
+
+               if (var4 != null && var4.getHasStack()) {
+                       ItemStack var5 = var4.getStack();
+                       var3 = var5.copy();
+                       if (par2 >= 0 && par2 < 16) {
+                               if (!this.mergeItemStack(var5, 16, 52, false)) {
+                                       return null;
+                               }
+                       } else if (par2 >= 16 && par2 < 53) {
+                               if (var6.isItemValid(var3)) {
+                                       if (!this.mergeItemStack(var5, 0, 15, false)) {
+                                               return null;
+                                       }
+                               }
+                       } else if(par2 == 16) {
+                               if (!this.mergeItemStack(var5, 16, 52, false)) {
+                                       return null;
+                               }
+                       }
+
+                       if (var5.stackSize == 0) {
+                               var4.putStack((ItemStack)null);
+                       } else {
+                               var4.onSlotChanged();
+                       }
+
+                       if (var5.stackSize == var3.stackSize) {
+                               return null;
+                       }
+
+                       var4.onPickupFromSlot(par1EntityPlayer, var5);
+               }
+
+               return var3;
+       }
+
+       @Override
+       public ItemStack slotClick(int par1, int par2, int par3, EntityPlayer par4EntityPlayer) {
+               if (par1 == 15) {
+                       if (this.invr.getStackInSlot(0) != null) {
+                               this.tileentity.emptytoAtomsList();
+                       }
+               }
+               return super.slotClick(par1, par2, par3, par4EntityPlayer);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerChemicalCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerChemicalCraftingTable.java
new file mode 100644 (file)
index 0000000..dc3cc4f
--- /dev/null
@@ -0,0 +1,207 @@
+package asia.tcrs.ccnp.chemicraftnext.core.container;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingNBT;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingResult;
+import asia.tcrs.ccnp.chemicraftnext.core.nbt.ChemicalNBTRecipe;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotAtom;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotResult;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCraftingTable;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+public class ContainerChemicalCraftingTable extends Container {
+
+       /**
+        * Worldのインスタンス
+        */
+       private World worldObj;
+
+
+       /**
+        * BlockのX, Y, Z座標
+        */
+       private int posX;
+       private int posY;
+       private int posZ;
+
+
+       /**
+        * the TileEntity.
+        */
+       private TileEntityChemicalCraftingTable tileEntity;
+
+
+       private InventoryChemicalCraftingMaterial invm;
+       private InventoryChemicalCraftingResult invr;
+       private InventoryChemicalCraftingNBT invn;
+
+       private ChemicalNBTRecipe useNBT;
+
+
+
+       public ContainerChemicalCraftingTable(EntityPlayer par1EntityPlayer, TileEntityChemicalCraftingTable par2)
+       {
+               super();
+               this.worldObj = par2.worldObj;
+               this.posX = par2.xCoord;
+               this.posY = par2.yCoord;
+               this.posZ = par2.zCoord;
+               this.tileEntity = par2;
+               this.invm = (InventoryChemicalCraftingMaterial) this.tileEntity.chemicalCraftingInvMaterial;
+               this.invr = (InventoryChemicalCraftingResult) this.tileEntity.chemicalCraftingInvResult;
+               this.invn = (InventoryChemicalCraftingNBT) this.tileEntity.chemicalCraftingInvNBT;
+               //GenerateInventory
+               this.generateSlots(this.invm, this.invr, this.invn);
+               //GeneratePlayerInventory
+               int var3;
+
+               for (var3 = 0; var3 < 3; ++var3)
+               {
+                       for (int var4 = 0; var4 < 9; ++var4)
+                       {
+                               this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var4 + var3 * 9 + 9, 8 + var4 * 18, 85 + var3 * 18));
+                       }
+               }
+
+               for (var3 = 0; var3 < 9; ++var3)
+               {
+                       this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var3, 8 + var3 * 18, 143));
+               }
+
+               this.invm.setEventHandler(this);
+               this.invr.setEventHandler(this);
+               this.invn.setEventHandler(this);
+               this.onCraftMatrixChanged(invm);
+       }
+
+
+
+       @Override
+       public void onCraftMatrixChanged(IInventory par1IInventory){
+               this.useNBT = ChemiCraftAPI.instance().getCraftingManager().chemicalCrafting(this.invm, this.invr, this.invn);
+       }
+
+       @Override
+       public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
+       {
+               super.onCraftGuiClosed(par1EntityPlayer);
+
+               if (!this.worldObj.isRemote)
+               {
+                       for (int i = 0; i < 9; ++i)
+                       {
+                               ItemStack itemstack = this.invm.getStackInSlotOnClosing(i);
+
+                               if (itemstack != null)
+                               {
+                                       par1EntityPlayer.dropPlayerItem(itemstack);
+                               }
+                       }
+               }
+       }
+
+       @Override
+       public ItemStack slotClick(int par1, int par2, int par3, EntityPlayer par4EntityPlayer)
+       {
+               if(par1 == 12){
+                       if(this.invr.getStackInSlot(0) == null) return super.slotClick(par1, par2, par3, par4EntityPlayer);
+                       ItemStack var1 = par4EntityPlayer.inventory.getItemStack();
+                       if(var1 != null){
+                               if(var1.stackSize + this.invr.getStackInSlot(0).stackSize >= var1.getMaxStackSize()) return super.slotClick(par1, par2, par3, par4EntityPlayer);
+                       }
+                       for(int i = 0;i < this.invm.getSizeInventory();i++){
+                               if(this.invm.getStackInSlot(i) != null){
+                                       if(this.invm.getStackInSlot(i).stackSize > 1){
+                                               this.invm.getStackInSlot(i).stackSize--;
+                                       }else{
+                                               this.invm.setInventorySlotContents(i, null);
+                                       }
+                               }
+                       }
+                       ItemStack[] matchNBT = new ItemStack[this.invn.getSizeInventory()];
+                       for(int i = 0;i < this.invn.getSizeInventory();i++){
+                               matchNBT[i] = this.invn.getStackInSlot(i);
+                       }
+                       if(this.useNBT == null) return super.slotClick(par1, par2, par3, par4EntityPlayer);
+                       ItemStack[] useItems = this.useNBT.getMatchItems(matchNBT);
+                       for(int i = 0;i < useItems.length;i++){
+                               if(useItems[i] != null){
+                                       this.invn.setInventorySlotContents(i, null);
+                               }
+                       }
+               }
+               return super.slotClick(par1, par2, par3, par4EntityPlayer);
+       }
+
+       @Override
+       public boolean canInteractWith(EntityPlayer par1EntityPlayer){
+               return this.worldObj.getBlockId(this.posX, this.posY, this.posZ) != ChemiCraftCore.instance.chemicalCraftingTableID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D;
+       }
+
+
+
+       @Override
+       public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) {
+               ItemStack var3 = null;
+               Slot var4 = (Slot)this.inventorySlots.get(par2);
+               Slot var6 = (Slot)this.inventorySlots.get(0);
+
+               if (var4 != null && var4.getHasStack()) {
+                       ItemStack var5 = var4.getStack();
+                       var3 = var5.copy();
+                       if (par2 >= 0 && par2 < 3) {
+                               if (!this.mergeItemStack(var5, 13,49, false)) {
+                                       return null;
+                               }
+                       }
+                       if (par2 >= 3 && par2 < 13) {
+                               if (!this.mergeItemStack(var5, 13, 49, false)) {
+                                       return null;
+                               }
+                       } else if (par2 >= 13 && par2 < 49) {
+                               if (var6.isItemValid(var3)) {
+                                       if (!this.mergeItemStack(var5, 0, 2, false)) {
+                                               return null;
+                                       }
+                               } else if (!this.mergeItemStack(var5, 3, 13, false)) {
+                                       return null;
+                               }
+                       }
+
+                       if (var5.stackSize == 0) {
+                               var4.putStack((ItemStack)null);
+                       } else {
+                               var4.onSlotChanged();
+                       }
+
+                       if (var5.stackSize == var3.stackSize) {
+                               return null;
+                       }
+
+                       var4.onPickupFromSlot(par1EntityPlayer, var5);
+               }
+
+               return var3;
+       }
+
+
+
+       private void generateSlots(IInventory materialInv, IInventory resultInv, IInventory nbtInv){
+               for(int i = 0;i < 3;i++){
+                       this.addSlotToContainer(new SlotAtom(invn, i, 30 + 18 * i, 7));
+               }
+               for(int i = 0;i < 3;i++){
+                       for(int j = 0;j < 3;j++){
+                               this.addSlotToContainer(new Slot(invm, i * 3 + j, 30 + 18 * j, 27 + 18 * i));
+                       }
+               }
+               this.addSlotToContainer(new SlotResult(invr, 0, 123, 33));
+       }
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerElectrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerElectrolysisTable.java
new file mode 100644 (file)
index 0000000..0ceb384
--- /dev/null
@@ -0,0 +1,109 @@
+package asia.tcrs.ccnp.chemicraftnext.core.container;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryElectrolysisFuel;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryElectrolysisMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryElectrolysisResult;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotElectrolysisFuel;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotResult;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityElectrolysisTable;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+
+public class ContainerElectrolysisTable extends Container {
+
+       private World worldObj;
+
+       private int posX;
+       private int posY;
+       private int posZ;
+
+       private TileEntityElectrolysisTable tileentity;
+
+       private InventoryElectrolysisMaterial invm;
+       private InventoryElectrolysisResult invr;
+       private InventoryElectrolysisFuel invf;
+
+       public ContainerElectrolysisTable(EntityPlayer par1EntityPlayer, TileEntityElectrolysisTable par2) {
+               super();
+               this.tileentity = par2;
+               this.worldObj = par2.worldObj;
+               this.posX = par2.xCoord;
+               this.posY = par2.yCoord;
+               this.posZ = par2.zCoord;
+               this.invm = par2.getInvMaterial();
+               this.invr = par2.getInvResult();
+               this.invf = par2.getInvFuel();
+               this.invm.setEventHandler(this);
+               this.invr.setEventHandler(this);
+               this.invf.setEventHandler(this);
+
+               for (int i = 0; i < 4; i++) {
+                       for (int j = 0; j < 4; j++) {
+                               this.addSlotToContainer(new SlotResult(this.tileentity.getInvResult(), i*4 + j, 88+i*18, 17+j*18));
+                       }
+               }
+               this.addSlotToContainer(new Slot(this.tileentity.getInvMaterial(), 0, 27, 20));
+               this.addSlotToContainer(new SlotElectrolysisFuel(this.tileentity.getInvFuel(), 0, 27, 63));
+
+               int var3;
+               for (var3 = 0; var3 < 3; ++var3)
+               {
+                       for (int var4 = 0; var4 < 9; ++var4)
+                       {
+                               this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var4 + var3 * 9 + 9, 8 + var4 * 18, 121 + var3 * 18));
+                       }
+               }
+
+               for (var3 = 0; var3 < 9; ++var3)
+               {
+                       this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var3, 8 + var3 * 18, 179));
+               }
+       }
+
+       @Override
+       public boolean canInteractWith(EntityPlayer par1EntityPlayer)
+       {
+               return this.worldObj.getBlockId(this.posX, this.posY, this.posZ) != ChemiCraftCore.instance.electrolysisTableID ? false : par1EntityPlayer.getDistanceSq((double) this.posX + 0.5D, (double) this.posY + 0.5D, (double) this.posZ + 0.5D) <= 64.0D;
+       }
+
+       @Override
+       public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
+       {
+               ItemStack var3 = null;
+               Slot var4 = (Slot)this.inventorySlots.get(par2);
+
+               if (var4 != null && var4.getHasStack())
+               {
+                       ItemStack var5 = var4.getStack();
+                       var3 = var5.copy();
+
+                       if (par2 < 18 ){
+                               if (!this.mergeItemStack(var5, 18, this.inventorySlots.size(), true))
+                               {
+                                       return null;
+                               }
+                       }
+                       else if (!this.mergeItemStack(var5, 16, 18, false))
+                       {
+                               return null;
+                       }
+
+                       if (var5.stackSize == 0)
+                       {
+                               var4.putStack((ItemStack)null);
+                       }
+                       else
+                       {
+                               var4.onSlotChanged();
+                       }
+               }
+
+               return var3;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerPyrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerPyrolysisTable.java
new file mode 100644 (file)
index 0000000..cf3eb51
--- /dev/null
@@ -0,0 +1,108 @@
+package asia.tcrs.ccnp.chemicraftnext.core.container;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryPyrolysisTableFuel;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryPyrolysisTableMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryPyrolysisTableResult;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotPyrolysisTableFuel;
+import asia.tcrs.ccnp.chemicraftnext.core.slot.SlotResult;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityPyrolysisTable;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+
+public class ContainerPyrolysisTable extends Container {
+
+       private World worldObj;
+
+       private int posX;
+       private int posY;
+       private int posZ;
+
+       private TileEntityPyrolysisTable tileentity;
+
+       private InventoryPyrolysisTableMaterial invm;
+       private InventoryPyrolysisTableResult invr;
+       private InventoryPyrolysisTableFuel invf;
+
+       public ContainerPyrolysisTable(EntityPlayer par1EntityPlayer, TileEntityPyrolysisTable par2){
+               super();
+               this.tileentity = par2;
+               this.worldObj = par2.worldObj;
+               this.posX = par2.xCoord;
+               this.posY = par2.yCoord;
+               this.posZ = par2.zCoord;
+               this.invm = par2.getInvMaterial();
+               this.invr = par2.getInvResult();
+               this.invf = par2.getInvFuel();
+               this.invm.setEventHandler(this);
+               this.invr.setEventHandler(this);
+               this.invf.setEventHandler(this);
+
+               for (int i = 0; i < 4; i++) {
+                       for (int j = 0; j < 4; j++) {
+                               this.addSlotToContainer(new SlotResult(this.tileentity.getInvResult(), i*4 + j, 88+i*18, 17+j*18));
+                       }
+               }
+               this.addSlotToContainer(new Slot(this.tileentity.getInvMaterial(), 0, 27, 20));
+               this.addSlotToContainer(new SlotPyrolysisTableFuel(this.tileentity.getInvFuel(), 0, 27, 63));
+
+               int var3;
+               for (var3 = 0; var3 < 3; ++var3)
+               {
+                       for (int var4 = 0; var4 < 9; ++var4)
+                       {
+                               this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var4 + var3 * 9 + 9, 8 + var4 * 18, 121 + var3 * 18));
+                       }
+               }
+
+               for (var3 = 0; var3 < 9; ++var3)
+               {
+                       this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var3, 8 + var3 * 18, 179));
+               }
+       }
+
+       @Override
+       public boolean canInteractWith(EntityPlayer par1EntityPlayer) {
+               return this.worldObj.getBlockId(this.posX, this.posY, this.posZ) != ChemiCraftCore.instance.pyrolysisTableID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D;
+       }
+
+       @Override
+       public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
+       {
+               ItemStack var3 = null;
+               Slot var4 = (Slot)this.inventorySlots.get(par2);
+
+               if (var4 != null && var4.getHasStack())
+               {
+                       ItemStack var5 = var4.getStack();
+                       var3 = var5.copy();
+
+                       if (par2 < 18 ){
+                               if (!this.mergeItemStack(var5, 18, this.inventorySlots.size(), true))
+                               {
+                                       return null;
+                               }
+                       }
+                       else if (!this.mergeItemStack(var5, 16, 18, false))
+                       {
+                               return null;
+                       }
+
+                       if (var5.stackSize == 0)
+                       {
+                               var4.putStack((ItemStack)null);
+                       }
+                       else
+                       {
+                               var4.onSlotChanged();
+                       }
+               }
+
+               return var3;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerToolAndWeaponCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/container/ContainerToolAndWeaponCraftingTable.java
new file mode 100644 (file)
index 0000000..d9cc944
--- /dev/null
@@ -0,0 +1,18 @@
+package asia.tcrs.ccnp.chemicraftnext.core.container;
+
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityToolAndWeaponCraftingTable;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+
+public class ContainerToolAndWeaponCraftingTable extends Container {
+
+       public ContainerToolAndWeaponCraftingTable(EntityPlayer par1EntityPlayer, TileEntityToolAndWeaponCraftingTable par2){
+               super();
+       }
+
+       @Override
+       public boolean canInteractWith(EntityPlayer var1) {
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/creativetab/CreativeTabChemiCraft.java b/src/asia/tcrs/ccnp/chemicraftnext/core/creativetab/CreativeTabChemiCraft.java
new file mode 100644 (file)
index 0000000..25e3798
--- /dev/null
@@ -0,0 +1,30 @@
+package asia.tcrs.ccnp.chemicraftnext.core.creativetab;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import net.minecraft.creativetab.CreativeTabs;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class CreativeTabChemiCraft extends CreativeTabs {
+
+       public CreativeTabChemiCraft(String type){
+               super(type);
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+       public int getTabIconItemIndex(){
+               return ChemiCraftCore.instance.itemGasCollectingBottle.itemID;
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+       public String getTranslatedTabLabel(){
+               return "ChemiCraft";
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandDeleteItem.java b/src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandDeleteItem.java
new file mode 100644 (file)
index 0000000..79abe1d
--- /dev/null
@@ -0,0 +1,63 @@
+package asia.tcrs.ccnp.chemicraftnext.core.debug;
+
+import java.util.Iterator;
+import java.util.List;
+
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.world.World;
+
+public class CommandDeleteItem extends CommandBase {
+
+       @Override
+       public String getCommandName() {
+               return "delItem";
+       }
+
+       @SuppressWarnings("unchecked")
+       @Override
+       public void processCommand(ICommandSender var1, String[] var2) {
+               MinecraftServer server = null;
+               EntityPlayerMP player = null;
+               try { server = (MinecraftServer)var1; } catch (ClassCastException e) {}
+               try{ player = (EntityPlayerMP)var1;} catch(ClassCastException e) {}
+
+               World world;
+               List<Entity> list;
+               Iterator<Entity> itr;
+
+               if(server != null){
+                       if(var2.length > 0){
+                               world = server.worldServerForDimension(Integer.parseInt(var2[0]));
+                               list = world.loadedEntityList;
+                               itr = list.iterator();
+                               while(itr.hasNext()){
+                                       Entity entity = itr.next();
+                                       if(entity instanceof EntityItem){
+                                               entity.setDead();
+                                       }
+                               }
+                       }else{
+                               var1.sendChatToPlayer("Please specify the World.");
+                       }
+               }else if(player != null){
+                       world = player.worldObj;
+                       list = world.loadedEntityList;
+                       itr = list.iterator();
+                       while(itr.hasNext()){
+                               Entity entity = itr.next();
+                               if(entity instanceof EntityItem){
+                                       entity.setDead();
+                               }
+                       }
+               }else{
+                       var1.sendChatToPlayer("---Command Error---");
+               }
+
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandGenDebugRoom.java b/src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandGenDebugRoom.java
new file mode 100644 (file)
index 0000000..3271c88
--- /dev/null
@@ -0,0 +1,28 @@
+package asia.tcrs.ccnp.chemicraftnext.core.debug;
+
+import net.minecraft.block.Block;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.world.World;
+
+public class CommandGenDebugRoom extends CommandBase {
+
+       @Override
+       public String getCommandName() {
+               return "debugRoom";
+       }
+
+       @Override
+       public void processCommand(ICommandSender var1, String[] var2) {
+               try{
+                       EntityPlayer player = (EntityPlayer)var1;
+                       World wolrd = player.worldObj;
+
+                       SetBlockSupport.box(wolrd, (int)player.posX, (int)player.posY, (int)player.posZ, Block.bedrock.blockID, 0, 20, 20, 6);
+               }catch(ClassCastException e){
+
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandSetTile.java b/src/asia/tcrs/ccnp/chemicraftnext/core/debug/CommandSetTile.java
new file mode 100644 (file)
index 0000000..a0f96f2
--- /dev/null
@@ -0,0 +1,45 @@
+package asia.tcrs.ccnp.chemicraftnext.core.debug;\r
+\r
+import net.minecraft.block.Block;\r
+import net.minecraft.command.CommandBase;\r
+import net.minecraft.command.ICommandSender;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.world.World;\r
+\r
+public class CommandSetTile extends CommandBase {\r
+\r
+       @Override\r
+       public String getCommandName() {\r
+               return "setTile";\r
+       }\r
+\r
+       @Override\r
+       public void processCommand(ICommandSender var1, String[] var2) {\r
+               try{\r
+                       EntityPlayer player = (EntityPlayer)var1;\r
+                       World wolrd = player.worldObj;\r
+                       if(var2.length > 0){\r
+                               try{\r
+                                       if(Integer.parseInt(var2[0]) < 4096 && Block.blocksList[Integer.parseInt(var2[0])] != null || Integer.parseInt(var2[0]) == 0){\r
+                                               if(var2.length == 1){\r
+                                                       SetBlockSupport.square(wolrd, (int)player.posX, (int)player.posY, (int)player.posZ, Integer.parseInt(var2[0]), Integer.parseInt(var2[1]), 12, 12);\r
+                                               }else if(var2.length > 2){\r
+                                                       SetBlockSupport.square(wolrd, (int)player.posX, (int)player.posY, (int)player.posZ, Integer.parseInt(var2[0]), Integer.parseInt(var2[1]), Integer.parseInt(var2[2]), Integer.parseInt(var2[2]));\r
+                                               }else{\r
+                                                       SetBlockSupport.square(wolrd, (int)player.posX, (int)player.posY, (int)player.posZ, Integer.parseInt(var2[0]), 0, 12, 12);\r
+                                               }\r
+                                       }else{\r
+                                               var1.sendChatToPlayer("\u00a7cBlockが存在しないか指定された数が4096を超えています。");\r
+                                       }\r
+                               }catch(NumberFormatException e){\r
+                                       var1.sendChatToPlayer("\u00a7c指定された文字は数値ではありません。");\r
+                               }\r
+                       }else{\r
+                               var1.sendChatToPlayer("\u00a7cBlockIDを指定してください。(Metadata, Sizeも可能)");\r
+                       }\r
+               }catch(ClassCastException e){\r
+\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/debug/DebugData.java b/src/asia/tcrs/ccnp/chemicraftnext/core/debug/DebugData.java
new file mode 100644 (file)
index 0000000..6865567
--- /dev/null
@@ -0,0 +1,21 @@
+package asia.tcrs.ccnp.chemicraftnext.core.debug;
+
+public class DebugData {
+
+       private String key;
+       private Object value;
+
+       public DebugData(String par1, Object par2) {
+               this.key = par1;
+               this.value = par2;
+       }
+
+       public String getKey() {
+               return this.key;
+       }
+
+       public Object getValue() {
+               return this.value;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/debug/DebugTick.java b/src/asia/tcrs/ccnp/chemicraftnext/core/debug/DebugTick.java
new file mode 100644 (file)
index 0000000..b3c9118
--- /dev/null
@@ -0,0 +1,87 @@
+package asia.tcrs.ccnp.chemicraftnext.core.debug;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import cpw.mods.fml.common.ITickHandler;
+import cpw.mods.fml.common.TickType;
+
+public class DebugTick extends JPanel implements ITickHandler {
+
+       private static HashMap<String, DebugData[]> displayDataList = new HashMap<String, DebugData[]>();
+
+       public DebugTick() {
+               JFrame frame = new JFrame();
+               frame.setSize(640, 480);
+               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+               frame.add(this);
+               frame.setVisible(true);
+
+       }
+
+       @Override
+       public void tickStart(EnumSet<TickType> type, Object... tickData) {
+
+       }
+
+       @Override
+       public void tickEnd(EnumSet<TickType> type, Object... tickData) {
+               this.repaint();
+       }
+
+       @Override
+       public EnumSet<TickType> ticks() {
+               return EnumSet.of(TickType.CLIENT, TickType.CLIENT);
+       }
+
+       @Override
+       public String getLabel() {
+               return null;
+       }
+
+       @Override
+       public void paintComponent(Graphics g) {
+               Graphics2D g2 = (Graphics2D) g;
+
+               g2.clearRect(0, 0, this.getWidth(), this.getHeight());
+
+               int fontPos = 20;
+               Iterator<String> itKey = displayDataList.keySet().iterator();
+               while (itKey.hasNext()) {
+                       String key = itKey.next();
+                       DebugData[] datas = displayDataList.get(key);
+                       g2.setFont(new Font("MS ゴシック", Font.BOLD, 16));
+                       g2.setColor(Color.RED);
+                       g2.drawString(key + ":", 10, fontPos);
+                       g2.setFont(new Font("MS ゴシック", Font.PLAIN, 12));
+                       g2.setColor(Color.BLACK);
+
+                       fontPos += 16;
+
+                       for (int i = 0; i < datas.length; i++) {
+                               g2.drawString(String.valueOf(datas[i].getKey()) + ":" + String.valueOf(datas[i].getValue()), 10, fontPos);
+                               fontPos += 12;
+                       }
+
+                       fontPos += 4;
+
+               }
+       }
+
+       public static void setDebugData(String key, DebugData... value) {
+               displayDataList.put(key, value);
+       }
+
+       public static void removeDebugData(String key) {
+               displayDataList.remove(key);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/debug/SetBlockSupport.java b/src/asia/tcrs/ccnp/chemicraftnext/core/debug/SetBlockSupport.java
new file mode 100644 (file)
index 0000000..522caf2
--- /dev/null
@@ -0,0 +1,584 @@
+package asia.tcrs.ccnp.chemicraftnext.core.debug;\r
+import java.util.Random;\r
+\r
+import net.minecraft.world.World;\r
+\r
+public class SetBlockSupport\r
+{\r
+\r
+       static Random rand = new Random();\r
+\r
+       /**\r
+        * X方向に線状にBlockを配置します。\r
+        * Directionが0の場合、特殊な計算式で\r
+        * +,-方向:loop-1の長さになります。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param Length 長さ\r
+        * @param Direction 方向(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @return Object\r
+        */\r
+       public static Object lineX(World par1World,int X,int Y,int Z,int Block,int meta,int Length,int Direction)\r
+       {\r
+               int loop2=0;\r
+               Object DataBox=null;\r
+               for(loop2=0;loop2 < Length;loop2++)\r
+               {\r
+                       switch(Direction)\r
+                       {\r
+                       case -1:\r
+                               DataBox = par1World.setBlock(X, Y, Z, Block, meta, 0x02);\r
+                               break;\r
+                       case 0:\r
+                               DataBox = par1World.setBlock(X-(Length-1)+loop2,Y,Z,Block,meta, 0x02);\r
+                               break;\r
+                       case 1:\r
+                               DataBox = par1World.setBlock(X+loop2, Y, Z, Block,meta, 0x02);\r
+                               break;\r
+                       }\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * Y方向に線状にBlockを配置します。\r
+        * Directionが0の場合、特殊な計算式で\r
+        * +,-方向:loop-1の長さになります。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param Length 長さ\r
+        * @param Direction 方向(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @return Object\r
+        */\r
+       public static Object lineY(World par1World,int X,int Y,int Z,int Block,int meta,int Length,int Direction)\r
+       {\r
+               int loop2=0;\r
+               Object DataBox=null;\r
+               for(loop2=0;loop2 < Length;loop2++)\r
+               {\r
+                       switch(Direction)\r
+                       {\r
+                       case -1:\r
+                               DataBox = par1World.setBlock(X, Y-loop2, Z, Block,meta, 0x02);\r
+                               break;\r
+                       case 0:\r
+                               DataBox = par1World.setBlock(X,Y-(Length-1)+loop2,Z,Block,meta, 0x02);\r
+                               break;\r
+                       case 1:\r
+                               DataBox = par1World.setBlock(X, Y+loop2, Z, Block,meta, 0x02);\r
+                               break;\r
+                       }\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * Z方向に線状にBlockを配置します。\r
+        * Directionが0の場合、特殊な計算式で\r
+        * +,-方向:loop-1の長さになります。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param Length 長さ\r
+        * @param Direction 方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @return Object\r
+        */\r
+       public static Object lineZ(World par1World,int X,int Y,int Z,int Block,int meta,int Length,int Direction)\r
+       {\r
+               int loop2=0;\r
+               Object DataBox=null;\r
+               for(loop2=0;loop2 < Length;loop2++)\r
+               {\r
+                       switch(Direction)\r
+                       {\r
+                       case -1:\r
+                               DataBox = par1World.setBlock(X, Y, Z-loop2, Block,meta, 0x02);\r
+                               break;\r
+                       case 0:\r
+                               DataBox = par1World.setBlock(X,Y,Z-(Length-1)+loop2,Block,meta, 0x02);\r
+                               break;\r
+                       case 1:\r
+                               DataBox = par1World.setBlock(X, Y, Z+loop2, Block,meta, 0x02);\r
+                               break;\r
+                       }\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * XY方向に線状にBlockを配置します。\r
+        * Directionが0の場合、特殊な計算式で\r
+        * +,-方向:loop-1の長さになります。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param XLength X方向の長さ\r
+        * @param YLength Y方向の長さ\r
+        * @param XDirection X方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @param YDirection Y方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @return Object\r
+        */\r
+       public static Object  lineXY(World par1World,int X,int Y,int Z,int Block,int meta,int XLength,int YLength,int XDirection,int YDirection)\r
+       {\r
+               Object DataBox=null;\r
+               DataBox = lineX(par1World,X,Y,Z,Block,meta,XLength,XDirection);\r
+               DataBox = lineY(par1World,X,Y,Z,Block,YLength,meta,YDirection);\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * XZ方向に線状にBlockを配置します。\r
+        * Directionが0の場合、特殊な計算式で\r
+        * +,-方向:loop-1の長さになります。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param XLength X方向の長さ\r
+        * @param ZLength Y方向の長さ\r
+        * @param XDirection X方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @param ZDirection Z方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @return Object\r
+        */\r
+       public static Object  lineXZ(World par1World,int X,int Y,int Z,int Block,int meta,int XLength,int ZLength,int XDirection,int ZDirection)\r
+       {\r
+               Object DataBox=null;\r
+               DataBox = lineX(par1World,X,Y,Z,Block,meta,XLength,XDirection);\r
+               DataBox = lineZ(par1World,X,Y,Z,Block,meta,ZLength,ZDirection);\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * YZ方向に線状にBlockを配置します。\r
+        * Directionが0の場合、特殊な計算式で\r
+        * +,-方向:loop-1の長さになります。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param YLength X方向の長さ\r
+        * @param ZLength Y方向の長さ\r
+        * @param YDirection Y方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @param ZDirection Z方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @return Object\r
+        */\r
+       public static Object  lineYZ(World par1World,int X,int Y,int Z,int Block,int meta,int YLength,int ZLength,int YDirection,int ZDirection)\r
+       {\r
+               Object DataBox=null;\r
+               DataBox = lineY(par1World,X,Y,Z,Block,meta,YLength,YDirection);\r
+               DataBox = lineZ(par1World,X,Y,Z,Block,meta,ZLength,ZDirection);\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * XYZ方向に線状にBlockを配置します。\r
+        * Directionが0の場合、特殊な計算式で\r
+        * +,-方向:loop-1の長さになります。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param XLength X方向の長さ\r
+        * @param YLength Y方向の長さ\r
+        * @param ZLength Z方向の長さ\r
+        * @param XDirection X方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @param YDirection Y方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @param ZDirection Z方向指定(+方向:1,-方向:-1,中心から-+の方向:0)\r
+        * @return Object\r
+        */\r
+       public static Object  lineXYZ(World par1World,int X,int Y,int Z,int Block,int meta,int XLength,int YLength,int ZLength,int XDirection,int YDirection,int ZDirection)\r
+       {\r
+               Object DataBox=null;\r
+               DataBox = lineX(par1World,X,Y,Z,Block,meta,XLength,XDirection);\r
+               DataBox = lineY(par1World,X,Y,Z,Block,meta,YLength,YDirection);\r
+               DataBox = lineZ(par1World,X,Y,Z,Block,meta,ZLength,ZDirection);\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * X方向の壁を作成します。\r
+        * Directionは1で固定です。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param Length 幅\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object wallX(World par1World,int X,int Y,int Z,int Block,int meta,int Length,int height)\r
+       {\r
+               Object DataBox = null;\r
+               for(int loop = 0;loop < Length;loop++){\r
+                       lineY(par1World, X - (Length/2) + loop, Y, Z, Block,meta, height, 1);\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * Z方向の壁を作成します。\r
+        * Directionは1で固定です。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param Length 幅\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object wallZ(World par1World,int X,int Y,int Z,int Block,int meta,int Length,int height)\r
+       {\r
+               Object DataBox = null;\r
+               for(int loop = 0;loop < Length;loop++){\r
+                       lineY(par1World, X, Y, Z - (Length/2) + loop, Block,meta, height, 1);\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * 辺だけの四角を作成します。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param LengthX X方向の長さ\r
+        * @param LengthZ  Z方向の長さ\r
+        * @return Object\r
+        */\r
+       public static Object spuareFrame(World par1World,int X,int Y,int Z,int Block,int meta,int LengthX,int LengthZ)\r
+       {\r
+               Object DataBox = null;\r
+               DataBox = lineX(par1World, X, Y, Z + (LengthZ/2), Block,meta, LengthX/2+1, 0);\r
+               DataBox = lineX(par1World, X, Y, Z - (LengthZ/2), Block,meta, LengthX/2+1, 0);\r
+               DataBox = lineZ(par1World, X + (LengthX/2), Y, Z, Block,meta, LengthZ/2+1, 0);\r
+               DataBox = lineZ(par1World, X - (LengthX/2), Y, Z, Block,meta, LengthZ/2+1, 0);\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * 辺だけの箱を作成します。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param LengthX X方向の長さ\r
+        * @param LengthZ  Z方向の長さ\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object boxFrame(World par1World,int X,int Y,int Z,int Block,int meta,int LengthX,int LengthZ,int height)\r
+       {\r
+               Object DataBox=null;\r
+               DataBox = lineX(par1World, X, Y, Z + (LengthZ/2), Block,meta, LengthX/2, 0);\r
+               DataBox = lineX(par1World, X, Y, Z - (LengthZ/2), Block,meta, LengthX/2, 0);\r
+               DataBox = lineX(par1World, X, Y + height-1, Z + (LengthZ/2), Block,meta, LengthX/2, 0);\r
+               DataBox = lineX(par1World, X, Y + height-1, Z - (LengthZ/2), Block,meta, LengthX/2, 0);\r
+\r
+               DataBox = lineY(par1World,X +(LengthX/2),Y,Z +(LengthZ/2),Block,meta,height,1);\r
+               DataBox = lineY(par1World,X -(LengthX/2),Y,Z +(LengthZ/2),Block,meta,height,1);\r
+               DataBox = lineY(par1World,X +(LengthX/2),Y,Z - (LengthZ/2),Block,meta,height,1);\r
+               DataBox = lineY(par1World,X -(LengthX/2),Y,Z - (LengthZ/2),Block,meta,height,1);\r
+\r
+               DataBox = lineZ(par1World, X + (LengthX/2), Y, Z, Block,meta, LengthZ/2, 0);\r
+               DataBox = lineZ(par1World, X - (LengthX/2), Y, Z, Block,meta, LengthZ/2, 0);\r
+               DataBox = lineZ(par1World, X + (LengthX/2), Y + height-1, Z, Block,meta, LengthZ/2, 0);\r
+               DataBox = lineZ(par1World, X - (LengthX/2), Y + height-1, Z, Block,meta, LengthZ/2, 0);\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * 四角を作成します。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param LengthX X方向の長さ\r
+        * @param LengthZ  Z方向の長さ\r
+        * @return Object\r
+        */\r
+       public static Object square(World par1World,int X,int Y,int Z,int Block,int meta,int LengthX,int LengthZ)\r
+       {\r
+               Object DataBox = null;\r
+               int loop1 = 0;\r
+               for(loop1=0; loop1 < LengthZ; loop1++){\r
+                       DataBox = lineX(par1World,X - (LengthX/2),Y,Z - (LengthZ/2) + loop1,Block,meta,LengthX,1);\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * 箱を生成します。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param LengthX X方向の長さ\r
+        * @param LengthZ  Z方向の長さ\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object box(World par1World,int X,int Y,int Z,int Block,int meta,int LengthX,int LengthZ,int height)\r
+       {\r
+               Object DataBox = null;\r
+               DataBox = square(par1World, X, Y, Z, Block, meta,LengthX,LengthZ);\r
+               DataBox = square(par1World,X,Y+height,Z,Block,meta,LengthX,LengthZ);\r
+               DataBox = wallX(par1World,X,Y,Z-(LengthZ/2),Block,meta,LengthX,height);\r
+               DataBox = wallZ(par1World,X-(LengthX/2),Y,Z,Block,meta,LengthZ,height);\r
+               DataBox = wallX(par1World,X,Y,Z+(LengthZ/2),Block,meta,LengthX,height);\r
+               DataBox = wallZ(par1World,X+(LengthX/2),Y,Z,Block,meta,LengthZ,height);\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * Blockで埋め尽くされた箱を生成します。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param LengthX X方向の長さ\r
+        * @param LengthZ  Z方向の長さ\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object fillBox(World par1World , int X,int Y,int Z,int Block,int meta,int LengthX,int LengthZ,int height)\r
+       {\r
+               Object DataBox = null;\r
+\r
+               for(int i = 0; i < height; i++)\r
+               {\r
+                       DataBox = square(par1World,X,Y+i,Z,Block,meta,LengthX,LengthZ);\r
+               }\r
+\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * 座標ごとにデータを指定して配置します。\r
+        * 配列になっているので、順番に指定してください。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param XPosition 配置する相対X座標\r
+        * @param YPosition 配置する相対Y座標\r
+        * @param ZPosition 配置する相対Z座標\r
+        * @param Option\r
+        * @return Object\r
+        */\r
+       public static Object fineSetBlock(World par1World,int X,int Y,int Z,int[] Block,int[] meta,int[] XPosition,int[] YPosition,int[] ZPosition,Object[] Option){\r
+               Object DataBox = null;\r
+               for(int i=0;i<Block.length;i++){\r
+                       DataBox = par1World.setBlock(X+XPosition[i], Y+YPosition[i], Z+ZPosition[i], Block[i],meta[i], 0x02);\r
+               }\r
+\r
+               if(Option!=null){\r
+                       for(int j=0;j<Option.length;j++){\r
+                               DataBox = Option[j];\r
+                       }\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * X方向に台形を作成します。\r
+        * 必ずbottom/(upper*3)*(height/upper)かupper/(bottom*3)*(height/buttom)が整数になるようにしてください。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param upperSide 上辺の長さ\r
+        * @param bottomSide 下辺の長さ\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object TrapezoidX(World par1World,int X,int Y,int Z,int Block,int meta,int upperSide,int bottomSide,int height){\r
+               Object DataBox = null;\r
+               int Rate=0;\r
+               int Math=0;\r
+               int XRate=0;\r
+               int YRate = 0;\r
+               for(int i=0;i<height;i++){\r
+                       YRate++;\r
+                       Math++;\r
+                       XRate++;\r
+                       if(upperSide < bottomSide){\r
+                               if(Math == bottomSide/(upperSide*3)*(height/upperSide)){\r
+                                       Rate++;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       if(bottomSide < upperSide){\r
+                               if(Math == upperSide/(bottomSide*3)*(height/bottomSide)){\r
+                                       Rate--;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       DataBox=lineZ(par1World, X+XRate-1, Y+YRate, Z, Block, meta, upperSide+Rate, 0);\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * Y方向のXラインに台形を作成します。\r
+        * 必ずbottom/(upper*3)*(height/upper)かupper/(bottom*3)*(height/buttom)が整数になるようにしてください。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param upperSide 上辺の長さ\r
+        * @param bottomSide 下辺の長さ\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object TrapezoidY_X(World par1World,int X,int Y,int Z,int Block,int meta,int upperSide,int bottomSide,int height){\r
+               Object DataBox = null;\r
+               int Rate=0;\r
+               int Math=0;\r
+               int YRate = 0;\r
+               for(int i=0;i<height;i++){\r
+                       YRate++;\r
+                       Math++;\r
+                       if(upperSide < bottomSide){\r
+                               if(Math == bottomSide/(upperSide*3)*(height/upperSide)){\r
+                                       Rate++;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       if(bottomSide < upperSide){\r
+                               if(Math == upperSide/(bottomSide*3)*(height/bottomSide)){\r
+                                       Rate--;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       DataBox=lineZ(par1World, X, Y+YRate, Z, Block, meta, upperSide+Rate, 0);\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * Y方向のZラインに台形を作成します。\r
+        * 必ずbottom/(upper*3)*(height/upper)かupper/(bottom*3)*(height/buttom)が整数になるようにしてください。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param upperSide 上辺の長さ\r
+        * @param bottomSide 下辺の長さ\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object TrapezoidY_Z(World par1World,int X,int Y,int Z,int Block,int meta,int upperSide,int bottomSide,int height){\r
+               Object DataBox = null;\r
+               int Rate=0;\r
+               int Math=0;\r
+               int YRate = 0;\r
+               for(int i=0;i<height;i++){\r
+                       YRate++;\r
+                       Math++;\r
+                       if(upperSide < bottomSide){\r
+                               if(Math == bottomSide/(upperSide*3)*(height/upperSide)){\r
+                                       Rate++;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       if(bottomSide < upperSide){\r
+                               if(Math == upperSide/(bottomSide*3)*(height/bottomSide)){\r
+                                       Rate--;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       DataBox=lineX(par1World, X, Y+YRate, Z, Block, meta, upperSide+Rate, 0);\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+       /**\r
+        * Z方向に台形を作成します。\r
+        * 必ずbottom/(upper*3)*(height/upper)かupper/(bottom*3)*(height/buttom)が整数になるようにしてください。\r
+        * @param par1World\r
+        * @param X 基準X座標\r
+        * @param Y 基準Y座標\r
+        * @param Z 基準Z座標\r
+        * @param Block 配置するBlock\r
+        * @param meta 配置するMetadata\r
+        * @param upperSide 上辺の長さ\r
+        * @param bottomSide 下辺の長さ\r
+        * @param height 高さ\r
+        * @return Object\r
+        */\r
+       public static Object TrapezoidZ(World par1World,int X,int Y,int Z,int Block,int meta,int upperSide,int bottomSide,int height){\r
+               Object DataBox = null;\r
+               int Rate=0;\r
+               int Math=0;\r
+               int ZRate=0;\r
+               for(int i=0;i<height;i++){\r
+                       Math++;\r
+                       ZRate++;\r
+                       if(upperSide < bottomSide){\r
+                               if(Math == bottomSide/(upperSide*3)*(height/upperSide)){\r
+                                       Rate++;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       if(bottomSide < upperSide){\r
+                               if(Math == upperSide/(bottomSide*3)*(height/bottomSide)){\r
+                                       Rate--;\r
+                                       Math=0;\r
+                               }\r
+                       }\r
+\r
+                       DataBox=lineX(par1World, X, Y, Z+ZRate, Block, meta, upperSide+Rate, 0);\r
+               }\r
+               return DataBox;\r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiChemicalCombinationTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiChemicalCombinationTable.java
new file mode 100644 (file)
index 0000000..257df47
--- /dev/null
@@ -0,0 +1,58 @@
+package asia.tcrs.ccnp.chemicraftnext.core.gui;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerChemicalCombinationTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCombinationTable;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiTextField;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.EntityPlayer;
+import cpw.mods.fml.common.network.PacketDispatcher;
+
+public class GuiChemicalCombinationTable extends GuiContainer {
+
+       private GuiTextField atomList;
+
+       private TileEntityChemicalCombinationTable tileentity;
+
+       public GuiChemicalCombinationTable(EntityPlayer par1EntityPlayer, TileEntityChemicalCombinationTable par2) {
+               super(new ContainerChemicalCombinationTable(par1EntityPlayer, par2));
+               this.tileentity = par2;
+               this.ySize = 204;
+       }
+
+       @Override
+       public void initGui(){
+               super.initGui();
+               this.atomList = new GuiTextField(this.fontRenderer, 9, 103, 160, 15);
+               this.atomList.setFocused(false);
+               this.atomList.setMaxStringLength(25);
+               this.buttonList.add(new GuiButton(0, this.guiLeft + 172 - 41, this.guiTop + 80 - 21, 40, 20, "Add"));
+               this.buttonList.add(new GuiButton(1, this.guiLeft + 172 - 41, this.guiTop + 80, 40, 20, "Eject"));
+       }
+
+       @Override
+       protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {
+               this.mc.renderEngine.bindTexture(ChemiCraftCore.instance.GUI_CHEMICALCOMBINATION_TEXTURE);
+               this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
+       }
+
+       @Override
+       protected void actionPerformed(GuiButton par1GuiButton) {
+               if(par1GuiButton.id == 0){
+                       this.tileentity.field_00001();
+                       PacketDispatcher.sendPacketToServer(this.tileentity.getDescriptionPacket());
+               }else if(par1GuiButton.id == 1){
+                       this.tileentity.field_00002();
+                       PacketDispatcher.sendPacketToServer(this.tileentity.getDescriptionPacket());
+               }
+               return;
+       }
+
+       @Override
+       protected void drawGuiContainerForegroundLayer(int par1, int par2) {
+               this.atomList.setText(this.tileentity.getAtoms());
+               this.atomList.drawTextBox();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiChemicalCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiChemicalCraftingTable.java
new file mode 100644 (file)
index 0000000..ee98d5a
--- /dev/null
@@ -0,0 +1,26 @@
+package asia.tcrs.ccnp.chemicraftnext.core.gui;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerChemicalCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCraftingTable;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.EntityPlayer;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class GuiChemicalCraftingTable extends GuiContainer {
+
+       public GuiChemicalCraftingTable(EntityPlayer par1EntityPlayer, TileEntityChemicalCraftingTable par2){
+               super(new ContainerChemicalCraftingTable(par1EntityPlayer, par2));
+       }
+
+
+
+       @Override
+       protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3){
+               this.mc.renderEngine.bindTexture(ChemiCraftCore.instance.GUI_CHEMICALCRAFTING_TEXTURE);
+               this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiElectrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiElectrolysisTable.java
new file mode 100644 (file)
index 0000000..1e5b869
--- /dev/null
@@ -0,0 +1,28 @@
+package asia.tcrs.ccnp.chemicraftnext.core.gui;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerElectrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityElectrolysisTable;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class GuiElectrolysisTable extends GuiContainer
+{
+
+       private TileEntityElectrolysisTable tileentity;
+
+       public GuiElectrolysisTable(EntityPlayer par1EntityPlayer, TileEntityElectrolysisTable par2)
+       {
+               super(new ContainerElectrolysisTable(par1EntityPlayer, par2));
+               this.tileentity = par2;
+               this.ySize = 204;
+       }
+
+       @Override
+       protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3)
+       {
+               this.mc.renderEngine.bindTexture(ChemiCraftCore.instance.GUI_ELECTROLYSIS_TEXTURE);
+               this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiPyrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiPyrolysisTable.java
new file mode 100644 (file)
index 0000000..30381cc
--- /dev/null
@@ -0,0 +1,32 @@
+package asia.tcrs.ccnp.chemicraftnext.core.gui;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerPyrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityPyrolysisTable;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class GuiPyrolysisTable extends GuiContainer{
+
+       private TileEntityPyrolysisTable tileentity;
+
+       public GuiPyrolysisTable(EntityPlayer par1EntityPlayer, TileEntityPyrolysisTable par2) {
+               super(new ContainerPyrolysisTable(par1EntityPlayer, par2));
+               this.tileentity = par2;
+               this.ySize = 204;
+       }
+
+       @Override
+       protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {
+               this.mc.renderEngine.bindTexture(ChemiCraftCore.instance.GUI_PYROLYSIS_TEXTURE);
+               this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
+               this.drawTexturedModalRect(this.guiLeft + 28, this.guiTop + 48, 176, 0, 13, (int) (13F / this.tileentity.getFuelRestTime()));
+
+       }
+
+       @Override
+       protected void drawGuiContainerForegroundLayer(int par1, int par2) {
+               this.fontRenderer.drawString(String.valueOf("Temp:" + (int)this.tileentity.getHeat()), 110, 100, 0x000000);
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiToolAndWeaponCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/gui/GuiToolAndWeaponCraftingTable.java
new file mode 100644 (file)
index 0000000..0e6267f
--- /dev/null
@@ -0,0 +1,22 @@
+package asia.tcrs.ccnp.chemicraftnext.core.gui;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerToolAndWeaponCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityToolAndWeaponCraftingTable;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class GuiToolAndWeaponCraftingTable extends GuiContainer {
+
+       public GuiToolAndWeaponCraftingTable(EntityPlayer par1EntityPlayer, TileEntityToolAndWeaponCraftingTable par2) {
+               super(new ContainerToolAndWeaponCraftingTable(par1EntityPlayer, par2));
+       }
+
+       @Override
+       protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {
+               this.mc.renderEngine.bindTexture(ChemiCraftCore.instance.GUI_TOOLANDWEAPONCRAFTING_TEXTURE);
+               this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
+       }
+
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCombinationTableMaterial.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCombinationTableMaterial.java
new file mode 100644 (file)
index 0000000..08b528a
--- /dev/null
@@ -0,0 +1,123 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryChemicalCombinationTableMaterial implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[16];
+       private Container eventHandler;
+
+       public void setEventHandler(Container par1){
+               this.eventHandler = par1;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return this.inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return this.inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int var1, int var2) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var3;
+
+                       if (this.inventory[var1].stackSize <= var2)
+                       {
+                               var3 = this.inventory[var1];
+                               this.inventory[var1] = null;
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+                       else
+                       {
+                               var3 = this.inventory[var1].splitStack(var2);
+
+                               if (this.inventory[var1].stackSize == 0)
+                               {
+                                       this.inventory[var1] = null;
+                               }
+
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int var1) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var2 = this.inventory[var1];
+                       this.inventory[var1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               this.inventory[var1] = var2;
+
+               if (var2 != null && var2.stackSize > this.getInventoryStackLimit())
+               {
+                       var2.stackSize = this.getInventoryStackLimit();
+               }
+
+               this.onInventoryChanged();
+       }
+
+       @Override
+       public String getInvName() {
+               return "ChemicalCombinationTableMaterial";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               if(this.eventHandler != null) this.eventHandler.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+       }
+
+       @Override
+       public void closeChest() {
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCombinationTableResult.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCombinationTableResult.java
new file mode 100644 (file)
index 0000000..f087bfe
--- /dev/null
@@ -0,0 +1,126 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryChemicalCombinationTableResult implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[15];
+       private Container eventHandler;
+
+       public void setEventHandler(Container par1){
+               this.eventHandler = par1;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return this.inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return this.inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int var1, int var2) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var3;
+
+                       if (this.inventory[var1].stackSize <= var2)
+                       {
+                               var3 = this.inventory[var1];
+                               this.inventory[var1] = null;
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+                       else
+                       {
+                               var3 = this.inventory[var1].splitStack(var2);
+
+                               if (this.inventory[var1].stackSize == 0)
+                               {
+                                       this.inventory[var1] = null;
+                               }
+
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int var1) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var2 = this.inventory[var1];
+                       this.inventory[var1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               this.inventory[var1] = var2;
+
+               if (var2 != null && var2.stackSize > this.getInventoryStackLimit())
+               {
+                       var2.stackSize = this.getInventoryStackLimit();
+               }
+
+               this.onInventoryChanged();
+       }
+
+       @Override
+       public String getInvName() {
+               return "ChemicalCombinationTableResult";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               if(this.eventHandler != null) this.eventHandler.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+       }
+
+       @Override
+       public void closeChest() {
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingMaterial.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingMaterial.java
new file mode 100644 (file)
index 0000000..2dc35ea
--- /dev/null
@@ -0,0 +1,105 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryChemicalCraftingMaterial implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[9];
+
+       private Container eventHandelr;
+
+       public void setEventHandler(Container par1Container){
+               this.eventHandelr = par1Container;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int par1, int par2)
+       {
+               if (this.inventory[par1] != null)
+               {
+                       ItemStack var3 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var3;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int par1)
+       {
+               if (this.inventory[par1] != null)
+               {
+                       ItemStack var2 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               inventory[var1] = var2;
+       }
+
+       @Override
+       public String getInvName() {
+               return "ChemicalCraftingInventory";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               this.eventHandelr.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+
+       }
+
+       @Override
+       public void closeChest() {
+
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingNBT.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingNBT.java
new file mode 100644 (file)
index 0000000..3a71a2b
--- /dev/null
@@ -0,0 +1,105 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryChemicalCraftingNBT implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[3];
+
+       private Container eventHandelr;
+
+       public void setEventHandler(Container par1Container){
+               this.eventHandelr = par1Container;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int par1, int par2)
+       {
+               if (this.inventory[par1] != null)
+               {
+                       ItemStack var3 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var3;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int par1)
+       {
+               if (this.inventory[par1] != null)
+               {
+                       ItemStack var2 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               inventory[var1] = var2;
+       }
+
+       @Override
+       public String getInvName() {
+               return "ChemicalCraftingInventory";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               this.eventHandelr.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+
+       }
+
+       @Override
+       public void closeChest() {
+
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingResult.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryChemicalCraftingResult.java
new file mode 100644 (file)
index 0000000..43105d4
--- /dev/null
@@ -0,0 +1,106 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryChemicalCraftingResult implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[1];
+
+       private Container eventHandelr;
+
+       public void setEventHandler(Container par1Container){
+               this.eventHandelr = par1Container;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int par1, int par2)
+       {
+               if (this.inventory[par1] != null)
+               {
+                       ItemStack var3 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var3;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int par1)
+       {
+               if (this.inventory[par1] != null)
+               {
+                       ItemStack var2 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               inventory[var1] = var2;
+       }
+
+       @Override
+       public String getInvName() {
+               return "ChemicalCraftingInventory";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               this.eventHandelr.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+
+       }
+
+       @Override
+       public void closeChest() {
+
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisFuel.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisFuel.java
new file mode 100644 (file)
index 0000000..fad8d5e
--- /dev/null
@@ -0,0 +1,110 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryElectrolysisFuel implements IInventory
+{
+
+       private ItemStack[] inventory = new ItemStack[1];
+
+       private Container eventHandelr;
+
+       public void setEventHandler(Container par1Container)
+       {
+               this.eventHandelr = par1Container;
+       }
+
+       @Override
+       public int getSizeInventory()
+       {
+               return inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1)
+       {
+               return inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int par1, int par2)
+       {
+               if (this.inventory[par1] != null) {
+                       ItemStack var3 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var3;
+               } else {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int par1)
+       {
+               if (this.inventory[par1] != null) {
+                       ItemStack var2 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var2;
+               } else {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2)
+       {
+               inventory[var1] = var2;
+       }
+
+       @Override
+       public String getInvName()
+       {
+               return "ElectrolysisTableInventory";
+       }
+
+       @Override
+       public int getInventoryStackLimit()
+       {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged()
+       {
+               this.eventHandelr.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1)
+       {
+               return true;
+       }
+
+       @Override
+       public void openChest()
+       {
+
+       }
+
+       @Override
+       public void closeChest()
+       {
+
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisMaterial.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisMaterial.java
new file mode 100644 (file)
index 0000000..a044347
--- /dev/null
@@ -0,0 +1,110 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryElectrolysisMaterial implements IInventory
+{
+
+       private ItemStack[] inventory = new ItemStack[1];
+
+       private Container eventHandelr;
+
+       public void setEventHandler(Container par1Container)
+       {
+               this.eventHandelr = par1Container;
+       }
+
+       @Override
+       public int getSizeInventory()
+       {
+               return inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1)
+       {
+               return inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int par1, int par2)
+       {
+               if (this.inventory[par1] != null) {
+                       ItemStack var3 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var3;
+               } else {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int par1)
+       {
+               if (this.inventory[par1] != null) {
+                       ItemStack var2 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var2;
+               } else {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2)
+       {
+               inventory[var1] = var2;
+       }
+
+       @Override
+       public String getInvName()
+       {
+               return "ElectrolysisTableInventory";
+       }
+
+       @Override
+       public int getInventoryStackLimit()
+       {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged()
+       {
+               this.eventHandelr.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1)
+       {
+               return true;
+       }
+
+       @Override
+       public void openChest()
+       {
+
+       }
+
+       @Override
+       public void closeChest()
+       {
+
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisResult.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryElectrolysisResult.java
new file mode 100644 (file)
index 0000000..b8e3192
--- /dev/null
@@ -0,0 +1,110 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryElectrolysisResult implements IInventory
+{
+
+       private ItemStack[] inventory = new ItemStack[16];
+
+       private Container eventHandelr;
+
+       public void setEventHandler(Container par1Container)
+       {
+               this.eventHandelr = par1Container;
+       }
+
+       @Override
+       public int getSizeInventory()
+       {
+               return inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1)
+       {
+               return inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int par1, int par2)
+       {
+               if (this.inventory[par1] != null) {
+                       ItemStack var3 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var3;
+               } else {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int par1)
+       {
+               if (this.inventory[par1] != null) {
+                       ItemStack var2 = this.inventory[par1];
+                       this.inventory[par1] = null;
+                       return var2;
+               } else {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2)
+       {
+               inventory[var1] = var2;
+       }
+
+       @Override
+       public String getInvName()
+       {
+               return "ElectrolysisTableInventory";
+       }
+
+       @Override
+       public int getInventoryStackLimit()
+       {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged()
+       {
+               this.eventHandelr.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1)
+       {
+               return true;
+       }
+
+       @Override
+       public void openChest()
+       {
+
+       }
+
+       @Override
+       public void closeChest()
+       {
+
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableFuel.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableFuel.java
new file mode 100644 (file)
index 0000000..d39d0c0
--- /dev/null
@@ -0,0 +1,124 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryPyrolysisTableFuel implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[1];
+       private Container eventHandler;
+
+       public void setEventHandler(Container par1){
+               this.eventHandler = par1;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return this.inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return this.inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int var1, int var2) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var3;
+
+                       if (this.inventory[var1].stackSize <= var2)
+                       {
+                               var3 = this.inventory[var1];
+                               this.inventory[var1] = null;
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+                       else
+                       {
+                               var3 = this.inventory[var1].splitStack(var2);
+
+                               if (this.inventory[var1].stackSize == 0)
+                               {
+                                       this.inventory[var1] = null;
+                               }
+
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int var1) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var2 = this.inventory[var1];
+                       this.inventory[var1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               this.inventory[var1] = var2;
+
+               if (var2 != null && var2.stackSize > this.getInventoryStackLimit())
+               {
+                       var2.stackSize = this.getInventoryStackLimit();
+               }
+
+               this.onInventoryChanged();
+       }
+
+       @Override
+       public String getInvName() {
+               return "PyrolysisTableFuel";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               if(this.eventHandler != null) this.eventHandler.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+       }
+
+       @Override
+       public void closeChest() {
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableMaterial.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableMaterial.java
new file mode 100644 (file)
index 0000000..f88e337
--- /dev/null
@@ -0,0 +1,125 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryPyrolysisTableMaterial implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[1];
+       private Container eventHandler;
+
+       public void setEventHandler(Container par1){
+               this.eventHandler = par1;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return this.inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return this.inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int var1, int var2) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var3;
+
+                       if (this.inventory[var1].stackSize <= var2)
+                       {
+                               var3 = this.inventory[var1];
+                               this.inventory[var1] = null;
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+                       else
+                       {
+                               var3 = this.inventory[var1].splitStack(var2);
+
+                               if (this.inventory[var1].stackSize == 0)
+                               {
+                                       this.inventory[var1] = null;
+                               }
+
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int var1) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var2 = this.inventory[var1];
+                       this.inventory[var1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               this.inventory[var1] = var2;
+
+               if (var2 != null && var2.stackSize > this.getInventoryStackLimit())
+               {
+                       var2.stackSize = this.getInventoryStackLimit();
+               }
+
+               this.onInventoryChanged();
+       }
+
+       @Override
+       public String getInvName() {
+               return "PyrolysisTableMaterial";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               if(this.eventHandler != null) this.eventHandler.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+       }
+
+       @Override
+       public void closeChest() {
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableResult.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryPyrolysisTableResult.java
new file mode 100644 (file)
index 0000000..f33d14e
--- /dev/null
@@ -0,0 +1,124 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryPyrolysisTableResult implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[16];
+       private Container eventHandler;
+
+       public void setEventHandler(Container par1){
+               this.eventHandler = par1;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return this.inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return this.inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int var1, int var2) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var3;
+
+                       if (this.inventory[var1].stackSize <= var2)
+                       {
+                               var3 = this.inventory[var1];
+                               this.inventory[var1] = null;
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+                       else
+                       {
+                               var3 = this.inventory[var1].splitStack(var2);
+
+                               if (this.inventory[var1].stackSize == 0)
+                               {
+                                       this.inventory[var1] = null;
+                               }
+
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int var1) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var2 = this.inventory[var1];
+                       this.inventory[var1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               this.inventory[var1] = var2;
+
+               if (var2 != null && var2.stackSize > this.getInventoryStackLimit())
+               {
+                       var2.stackSize = this.getInventoryStackLimit();
+               }
+
+               this.onInventoryChanged();
+       }
+
+       @Override
+       public String getInvName() {
+               return "PyrolysisTableResult";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+       }
+
+       @Override
+       public void closeChest() {
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryToolAndWeaponCraftingTableMaterial.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryToolAndWeaponCraftingTableMaterial.java
new file mode 100644 (file)
index 0000000..645fe88
--- /dev/null
@@ -0,0 +1,125 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryToolAndWeaponCraftingTableMaterial implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[16];
+       private Container eventHandler;
+
+       public void setEventHandler(Container par1){
+               this.eventHandler = par1;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return this.inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return this.inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int var1, int var2) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var3;
+
+                       if (this.inventory[var1].stackSize <= var2)
+                       {
+                               var3 = this.inventory[var1];
+                               this.inventory[var1] = null;
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+                       else
+                       {
+                               var3 = this.inventory[var1].splitStack(var2);
+
+                               if (this.inventory[var1].stackSize == 0)
+                               {
+                                       this.inventory[var1] = null;
+                               }
+
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int var1) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var2 = this.inventory[var1];
+                       this.inventory[var1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               this.inventory[var1] = var2;
+
+               if (var2 != null && var2.stackSize > this.getInventoryStackLimit())
+               {
+                       var2.stackSize = this.getInventoryStackLimit();
+               }
+
+               this.onInventoryChanged();
+       }
+
+       @Override
+       public String getInvName() {
+               return "ToolAndWeaponCraftingTableMaterial";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               if(this.eventHandler != null) this.eventHandler.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+       }
+
+       @Override
+       public void closeChest() {
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryToolAndWeaponCraftingTableResult.java b/src/asia/tcrs/ccnp/chemicraftnext/core/inventory/InventoryToolAndWeaponCraftingTableResult.java
new file mode 100644 (file)
index 0000000..0d29705
--- /dev/null
@@ -0,0 +1,126 @@
+package asia.tcrs.ccnp.chemicraftnext.core.inventory;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public class InventoryToolAndWeaponCraftingTableResult implements IInventory {
+
+       private ItemStack[] inventory = new ItemStack[16];
+       private Container eventHandler;
+
+       public void setEventHandler(Container par1){
+               this.eventHandler = par1;
+       }
+
+       @Override
+       public int getSizeInventory() {
+               return this.inventory.length;
+       }
+
+       @Override
+       public ItemStack getStackInSlot(int var1) {
+               return this.inventory[var1];
+       }
+
+       @Override
+       public ItemStack decrStackSize(int var1, int var2) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var3;
+
+                       if (this.inventory[var1].stackSize <= var2)
+                       {
+                               var3 = this.inventory[var1];
+                               this.inventory[var1] = null;
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+                       else
+                       {
+                               var3 = this.inventory[var1].splitStack(var2);
+
+                               if (this.inventory[var1].stackSize == 0)
+                               {
+                                       this.inventory[var1] = null;
+                               }
+
+                               this.onInventoryChanged();
+                               return var3;
+                       }
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public ItemStack getStackInSlotOnClosing(int var1) {
+               if (this.inventory[var1] != null)
+               {
+                       ItemStack var2 = this.inventory[var1];
+                       this.inventory[var1] = null;
+                       return var2;
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       @Override
+       public void setInventorySlotContents(int var1, ItemStack var2) {
+               this.inventory[var1] = var2;
+
+               if (var2 != null && var2.stackSize > this.getInventoryStackLimit())
+               {
+                       var2.stackSize = this.getInventoryStackLimit();
+               }
+
+               this.onInventoryChanged();
+       }
+
+       @Override
+       public String getInvName() {
+               return "ToolAndWeaponCraftingTableResult";
+       }
+
+       @Override
+       public int getInventoryStackLimit() {
+               return 64;
+       }
+
+       @Override
+       public void onInventoryChanged() {
+               if(this.eventHandler != null) this.eventHandler.onCraftMatrixChanged(this);
+       }
+
+       @Override
+       public boolean isUseableByPlayer(EntityPlayer var1) {
+               return true;
+       }
+
+       @Override
+       public void openChest() {
+       }
+
+       @Override
+       public void closeChest() {
+       }
+
+       @Override
+       public boolean isInvNameLocalized() {
+
+               return false;
+       }
+
+       @Override
+       public boolean isStackValidForSlot(int i, ItemStack itemstack) {
+
+               return false;
+       }
+
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemAtomInfoContainer.java b/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemAtomInfoContainer.java
new file mode 100644 (file)
index 0000000..f0cb47f
--- /dev/null
@@ -0,0 +1,19 @@
+package asia.tcrs.ccnp.chemicraftnext.core.item;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.util.AtomInfo;\r
+import net.minecraft.item.Item;\r
+\r
+public class ItemAtomInfoContainer extends Item {\r
+\r
+       /**\r
+        * AtonInfoのインスタンス\r
+        */\r
+       public AtomInfo atomInfo = new AtomInfo();\r
+\r
+\r
+\r
+       public ItemAtomInfoContainer(int par1){\r
+               super(par1);\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemAtoms.java b/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemAtoms.java
new file mode 100644 (file)
index 0000000..bdc403d
--- /dev/null
@@ -0,0 +1,102 @@
+package asia.tcrs.ccnp.chemicraftnext.core.item;
+
+import java.util.List;
+import java.util.Random;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.util.AtomInfo;
+
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ItemAtoms extends Item {
+
+       @SideOnly(Side.CLIENT)
+       private Icon[] icons;
+
+       public ItemAtoms(int par1){
+               super(par1);
+               this.maxStackSize = 16;
+               this.setHasSubtypes(true);
+               this.setMaxDamage(0);
+               this.setCreativeTab(ChemiCraftCore.instance.creativeTabChemiCraft);
+       }
+
+
+
+       @Override
+       public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5)
+       {
+               if (AtomInfo.isRI(par1ItemStack.getItemDamage() + 1)){
+                       Random random = new Random();
+                       if (random.nextInt(100) == 0){
+                               if (par3Entity instanceof EntityLiving){
+                                       EntityLiving entity = (EntityLiving)par3Entity;
+                                       entity.attackEntityFrom(ChemiCraftCore.getRadiationDamageSource(entity), 1);
+                               }
+                               if (par3Entity instanceof EntityPlayer){
+                                       EntityPlayer player = (EntityPlayer)par3Entity;
+                                       ItemStack itemstack = new ItemStack(
+                                                       par1ItemStack.itemID,
+                                                       1,
+                                                       par1ItemStack.getItemDamage());
+                                       itemstack.setItemDamage(AtomInfo.collapseUraniumSeries(itemstack.getItemDamage() + 1) - 1);
+                                       if (--par1ItemStack.stackSize <= 0) {
+                                               player.inventory.clearInventory(par1ItemStack.itemID, par1ItemStack.getItemDamage());
+                                       }
+                                       player.inventory.addItemStackToInventory(itemstack);
+                               }
+                       }
+               }
+       }
+
+
+
+       @SuppressWarnings({ "unchecked", "rawtypes" })
+       @SideOnly(Side.CLIENT)
+       @Override
+       public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List){
+               for(int type = 0; type < ChemiCraftCore.instance.ATOMSNAME.length; type++)
+               {
+                       par3List.add(new ItemStack(par1, 1, type));
+               }
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+       public Icon getIconFromDamage(int par1) {
+               return this.icons[par1];
+       }
+
+
+
+       @Override
+       public String getUnlocalizedName(ItemStack par1ItemStack){
+               return super.getUnlocalizedName() + "." + ChemiCraftCore.instance.ATOMSNAME[par1ItemStack.getItemDamage()];
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister){
+               this.icons = new Icon[ChemiCraftCore.instance.ATOMSNAME.length];
+
+               for (int i = 0; i < ChemiCraftCore.instance.ATOMSNAME.length; i++) {
+                       this.icons[i] = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "atoms_" + ChemiCraftCore.instance.ATOMSNAME[i]);
+               }
+       }
+
+}
\ No newline at end of file
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemChemicalCell.java b/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemChemicalCell.java
new file mode 100644 (file)
index 0000000..bd8a35a
--- /dev/null
@@ -0,0 +1,29 @@
+package asia.tcrs.ccnp.chemicraftnext.core.item;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.item.Item;
+
+
+public class ItemChemicalCell extends Item
+{
+
+       public ItemChemicalCell(int par1)
+       {
+               super(par1);
+               this.maxStackSize = 64;
+               this.setCreativeTab(ChemiCraftCore.instance.creativeTabChemiCraft);
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister){
+               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "chemical_cell");
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemCompounds.java b/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemCompounds.java
new file mode 100644 (file)
index 0000000..9a0154d
--- /dev/null
@@ -0,0 +1,112 @@
+package asia.tcrs.ccnp.chemicraftnext.core.item;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Icon;
+import net.minecraft.world.World;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ItemCompounds extends Item {
+
+       private Icon[] icons;
+
+       public ItemCompounds(int par1){
+               super(par1);
+               this.setHasSubtypes(true);
+               this.setMaxDamage(0);
+               this.setCreativeTab(ChemiCraftCore.instance.creativeTabChemiCraft);
+       }
+
+       @Override
+       public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) {
+               try {
+                       for(int i=0;i < ChemiCraftAPI.instance().getCompoundHandlerItemName().size();i++){
+                               if(ChemiCraftAPI.instance().getCompoundsName().getKeyList(par1ItemStack.getItemDamage()).equals(ChemiCraftAPI.instance().getCompoundHandlerItemName().get(i))){
+                                       return ChemiCraftAPI.instance().getCompoundHandler().get(i).onItemUseHandler(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6, par7, par8, par9, par10);
+                               }
+                       }
+               } catch (IndexOutOfBoundsException e) {
+                       par1ItemStack.stackSize = 0;
+               }
+               return false;
+       }
+
+
+       @Override
+       public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
+               try {
+                       for(int i=0;i < ChemiCraftAPI.instance().getCompoundHandlerItemName().size();i++){
+                               if(ChemiCraftAPI.instance().getCompoundsName().getKeyList(par1ItemStack.getItemDamage()).equals(ChemiCraftAPI.instance().getCompoundHandlerItemName().get(i))){
+                                       ChemiCraftAPI.instance().getCompoundHandler().get(i).onItemRightClickHandler(par1ItemStack, par2World, par3EntityPlayer);
+                               }
+                       }
+               } catch (IndexOutOfBoundsException e) {
+                       par1ItemStack.stackSize = 0;
+               }
+               return par1ItemStack;
+       }
+
+
+
+       @Override
+       public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) {
+               try {
+                       for(int i=0;i < ChemiCraftAPI.instance().getCompoundHandlerItemName().size();i++){
+                               if(ChemiCraftAPI.instance().getCompoundsName().getKeyList(par1ItemStack.getItemDamage()).equals(ChemiCraftAPI.instance().getCompoundHandlerItemName().get(i))){
+                                       ChemiCraftAPI.instance().getCompoundHandler().get(i).onUpdateHandler(par1ItemStack, par2World, par3Entity, par4, par5);
+                               }
+                       }
+               } catch (IndexOutOfBoundsException e) {
+                       par1ItemStack.stackSize = 0;
+                       par1ItemStack = null;
+               }
+       }
+
+
+
+       @SuppressWarnings({ "unchecked", "rawtypes" })
+       @SideOnly(Side.CLIENT)
+       @Override
+       public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List){
+               for(int type = 0; type < ChemiCraftAPI.instance().getCompoundsName().get("en_US").size(); type++) {
+                       par3List.add(new ItemStack(par1, 1, type));
+               }
+       }
+
+
+
+       @Override
+       public String getUnlocalizedName(ItemStack par1ItemStack){
+               return super.getUnlocalizedName() + "." + ChemiCraftCore.instance.api.getCompoundsName().get("en_US", par1ItemStack.getItemDamage());
+       }
+
+
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister) {
+               ArrayList<String> textures = ChemiCraftAPI.getCompoundsTexture();
+               this.icons = new Icon[textures.size()];
+               for (int i = 0; i < textures.size(); i++) {
+                       this.icons[i] = par1IconRegister.registerIcon(textures.get(i));
+               }
+       }
+
+       @Override
+       @SideOnly(Side.CLIENT)
+       public Icon getIconFromDamage(int par1) {
+               return this.icons[par1];
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemGasCollectingBottle.java b/src/asia/tcrs/ccnp/chemicraftnext/core/item/ItemGasCollectingBottle.java
new file mode 100644 (file)
index 0000000..ea2a4fa
--- /dev/null
@@ -0,0 +1,103 @@
+package asia.tcrs.ccnp.chemicraftnext.core.item;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraft;
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.util.Auxiliary.Probability;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFire;
+import net.minecraft.client.renderer.texture.IconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+public class ItemGasCollectingBottle extends ItemAtomInfoContainer
+{
+
+       public Probability probability = new Probability();
+
+       public ItemGasCollectingBottle(int id)
+       {
+               super(id);
+               this.setMaxStackSize(1);
+               this.setMaxDamage(4);
+               this.setCreativeTab(ChemiCraftCore.instance.creativeTabChemiCraft);
+       }
+
+       @Override
+       public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
+       {
+               par1ItemStack.damageItem(1, par3EntityPlayer);
+
+               this.atomInfo.update(par2World, par3EntityPlayer);
+
+               int heightValue = par2World.getHeightValue((int)par3EntityPlayer.posX, (int)par3EntityPlayer.posZ);
+
+               int result = probability.getProbability(78.0D, 21.0D, 1.0D, 0.032D, 0.0018D, 0.000012D, 0.00052D, 0.000114D, 0.000087D);
+               if (this.atomInfo.isOverY(heightValue)) {
+                       if (result == 0) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.NITROGEN), par3EntityPlayer);
+                       } else if (result == 1) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.OXYGEN), par3EntityPlayer);
+                       } else if (result == 2) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.ARGON), par3EntityPlayer);
+                       } else if (result == 3) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemCompounds, 1, ChemiCraftAPI.instance().getCompound("CarbonDioxide")), par3EntityPlayer);
+                       } else if (result == 4) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.NEON), par3EntityPlayer);
+                       } else if (result == 5) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemCompounds, 1, ChemiCraftAPI.instance().getCompound("CarbonMonoxide")), par3EntityPlayer);
+                       } else if (result == 6) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.LITHIUM), par3EntityPlayer);
+                       } else if (result == 7) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.KRYPTON), par3EntityPlayer);
+                       } else {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemAtoms, 1, ChemiCraftData.XENON), par3EntityPlayer);
+                       }
+               }
+
+               return par1ItemStack;
+       }
+
+       protected void isStackOrDrop(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer)
+       {
+               if (!par2EntityPlayer.inventory.addItemStackToInventory(par1ItemStack)) {
+                       par2EntityPlayer.dropPlayerItem(par1ItemStack);
+               }
+       }
+
+       @Override
+       public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
+       {
+               int blockID = par3World.getBlockId(par4, par5, par6);
+               Block block = Block.blocksList[blockID];
+
+               int uniqueBlockID = par3World.getBlockId(par4, par5 + 1, par6);
+               Block uniqueBlock = Block.blocksList[uniqueBlockID];
+
+               if (uniqueBlock instanceof BlockFire) {
+                       par1ItemStack.damageItem(1, par2EntityPlayer);
+
+                       int result1 = probability.getProbability(99, 1);
+
+                       if (result1 == 0) {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemCompounds, 1, ChemiCraftAPI.instance().getCompound("CarbonDioxide")), par2EntityPlayer);
+                       } else {
+                               this.isStackOrDrop(new ItemStack(ChemiCraftCore.instance.itemCompounds, 1, ChemiCraftAPI.instance().getCompound("CarbonMonoxide")), par2EntityPlayer);
+                       }
+
+                       return true;
+               }
+               return false;
+       }
+
+       @Override
+       @SideOnly(Side.CLIENT)
+    public void registerIcons(IconRegister par1IconRegister){
+               this.itemIcon = par1IconRegister.registerIcon(ChemiCraft.TEXTURE + "gas_collecting_bottle");
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/nbt/ChemicalNBTRecipe.java b/src/asia/tcrs/ccnp/chemicraftnext/core/nbt/ChemicalNBTRecipe.java
new file mode 100644 (file)
index 0000000..2d72f38
--- /dev/null
@@ -0,0 +1,11 @@
+package asia.tcrs.ccnp.chemicraftnext.core.nbt;
+
+import net.minecraft.item.ItemStack;
+
+public interface ChemicalNBTRecipe {
+
+       public abstract void setNBT(ItemStack[] materials, ItemStack result);
+
+       public abstract ItemStack[] getMatchItems(ItemStack[] materials);
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/nbt/NBTRecipeGrenade.java b/src/asia/tcrs/ccnp/chemicraftnext/core/nbt/NBTRecipeGrenade.java
new file mode 100644 (file)
index 0000000..43f55f4
--- /dev/null
@@ -0,0 +1,62 @@
+package asia.tcrs.ccnp.chemicraftnext.core.nbt;
+
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+public class NBTRecipeGrenade implements ChemicalNBTRecipe {
+
+       @Override
+       public void setNBT(ItemStack[] materials, ItemStack result) {
+               if (result.stackTagCompound == null) {
+                       result.stackTagCompound = new NBTTagCompound();
+               }
+
+               if (!result.stackTagCompound.hasKey("Effect")) {
+                       result.stackTagCompound.setTag("Effect", new NBTTagList("Effect"));
+               }
+
+               NBTTagList tagList = (NBTTagList) result.getTagCompound().getTag("Effect");
+               NBTTagCompound tag = new NBTTagCompound();
+
+               for (int i = 0;i < materials.length;i++) {
+                       if (materials[i] != null) {
+                               if (materials[i].itemID-256 == ChemiCraftCore.instance.atomsID && materials[i].getItemDamage() == ChemiCraftData.HYDROGEN) {
+                                       tag.setString("GrenadeEffect" + i, "Hydrogen");
+                               }
+                               if (materials[i].itemID-256 == ChemiCraftCore.instance.atomsID && materials[i].getItemDamage() == ChemiCraftData.CARBON) {
+                                       tag.setString("GrenadeEffect" + i, "Carbon");
+                               }
+                               if (materials[i].itemID-256 == ChemiCraftCore.instance.atomsID && materials[i].getItemDamage() == ChemiCraftData.URANIUM) {
+                                       tag.setString("GrenadeEffect" + i, "Uranium");
+                               }
+                       }
+               }
+               tagList.appendTag(tag);
+
+       }
+
+       @Override
+       public ItemStack[] getMatchItems(ItemStack[] materials) {
+               ItemStack[] var1 = new ItemStack[materials.length];
+               for (int i = 0;i < var1.length;i++) {
+                       if (materials[i] != null) {
+                               if (materials[i].getItemDamage() == ChemiCraftData.HYDROGEN) {
+                                       var1[i] = materials[i];
+                               } else if (materials[i].getItemDamage() == ChemiCraftData.CARBON) {
+                                       var1[i] = materials[i];
+                               } else if (materials[i].getItemDamage() == ChemiCraftData.URANIUM) {
+                                       var1[i] = materials[i];
+                               } else {
+                                       var1[i] = null;
+                               }
+                       } else {
+                               var1[i] = null;
+                       }
+               }
+               return var1;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/other/ChunkProviderChemical.java b/src/asia/tcrs/ccnp/chemicraftnext/core/other/ChunkProviderChemical.java
new file mode 100644 (file)
index 0000000..850389b
--- /dev/null
@@ -0,0 +1,691 @@
+package asia.tcrs.ccnp.chemicraftnext.core.other;
+
+import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.*;
+import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.*;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSand;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.util.IProgressUpdate;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.SpawnerAnimals;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraft.world.gen.MapGenBase;
+import net.minecraft.world.gen.MapGenCaves;
+import net.minecraft.world.gen.MapGenRavine;
+import net.minecraft.world.gen.NoiseGeneratorOctaves;
+import net.minecraft.world.gen.feature.MapGenScatteredFeature;
+import net.minecraft.world.gen.feature.WorldGenDungeons;
+import net.minecraft.world.gen.feature.WorldGenLakes;
+import net.minecraft.world.gen.structure.MapGenMineshaft;
+import net.minecraft.world.gen.structure.MapGenStronghold;
+import net.minecraft.world.gen.structure.MapGenVillage;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.Event.Result;
+import net.minecraftforge.event.terraingen.ChunkProviderEvent;
+import net.minecraftforge.event.terraingen.PopulateChunkEvent;
+import net.minecraftforge.event.terraingen.TerrainGen;
+
+public class ChunkProviderChemical implements IChunkProvider
+{
+       /** RNG. */
+       private Random rand;
+
+       /** A NoiseGeneratorOctaves used in generating terrain */
+       private NoiseGeneratorOctaves noiseGen1;
+
+       /** A NoiseGeneratorOctaves used in generating terrain */
+       private NoiseGeneratorOctaves noiseGen2;
+
+       /** A NoiseGeneratorOctaves used in generating terrain */
+       private NoiseGeneratorOctaves noiseGen3;
+
+       /** A NoiseGeneratorOctaves used in generating terrain */
+       private NoiseGeneratorOctaves noiseGen4;
+
+       /** A NoiseGeneratorOctaves used in generating terrain */
+       public NoiseGeneratorOctaves noiseGen5;
+
+       /** A NoiseGeneratorOctaves used in generating terrain */
+       public NoiseGeneratorOctaves noiseGen6;
+       public NoiseGeneratorOctaves mobSpawnerNoise;
+
+       /** Reference to the World object. */
+       private World worldObj;
+
+       /** are map structures going to be generated (e.g. strongholds) */
+       private final boolean mapFeaturesEnabled;
+
+       /** Holds the overall noise array used in chunk generation */
+       private double[] noiseArray;
+       private double[] stoneNoise = new double[256];
+       private MapGenBase caveGenerator = new MapGenCaves();
+
+       /** Holds Stronghold Generator */
+       private MapGenStronghold strongholdGenerator = new MapGenStronghold();
+
+       /** Holds Village Generator */
+       private MapGenVillage villageGenerator = new MapGenVillage();
+
+       /** Holds Mineshaft Generator */
+       private MapGenMineshaft mineshaftGenerator = new MapGenMineshaft();
+       private MapGenScatteredFeature scatteredFeatureGenerator = new MapGenScatteredFeature();
+
+       /** Holds ravine generator */
+       private MapGenBase ravineGenerator = new MapGenRavine();
+
+       /** The biomes that are used to generate the chunk */
+       private BiomeGenBase[] biomesForGeneration;
+
+       /** A double array that hold terrain noise from noiseGen3 */
+       double[] noise3;
+
+       /** A double array that hold terrain noise */
+       double[] noise1;
+
+       /** A double array that hold terrain noise from noiseGen2 */
+       double[] noise2;
+
+       /** A double array that hold terrain noise from noiseGen5 */
+       double[] noise5;
+
+       /** A double array that holds terrain noise from noiseGen6 */
+       double[] noise6;
+
+       /**
+        * Used to store the 5x5 parabolic field that is used during terrain generation.
+        */
+       float[] parabolicField;
+       int[][] field_73219_j = new int[32][32];
+
+       {
+               caveGenerator = TerrainGen.getModdedMapGen(caveGenerator, CAVE);
+               strongholdGenerator = (MapGenStronghold) TerrainGen.getModdedMapGen(strongholdGenerator, STRONGHOLD);
+               villageGenerator = (MapGenVillage) TerrainGen.getModdedMapGen(villageGenerator, VILLAGE);
+               mineshaftGenerator = (MapGenMineshaft) TerrainGen.getModdedMapGen(mineshaftGenerator, MINESHAFT);
+               scatteredFeatureGenerator = (MapGenScatteredFeature) TerrainGen.getModdedMapGen(scatteredFeatureGenerator, SCATTERED_FEATURE);
+               ravineGenerator = TerrainGen.getModdedMapGen(ravineGenerator, RAVINE);
+       }
+
+       public ChunkProviderChemical(World par1World, long par2, boolean par4)
+       {
+               this.worldObj = par1World;
+               this.mapFeaturesEnabled = par4;
+               this.rand = new Random(par2);
+               this.noiseGen1 = new NoiseGeneratorOctaves(this.rand, 16);
+               this.noiseGen2 = new NoiseGeneratorOctaves(this.rand, 16);
+               this.noiseGen3 = new NoiseGeneratorOctaves(this.rand, 8);
+               this.noiseGen4 = new NoiseGeneratorOctaves(this.rand, 4);
+               this.noiseGen5 = new NoiseGeneratorOctaves(this.rand, 10);
+               this.noiseGen6 = new NoiseGeneratorOctaves(this.rand, 16);
+               this.mobSpawnerNoise = new NoiseGeneratorOctaves(this.rand, 8);
+
+               NoiseGeneratorOctaves[] noiseGens = {noiseGen1, noiseGen2, noiseGen3, noiseGen4, noiseGen5, noiseGen6, mobSpawnerNoise};
+               noiseGens = TerrainGen.getModdedNoiseGenerators(par1World, this.rand, noiseGens);
+               this.noiseGen1 = noiseGens[0];
+               this.noiseGen2 = noiseGens[1];
+               this.noiseGen3 = noiseGens[2];
+               this.noiseGen4 = noiseGens[3];
+               this.noiseGen5 = noiseGens[4];
+               this.noiseGen6 = noiseGens[5];
+               this.mobSpawnerNoise = noiseGens[6];
+       }
+
+       /**
+        * Generates the shape of the terrain for the chunk though its all stone though the water is frozen if the
+        * temperature is low enough
+        */
+       public void generateTerrain(int par1, int par2, byte[] par3ArrayOfByte)
+       {
+               byte var4 = 4;
+               byte var5 = 16;
+               byte var6 = 63;
+               int var7 = var4 + 1;
+               byte var8 = 17;
+               int var9 = var4 + 1;
+               this.biomesForGeneration = this.worldObj.getWorldChunkManager().getBiomesForGeneration(this.biomesForGeneration, par1 * 4 - 2, par2 * 4 - 2, var7 + 5, var9 + 5);
+               this.noiseArray = this.initializeNoiseField(this.noiseArray, par1 * var4, 0, par2 * var4, var7, var8, var9);
+
+               for (int var10 = 0; var10 < var4; ++var10)
+               {
+                       for (int var11 = 0; var11 < var4; ++var11)
+                       {
+                               for (int var12 = 0; var12 < var5; ++var12)
+                               {
+                                       double var13 = 0.125D;
+                                       double var15 = this.noiseArray[((var10 + 0) * var9 + var11 + 0) * var8 + var12 + 0];
+                                       double var17 = this.noiseArray[((var10 + 0) * var9 + var11 + 1) * var8 + var12 + 0];
+                                       double var19 = this.noiseArray[((var10 + 1) * var9 + var11 + 0) * var8 + var12 + 0];
+                                       double var21 = this.noiseArray[((var10 + 1) * var9 + var11 + 1) * var8 + var12 + 0];
+                                       double var23 = (this.noiseArray[((var10 + 0) * var9 + var11 + 0) * var8 + var12 + 1] - var15) * var13;
+                                       double var25 = (this.noiseArray[((var10 + 0) * var9 + var11 + 1) * var8 + var12 + 1] - var17) * var13;
+                                       double var27 = (this.noiseArray[((var10 + 1) * var9 + var11 + 0) * var8 + var12 + 1] - var19) * var13;
+                                       double var29 = (this.noiseArray[((var10 + 1) * var9 + var11 + 1) * var8 + var12 + 1] - var21) * var13;
+
+                                       for (int var31 = 0; var31 < 8; ++var31)
+                                       {
+                                               double var32 = 0.25D;
+                                               double var34 = var15;
+                                               double var36 = var17;
+                                               double var38 = (var19 - var15) * var32;
+                                               double var40 = (var21 - var17) * var32;
+
+                                               for (int var42 = 0; var42 < 4; ++var42)
+                                               {
+                                                       int var43 = var42 + var10 * 4 << 11 | 0 + var11 * 4 << 7 | var12 * 8 + var31;
+                                                       short var44 = 128;
+                                                       var43 -= var44;
+                                                       double var45 = 0.25D;
+                                                       double var49 = (var36 - var34) * var45;
+                                                       double var47 = var34 - var49;
+
+                                                       for (int var51 = 0; var51 < 4; ++var51)
+                                                       {
+                                                               if ((var47 += var49) > 0.0D)
+                                                               {
+                                                                       par3ArrayOfByte[var43 += var44] = (byte)Block.stone.blockID;
+                                                               }
+                                                               else if (var12 * 8 + var31 < var6)
+                                                               {
+                                                                       //par3ArrayOfByte[var43 += var44] = (byte)Block.waterStill.blockID;
+                                                               }
+                                                               else
+                                                               {
+                                                                       par3ArrayOfByte[var43 += var44] = 0;
+                                                               }
+                                                       }
+
+                                                       var34 += var38;
+                                                       var36 += var40;
+                                               }
+
+                                               var15 += var23;
+                                               var17 += var25;
+                                               var19 += var27;
+                                               var21 += var29;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Replaces the stone that was placed in with blocks that match the biome
+        */
+       public void replaceBlocksForBiome(int par1, int par2, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase)
+       {
+               ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(this, par1, par2, par3ArrayOfByte, par4ArrayOfBiomeGenBase);
+               MinecraftForge.EVENT_BUS.post(event);
+               if (event.getResult() == Result.DENY) return;
+
+               byte var5 = 63;
+               double var6 = 0.03125D;
+               this.stoneNoise = this.noiseGen4.generateNoiseOctaves(this.stoneNoise, par1 * 16, par2 * 16, 0, 16, 16, 1, var6 * 2.0D, var6 * 2.0D, var6 * 2.0D);
+
+               for (int var8 = 0; var8 < 16; ++var8)
+               {
+                       for (int var9 = 0; var9 < 16; ++var9)
+                       {
+                               BiomeGenBase var10 = par4ArrayOfBiomeGenBase[var9 + var8 * 16];
+                               float var11 = var10.getFloatTemperature();
+                               int var12 = (int)(this.stoneNoise[var8 + var9 * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D);
+                               int var13 = -1;
+                               byte var14 = var10.topBlock;
+                               byte var15 = var10.fillerBlock;
+
+                               for (int var16 = 127; var16 >= 0; --var16)
+                               {
+                                       int var17 = (var9 * 16 + var8) * 128 + var16;
+
+                                       if (var16 <= 0 + this.rand.nextInt(5))
+                                       {
+                                               par3ArrayOfByte[var17] = (byte)Block.bedrock.blockID;
+                                       }
+                                       else
+                                       {
+                                               byte var18 = par3ArrayOfByte[var17];
+
+                                               if (var18 == 0)
+                                               {
+                                                       var13 = -1;
+                                               }
+                                               else if (var18 == Block.stone.blockID)
+                                               {
+                                                       if (var13 == -1)
+                                                       {
+                                                               if (var12 <= 0)
+                                                               {
+                                                                       var14 = 0;
+                                                                       var15 = (byte)Block.stone.blockID;
+                                                               }
+                                                               else if (var16 >= var5 - 4 && var16 <= var5 + 1)
+                                                               {
+                                                                       var14 = var10.topBlock;
+                                                                       var15 = var10.fillerBlock;
+                                                               }
+
+                                                               if (var16 < var5 && var14 == 0)
+                                                               {
+                                                                       if (var11 < 0.15F)
+                                                                       {
+                                                                               //var14 = (byte)Block.ice.blockID;
+                                                                       }
+                                                                       else
+                                                                       {
+                                                                               //var14 = (byte)Block.waterStill.blockID;
+                                                                       }
+                                                               }
+
+                                                               var13 = var12;
+
+                                                               if (var16 >= var5 - 1)
+                                                               {
+                                                                       par3ArrayOfByte[var17] = var14;
+                                                               }
+                                                               else
+                                                               {
+                                                                       par3ArrayOfByte[var17] = var15;
+                                                               }
+                                                       }
+                                                       else if (var13 > 0)
+                                                       {
+                                                               --var13;
+                                                               par3ArrayOfByte[var17] = var15;
+
+                                                               if (var13 == 0 && var15 == Block.sand.blockID)
+                                                               {
+                                                                       var13 = this.rand.nextInt(4);
+                                                                       var15 = (byte)Block.sandStone.blockID;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * loads or generates the chunk at the chunk location specified
+        */
+       public Chunk loadChunk(int par1, int par2)
+       {
+               return this.provideChunk(par1, par2);
+       }
+
+       /**
+        * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the
+        * specified chunk from the map seed and chunk seed
+        */
+       public Chunk provideChunk(int par1, int par2)
+       {
+               this.rand.setSeed((long)par1 * 341873128712L + (long)par2 * 132897987541L);
+               byte[] var3 = new byte[32768];
+               this.generateTerrain(par1, par2, var3);
+               this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, par1 * 16, par2 * 16, 16, 16);
+               this.replaceBlocksForBiome(par1, par2, var3, this.biomesForGeneration);
+               this.caveGenerator.generate(this, this.worldObj, par1, par2, var3);
+               this.ravineGenerator.generate(this, this.worldObj, par1, par2, var3);
+
+               if (this.mapFeaturesEnabled)
+               {
+                       this.mineshaftGenerator.generate(this, this.worldObj, par1, par2, var3);
+                       this.villageGenerator.generate(this, this.worldObj, par1, par2, var3);
+                       this.strongholdGenerator.generate(this, this.worldObj, par1, par2, var3);
+                       this.scatteredFeatureGenerator.generate(this, this.worldObj, par1, par2, var3);
+               }
+
+               Chunk var4 = new Chunk(this.worldObj, var3, par1, par2);
+               byte[] var5 = var4.getBiomeArray();
+
+               for (int var6 = 0; var6 < var5.length; ++var6)
+               {
+                       var5[var6] = (byte)this.biomesForGeneration[var6].biomeID;
+               }
+
+               var4.generateSkylightMap();
+               return var4;
+       }
+
+       /**
+        * generates a subset of the level's terrain data. Takes 7 arguments: the [empty] noise array, the position, and the
+        * size.
+        */
+       private double[] initializeNoiseField(double[] par1ArrayOfDouble, int par2, int par3, int par4, int par5, int par6, int par7)
+       {
+               ChunkProviderEvent.InitNoiseField event = new ChunkProviderEvent.InitNoiseField(this, par1ArrayOfDouble, par2, par3, par4, par5, par6, par7);
+               MinecraftForge.EVENT_BUS.post(event);
+               if (event.getResult() == Result.DENY) return event.noisefield;
+
+               if (par1ArrayOfDouble == null)
+               {
+                       par1ArrayOfDouble = new double[par5 * par6 * par7];
+               }
+
+               if (this.parabolicField == null)
+               {
+                       this.parabolicField = new float[25];
+
+                       for (int var8 = -2; var8 <= 2; ++var8)
+                       {
+                               for (int var9 = -2; var9 <= 2; ++var9)
+                               {
+                                       float var10 = 10.0F / MathHelper.sqrt_float((float)(var8 * var8 + var9 * var9) + 0.2F);
+                                       this.parabolicField[var8 + 2 + (var9 + 2) * 5] = var10;
+                               }
+                       }
+               }
+
+               double var44 = 684.412D;
+               double var45 = 684.412D;
+               this.noise5 = this.noiseGen5.generateNoiseOctaves(this.noise5, par2, par4, par5, par7, 1.121D, 1.121D, 0.5D);
+               this.noise6 = this.noiseGen6.generateNoiseOctaves(this.noise6, par2, par4, par5, par7, 200.0D, 200.0D, 0.5D);
+               this.noise3 = this.noiseGen3.generateNoiseOctaves(this.noise3, par2, par3, par4, par5, par6, par7, var44 / 80.0D, var45 / 160.0D, var44 / 80.0D);
+               this.noise1 = this.noiseGen1.generateNoiseOctaves(this.noise1, par2, par3, par4, par5, par6, par7, var44, var45, var44);
+               this.noise2 = this.noiseGen2.generateNoiseOctaves(this.noise2, par2, par3, par4, par5, par6, par7, var44, var45, var44);
+               boolean var43 = false;
+               boolean var42 = false;
+               int var12 = 0;
+               int var13 = 0;
+
+               for (int var14 = 0; var14 < par5; ++var14)
+               {
+                       for (int var15 = 0; var15 < par7; ++var15)
+                       {
+                               float var16 = 0.0F;
+                               float var17 = 0.0F;
+                               float var18 = 0.0F;
+                               byte var19 = 2;
+                               BiomeGenBase var20 = this.biomesForGeneration[var14 + 2 + (var15 + 2) * (par5 + 5)];
+
+                               for (int var21 = -var19; var21 <= var19; ++var21)
+                               {
+                                       for (int var22 = -var19; var22 <= var19; ++var22)
+                                       {
+                                               BiomeGenBase var23 = this.biomesForGeneration[var14 + var21 + 2 + (var15 + var22 + 2) * (par5 + 5)];
+                                               float var24 = this.parabolicField[var21 + 2 + (var22 + 2) * 5] / (var23.minHeight + 2.0F);
+
+                                               if (var23.minHeight > var20.minHeight)
+                                               {
+                                                       var24 /= 2.0F;
+                                               }
+
+                                               var16 += var23.maxHeight * var24;
+                                               var17 += var23.minHeight * var24;
+                                               var18 += var24;
+                                       }
+                               }
+
+                               var16 /= var18;
+                               var17 /= var18;
+                               var16 = var16 * 0.9F + 0.1F;
+                               var17 = (var17 * 4.0F - 1.0F) / 8.0F;
+                               double var47 = this.noise6[var13] / 8000.0D;
+
+                               if (var47 < 0.0D)
+                               {
+                                       var47 = -var47 * 0.3D;
+                               }
+
+                               var47 = var47 * 3.0D - 2.0D;
+
+                               if (var47 < 0.0D)
+                               {
+                                       var47 /= 2.0D;
+
+                                       if (var47 < -1.0D)
+                                       {
+                                               var47 = -1.0D;
+                                       }
+
+                                       var47 /= 1.4D;
+                                       var47 /= 2.0D;
+                               }
+                               else
+                               {
+                                       if (var47 > 1.0D)
+                                       {
+                                               var47 = 1.0D;
+                                       }
+
+                                       var47 /= 8.0D;
+                               }
+
+                               ++var13;
+
+                               for (int var46 = 0; var46 < par6; ++var46)
+                               {
+                                       double var48 = (double)var17;
+                                       double var26 = (double)var16;
+                                       var48 += var47 * 0.2D;
+                                       var48 = var48 * (double)par6 / 16.0D;
+                                       double var28 = (double)par6 / 2.0D + var48 * 4.0D;
+                                       double var30 = 0.0D;
+                                       double var32 = ((double)var46 - var28) * 12.0D * 128.0D / 128.0D / var26;
+
+                                       if (var32 < 0.0D)
+                                       {
+                                               var32 *= 4.0D;
+                                       }
+
+                                       double var34 = this.noise1[var12] / 512.0D;
+                                       double var36 = this.noise2[var12] / 512.0D;
+                                       double var38 = (this.noise3[var12] / 10.0D + 1.0D) / 2.0D;
+
+                                       if (var38 < 0.0D)
+                                       {
+                                               var30 = var34;
+                                       }
+                                       else if (var38 > 1.0D)
+                                       {
+                                               var30 = var36;
+                                       }
+                                       else
+                                       {
+                                               var30 = var34 + (var36 - var34) * var38;
+                                       }
+
+                                       var30 -= var32;
+
+                                       if (var46 > par6 - 4)
+                                       {
+                                               double var40 = (double)((float)(var46 - (par6 - 4)) / 3.0F);
+                                               var30 = var30 * (1.0D - var40) + -10.0D * var40;
+                                       }
+
+                                       par1ArrayOfDouble[var12] = var30;
+                                       ++var12;
+                               }
+                       }
+               }
+
+               return par1ArrayOfDouble;
+       }
+
+       /**
+        * Checks to see if a chunk exists at x, y
+        */
+       public boolean chunkExists(int par1, int par2)
+       {
+               return true;
+       }
+
+       /**
+        * Populates chunk with ores etc etc
+        */
+       public void populate(IChunkProvider par1IChunkProvider, int par2, int par3)
+       {
+               BlockSand.fallInstantly = true;
+               int var4 = par2 * 16;
+               int var5 = par3 * 16;
+               BiomeGenBase var6 = this.worldObj.getBiomeGenForCoords(var4 + 16, var5 + 16);
+               this.rand.setSeed(this.worldObj.getSeed());
+               long var7 = this.rand.nextLong() / 2L * 2L + 1L;
+               long var9 = this.rand.nextLong() / 2L * 2L + 1L;
+               this.rand.setSeed((long)par2 * var7 + (long)par3 * var9 ^ this.worldObj.getSeed());
+               boolean var11 = false;
+
+               MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Pre(par1IChunkProvider, worldObj, rand, par2, par3, var11));
+
+               if (this.mapFeaturesEnabled)
+               {
+                       this.mineshaftGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
+                       var11 = this.villageGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
+                       this.strongholdGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
+                       this.scatteredFeatureGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
+               }
+
+               int var12;
+               int var13;
+               int var14;
+
+               if (TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, LAKE) &&
+                               !var11 && this.rand.nextInt(4) == 0)
+               {
+                       var12 = var4 + this.rand.nextInt(16) + 8;
+                       var13 = this.rand.nextInt(128);
+                       var14 = var5 + this.rand.nextInt(16) + 8;
+                       //(new WorldGenLakes(Block.waterStill.blockID)).generate(this.worldObj, this.rand, var12, var13, var14);
+               }
+
+               if (TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, LAVA) &&
+                               !var11 && this.rand.nextInt(8) == 0)
+               {
+                       var12 = var4 + this.rand.nextInt(16) + 8;
+                       var13 = this.rand.nextInt(this.rand.nextInt(120) + 8);
+                       var14 = var5 + this.rand.nextInt(16) + 8;
+
+                       if (var13 < 63 || this.rand.nextInt(10) == 0)
+                       {
+                               (new WorldGenLakes(Block.lavaStill.blockID)).generate(this.worldObj, this.rand, var12, var13, var14);
+                       }
+               }
+
+               boolean doGen = TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, DUNGEON);
+               for (var12 = 0; doGen && var12 < 8; ++var12)
+               {
+                       var13 = var4 + this.rand.nextInt(16) + 8;
+                       var14 = this.rand.nextInt(128);
+                       int var15 = var5 + this.rand.nextInt(16) + 8;
+
+                       if ((new WorldGenDungeons()).generate(this.worldObj, this.rand, var13, var14, var15))
+                       {
+                               ;
+                       }
+               }
+
+               var6.decorate(this.worldObj, this.rand, var4, var5);
+               SpawnerAnimals.performWorldGenSpawning(this.worldObj, var6, var4 + 8, var5 + 8, 16, 16, this.rand);
+               var4 += 8;
+               var5 += 8;
+
+               doGen = TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, ICE);
+               for (var12 = 0; doGen && var12 < 16; ++var12)
+               {
+                       for (var13 = 0; var13 < 16; ++var13)
+                       {
+                               var14 = this.worldObj.getPrecipitationHeight(var4 + var12, var5 + var13);
+
+                               if (this.worldObj.isBlockFreezable(var12 + var4, var14 - 1, var13 + var5))
+                               {
+                                       this.worldObj.setBlock(var12 + var4, var14 - 1, var13 + var5, Block.ice.blockID);
+                               }
+
+                               if (this.worldObj.canSnowAt(var12 + var4, var14, var13 + var5))
+                               {
+                                       this.worldObj.setBlock(var12 + var4, var14, var13 + var5, Block.snow.blockID);
+                               }
+                       }
+               }
+
+               MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Post(par1IChunkProvider, worldObj, rand, par2, par3, var11));
+
+               BlockSand.fallInstantly = false;
+       }
+
+       /**
+        * Two modes of operation: if passed true, save all Chunks in one go.  If passed false, save up to two chunks.
+        * Return true if all chunks have been saved.
+        */
+       public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate)
+       {
+               return true;
+       }
+
+       /**
+        * Unloads the 100 oldest chunks from memory, due to a bug with chunkSet.add() never being called it thinks the list
+        * is always empty and will not remove any chunks.
+        */
+       public boolean unload100OldestChunks()
+       {
+               return false;
+       }
+
+       /**
+        * Returns if the IChunkProvider supports saving.
+        */
+       public boolean canSave()
+       {
+               return true;
+       }
+
+       /**
+        * Converts the instance data to a readable string.
+        */
+       public String makeString()
+       {
+               return "RandomLevelSource";
+       }
+
+       /**
+        * Returns a list of creatures of the specified type that can spawn at the given location.
+        */
+       public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4)
+       {
+               BiomeGenBase var5 = this.worldObj.getBiomeGenForCoords(par2, par4);
+               return var5 == null ? null : (var5 == BiomeGenBase.swampland && par1EnumCreatureType == EnumCreatureType.monster && this.scatteredFeatureGenerator.hasStructureAt(par2, par3, par4) ? this.scatteredFeatureGenerator.getScatteredFeatureSpawnList() : var5.getSpawnableList(par1EnumCreatureType));
+       }
+
+       /**
+        * Returns the location of the closest structure of the specified type. If not found returns null.
+        */
+       public ChunkPosition findClosestStructure(World par1World, String par2Str, int par3, int par4, int par5)
+       {
+               return "Stronghold".equals(par2Str) && this.strongholdGenerator != null ? this.strongholdGenerator.getNearestInstance(par1World, par3, par4, par5) : null;
+       }
+
+       public int getLoadedChunkCount()
+       {
+               return 0;
+       }
+
+       public void recreateStructures(int par1, int par2)
+       {
+               if (this.mapFeaturesEnabled)
+               {
+                       this.mineshaftGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
+                       this.villageGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
+                       this.strongholdGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
+                       this.scatteredFeatureGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
+               }
+       }
+
+       @Override
+       public boolean unloadQueuedChunks() {
+               return false;
+       }
+
+       @Override
+       public void func_104112_b() {
+               // TODO Auto-generated method stub
+               
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/other/WorldProviderChemical.java b/src/asia/tcrs/ccnp/chemicraftnext/core/other/WorldProviderChemical.java
new file mode 100644 (file)
index 0000000..426a866
--- /dev/null
@@ -0,0 +1,15 @@
+package asia.tcrs.ccnp.chemicraftnext.core.other;
+
+import net.minecraft.world.WorldProvider;
+
+public class WorldProviderChemical extends WorldProvider
+{
+
+       public WorldProviderChemical() {
+       }
+
+       public String getDimensionName()
+       {
+               return "Chemical";
+       }
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/other/WorldTypeChemical.java b/src/asia/tcrs/ccnp/chemicraftnext/core/other/WorldTypeChemical.java
new file mode 100644 (file)
index 0000000..433516c
--- /dev/null
@@ -0,0 +1,34 @@
+package asia.tcrs.ccnp.chemicraftnext.core.other;
+
+import net.minecraft.world.World;
+import net.minecraft.world.WorldType;
+import net.minecraft.world.biome.WorldChunkManager;
+import net.minecraft.world.chunk.IChunkProvider;
+
+public class WorldTypeChemical extends WorldType {
+
+       public WorldTypeChemical(int par1, String par2Str) {
+               super(par1, par2Str);
+       }
+
+       public WorldChunkManager getChunkManager(World par1) {
+               return new WorldChunkManager(par1);
+       }
+
+       public IChunkProvider getChunkGenerator(World par1) {
+               return new ChunkProviderChemical(par1, par1.getSeed(), par1.getWorldInfo().isMapFeaturesEnabled());
+       }
+
+       public int getSeaLevel(World par1) {
+               return 64;
+       }
+
+       public boolean hasVoidParticles(boolean var1) {
+               return false;
+       }
+
+       public double voidFadeMagnitude() {
+               return 1.0D;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotAtom.java b/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotAtom.java
new file mode 100644 (file)
index 0000000..2a0bf3e
--- /dev/null
@@ -0,0 +1,16 @@
+package asia.tcrs.ccnp.chemicraftnext.core.slot;
+
+import net.minecraft.inventory.IInventory;
+
+public class SlotAtom extends SlotAtoms {
+
+       public SlotAtom(IInventory par1iInventory, int par2, int par3, int par4) {
+               super(par1iInventory, par2, par3, par4);
+       }
+
+       @Override
+       public int getSlotStackLimit() {
+               return 1;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotAtoms.java b/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotAtoms.java
new file mode 100644 (file)
index 0000000..c7631a8
--- /dev/null
@@ -0,0 +1,20 @@
+package asia.tcrs.ccnp.chemicraftnext.core.slot;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+
+public class SlotAtoms extends Slot {
+
+       public SlotAtoms(IInventory par1iInventory, int par2, int par3, int par4) {
+               super(par1iInventory, par2, par3, par4);
+       }
+
+       @Override
+       public boolean isItemValid(ItemStack par1ItemStack){
+               return par1ItemStack == null ? false : par1ItemStack.itemID == ChemiCraftCore.instance.atomsID + 256;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotElectrolysisFuel.java b/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotElectrolysisFuel.java
new file mode 100644 (file)
index 0000000..e865a27
--- /dev/null
@@ -0,0 +1,30 @@
+package asia.tcrs.ccnp.chemicraftnext.core.slot;
+
+import java.util.Iterator;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotElectrolysisFuel extends Slot
+{
+
+       public SlotElectrolysisFuel(IInventory par1iInventory, int par2, int par3, int par4) {
+               super(par1iInventory, par2, par3, par4);
+       }
+
+       @Override
+       public boolean isItemValid(ItemStack par1ItemStack) {
+               Iterator<ItemStack> itFuel = ChemiCraftAPI.getElectrolysisFuelList().keySet().iterator();
+               while (itFuel.hasNext()) {
+                       ItemStack fuel = itFuel.next();
+                       if (par1ItemStack != null && par1ItemStack.itemID == fuel.itemID) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotPyrolysisTableFuel.java b/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotPyrolysisTableFuel.java
new file mode 100644 (file)
index 0000000..fee6fd7
--- /dev/null
@@ -0,0 +1,29 @@
+package asia.tcrs.ccnp.chemicraftnext.core.slot;
+
+import java.util.Iterator;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotPyrolysisTableFuel extends Slot {
+
+       public SlotPyrolysisTableFuel(IInventory par1IInventory, int par2, int par3, int par4) {
+               super(par1IInventory, par2, par3, par4);
+       }
+
+       @Override
+       public boolean isItemValid(ItemStack par1ItemStack) {
+               Iterator<ItemStack> itFuel = ChemiCraftAPI.getPyrolysisFuelList().keySet().iterator();
+               while (itFuel.hasNext()) {
+                       ItemStack fuel = itFuel.next();
+                       if (par1ItemStack != null && par1ItemStack.itemID == fuel.itemID) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotResult.java b/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotResult.java
new file mode 100644 (file)
index 0000000..ae3d08e
--- /dev/null
@@ -0,0 +1,18 @@
+package asia.tcrs.ccnp.chemicraftnext.core.slot;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotResult extends Slot {
+
+       public SlotResult(IInventory par1iInventory, int par2, int par3, int par4) {
+               super(par1iInventory, par2, par3, par4);
+       }
+
+       @Override
+       public boolean isItemValid(ItemStack par1ItemStack){
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotToolAndWeaponCraftingTableResult.java b/src/asia/tcrs/ccnp/chemicraftnext/core/slot/SlotToolAndWeaponCraftingTableResult.java
new file mode 100644 (file)
index 0000000..1d71e7d
--- /dev/null
@@ -0,0 +1,18 @@
+package asia.tcrs.ccnp.chemicraftnext.core.slot;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotToolAndWeaponCraftingTableResult extends Slot {
+
+       public SlotToolAndWeaponCraftingTableResult(IInventory par1iInventory, int par2, int par3, int par4) {
+               super(par1iInventory, par2, par3, par4);
+       }
+
+       @Override
+       public boolean isItemValid(ItemStack par1ItemStack){
+               return false;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/system/ChemiCraftCraftingManager.java b/src/asia/tcrs/ccnp/chemicraftnext/core/system/ChemiCraftCraftingManager.java
new file mode 100644 (file)
index 0000000..15dbf8a
--- /dev/null
@@ -0,0 +1,135 @@
+package asia.tcrs.ccnp.chemicraftnext.core.system;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingNBT;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingResult;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryToolAndWeaponCraftingTableMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.nbt.ChemicalNBTRecipe;
+import asia.tcrs.ccnp.chemicraftnext.util.ComparatorFormulaPart;
+import asia.tcrs.ccnp.chemicraftnext.util.ComparatorItemStack;
+import asia.tcrs.ccnp.chemicraftnext.util.FormulaPart;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+
+public class ChemiCraftCraftingManager {
+
+       public ItemStack getToolAndWeaponCraftingResult(InventoryToolAndWeaponCraftingTableMaterial par1IInventory){
+               ChemiCraftAPI api = ChemiCraftAPI.instance();
+               ArrayList<ItemStack[]> materials = api.getToolAndWeaponMaterials();
+               ArrayList<ItemStack> result = api.getToolAndWeaponResult();
+               ArrayList<Boolean> sharpless = api.getToolAndWeaponSharpless();
+
+               ItemStack[] slotItems = new ItemStack[par1IInventory.getSizeInventory()];
+               for (int i = 0; i < par1IInventory.getSizeInventory(); i++) {
+                       slotItems[i] = (par1IInventory.getStackInSlot(i));
+               }
+
+               label1 :
+                       for (int i = 0; i < materials.size(); i++) {
+                               if (sharpless.get(i)) {
+                                       slotItems = ChemiCraftCore.instance.arrayAuxiliary.deleteNull(slotItems);
+                                       Collections.sort(materials, new ComparatorItemStack());
+                                       Arrays.sort(slotItems, new ComparatorItemStack());
+                                       if (materials.size() != slotItems.length) continue label1;
+
+                                       for (int j = 0; j < materials.size(); j++) {
+                                               if (materials.get(i)[j].itemID != slotItems[j].itemID) {
+                                                       if (materials.get(i)[j].getItemDamage() != slotItems[j].getItemDamage()) {
+                                                               continue label1;
+                                                       }
+                                               }
+                                       }
+                                       return result.get(i);
+                               } else {
+                                       slotItems = ChemiCraftCore.instance.arrayAuxiliary.deleteNull(slotItems);
+                                       if (materials.get(i).length != slotItems.length) continue label1;
+
+                                       for (int j = 0; j < materials.size(); j++) {
+                                               if (materials.get(i)[j].itemID != slotItems[j].itemID) {
+                                                       if (materials.get(i)[j].getItemDamage() != slotItems[j].getItemDamage()) {
+                                                               continue label1;
+                                                       }
+                                               }
+                                       }
+                                       return result.get(i);
+                               }
+                       }
+               return null;
+       }
+
+
+
+       public ItemStack getChemicalCombinationResult(ArrayList<String> atomsList, ArrayList<Integer> atomsAmountList){
+               ChemiCraftAPI api = ChemiCraftAPI.instance();
+               recipeSize :
+                       for (int i = 0; i < api.getChemicalCombinationAtoms().size(); i++) {
+                               FormulaPart[] var1 = new FormulaPart[atomsList.size()];
+                               FormulaPart[] var2 = new FormulaPart[api.getChemicalCombinationAtoms().get(i).length];
+                               for (int j = 0; j < atomsList.size(); j++) {
+                                       var1[j] = new FormulaPart(atomsList.get(j), atomsAmountList.get(j));
+                               }
+                               for (int j = 0; j < api.getChemicalCombinationAtoms().get(i).length; j++) {
+                                       var2[j] = new FormulaPart(api.getChemicalCombinationAtoms().get(i)[j], api.getChemicalCombinationAmounts().get(i)[j]);
+                               }
+                               Arrays.sort(var1, new ComparatorFormulaPart());
+                               Arrays.sort(var2, new ComparatorFormulaPart());
+                               if (var1.length != var2.length) {
+                                       continue recipeSize;
+                               }
+                               for (int j = 0; j < var1.length; j++) {
+                                       if (!var1[j].equals(var2[j])) {
+                                               continue recipeSize;
+                                       }
+                               }
+                               return api.getChemicalCombinationResult().get(i);
+                       }
+               return null;
+       }
+
+
+
+       public ChemicalNBTRecipe chemicalCrafting(InventoryChemicalCraftingMaterial par1IInventory, InventoryChemicalCraftingResult par2IInventory, InventoryChemicalCraftingNBT par3IInventory){
+               ChemiCraftAPI api = ChemiCraftAPI.instance();
+               ChemicalNBTRecipe returnObj = null;
+               for(int i = 0;i < api.getMaterialRecipe().size();i++){
+                       ItemStack result = api.getMaterialRecipe().get(i).match(par1IInventory);
+                       ItemStack resultArg = null;
+                       if(result != null){
+                               resultArg = new ItemStack(result.itemID, result.stackSize, result.getItemDamage());
+                               if(api.getMaterialRecipe().get(i).nbtMatch(par1IInventory) != null){
+                                       ItemStack[] nbtInv = new ItemStack[par3IInventory.getSizeInventory()];
+                                       for(int j = 0;j < par3IInventory.getSizeInventory();j++){
+                                               nbtInv[j] = par3IInventory.getStackInSlot(j);
+                                       }
+                                       api.getMaterialRecipe().get(i).nbtMatch(par1IInventory).setNBT(nbtInv, resultArg);
+                               }
+                               returnObj = api.getMaterialRecipe().get(i).nbtMatch(par1IInventory);
+                               par2IInventory.setInventorySlotContents(0, resultArg);
+                               return returnObj;
+                       }
+                       par2IInventory.setInventorySlotContents(0, resultArg);
+               }
+               return returnObj;
+       }
+
+
+
+       private void clearResults(IInventory par1IInventory, int par2){
+               /*
+                * Commented by mozipi.
+               ((InventoryDecomposition)par1IInventory).setFlag(false);
+                */
+               for(int i = 0;i < par2;i++){
+                       par1IInventory.setInventorySlotContents(i, null);
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/system/CommonProxy.java b/src/asia/tcrs/ccnp/chemicraftnext/core/system/CommonProxy.java
new file mode 100644 (file)
index 0000000..18110a9
--- /dev/null
@@ -0,0 +1,68 @@
+package asia.tcrs.ccnp.chemicraftnext.core.system;
+
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerChemicalCombinationTable;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerChemicalCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerElectrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerPyrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.container.ContainerToolAndWeaponCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.debug.DebugTick;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCombinationTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCraftingTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityElectrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityPyrolysisTable;
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityToolAndWeaponCraftingTable;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import cpw.mods.fml.common.network.IGuiHandler;
+import cpw.mods.fml.common.registry.TickRegistry;
+import cpw.mods.fml.relauncher.Side;
+
+
+public class CommonProxy implements IGuiHandler {
+
+       public void registerTextures(){
+
+       }
+
+       public void registerRenderInformation() {
+       }
+
+
+       @Override
+       public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
+               if (!world.blockExists(x, y, z))
+                       return null;
+
+               TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
+               if (tileEntity instanceof TileEntityPyrolysisTable) {
+                       return new ContainerPyrolysisTable(player, (TileEntityPyrolysisTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityElectrolysisTable){
+                       return new ContainerElectrolysisTable(player, (TileEntityElectrolysisTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityChemicalCombinationTable){
+                       return new ContainerChemicalCombinationTable(player, (TileEntityChemicalCombinationTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityToolAndWeaponCraftingTable){
+                       return new ContainerToolAndWeaponCraftingTable(player, (TileEntityToolAndWeaponCraftingTable) tileEntity);
+               }else if(tileEntity instanceof TileEntityChemicalCraftingTable){
+                       return new ContainerChemicalCraftingTable(player, (TileEntityChemicalCraftingTable) tileEntity);
+               } else if (tileEntity instanceof TileEntityElectrolysisTable) {
+                       return new ContainerElectrolysisTable(player, (TileEntityElectrolysisTable) tileEntity);
+               }
+               return null;
+       }
+
+
+       @Override
+       public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
+               return null;
+       }
+
+       public World getClientWorld(){
+               return null;
+       }
+
+       public void registerTickHandler() {
+               TickRegistry.registerTickHandler(new DebugTick(), Side.SERVER);
+       }
+
+}
\ No newline at end of file
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/system/PacketHandler.java b/src/asia/tcrs/ccnp/chemicraftnext/core/system/PacketHandler.java
new file mode 100644 (file)
index 0000000..d194ac1
--- /dev/null
@@ -0,0 +1,230 @@
+package asia.tcrs.ccnp.chemicraftnext.core.system;\r
+\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.DataOutputStream;\r
+import java.io.IOException;\r
+\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.network.INetworkManager;\r
+import net.minecraft.network.packet.Packet;\r
+import net.minecraft.network.packet.Packet250CustomPayload;\r
+import net.minecraft.tileentity.TileEntity;\r
+import net.minecraft.world.World;\r
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;\r
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCombinationTable;\r
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityChemicalCraftingTable;\r
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityElectrolysisTable;\r
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityPyrolysisTable;\r
+import asia.tcrs.ccnp.chemicraftnext.core.tileentity.TileEntityToolAndWeaponCraftingTable;\r
+\r
+import com.google.common.io.ByteArrayDataInput;\r
+import com.google.common.io.ByteStreams;\r
+\r
+import cpw.mods.fml.common.network.IPacketHandler;\r
+import cpw.mods.fml.common.network.Player;\r
+\r
+/**\r
+ * サーバーとクライアントのデータの同期に必要なクラス\r
+ *\r
+ * @author Lilly\r
+ *\r
+ */\r
+public class PacketHandler implements IPacketHandler {\r
+\r
+       @Override\r
+       public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) {\r
+               if (packet.channel.equals("chemicraftcore")) {\r
+                       ByteArrayDataInput badi = ByteStreams.newDataInput(packet.data);\r
+\r
+                       World worldClient;\r
+                       World worldServer;\r
+                       TileEntity var1;\r
+\r
+                       // TileEntityのx, y, z座標\r
+                       int x, y, z;\r
+\r
+                       // 座標読み込み\r
+                       x = badi.readInt();\r
+                       y = badi.readInt();\r
+                       z = badi.readInt();\r
+\r
+                       worldClient = ChemiCraftCore.proxy.getClientWorld();\r
+                       worldServer = ((EntityPlayer)player).worldObj;\r
+                       if(worldClient != null && worldServer == null){\r
+                               var1 = worldClient.getBlockTileEntity(x, y, z);\r
+                               if(var1 instanceof TileEntityChemicalCombinationTable) ((TileEntityChemicalCombinationTable)var1).readPacket(badi);\r
+                               if(var1 instanceof TileEntityChemicalCraftingTable) ((TileEntityChemicalCraftingTable)var1).readPacket(badi);\r
+                               if(var1 instanceof TileEntityPyrolysisTable) ((TileEntityPyrolysisTable)var1).readPacket(badi);\r
+                               if(var1 instanceof TileEntityToolAndWeaponCraftingTable) ((TileEntityToolAndWeaponCraftingTable)var1).readPacket(badi);\r
+                               return;\r
+                       }\r
+                       if(worldServer != null){\r
+                               var1 = worldServer.getBlockTileEntity(x, y, z);\r
+                               if(var1 instanceof TileEntityChemicalCombinationTable) ((TileEntityChemicalCombinationTable)var1).readPacket(badi);\r
+                               if(var1 instanceof TileEntityChemicalCraftingTable) ((TileEntityChemicalCraftingTable)var1).readPacket(badi);\r
+                               if(var1 instanceof TileEntityPyrolysisTable) ((TileEntityPyrolysisTable)var1).readPacket(badi);\r
+                               if(var1 instanceof TileEntityToolAndWeaponCraftingTable) ((TileEntityToolAndWeaponCraftingTable)var1).readPacket(badi);\r
+                       }\r
+                       return;\r
+               }\r
+       }\r
+\r
+\r
+       public static Packet getPacket(TileEntityPyrolysisTable tileEntity) {\r
+               ByteArrayOutputStream var1 = new ByteArrayOutputStream(128);\r
+               DataOutputStream var2 = new DataOutputStream(var1);\r
+\r
+               // Blockのx, y, z座標\r
+               int x, y, z;\r
+\r
+               // x, y, z座標を代入\r
+               x = tileEntity.xCoord;\r
+               y = tileEntity.yCoord;\r
+               z = tileEntity.zCoord;\r
+\r
+               try {\r
+                       // 座標書き込み\r
+                       var2.writeInt(x);\r
+                       var2.writeInt(y);\r
+                       var2.writeInt(z);\r
+                       tileEntity.writePacket(var2);\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+               // パケットの作成\r
+               Packet250CustomPayload packet = new Packet250CustomPayload();\r
+               packet.channel = "chemicraftcore";\r
+               packet.data = var1.toByteArray();\r
+               packet.length = var1.size();\r
+               packet.isChunkDataPacket = true;\r
+               return packet;\r
+       }\r
+\r
+       public static Packet getPacket(TileEntityChemicalCombinationTable tileEntity) {\r
+               ByteArrayOutputStream var1 = new ByteArrayOutputStream(128);\r
+               DataOutputStream var2 = new DataOutputStream(var1);\r
+\r
+               // Blockのx, y, z座標\r
+               int x, y, z;\r
+\r
+               // x, y, z座標を代入\r
+               x = tileEntity.xCoord;\r
+               y = tileEntity.yCoord;\r
+               z = tileEntity.zCoord;\r
+\r
+               try {\r
+                       // 座標書き込み\r
+                       var2.writeInt(x);\r
+                       var2.writeInt(y);\r
+                       var2.writeInt(z);\r
+                       tileEntity.writePacket(var2);\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+               // パケットの作成\r
+               Packet250CustomPayload packet = new Packet250CustomPayload();\r
+               packet.channel = "chemicraftcore";\r
+               packet.data = var1.toByteArray();\r
+               packet.length = var1.size();\r
+               packet.isChunkDataPacket = true;\r
+               return packet;\r
+       }\r
+\r
+       public static Packet getPacket(TileEntityToolAndWeaponCraftingTable tileEntity) {\r
+               ByteArrayOutputStream var1 = new ByteArrayOutputStream(128);\r
+               DataOutputStream var2 = new DataOutputStream(var1);\r
+\r
+               // Blockのx, y, z座標\r
+               int x, y, z;\r
+\r
+               // x, y, z座標を代入\r
+               x = tileEntity.xCoord;\r
+               y = tileEntity.yCoord;\r
+               z = tileEntity.zCoord;\r
+\r
+               try {\r
+                       // 座標書き込み\r
+                       var2.writeInt(x);\r
+                       var2.writeInt(y);\r
+                       var2.writeInt(z);\r
+                       tileEntity.writePacket(var2);\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+               // パケットの作成\r
+               Packet250CustomPayload packet = new Packet250CustomPayload();\r
+               packet.channel = "chemicraftcore";\r
+               packet.data = var1.toByteArray();\r
+               packet.length = var1.size();\r
+               packet.isChunkDataPacket = true;\r
+               return packet;\r
+       }\r
+\r
+       public static Packet getPacket(TileEntityChemicalCraftingTable tileEntity) {\r
+               ByteArrayOutputStream var1 = new ByteArrayOutputStream(128);\r
+               DataOutputStream var2 = new DataOutputStream(var1);\r
+\r
+               // Blockのx, y, z座標\r
+               int x, y, z;\r
+\r
+               // x, y, z座標を代入\r
+               x = tileEntity.xCoord;\r
+               y = tileEntity.yCoord;\r
+               z = tileEntity.zCoord;\r
+\r
+               try {\r
+                       // 座標書き込み\r
+                       var2.writeInt(x);\r
+                       var2.writeInt(y);\r
+                       var2.writeInt(z);\r
+                       tileEntity.writePacket(var2);\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+               // パケットの作成\r
+               Packet250CustomPayload packet = new Packet250CustomPayload();\r
+               packet.channel = "chemicraftcore";\r
+               packet.data = var1.toByteArray();\r
+               packet.length = var1.size();\r
+               packet.isChunkDataPacket = true;\r
+               return packet;\r
+       }\r
+\r
+\r
+       public static Packet getPacket(TileEntityElectrolysisTable tileEntity)\r
+       {\r
+               ByteArrayOutputStream var1 = new ByteArrayOutputStream(128);\r
+               DataOutputStream var2 = new DataOutputStream(var1);\r
+\r
+               // Blockのx, y, z座標\r
+               int x, y, z;\r
+\r
+               // x, y, z座標を代入\r
+               x = tileEntity.xCoord;\r
+               y = tileEntity.yCoord;\r
+               z = tileEntity.zCoord;\r
+\r
+               try {\r
+                       // 座標書き込み\r
+                       var2.writeInt(x);\r
+                       var2.writeInt(y);\r
+                       var2.writeInt(z);\r
+                       tileEntity.writePacket(var2);\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+               // パケットの作成\r
+               Packet250CustomPayload packet = new Packet250CustomPayload();\r
+               packet.channel = "chemicraftcore";\r
+               packet.data = var1.toByteArray();\r
+               packet.length = var1.size();\r
+               packet.isChunkDataPacket = true;\r
+               return packet;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityChemicalCombinationTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityChemicalCombinationTable.java
new file mode 100644 (file)
index 0000000..9bf3c00
--- /dev/null
@@ -0,0 +1,370 @@
+package asia.tcrs.ccnp.chemicraftnext.core.tileentity;
+
+import java.io.DataOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.packet.Packet;
+import net.minecraft.tileentity.TileEntity;
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftCore;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCombinationTableMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCombinationTableResult;
+import asia.tcrs.ccnp.chemicraftnext.core.system.PacketHandler;
+import asia.tcrs.ccnp.chemicraftnext.util.ComparatorItemStack;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import cpw.mods.fml.common.network.PacketDispatcher;
+
+public class TileEntityChemicalCombinationTable extends TileEntity {
+
+       private InventoryChemicalCombinationTableMaterial invm = new InventoryChemicalCombinationTableMaterial();
+       private InventoryChemicalCombinationTableResult invr = new InventoryChemicalCombinationTableResult();
+
+       private ArrayList<String> atomsList = new ArrayList<String>();
+       private ArrayList<Integer> atomsAmountList = new ArrayList<Integer>();
+       private int atomsListSize = 0;
+
+       private ItemStack dropItems;
+
+       private boolean isProvidePower;
+
+       @Override
+       public void updateEntity(){
+               super.updateEntity();
+               if (this.isProvidePower && !this.worldObj.isRemote) {
+                       this.field_00001();
+                       this.isProvidePower = false;
+                       PacketDispatcher.sendPacketToAllPlayers(this.getDescriptionPacket());
+               }
+       }
+
+       @Override
+       public void readFromNBT(NBTTagCompound par1){
+               super.readFromNBT(par1);
+               NBTTagList var2 = par1.getTagList("Items");
+               for (int var3 = 0; var3 < var2.tagCount(); ++var3)
+               {
+                       NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+                       int var5 = var4.getByte("Slot") & 255;
+
+                       if  (var5 >= 0 && var5 < this.invm.getSizeInventory())
+                       {
+                               this.invm.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
+                       }
+               }
+
+               NBTTagList var6 = par1.getTagList("Items2");
+               for (int var3 = 0; var3 < var6.tagCount(); ++var3)
+               {
+                       NBTTagCompound var7 = (NBTTagCompound)var6.tagAt(var3);
+                       int var8 = var7.getByte("Slot2") & 255;
+
+                       if  (var8 >= 0 && var8 < this.invr.getSizeInventory())
+                       {
+                               this.invr.setInventorySlotContents(var8, ItemStack.loadItemStackFromNBT(var7));
+                       }
+               }
+
+               this.atomsListSize = par1.getInteger("atomsListSize");
+               for(int i = 0;i < this.atomsListSize;i++){
+                       this.atomsList.add(par1.getString("atomsList" + i));
+               }
+               for(int i = 0;i < this.atomsListSize;i++){
+                       this.atomsAmountList.add(par1.getInteger("atomsAmountList" + i));
+               }
+
+               this.isProvidePower = par1.getBoolean("isProvidePower");
+       }
+
+       @Override
+       public void writeToNBT(NBTTagCompound par1){
+               super.writeToNBT(par1);
+               NBTTagList var2 = new NBTTagList();
+               for (int var3 = 0; var3 < this.invm.getSizeInventory(); ++var3)
+               {
+                       if  (this.invm.getStackInSlot(var3) != null)
+                       {
+                               NBTTagCompound var4 = new NBTTagCompound();
+                               var4.setByte("Slot", (byte)var3);
+                               this.invm.getStackInSlot(var3).writeToNBT(var4);
+                               var2.appendTag(var4);
+                       }
+               }
+               par1.setTag("Items", var2);
+
+               NBTTagList var5 = new NBTTagList();
+               for (int var6 = 0; var6 < this.invr.getSizeInventory(); ++var6)
+               {
+                       if  (this.invr.getStackInSlot(var6) != null)
+                       {
+                               NBTTagCompound var7 = new NBTTagCompound();
+                               var7.setByte("Slot2", (byte)var6);
+                               this.invr.getStackInSlot(var6).writeToNBT(var7);
+                               var5.appendTag(var7);
+                       }
+               }
+               par1.setTag("Items2", var5);
+
+               this.atomsList.trimToSize();
+               this.atomsAmountList.trimToSize();
+               for(int i = 0;i < this.atomsList.size();i++){
+                       par1.setString("atomsList" + i, this.atomsList.get(i));
+               }
+               for(int i = 0;i < this.atomsAmountList.size();i++){
+                       par1.setInteger("atomsAmountList" + i, this.atomsAmountList.get(i));
+               }
+
+               this.atomsListSize = this.atomsList.size();
+               par1.setInteger("atomsListSize", this.atomsListSize);
+
+               par1.setBoolean("isProvidePower", this.isProvidePower);
+       }
+
+       @Override
+       public Packet getDescriptionPacket() {
+               return PacketHandler.getPacket(this);
+       }
+
+       public void readPacket(ByteArrayDataInput data) {
+               try {
+                       for(int i = 0;i < this.invm.getSizeInventory();i++){
+                               int id = data.readInt();
+                               int size = data.readByte();
+                               int damage = data.readInt();
+                               if (id != 0 && size != 0){
+                                       this.invm.setInventorySlotContents(i, new ItemStack(id, size, damage));
+                               }else{
+                                       this.invm.setInventorySlotContents(i, null);
+                               }
+                       }
+
+                       for(int i = 0;i < this.invr.getSizeInventory();i++){
+                               int id = data.readInt();
+                               int size = data.readByte();
+                               int damage = data.readInt();
+                               if (id != 0 && size != 0){
+                                       this.invr.setInventorySlotContents(i, new ItemStack(id, size, damage));
+                               }else{
+                                       this.invr.setInventorySlotContents(i, null);
+                               }
+                       }
+
+                       this.atomsListSize = data.readInt();
+                       this.atomsList.clear();
+                       this.atomsAmountList.clear();
+                       for(int i = 0;i < this.atomsListSize;i++){
+                               this.atomsList.add(data.readUTF());
+                       }
+                       for(int i = 0;i < this.atomsListSize;i++){
+                               this.atomsAmountList.add(data.readInt());
+                       }
+
+                       ItemStack itemstack = new ItemStack(data.readInt(), data.readByte(), data.readInt());
+                       if(itemstack.itemID != 0 && !this.worldObj.isRemote){
+                               this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.xCoord, this.yCoord + 1, this.zCoord, itemstack));
+                       }
+                       this.dropItems = null;
+
+                       this.isProvidePower = data.readBoolean();
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public void writePacket(DataOutputStream dos){
+               try {
+                       for(int i = 0;i < this.invm.getSizeInventory();i++){
+                               int id = 0;
+                               int size = 0;
+                               int damage  = 0;
+                               ItemStack itemstack = this.invm.getStackInSlot(i);
+                               if (itemstack != null){
+                                       id = itemstack.itemID;
+                                       size = itemstack.stackSize;
+                                       damage = itemstack.getItemDamage();
+                                       dos.writeInt(id);
+                                       dos.writeByte(size);
+                                       dos.writeInt(damage);
+                               }else{
+                                       dos.writeInt(0);
+                                       dos.writeByte(0);
+                                       dos.writeInt(0);
+                               }
+                       }
+
+                       for(int i = 0;i < this.invr.getSizeInventory();i++){
+                               int id = 0;
+                               int size = 0;
+                               int damage  = 0;
+                               ItemStack itemstack = this.invr.getStackInSlot(i);
+                               if (itemstack != null){
+                                       id = itemstack.itemID;
+                                       size = itemstack.stackSize;
+                                       damage = itemstack.getItemDamage();
+                                       dos.writeInt(id);
+                                       dos.writeByte(size);
+                                       dos.writeInt(damage);
+                               }else{
+                                       dos.writeInt(0);
+                                       dos.writeByte(0);
+                                       dos.writeInt(0);
+                               }
+                       }
+
+                       dos.writeInt(this.atomsList.size());
+                       for(int i = 0;i < this.atomsList.size();i++){
+                               dos.writeUTF(this.atomsList.get(i));
+                       }
+                       for(int i = 0;i < this.atomsAmountList.size();i++){
+                               dos.writeInt(this.atomsAmountList.get(i));
+                       }
+
+                       if (this.dropItems != null){
+                               int id = this.dropItems.itemID;
+                               int size = this.dropItems.stackSize;
+                               int damage = this.dropItems.getItemDamage();
+                               dos.writeInt(id);
+                               dos.writeByte(size);
+                               dos.writeInt(damage);
+                       }else{
+                               dos.writeInt(0);
+                               dos.writeByte(0);
+                               dos.writeInt(0);
+                       }
+                       this.dropItems = null;
+
+                       dos.writeBoolean(this.isProvidePower);
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public void setAtoms(String par1, int par2){
+               if (this.atomsList.indexOf(par1) != -1){
+                       int var1 = this.atomsList.indexOf(par1);
+                       this.atomsAmountList.set(var1, this.atomsAmountList.get(var1) + par2);
+               }else{
+                       this.atomsList.add(par1);
+                       this.atomsAmountList.add(par2);
+               }
+               PacketDispatcher.sendPacketToAllPlayers(this.getDescriptionPacket());
+       }
+
+       public void setDropItems(ItemStack par1ItemStack){
+               this.dropItems = par1ItemStack;
+       }
+
+       public String getAtoms(){
+               StringBuffer var1 = new StringBuffer();
+               for(int i = 0;i < this.atomsList.size();i++){
+                       if (this.atomsAmountList.get(i) != 1){
+                               var1.append(this.atomsList.get(i) + this.atomsAmountList.get(i));
+                       }else{
+                               var1.append(this.atomsList.get(i));
+                       }
+               }
+               return var1.toString();
+       }
+
+       public ArrayList<String> getAtomsList(){
+               return this.atomsList;
+       }
+
+       public ArrayList<Integer> getAtomsAmountList(){
+               return this.atomsAmountList;
+       }
+
+       public void emptytoAtomsList(){
+               this.atomsList.clear();
+               this.atomsAmountList.clear();
+       }
+
+       public void setProvidePower(boolean par1) {
+               this.isProvidePower = par1;
+       }
+
+       public boolean getProvidePower() {
+               return this.isProvidePower;
+       }
+
+       public void field_00001() {
+               IInventory inv = this.getInvMaterial();
+               ItemStack[] stacks = new ItemStack[inv.getSizeInventory()];
+               for(int i = 0;i < stacks.length;i++){
+                       if(inv.getStackInSlot(i) != null){
+                               stacks[i] = inv.getStackInSlot(i);
+                       }
+               }
+               Arrays.sort(stacks, new ComparatorItemStack());
+               stacks = ChemiCraftCore.instance.arrayAuxiliary.deleteNull(stacks);
+
+               for(int i = 0;i < stacks.length;i++){
+                       if(stacks[i].stackSize > 1){
+                               this.setAtoms(ChemiCraftData.ATOMSLIST[stacks[i].getItemDamage()], stacks[i].stackSize);
+                       }else{
+                               this.setAtoms(ChemiCraftData.ATOMSLIST[stacks[i].getItemDamage()], 1);
+                       }
+               }
+
+               for(int i = 0;i < inv.getSizeInventory();i++){
+                       inv.setInventorySlotContents(i, null);
+               }
+       }
+
+       public void field_00002() {
+               ArrayList<String> var1 = this.getAtomsList();
+               ArrayList<Integer> var2 = this.getAtomsAmountList();
+
+               for (int i = 0;i < var1.size();i++) {
+                       for (int j = 0;j < ChemiCraftData.ATOMSLIST.length;j++) {
+                               if (var1.get(i).equals(ChemiCraftData.ATOMSLIST[j])) {
+                                       int var3 = var2.get(i);
+                                       while(var3 > 0){
+                                               if(var3 > 64){
+                                                       ItemStack itemstack = new ItemStack(ChemiCraftCore.instance.itemAtoms, 64, j);
+                                                       this.setDropItems(itemstack);
+                                                       PacketDispatcher.sendPacketToServer(this.getDescriptionPacket());
+                                                       var3 -= 64;
+                                               }else{
+                                                       ItemStack itemstack = new ItemStack(ChemiCraftCore.instance.itemAtoms, var3, j);
+                                                       this.setDropItems(itemstack);
+                                                       PacketDispatcher.sendPacketToServer(this.getDescriptionPacket());
+                                                       var3 = 0;
+                                               }
+                                       }
+                                       break;
+                               }
+                       }
+               }
+               IInventory invr = this.getInvResult();
+               if (invr.getStackInSlot(0) != null) {
+                       invr.setInventorySlotContents(0, null);
+               }
+               this.emptytoAtomsList();
+       }
+
+       protected boolean isNumber(String par1){
+               try {
+                       int var1 = Integer.valueOf(new String(par1));
+               } catch (Exception e) {
+                       return false;
+               }
+               return true;
+       }
+
+       public InventoryChemicalCombinationTableMaterial getInvMaterial(){
+               return this.invm;
+       }
+
+       public InventoryChemicalCombinationTableResult getInvResult(){
+               return this.invr;
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityChemicalCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityChemicalCraftingTable.java
new file mode 100644 (file)
index 0000000..2021362
--- /dev/null
@@ -0,0 +1,143 @@
+package asia.tcrs.ccnp.chemicraftnext.core.tileentity;
+
+import java.io.DataOutputStream;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.packet.Packet;
+import net.minecraft.tileentity.TileEntity;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingNBT;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingResult;
+import asia.tcrs.ccnp.chemicraftnext.core.system.PacketHandler;
+
+import com.google.common.io.ByteArrayDataInput;
+
+public class TileEntityChemicalCraftingTable extends TileEntity {
+
+       public IInventory chemicalCraftingInvMaterial = new InventoryChemicalCraftingMaterial();
+       public IInventory chemicalCraftingInvResult = new InventoryChemicalCraftingResult();
+       public IInventory chemicalCraftingInvNBT = new InventoryChemicalCraftingNBT();
+
+
+       public TileEntityChemicalCraftingTable() {
+               super();
+       }
+
+       @Override
+       public void updateEntity() {
+               super.updateEntity();
+       }
+
+
+       @Override
+       public void readFromNBT(NBTTagCompound par1) {
+               super.readFromNBT(par1);
+
+               NBTTagList var2 = par1.getTagList("Items");
+               for (int var3 = 0; var3 < var2.tagCount(); ++var3)
+               {
+                       NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+                       int var5 = var4.getByte("Slot") & 255;
+
+                       if (var5 >= 0 && var5 < this.chemicalCraftingInvMaterial.getSizeInventory())
+                       {
+                               this.chemicalCraftingInvMaterial.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
+                       }
+               }
+
+               NBTTagList var6 = par1.getTagList("Items2");
+               for (int var7 = 0; var7 < var6.tagCount(); ++var7)
+               {
+                       NBTTagCompound var4 = (NBTTagCompound)var6.tagAt(var7);
+                       int var5 = var4.getByte("Slot2") & 255;
+
+                       if (var5 >= 0 && var5 < this.chemicalCraftingInvResult.getSizeInventory())
+                       {
+                               this.chemicalCraftingInvResult.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
+                       }
+               }
+
+               NBTTagList var8 = par1.getTagList("Items3");
+               for (int var9 = 0; var9 < var8.tagCount(); ++var9)
+               {
+                       NBTTagCompound var11 = (NBTTagCompound)var8.tagAt(var9);
+                       int var10 = var11.getByte("Slot3") & 255;
+
+                       if (var10 >= 0 && var10 < this.chemicalCraftingInvNBT.getSizeInventory())
+                       {
+                               this.chemicalCraftingInvNBT.setInventorySlotContents(var10, ItemStack.loadItemStackFromNBT(var11));
+                       }
+               }
+       }
+
+
+       @Override
+       public void writeToNBT(NBTTagCompound par1) {
+               super.writeToNBT(par1);
+
+               NBTTagList var2 = new NBTTagList();
+               for (int var3 = 0; var3 < this.chemicalCraftingInvMaterial.getSizeInventory(); ++var3)
+               {
+                       if (this.chemicalCraftingInvMaterial.getStackInSlot(var3) != null)
+                       {
+                               NBTTagCompound var4 = new NBTTagCompound();
+                               var4.setByte("Slot", (byte)var3);
+                               this.chemicalCraftingInvMaterial.getStackInSlot(var3).writeToNBT(var4);
+                               var2.appendTag(var4);
+                       }
+               }
+               par1.setTag("Items", var2);
+
+               NBTTagList var5 = new NBTTagList();
+               for (int var6 = 0; var6 < this.chemicalCraftingInvResult.getSizeInventory(); ++var6)
+               {
+                       if (this.chemicalCraftingInvResult.getStackInSlot(var6) != null)
+                       {
+                               NBTTagCompound var7 = new NBTTagCompound();
+                               var7.setByte("Slot2", (byte)var6);
+                               this.chemicalCraftingInvResult.getStackInSlot(var6).writeToNBT(var7);
+                               var5.appendTag(var7);
+                       }
+               }
+               par1.setTag("Items2", var5);
+
+               NBTTagList var8 = new NBTTagList();
+               for (int var9 = 0; var9 < this.chemicalCraftingInvNBT.getSizeInventory(); ++var9)
+               {
+                       if (this.chemicalCraftingInvNBT.getStackInSlot(var9) != null)
+                       {
+                               NBTTagCompound var10 = new NBTTagCompound();
+                               var10.setByte("Slot3", (byte)var9);
+                               this.chemicalCraftingInvNBT.getStackInSlot(var9).writeToNBT(var10);
+                               var8.appendTag(var10);
+                       }
+               }
+               par1.setTag("Items3", var8);
+       }
+
+
+       @Override
+       public Packet getDescriptionPacket() {
+               return PacketHandler.getPacket(this);
+       }
+
+
+       public void readPacket(ByteArrayDataInput data) {
+               try {
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+
+       public void writePacket(DataOutputStream dos){
+               try {
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityElectrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityElectrolysisTable.java
new file mode 100644 (file)
index 0000000..664cfbc
--- /dev/null
@@ -0,0 +1,438 @@
+package asia.tcrs.ccnp.chemicraftnext.core.tileentity;
+
+import java.io.DataOutputStream;
+import java.util.Iterator;
+import java.util.Random;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.packet.Packet;
+import net.minecraft.tileentity.TileEntity;
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryElectrolysisFuel;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryElectrolysisMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryElectrolysisResult;
+import asia.tcrs.ccnp.chemicraftnext.core.system.PacketHandler;
+
+import com.google.common.io.ByteArrayDataInput;
+
+public class TileEntityElectrolysisTable extends TileEntity {
+
+       private InventoryElectrolysisMaterial invm = new InventoryElectrolysisMaterial();
+       private InventoryElectrolysisResult invr = new InventoryElectrolysisResult();
+       private InventoryElectrolysisFuel invf = new InventoryElectrolysisFuel();
+
+       /**
+        * 電力
+        */
+       private float heat = 0;
+
+       /**
+        * 素材の電力時間
+        */
+       private float burnTime = 0;
+
+       /**
+        * 電池の残り電力時間
+        */
+       private float fuelRestTime = 0;
+
+       /**
+        * 最大熱量
+        */
+       private static final int MAX_HEAT = 1700;
+
+       /**
+        * 燃料が燃え始める最低熱量
+        */
+       private static final int MIN_HEAT = 400;
+
+       /**
+        * 燃料の燃焼速度比率・素材の燃焼速度比率の中心となる熱量
+        */
+       private static final int CENTER_HEAT = 1050;
+
+       /**
+        * 分解までの時間
+        */
+       private static final int MAX_BURN_TIME = 2000;
+
+       /**
+        * Random of instance.
+        */
+       public static final Random rand = new Random();
+
+       @Override
+       public void updateEntity()
+       {
+               if (this.fuelRestTime >= 0) {
+                       this.burnTime += 10 * CENTER_HEAT / this.heat;
+                       this.fuelRestTime -= 10 * CENTER_HEAT / this.heat;
+               }
+
+               if (this.burnTime >= MAX_BURN_TIME) {
+                       Iterator<ItemStack> itMaterial = ChemiCraftAPI.instance().getElectrolysisRecipeList().keySet().iterator();
+                       while (itMaterial.hasNext()) {
+                               ItemStack itemstackMaterial = itMaterial.next();
+                               ItemStack materialItem = this.invm.getStackInSlot(0);
+                               if (materialItem != null) {
+                                       if (this.isInItemCheck(itemstackMaterial)) {
+                                               if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
+                                                       this.inItem(itemstackMaterial);
+                                                       if (materialItem.stackSize > 1) {
+                                                               this.invm.setInventorySlotContents(0, new ItemStack(materialItem.itemID, --materialItem.stackSize, materialItem.getItemDamage()));
+                                                       } else {
+                                                               this.invm.setInventorySlotContents(0, null);
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       this.burnTime = 0;
+               }
+
+               boolean var1 = false;
+               if (this.heat > MIN_HEAT) {
+                       Iterator<ItemStack> itMaterial = ChemiCraftAPI.instance().getElectrolysisRecipeList().keySet().iterator();
+                       while (itMaterial.hasNext()) {
+                               ItemStack itemstackMaterial = itMaterial.next();
+                               ItemStack materialItem = this.invm.getStackInSlot(0);
+                               if (materialItem != null) {
+                                       if (this.isInItemCheck(itemstackMaterial)) {
+                                               if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {
+                                                       var1 = true;
+                                                       if (this.fuelRestTime <= 0) {
+                                                               Iterator<ItemStack> itFuel = ChemiCraftAPI.instance().getElectrolysisFuelList().keySet().iterator();
+                                                               while (itFuel.hasNext()) {
+                                                                       ItemStack itemstackFuel = itFuel.next();
+                                                                       ItemStack fuelItem = this.invf.getStackInSlot(0);
+                                                                       if (fuelItem != null) {
+                                                                               if (itemstackFuel.itemID == fuelItem.itemID && itemstackFuel.getItemDamage() == fuelItem.getItemDamage()) {
+                                                                                       this.fuelRestTime = ChemiCraftAPI.instance().getElectrolysisFuelList().get(itemstackFuel);
+                                                                                       if (fuelItem.stackSize > 1) {
+                                                                                               this.invf.setInventorySlotContents(0, new ItemStack(fuelItem.itemID, --fuelItem.stackSize, fuelItem.getItemDamage()));
+                                                                                               break;
+                                                                                       } else {
+                                                                                               this.invf.setInventorySlotContents(0, null);
+                                                                                               break;
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               } else {
+                                       this.burnTime = 0;
+                               }
+                       }
+                       if (!var1) {
+                               this.burnTime = 0;
+                       }
+               }
+       }
+
+       @Override
+       public void readFromNBT(NBTTagCompound par1) {
+               super.readFromNBT(par1);
+               this.heat = par1.getFloat("Heat");
+               this.burnTime = par1.getFloat("BurnTime");
+               this.fuelRestTime = par1.getFloat("FuelRestTime");
+
+               NBTTagList var2 = par1.getTagList("Items");
+               for (int var3 = 0; var3 < var2.tagCount(); ++var3)
+               {
+                       NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+                       int var5 = var4.getByte("Slot") & 255;
+
+                       if  (var5 >= 0 && var5 < this.invm.getSizeInventory())
+                       {
+                               this.invm.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
+                       }
+               }
+
+               NBTTagList var6 = par1.getTagList("Items2");
+               for (int var3 = 0; var3 < var6.tagCount(); ++var3)
+               {
+                       NBTTagCompound var7 = (NBTTagCompound)var6.tagAt(var3);
+                       int var8 = var7.getByte("Slot2") & 255;
+
+                       if  (var8 >= 0 && var8 < this.invr.getSizeInventory())
+                       {
+                               this.invr.setInventorySlotContents(var8, ItemStack.loadItemStackFromNBT(var7));
+                       }
+               }
+
+               NBTTagList var9 = par1.getTagList("Items3");
+               for (int var3 = 0; var3 < var9.tagCount(); ++var3)
+               {
+                       NBTTagCompound var10 = (NBTTagCompound)var9.tagAt(var3);
+                       int var11 = var10.getByte("Slot3") & 255;
+
+                       if  (var11 >= 0 && var11 < this.invf.getSizeInventory())
+                       {
+                               this.invf.setInventorySlotContents(var11, ItemStack.loadItemStackFromNBT(var10));
+                       }
+               }
+       }
+
+       @Override
+       public void writeToNBT(NBTTagCompound par1) {
+               super.writeToNBT(par1);
+               par1.setFloat("Heat", this.heat);
+               par1.setFloat("BurnTime", this.burnTime);
+               par1.setFloat("FuelRestTime", this.fuelRestTime);
+
+               NBTTagList var2 = new NBTTagList();
+               for (int var3 = 0; var3 < this.invm.getSizeInventory(); ++var3)
+               {
+                       if  (this.invm.getStackInSlot(var3) != null)
+                       {
+                               NBTTagCompound var4 = new NBTTagCompound();
+                               var4.setByte("Slot", (byte)var3);
+                               this.invm.getStackInSlot(var3).writeToNBT(var4);
+                               var2.appendTag(var4);
+                       }
+               }
+               par1.setTag("Items", var2);
+
+               NBTTagList var5 = new NBTTagList();
+               for (int var6 = 0; var6 < this.invr.getSizeInventory(); ++var6)
+               {
+                       if  (this.invr.getStackInSlot(var6) != null)
+                       {
+                               NBTTagCompound var7 = new NBTTagCompound();
+                               var7.setByte("Slot2", (byte)var6);
+                               this.invr.getStackInSlot(var6).writeToNBT(var7);
+                               var5.appendTag(var7);
+                       }
+               }
+               par1.setTag("Items2", var5);
+
+               NBTTagList var8 = new NBTTagList();
+               for (int var9 = 0; var9 < this.invf.getSizeInventory(); ++var9)
+               {
+                       if  (this.invf.getStackInSlot(var9) != null)
+                       {
+                               NBTTagCompound var10 = new NBTTagCompound();
+                               var10.setByte("Slot3", (byte)var9);
+                               this.invf.getStackInSlot(var9).writeToNBT(var10);
+                               var8.appendTag(var10);
+                       }
+               }
+               par1.setTag("Items3", var8);
+       }
+
+       @Override
+       public Packet getDescriptionPacket() {
+               return PacketHandler.getPacket(this);
+       }
+
+       public void readPacket(ByteArrayDataInput data) {
+               try {
+                       this.heat = data.readFloat();
+                       this.burnTime = data.readInt();
+                       this.fuelRestTime = data.readFloat();
+                       for(int i = 0;i < this.invm.getSizeInventory();i++){
+                               int id = data.readInt();
+                               int size = data.readByte();
+                               int damage = data.readInt();
+                               if (id != 0 && size != 0){
+                                       this.invm.setInventorySlotContents(i, new ItemStack(id, size, damage));
+                               }else{
+                                       this.invm.setInventorySlotContents(i, null);
+                               }
+                       }
+
+                       for(int i = 0;i < this.invr.getSizeInventory();i++){
+                               int id = data.readInt();
+                               int size = data.readByte();
+                               int damage = data.readInt();
+                               if (id != 0 && size != 0){
+                                       this.invr.setInventorySlotContents(i, new ItemStack(id, size, damage));
+                               }else{
+                                       this.invr.setInventorySlotContents(i, null);
+                               }
+                       }
+
+                       for(int i = 0;i < this.invf.getSizeInventory();i++){
+                               int id = data.readInt();
+                               int size = data.readByte();
+                               int damage = data.readInt();
+                               if (id != 0 && size != 0){
+                                       this.invf.setInventorySlotContents(i, new ItemStack(id, size, damage));
+                               }else{
+                                       this.invf.setInventorySlotContents(i, null);
+                               }
+                       }
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+
+       public void writePacket(DataOutputStream dos){
+               try {
+                       dos.writeFloat(this.heat);
+                       dos.writeFloat(this.burnTime);
+                       dos.writeFloat(this.fuelRestTime);
+                       for(int i = 0;i < this.invm.getSizeInventory();i++){
+                               int id = 0;
+                               int size = 0;
+                               int damage  = 0;
+                               ItemStack itemstack = this.invm.getStackInSlot(i);
+                               if (itemstack != null){
+                                       id = itemstack.itemID;
+                                       size = itemstack.stackSize;
+                                       damage = itemstack.getItemDamage();
+                                       dos.writeInt(id);
+                                       dos.writeByte(size);
+                                       dos.writeInt(damage);
+                               }else{
+                                       dos.writeInt(0);
+                                       dos.writeByte(0);
+                                       dos.writeInt(0);
+                               }
+                       }
+
+                       for(int i = 0;i < this.invr.getSizeInventory();i++){
+                               int id = 0;
+                               int size = 0;
+                               int damage  = 0;
+                               ItemStack itemstack = this.invr.getStackInSlot(i);
+                               if (itemstack != null){
+                                       id = itemstack.itemID;
+                                       size = itemstack.stackSize;
+                                       damage = itemstack.getItemDamage();
+                                       dos.writeInt(id);
+                                       dos.writeByte(size);
+                                       dos.writeInt(damage);
+                               }else{
+                                       dos.writeInt(0);
+                                       dos.writeByte(0);
+                                       dos.writeInt(0);
+                               }
+                       }
+
+                       for(int i = 0;i < this.invf.getSizeInventory();i++){
+                               int id = 0;
+                               int size = 0;
+                               int damage  = 0;
+                               ItemStack itemstack = this.invf.getStackInSlot(i);
+                               if (itemstack != null){
+                                       id = itemstack.itemID;
+                                       size = itemstack.stackSize;
+                                       damage = itemstack.getItemDamage();
+                                       dos.writeInt(id);
+                                       dos.writeByte(size);
+                                       dos.writeInt(damage);
+                               }else{
+                                       dos.writeInt(0);
+                                       dos.writeByte(0);
+                                       dos.writeInt(0);
+                               }
+                       }
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public float getBurnTime() {
+               return this.burnTime;
+       }
+
+       public float getHeat() {
+               return this.heat;
+       }
+
+       public InventoryElectrolysisMaterial getInvMaterial(){
+               return this.invm;
+       }
+
+       public InventoryElectrolysisResult getInvResult(){
+               return this.invr;
+       }
+
+       public InventoryElectrolysisFuel getInvFuel(){
+               return this.invf;
+       }
+
+       public boolean isInItemCheck(ItemStack key) {
+               ItemStack[] results = ChemiCraftAPI.instance().getElectrolysisRecipeList().get(key).clone();
+               ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
+               for (int j = 0; j < this.invr.getSizeInventory(); j++) {
+                       containerResults[j] = this.invr.getStackInSlot(j);
+               }
+
+               for (int i = 0; i < results.length; i++) {
+                       int var1 = results[i].itemID;
+                       int var3 = results[i].getItemDamage();
+                       int var5 = results[i].stackSize;
+                       for (int j = 0; j < containerResults.length; j++) {
+                               if (containerResults[j] == null) {
+                                       containerResults[j] = results[i];
+                                       results[i] = null;
+                                       break;
+                               } else {
+                                       int var2 = containerResults[j].itemID;
+                                       int var4 = containerResults[j].getItemDamage();
+                                       int var6 = containerResults[j].stackSize;
+                                       int var7 = containerResults[j].getMaxStackSize();
+                                       if (var1 == var2 && var3 == var4) {
+                                               if (var5 + var6 <= var7) {
+                                                       containerResults[j] = results[i];
+                                                       results[i] = null;
+                                                       break;
+                                               } else {
+                                                       var5 -= var7 - var6;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               for (int i = 0; i < results.length; i++) {
+                       if (results[i] != null) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       public void inItem(ItemStack key) {
+               ItemStack[] results = ChemiCraftAPI.instance().getElectrolysisRecipeList().get(key);
+
+               for (int i = 0; i < results.length; i++) {
+                       ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];
+                       for (int j = 0; j < this.invr.getSizeInventory(); j++) {
+                               containerResults[j] = this.invr.getStackInSlot(j);
+                       }
+                       int var1 = results[i].itemID;
+                       int var3 = results[i].getItemDamage();
+                       int var5 = results[i].stackSize;
+                       for (int j = 0; j < containerResults.length; j++) {
+                               if (containerResults[j] == null) {
+                                       ItemStack result = new ItemStack(var1, var5, var3);
+                                       this.invr.setInventorySlotContents(j, result);
+                                       break;
+                               } else {
+                                       int var2 = containerResults[j].itemID;
+                                       int var4 = containerResults[j].getItemDamage();
+                                       int var6 = containerResults[j].stackSize;
+                                       int var7 = containerResults[j].getMaxStackSize();
+                                       if (var1 == var2 && var3 == var4) {
+                                               if (var5 + var6 <= var7) {
+                                                       this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var5 + var6, results[i].getItemDamage()));
+                                                       break;
+                                               } else {
+                                                       this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var7, results[i].getItemDamage()));
+                                                       var5 -= var7 - var6;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityPyrolysisTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityPyrolysisTable.java
new file mode 100644 (file)
index 0000000..76d04b0
--- /dev/null
@@ -0,0 +1,486 @@
+package asia.tcrs.ccnp.chemicraftnext.core.tileentity;\r
+\r
+import java.io.DataOutputStream;\r
+import java.util.Iterator;\r
+import java.util.Random;\r
+\r
+import net.minecraft.block.Block;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.nbt.NBTTagCompound;\r
+import net.minecraft.nbt.NBTTagList;\r
+import net.minecraft.network.packet.Packet;\r
+import net.minecraft.tileentity.TileEntity;\r
+import asia.tcrs.ccnp.chemicraftnext.core.ChemiCraftAPI;\r
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryPyrolysisTableFuel;\r
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryPyrolysisTableMaterial;\r
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryPyrolysisTableResult;\r
+import asia.tcrs.ccnp.chemicraftnext.core.system.PacketHandler;\r
+\r
+import com.google.common.io.ByteArrayDataInput;\r
+\r
+public class TileEntityPyrolysisTable extends TileEntity {\r
+\r
+       private InventoryPyrolysisTableMaterial invm = new InventoryPyrolysisTableMaterial();\r
+       private InventoryPyrolysisTableResult invr = new InventoryPyrolysisTableResult();\r
+       private InventoryPyrolysisTableFuel invf = new InventoryPyrolysisTableFuel();\r
+\r
+       /**\r
+        * 熱量\r
+        */\r
+       private float heat = 0;\r
+\r
+       /**\r
+        * 素材の加熱時間\r
+        */\r
+       private float burnTime = 0;\r
+\r
+       /**\r
+        * 燃料の残り燃焼時間\r
+        */\r
+       private float fuelRestTime = 0;\r
+\r
+       /**\r
+        * 最大熱量\r
+        */\r
+       private static final int MAX_HEAT = 1700;\r
+\r
+       /**\r
+        * 燃料が燃え始める最低熱量\r
+        */\r
+       private static final int MIN_HEAT = 400;\r
+\r
+       /**\r
+        * 燃料の燃焼速度比率・素材の燃焼速度比率の中心となる熱量\r
+        */\r
+       private static final int CENTER_HEAT = 1050;\r
+\r
+       /**\r
+        * 分解までの時間\r
+        */\r
+       private static final int MAX_BURN_TIME = 2000;\r
+\r
+       /**\r
+        * Random of instance.\r
+        */\r
+       public static final Random rand = new Random();\r
+\r
+       @Override\r
+       public void updateEntity() {\r
+               // boolean var2 = false;\r
+\r
+               boolean var1 = this.worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord);\r
+               if (this.worldObj.getBlockId(xCoord, yCoord-1, zCoord) == Block.fire.blockID) {\r
+                       if (this.heat < 1700) {\r
+                               if (this.worldObj.isRaining() && var1 && !this.worldObj.isThundering()) {\r
+                                       this.heat += 0.1F;\r
+                               } else if (this.worldObj.isThundering() && var1) {\r
+                                       this.heat += 0.25F;\r
+                               } else {\r
+                                       this.heat += 0.5F;\r
+                               }\r
+                       } else {\r
+                               this.heat = 1700;\r
+                       }\r
+               } else {\r
+                       if (this.heat > 0) {\r
+                               if(this.worldObj.isRaining() && var1 && !this.worldObj.isThundering()) {\r
+                                       this.heat -= 0.25F;\r
+                               } else if(this.worldObj.isThundering() && var1) {\r
+                                       this.heat -= 0.5F;\r
+                               } else {\r
+                                       this.heat -= 0.05F;\r
+                               }\r
+                       } else {\r
+                               this.heat = 0;\r
+                       }\r
+               }\r
+\r
+               if (this.fuelRestTime >= 0) {\r
+                       this.burnTime += 10 * (this.heat / CENTER_HEAT);\r
+                       this.fuelRestTime -= 10 * (this.heat / CENTER_HEAT);\r
+               }\r
+\r
+               if (this.burnTime >= MAX_BURN_TIME) {\r
+                       Iterator<ItemStack> itMaterial = ChemiCraftAPI.instance().getPyrolysisRecipeList().keySet().iterator();\r
+                       while (itMaterial.hasNext()) {\r
+                               ItemStack itemstackMaterial = itMaterial.next();\r
+                               ItemStack materialItem = this.invm.getStackInSlot(0);\r
+                               if (materialItem != null) {\r
+                                       if (this.isInItemCheck(itemstackMaterial)) {\r
+                                               //var2 = true;\r
+                                               if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {\r
+                                                       this.inItem(itemstackMaterial);\r
+                                                       if (materialItem.stackSize > 1) {\r
+                                                               this.invm.setInventorySlotContents(0, new ItemStack(materialItem.itemID, --materialItem.stackSize, materialItem.getItemDamage()));\r
+                                                       } else {\r
+                                                               this.invm.setInventorySlotContents(0, null);\r
+                                                       }\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       this.burnTime = 0;\r
+               }\r
+\r
+               boolean var3 = false;\r
+               if (this.heat > MIN_HEAT) {\r
+                       Iterator<ItemStack> itMaterial = ChemiCraftAPI.instance().getPyrolysisRecipeList().keySet().iterator();\r
+                       while (itMaterial.hasNext()) {\r
+                               ItemStack itemstackMaterial = itMaterial.next();\r
+                               ItemStack materialItem = this.invm.getStackInSlot(0);\r
+                               if (materialItem != null) {\r
+                                       if (this.isInItemCheck(itemstackMaterial)) {\r
+                                               //var2 = true;\r
+                                               if (itemstackMaterial.itemID == materialItem.itemID && itemstackMaterial.getItemDamage() == materialItem.getItemDamage()) {\r
+                                                       var3 = true;\r
+                                                       if (this.fuelRestTime <= 0) {\r
+                                                               Iterator<ItemStack> itFuel = ChemiCraftAPI.instance().getPyrolysisFuelList().keySet().iterator();\r
+                                                               while (itFuel.hasNext()) {\r
+                                                                       ItemStack itemstackFuel = itFuel.next();\r
+                                                                       ItemStack fuelItem = this.invf.getStackInSlot(0);\r
+                                                                       if (fuelItem != null) {\r
+                                                                               if (itemstackFuel.itemID == fuelItem.itemID && itemstackFuel.getItemDamage() == fuelItem.getItemDamage()) {\r
+                                                                                       this.fuelRestTime = ChemiCraftAPI.instance().getPyrolysisFuelList().get(itemstackFuel);\r
+                                                                                       if (fuelItem.stackSize > 1) {\r
+                                                                                               this.invf.setInventorySlotContents(0, new ItemStack(fuelItem.itemID, --fuelItem.stackSize, fuelItem.getItemDamage()));\r
+                                                                                               break;\r
+                                                                                       } else {\r
+                                                                                               this.invf.setInventorySlotContents(0, null);\r
+                                                                                               break;\r
+                                                                                       }\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       this.burnTime = 0;\r
+                                       //var2 = false;\r
+                               }\r
+                       }\r
+                       if (!var3) {\r
+                               this.burnTime = 0;\r
+                       }\r
+               }\r
+\r
+               /*\r
+               DebugTick.setDebugData("PyrolysisTable" +\r
+                               "(x:" + this.xCoord +\r
+                               " y:" + this.yCoord +\r
+                               " z:" + this.zCoord + ")",\r
+                               new DebugData("Heat", this.heat),\r
+                               new DebugData("FuelRestTime", this.fuelRestTime),\r
+                               new DebugData("BurnTime", this.burnTime),\r
+                               new DebugData("アイテムが入るか", var2)\r
+                               );\r
+                */\r
+       }\r
+\r
+       @Override\r
+       public void readFromNBT(NBTTagCompound par1) {\r
+               super.readFromNBT(par1);\r
+               this.heat = par1.getFloat("Heat");\r
+               this.burnTime = par1.getFloat("BurnTime");\r
+               this.fuelRestTime = par1.getFloat("FuelRestTime");\r
+\r
+               NBTTagList var2 = par1.getTagList("Items");\r
+               for (int var3 = 0; var3 < var2.tagCount(); ++var3)\r
+               {\r
+                       NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);\r
+                       int var5 = var4.getByte("Slot") & 255;\r
+\r
+                       if  (var5 >= 0 && var5 < this.invm.getSizeInventory())\r
+                       {\r
+                               this.invm.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));\r
+                       }\r
+               }\r
+\r
+               NBTTagList var6 = par1.getTagList("Items2");\r
+               for (int var3 = 0; var3 < var6.tagCount(); ++var3)\r
+               {\r
+                       NBTTagCompound var7 = (NBTTagCompound)var6.tagAt(var3);\r
+                       int var8 = var7.getByte("Slot2") & 255;\r
+\r
+                       if  (var8 >= 0 && var8 < this.invr.getSizeInventory())\r
+                       {\r
+                               this.invr.setInventorySlotContents(var8, ItemStack.loadItemStackFromNBT(var7));\r
+                       }\r
+               }\r
+\r
+               NBTTagList var9 = par1.getTagList("Items3");\r
+               for (int var3 = 0; var3 < var9.tagCount(); ++var3)\r
+               {\r
+                       NBTTagCompound var10 = (NBTTagCompound)var9.tagAt(var3);\r
+                       int var11 = var10.getByte("Slot3") & 255;\r
+\r
+                       if  (var11 >= 0 && var11 < this.invf.getSizeInventory())\r
+                       {\r
+                               this.invf.setInventorySlotContents(var11, ItemStack.loadItemStackFromNBT(var10));\r
+                       }\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void writeToNBT(NBTTagCompound par1) {\r
+               super.writeToNBT(par1);\r
+               par1.setFloat("Heat", this.heat);\r
+               par1.setFloat("BurnTime", this.burnTime);\r
+               par1.setFloat("FuelRestTime", this.fuelRestTime);\r
+\r
+               NBTTagList var2 = new NBTTagList();\r
+               for (int var3 = 0; var3 < this.invm.getSizeInventory(); ++var3)\r
+               {\r
+                       if  (this.invm.getStackInSlot(var3) != null)\r
+                       {\r
+                               NBTTagCompound var4 = new NBTTagCompound();\r
+                               var4.setByte("Slot", (byte)var3);\r
+                               this.invm.getStackInSlot(var3).writeToNBT(var4);\r
+                               var2.appendTag(var4);\r
+                       }\r
+               }\r
+               par1.setTag("Items", var2);\r
+\r
+               NBTTagList var5 = new NBTTagList();\r
+               for (int var6 = 0; var6 < this.invr.getSizeInventory(); ++var6)\r
+               {\r
+                       if  (this.invr.getStackInSlot(var6) != null)\r
+                       {\r
+                               NBTTagCompound var7 = new NBTTagCompound();\r
+                               var7.setByte("Slot2", (byte)var6);\r
+                               this.invr.getStackInSlot(var6).writeToNBT(var7);\r
+                               var5.appendTag(var7);\r
+                       }\r
+               }\r
+               par1.setTag("Items2", var5);\r
+\r
+               NBTTagList var8 = new NBTTagList();\r
+               for (int var9 = 0; var9 < this.invf.getSizeInventory(); ++var9)\r
+               {\r
+                       if  (this.invf.getStackInSlot(var9) != null)\r
+                       {\r
+                               NBTTagCompound var10 = new NBTTagCompound();\r
+                               var10.setByte("Slot3", (byte)var9);\r
+                               this.invf.getStackInSlot(var9).writeToNBT(var10);\r
+                               var8.appendTag(var10);\r
+                       }\r
+               }\r
+               par1.setTag("Items3", var8);\r
+       }\r
+\r
+       @Override\r
+       public Packet getDescriptionPacket() {\r
+               return PacketHandler.getPacket(this);\r
+       }\r
+\r
+       public void readPacket(ByteArrayDataInput data) {\r
+               try {\r
+                       this.heat = data.readFloat();\r
+                       this.burnTime = data.readInt();\r
+                       this.fuelRestTime = data.readFloat();\r
+                       for(int i = 0;i < this.invm.getSizeInventory();i++){\r
+                               int id = data.readInt();\r
+                               int size = data.readByte();\r
+                               int damage = data.readInt();\r
+                               if (id != 0 && size != 0){\r
+                                       this.invm.setInventorySlotContents(i, new ItemStack(id, size, damage));\r
+                               }else{\r
+                                       this.invm.setInventorySlotContents(i, null);\r
+                               }\r
+                       }\r
+\r
+                       for(int i = 0;i < this.invr.getSizeInventory();i++){\r
+                               int id = data.readInt();\r
+                               int size = data.readByte();\r
+                               int damage = data.readInt();\r
+                               if (id != 0 && size != 0){\r
+                                       this.invr.setInventorySlotContents(i, new ItemStack(id, size, damage));\r
+                               }else{\r
+                                       this.invr.setInventorySlotContents(i, null);\r
+                               }\r
+                       }\r
+\r
+                       for(int i = 0;i < this.invf.getSizeInventory();i++){\r
+                               int id = data.readInt();\r
+                               int size = data.readByte();\r
+                               int damage = data.readInt();\r
+                               if (id != 0 && size != 0){\r
+                                       this.invf.setInventorySlotContents(i, new ItemStack(id, size, damage));\r
+                               }else{\r
+                                       this.invf.setInventorySlotContents(i, null);\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+\r
+       public void writePacket(DataOutputStream dos){\r
+               try {\r
+                       dos.writeFloat(this.heat);\r
+                       dos.writeFloat(this.burnTime);\r
+                       dos.writeFloat(this.fuelRestTime);\r
+                       for(int i = 0;i < this.invm.getSizeInventory();i++){\r
+                               int id = 0;\r
+                               int size = 0;\r
+                               int damage  = 0;\r
+                               ItemStack itemstack = this.invm.getStackInSlot(i);\r
+                               if (itemstack != null){\r
+                                       id = itemstack.itemID;\r
+                                       size = itemstack.stackSize;\r
+                                       damage = itemstack.getItemDamage();\r
+                                       dos.writeInt(id);\r
+                                       dos.writeByte(size);\r
+                                       dos.writeInt(damage);\r
+                               }else{\r
+                                       dos.writeInt(0);\r
+                                       dos.writeByte(0);\r
+                                       dos.writeInt(0);\r
+                               }\r
+                       }\r
+\r
+                       for(int i = 0;i < this.invr.getSizeInventory();i++){\r
+                               int id = 0;\r
+                               int size = 0;\r
+                               int damage  = 0;\r
+                               ItemStack itemstack = this.invr.getStackInSlot(i);\r
+                               if (itemstack != null){\r
+                                       id = itemstack.itemID;\r
+                                       size = itemstack.stackSize;\r
+                                       damage = itemstack.getItemDamage();\r
+                                       dos.writeInt(id);\r
+                                       dos.writeByte(size);\r
+                                       dos.writeInt(damage);\r
+                               }else{\r
+                                       dos.writeInt(0);\r
+                                       dos.writeByte(0);\r
+                                       dos.writeInt(0);\r
+                               }\r
+                       }\r
+\r
+                       for(int i = 0;i < this.invf.getSizeInventory();i++){\r
+                               int id = 0;\r
+                               int size = 0;\r
+                               int damage  = 0;\r
+                               ItemStack itemstack = this.invf.getStackInSlot(i);\r
+                               if (itemstack != null){\r
+                                       id = itemstack.itemID;\r
+                                       size = itemstack.stackSize;\r
+                                       damage = itemstack.getItemDamage();\r
+                                       dos.writeInt(id);\r
+                                       dos.writeByte(size);\r
+                                       dos.writeInt(damage);\r
+                               }else{\r
+                                       dos.writeInt(0);\r
+                                       dos.writeByte(0);\r
+                                       dos.writeInt(0);\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+       public float getBurnTime() {\r
+               return this.burnTime;\r
+       }\r
+\r
+       public float getHeat() {\r
+               return this.heat;\r
+       }\r
+\r
+       public InventoryPyrolysisTableMaterial getInvMaterial() {\r
+               return this.invm;\r
+       }\r
+\r
+       public InventoryPyrolysisTableResult getInvResult() {\r
+               return this.invr;\r
+       }\r
+\r
+       public InventoryPyrolysisTableFuel getInvFuel() {\r
+               return this.invf;\r
+       }\r
+\r
+       public boolean isInItemCheck(ItemStack key) {\r
+               ItemStack[] results = ChemiCraftAPI.instance().getPyrolysisRecipeList().get(key).clone();\r
+               ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];\r
+               for (int j = 0; j < this.invr.getSizeInventory(); j++) {\r
+                       containerResults[j] = this.invr.getStackInSlot(j);\r
+               }\r
+\r
+               for (int i = 0; i < results.length; i++) {\r
+                       int var1 = results[i].itemID;\r
+                       int var3 = results[i].getItemDamage();\r
+                       int var5 = results[i].stackSize;\r
+                       for (int j = 0; j < containerResults.length; j++) {\r
+                               if (containerResults[j] == null) {\r
+                                       containerResults[j] = results[i];\r
+                                       results[i] = null;\r
+                                       break;\r
+                               } else {\r
+                                       int var2 = containerResults[j].itemID;\r
+                                       int var4 = containerResults[j].getItemDamage();\r
+                                       int var6 = containerResults[j].stackSize;\r
+                                       int var7 = containerResults[j].getMaxStackSize();\r
+                                       if (var1 == var2 && var3 == var4) {\r
+                                               if (var5 + var6 <= var7) {\r
+                                                       containerResults[j] = results[i];\r
+                                                       results[i] = null;\r
+                                                       break;\r
+                                               } else {\r
+                                                       var5 -= var7 - var6;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               for (int i = 0; i < results.length; i++) {\r
+                       if (results[i] != null) {\r
+                               return false;\r
+                       }\r
+               }\r
+               return true;\r
+       }\r
+\r
+       public void inItem(ItemStack key) {\r
+               ItemStack[] results = ChemiCraftAPI.instance().getPyrolysisRecipeList().get(key);\r
+\r
+               for (int i = 0; i < results.length; i++) {\r
+                       ItemStack[] containerResults = new ItemStack[this.invr.getSizeInventory()];\r
+                       for (int j = 0; j < this.invr.getSizeInventory(); j++) {\r
+                               containerResults[j] = this.invr.getStackInSlot(j);\r
+                       }\r
+                       int var1 = results[i].itemID;\r
+                       int var3 = results[i].getItemDamage();\r
+                       int var5 = results[i].stackSize;\r
+                       for (int j = 0; j < containerResults.length; j++) {\r
+                               if (containerResults[j] == null) {\r
+                                       ItemStack result = new ItemStack(var1, var5, var3);\r
+                                       this.invr.setInventorySlotContents(j, result);\r
+                                       break;\r
+                               } else {\r
+                                       int var2 = containerResults[j].itemID;\r
+                                       int var4 = containerResults[j].getItemDamage();\r
+                                       int var6 = containerResults[j].stackSize;\r
+                                       int var7 = containerResults[j].getMaxStackSize();\r
+                                       if (var1 == var2 && var3 == var4) {\r
+                                               if (var5 + var6 <= var7) {\r
+                                                       this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var5 + var6, results[i].getItemDamage()));\r
+                                                       break;\r
+                                               } else {\r
+                                                       this.invr.setInventorySlotContents(j, new ItemStack(results[i].itemID, var7, results[i].getItemDamage()));\r
+                                                       var5 -= var7 - var6;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public float getFuelRestTime() {\r
+               return fuelRestTime;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityToolAndWeaponCraftingTable.java b/src/asia/tcrs/ccnp/chemicraftnext/core/tileentity/TileEntityToolAndWeaponCraftingTable.java
new file mode 100644 (file)
index 0000000..c249d0e
--- /dev/null
@@ -0,0 +1,31 @@
+package asia.tcrs.ccnp.chemicraftnext.core.tileentity;
+
+import java.io.DataOutputStream;
+
+import net.minecraft.tileentity.TileEntity;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryToolAndWeaponCraftingTableMaterial;
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryToolAndWeaponCraftingTableResult;
+
+import com.google.common.io.ByteArrayDataInput;
+
+public class TileEntityToolAndWeaponCraftingTable extends TileEntity {
+
+       public InventoryToolAndWeaponCraftingTableMaterial invm = new InventoryToolAndWeaponCraftingTableMaterial();
+       public InventoryToolAndWeaponCraftingTableResult invr = new InventoryToolAndWeaponCraftingTableResult();
+
+       public void readPacket(ByteArrayDataInput data) {
+               try {
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+
+       public void writePacket(DataOutputStream dos){
+               try {
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/testcase/FormulaTest.java b/src/asia/tcrs/ccnp/chemicraftnext/testcase/FormulaTest.java
new file mode 100644 (file)
index 0000000..8680f2f
--- /dev/null
@@ -0,0 +1,83 @@
+/*\r
+package pcc.chemicraft.testcase;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import java.util.Arrays;\r
+\r
+import org.junit.Test;\r
+\r
+import pcc.chemicraft.util.Formula;\r
+\r
+public class FormulaTest extends Formula {\r
+\r
+       public FormulaTest() {\r
+               super("");\r
+       }\r
+\r
+       @Test\r
+       public void test8() {\r
+               Formula formula_Together = new Formula("Si12Si3C2O8C4");\r
+               check(formula_Together.getAtoms(), formula_Together.getAmonts(), new String[] {"Si", "C", "O"}, new Integer[] {12+3, 2+4, 8});\r
+       }\r
+\r
+       @Test\r
+       public void test7() {\r
+               Formula formula_first_no_ten__other_ten = new Formula("Si6C11O56");\r
+               check(formula_first_no_ten__other_ten.getAtoms(), formula_first_no_ten__other_ten.getAmonts(), new String[] {"Si", "C", "O"}, new Integer[] {6, 11, 56});\r
+       }\r
+\r
+       @Test\r
+       public void test6() {\r
+               Formula formula_multiple_and_ten = new Formula("Si13O47");\r
+               check(formula_multiple_and_ten.getAtoms(), formula_multiple_and_ten.getAmonts(), new String[] {"Si", "O"}, new Integer[] {13, 47});\r
+       }\r
+\r
+       @Test\r
+       public void test5() {\r
+               Formula formula_ten = new Formula("Si13");\r
+               check(formula_ten.getAtoms(), formula_ten.getAmonts(), new String[] {"Si"}, new Integer[] {13});\r
+       }\r
+\r
+       @Test\r
+       public void test4() {\r
+               Formula formula_firstSimple__other_In_Numer = new Formula("SiC2O2");\r
+               check(formula_firstSimple__other_In_Numer.getAtoms(), formula_firstSimple__other_In_Numer.getAmonts(), new String[] {"Si", "C", "O"}, new Integer[] {1, 2, 2});\r
+       }\r
+\r
+       @Test\r
+       public void test3() {\r
+               Formula formula_multiple_and_in_number = new Formula("Si2C2O2");\r
+               check(formula_multiple_and_in_number.getAtoms(), formula_multiple_and_in_number.getAmonts(), new String[] {"Si", "C", "O"}, new Integer[] {2, 2, 2});\r
+       }\r
+\r
+       @Test\r
+       public void test2() {\r
+               Formula formula_multiple = new Formula("SiCO");\r
+               check(formula_multiple.getAtoms(), formula_multiple.getAmonts(), new String[] {"Si", "C", "O"}, new Integer[] {1, 1, 1});\r
+       }\r
+\r
+       @Test\r
+       public void test1() {\r
+               Formula formula_in_number = new Formula("Si3");\r
+               check(formula_in_number.getAtoms(), formula_in_number.getAmonts(), new String[] {"Si"}, new Integer[] {3});\r
+       }\r
+\r
+       @Test\r
+       public void test() {\r
+               Formula formula_simple = new Formula("Si");\r
+               check(formula_simple.getAtoms(), formula_simple.getAmonts(), new String[] {"Si"}, new Integer[] {1});\r
+       }\r
+\r
+       public void check(String[] atoms, Integer[] amounts, String[] expectaionAtoms, Integer[] expectationAmounts) {\r
+               assertEquals("変換がおかしいです(元素)",\r
+                               atoms,\r
+                               expectaionAtoms);\r
+\r
+               assertEquals("変換がおかしいです(元素数)",\r
+                               amounts,\r
+                               expectationAmounts);\r
+       }\r
+\r
+}\r
+*/\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/testcase/MaterialRecipeTest.java b/src/asia/tcrs/ccnp/chemicraftnext/testcase/MaterialRecipeTest.java
new file mode 100644 (file)
index 0000000..fd79f6a
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+package pcc.chemicraft.testcase;
+
+import static org.junit.Assert.*;
+
+import net.minecraft.item.ItemStack;
+
+import org.junit.Test;
+
+import pcc.chemicraft.base.ChemiCraftBase;
+import pcc.chemicraft.core.inventory.InventoryChemicalCraftingMaterial;
+import pcc.chemicraft.core.nbt.ChemicalNBTRecipe;
+import pcc.chemicraft.util.MaterialRecipe;
+
+public class MaterialRecipeTest extends MaterialRecipe {
+
+       public MaterialRecipeTest() {
+               super(
+                               new ItemStack(1800, 1, 0),
+                               new ItemStack[] {
+                                       new ItemStack(1800, 1, 0)
+                               },
+                               null,
+                               true);
+       }
+
+       @Test
+       public void test() {
+
+               ItemStack stack = new ItemStack(18000, 1, 0);
+               InventoryChemicalCraftingMaterial inv = new InventoryChemicalCraftingMaterial();
+               inv.setInventorySlotContents(0, new ItemStack(18000, 1, 0));
+
+               MaterialRecipe mr = new MaterialRecipe(
+                               stack,
+                               new ItemStack[] {
+                                               new ItemStack(18000, 1, 0)
+                               },
+                               null,
+                               true);
+
+               assertEquals(
+                               mr.match(inv),
+                               stack
+                               );
+
+       }
+
+}
+*/
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/AtomInfo.java b/src/asia/tcrs/ccnp/chemicraftnext/util/AtomInfo.java
new file mode 100644 (file)
index 0000000..95533d6
--- /dev/null
@@ -0,0 +1,375 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.util.Auxiliary.Probability;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.world.World;\r
+import net.minecraftforge.oredict.OreDictionary;\r
+import cpw.mods.fml.relauncher.Side;\r
+import cpw.mods.fml.relauncher.SideOnly;\r
+\r
+/**\r
+ * いろいろなデータを格納しメソッドによってチェックするクラス。<br>\r
+ * 使用する場合はItemAtomInfoContainerを継承することを推奨します。\r
+ * @author ponkotate\r
+ */\r
+public final class AtomInfo {\r
+\r
+       /**\r
+        * 気体\r
+        */\r
+       public static final Integer[] GASES = new Integer[] {\r
+               1, 2, 7, 8, 9, 10, 17, 18, 36, 54, 86\r
+       };\r
+\r
+\r
+       /**\r
+        * 液体\r
+        */\r
+       public static final Integer[] LIQUIDS = new Integer[] {\r
+               35, 80\r
+       };\r
+\r
+\r
+       /**\r
+        * 不明\r
+        */\r
+       public static final Integer[] UNKNOWN = new Integer[] {\r
+               98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118\r
+       };\r
+\r
+\r
+       public static final Integer[] LANTHANOID = new Integer[] {\r
+               57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71\r
+       };\r
+\r
+\r
+       public static final Integer[] ACTINOID = new Integer[] {\r
+               89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103\r
+       };\r
+\r
+\r
+       public static final Integer[] UNOFFICIAL = new Integer[] {\r
+               113, 114, 115, 116, 117, 118\r
+       };\r
+\r
+\r
+       public static final Integer[] OREOFVANILLA = new Integer[] {\r
+               6, 26, 79\r
+       };\r
+\r
+\r
+       /**\r
+        * X, Y, Z座標\r
+        */\r
+       private  int posX;\r
+       private  int posY;\r
+       private  int posZ;\r
+\r
+\r
+       /**\r
+        * biomeの名前\r
+        */\r
+       private  String biomeName;\r
+\r
+\r
+       /**\r
+        * 天候\r
+        */\r
+       private  String weather;\r
+\r
+\r
+       /**\r
+        * EntityPlayerのインスタンス\r
+        */\r
+       private EntityPlayer entityPlayer;\r
+\r
+\r
+       /**\r
+        * Worldのインスタンス\r
+        */\r
+       private World world;\r
+\r
+\r
+\r
+       /**\r
+        * AtomInfoのデータをupdateします\r
+        * @param par1World Worldのインスタンス\r
+        * @param par2EntityPlayer EntityPlayerのインスタンス\r
+        */\r
+       public void update(World par1World, EntityPlayer par2EntityPlayer){\r
+               this.posX = (int) par2EntityPlayer.posX;\r
+               this.posY = (int) par2EntityPlayer.posY;\r
+               this.posZ = (int) par2EntityPlayer.posZ;\r
+\r
+               this.biomeName = par1World.getBiomeGenForCoords(posX, posZ).biomeName;\r
+\r
+               if (par1World.isThundering()) {\r
+                       this.weather = "Thunder";\r
+               } else if(par1World.isRaining()) {\r
+                       this.weather = "Rain";\r
+               } else {\r
+                       this.weather = "Sun";\r
+               }\r
+       }\r
+\r
+\r
+\r
+       public static boolean isGas(int par1) {\r
+               for (int var2:GASES) {\r
+                       if (par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isLiquid(int par1) {\r
+               for (int var2:LIQUIDS) {\r
+                       if (par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isSolid(int par1) {\r
+               if (!isGas(par1) && !isLiquid(par1) && !isUnknown(par1)) {\r
+                       return true;\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isUnknown(int par1) {\r
+               for (int var2:UNKNOWN) {\r
+                       if (par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isLanthanoid(int par1) {\r
+               for (int var2:LANTHANOID) {\r
+                       if (par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isActinoid(int par1) {\r
+               for (int var2:ACTINOID) {\r
+                       if (par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isUnofficial(int par1) {\r
+               for (int var2:UNOFFICIAL) {\r
+                       if (par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isRI(int par1) {\r
+               return collapseUraniumSeries(par1) != -1;\r
+       }\r
+\r
+\r
+\r
+       public static int collapseUraniumSeries(int par1) {\r
+               int var1 = 0;\r
+               Probability var2 = new Probability();\r
+               switch (par1) {\r
+               case 92:\r
+                       var1 = 90;\r
+                       break;\r
+               case 91:\r
+                       var1 = 92;\r
+                       break;\r
+               case 90:\r
+                       switch (var2.getProbability(1, 1)) {\r
+                       case 0:\r
+                               var1 = 91;\r
+                               break;\r
+                       case 1:\r
+                               var1 = 88;\r
+                               break;\r
+                       }\r
+                       break;\r
+               case 88:\r
+                       var1 = 86;\r
+                       break;\r
+               case 86:\r
+                       var1 = 84;\r
+                       break;\r
+               case 85:\r
+                       switch (var2.getProbability(1, 1)) {\r
+                       case 0:\r
+                               var1 = 86;\r
+                               break;\r
+                       case 1:\r
+                               var1 = 83;\r
+                               break;\r
+                       }\r
+                       break;\r
+               case 84:\r
+                       switch (var2.getProbability(1, 1)) {\r
+                       case 0:\r
+                               var1 = 85;\r
+                               break;\r
+                       case 1:\r
+                               var1 = 82;\r
+                               break;\r
+                       }\r
+                       break;\r
+               case 83:\r
+                       switch (var2.getProbability(1, 1)) {\r
+                       case 0:\r
+                               var1 = 84;\r
+                               break;\r
+                       case 1:\r
+                               var1 = 81;\r
+                               break;\r
+                       }\r
+                       break;\r
+               case 82:\r
+                       switch (var2.getProbability(1, 1)) {\r
+                       case 0:\r
+                               var1 = 83;\r
+                               break;\r
+                       case 1:\r
+                               var1 = 80;\r
+                               break;\r
+                       }\r
+                       break;\r
+               case 81:\r
+                       var1 = 82;\r
+                       break;\r
+               case 80:\r
+                       var1 = 81;\r
+                       break;\r
+               default:\r
+                       return -1;\r
+               }\r
+               return var1;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isOreOfVanilla(int par1) {\r
+               for (int var2:OREOFVANILLA) {\r
+                       if (par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       public static boolean isExisting(String par1) {\r
+               for (String var2:OreDictionary.getOreNames()) {\r
+                       if ("ore" + par1 == var2) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 引数に指定されたBiomeと同等か比較します\r
+        * @param biomeName 比較するBiomeの名前\r
+        * @return Biomeが一致しているか\r
+        */\r
+       public boolean isEquivalentBiome(String biomeName) {\r
+               if(this.biomeName != null){\r
+                       if(this.biomeName.equals(biomeName)){\r
+                               return true;\r
+                       }else{\r
+                               return false;\r
+                       }\r
+               }else{\r
+                       System.err.println("AtonInfo:データが入っていません。updateメソッドでデータを入れてください");\r
+                       return false;\r
+               }\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 引数に指定された天候と同等か比較します\r
+        * 晴れ:Sun, 雨:Rain, 雷雨:Thunder\r
+        * @param weather 比較する天候\r
+        * @return 天候が一致しているか\r
+        */\r
+       public boolean isEquivalentWeather(String weather) {\r
+               if (this.weather != null) {\r
+                       if (this.weather.equals(weather)) {\r
+                               return true;\r
+                       } else {\r
+                               return false;\r
+                       }\r
+               } else {\r
+                       System.err.println("AtonInfo:データが入っていません。updateメソッドでデータを入れてください");\r
+                       return false;\r
+               }\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 引数に指定されたY軸より高いか判定します\r
+        * @param par1\r
+        * @return 指定されたY軸より高いか\r
+        */\r
+       @SideOnly(Side.CLIENT)\r
+       public boolean isOverY(int par1) {\r
+               return this.posY >= par1;\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 引数に指定されたY軸と同等か判定します\r
+        * @param par1\r
+        * @return 指定されたY軸と同等かどうか\r
+        */\r
+       @SideOnly(Side.CLIENT)\r
+       public boolean isEquivalentY(int par1) {\r
+               return this.posY == par1;\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * 引数に指定されたY軸より低いか判定します\r
+        * @param par1\r
+        * @return 指定されたY軸より低いか\r
+        */\r
+       @SideOnly(Side.CLIENT)\r
+       public boolean isBelowY(int par1) {\r
+               return this.posY <= par1;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/Auxiliary.java b/src/asia/tcrs/ccnp/chemicraftnext/util/Auxiliary.java
new file mode 100644 (file)
index 0000000..189dad2
--- /dev/null
@@ -0,0 +1,311 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import java.util.ArrayList;\r
+\r
+import net.minecraft.block.Block;\r
+import net.minecraft.entity.Entity;\r
+import net.minecraft.item.Item;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.world.World;\r
+import cpw.mods.fml.common.registry.LanguageRegistry;\r
+\r
+/**\r
+ * 補助クラス\r
+ * @author mozipi,ponkotate\r
+ */\r
+public class Auxiliary {\r
+\r
+       public static class NameAuxiliary {\r
+\r
+               /**\r
+                * 名前を設定します\r
+                * @param object\r
+                * @param Name\r
+                */\r
+               public void addName(Object object,Object name){\r
+                       LanguageRegistry.addName(object, (String) name);\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * 名前を設定します(ItemStack版)\r
+                * @param object\r
+                * @param name\r
+                * @param meta\r
+                */\r
+               public void addName(ItemStack itemstack,Object name){\r
+                       LanguageRegistry.addName(itemstack, (String) name);\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * 指定言語にそって名前を追加します\r
+                * @param object\r
+                * @param lang\r
+                * @param name\r
+                */\r
+               public void addName(Object object,String lang,Object name){\r
+                       LanguageRegistry.instance().addNameForObject(object, lang, (String) name);\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * 指定言語にそって名前を追加します(ItemStack版)\r
+                * @param object\r
+                * @param lang\r
+                * @param name\r
+                */\r
+               public void addName(ItemStack object,String lang,Object name){\r
+                       LanguageRegistry.instance().addNameForObject(object, lang, (String) name);\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * メタデータごとに名前を追加します(Block版)\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Block object,Object[] name){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.addName(new ItemStack(object,0,i), (String) name[i]);\r
+                       }\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * メタデータごとに名前を追加します(Item版)\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Item object,Object[] name){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.addName(new ItemStack(object,0,i), (String) name[i]);\r
+                       }\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * 指定された言語にそってメタデータごとに名前を設定します(Block版)\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Block object,String lang,Object[] name){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.instance().addNameForObject(new ItemStack(object,0,i), lang, (String) name[i]);\r
+                       }\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * 指定された言語にそってメタデータごとに名前を設定します(Item版)\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Item object,String lang, Object[] name){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.instance().addNameForObject(new ItemStack(object,0,i), lang, (String) name[i]);\r
+                       }\r
+               }\r
+\r
+               /**\r
+                * 指定された言語にそってメタデータごとに名前を設定します(Block版)\r
+                * また、配列の前に任意の文字列を追加できます。\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Block object,String lang, String string, Object[] name){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.instance().addNameForObject(new ItemStack(object,0,i), lang, string + (String) name[i]);\r
+                       }\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * 指定された言語にそってメタデータごとに名前を設定します(Item版)\r
+                * また、配列の前に任意の文字列を追加できます。\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Item object,String lang, String string, Object[] name){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.instance().addNameForObject(new ItemStack(object,0,i), lang, string + (String) name[i]);\r
+                       }\r
+               }\r
+\r
+               /**\r
+                * 指定された言語にそってメタデータごとに名前を設定します(Block版)\r
+                * また、配列の後ろに任意の文字列を追加できます。\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Block object,String lang, Object[] name, String string){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.instance().addNameForObject(new ItemStack(object,0,i), lang, (String) name[i] + string);\r
+                       }\r
+               }\r
+\r
+\r
+\r
+               /**\r
+                * 指定された言語にそってメタデータごとに名前を設定します(Item版)\r
+                * また、配列の後ろに任意の文字列を追加できます。\r
+                * @param object\r
+                * @param name\r
+                */\r
+               public void addName(Item object,String lang, Object[] name, String string){\r
+                       for(int i=0;i<name.length;i++){\r
+                               LanguageRegistry.instance().addNameForObject(new ItemStack(object,0,i), lang, (String) name[i] + string);\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+       public static class ArrayAuxiliary{\r
+\r
+               public static ItemStack[] deleteNull(ItemStack[] array){\r
+                       int count = 0;\r
+                       ItemStack[] arrayCopy;\r
+                       for(int i = 0;i < array.length;i++){\r
+                               if(array[array.length - 1 - i] == null){\r
+                                       count++;\r
+                               }else{\r
+                                       break;\r
+                               }\r
+                       }\r
+                       arrayCopy = new ItemStack[array.length - count];\r
+                       for(int i = 0;i < arrayCopy.length;i++){\r
+                               arrayCopy[i] = array[i];\r
+                       }\r
+                       array = arrayCopy.clone();\r
+                       return array;\r
+               }\r
+\r
+       }\r
+\r
+       public static class Probability {\r
+\r
+               /**\r
+                * Return probability(0,1,2,etc...).\r
+                */\r
+               public int getProbability(double... par1){\r
+                       ArrayList<Double> var1 = new ArrayList<Double>();\r
+                       for (int var2 = 0; var2 < par1.length; var2++) {\r
+                               var1.add(par1[var2]);\r
+                       }\r
+                       return getProbability(var1);\r
+               }\r
+\r
+               public int getProbability(ArrayList<Double> par1){\r
+\r
+                       double var1 = 0;\r
+\r
+                       for (int i = 0; i < par1.size(); i++){\r
+                               var1 += par1.get(i);\r
+                       }\r
+\r
+                       double var2 = 0;\r
+                       double var3 = Math.random();\r
+\r
+                       for (int j = 0; j < par1.size(); j++){\r
+                               double var4 = par1.get(j) / var1;\r
+                               var2 += var4;\r
+                               if (var2 >= var3){\r
+                                       return j;\r
+                               }else{\r
+                                       continue;\r
+                               }\r
+                       }\r
+                       return -1;\r
+               }\r
+\r
+       }\r
+\r
+       public static class MathAuxiliary {\r
+\r
+               public static ArrayList<Entity> getTriangleEntitysByPlayer(World par1World,\r
+                               double par2, double par3, double par4,\r
+                               double yaw,\r
+                               double pitch,\r
+                               double angle,\r
+                               double rad) {\r
+\r
+                       ArrayList<Entity> entitys = (ArrayList<Entity>) par1World.loadedEntityList;\r
+                       ArrayList<Entity> result = new ArrayList<Entity>();\r
+                       for (int i = 0; i < entitys.size(); i++) {\r
+                               String a = "";\r
+                               Entity entity = entitys.get(i);\r
+                               double x = entity.posX;\r
+                               double y = entity.posY;\r
+                               double z = entity.posZ;\r
+                               double bx = par2;\r
+                               double by = par3;\r
+                               double bz = par4;\r
+                               double look = Math.sin(Math.toRadians(yaw)) * 180;\r
+                               double lookPitch = Math.abs(pitch);\r
+                               double playerToEntityAngleXZ = Math.sin(Math.atan2(bx - x, bz - z)) * 180;\r
+                               double playerToEntityAngleY = Math.toDegrees(Math.atan(y - by));\r
+                               double length =\r
+                                               Math.sqrt(\r
+                                                               Math.pow(Math.abs(bx - x), 2) +\r
+                                                               Math.pow(Math.abs(by - y), 2) +\r
+                                                               Math.pow(Math.abs(bz - z), 2));\r
+\r
+                               if (look + angle/2 > playerToEntityAngleXZ && look - angle/2 < playerToEntityAngleXZ) {\r
+                                       if (length < rad) {\r
+                                               result.add(entity);\r
+                                       }\r
+                               }\r
+\r
+                       }\r
+\r
+                       return result;\r
+               }\r
+\r
+               public static ArrayList<Entity> getTriangleEntitys(World par1World,\r
+                               double par2, double par3, double par4,\r
+                               double yaw,\r
+                               double pitch,\r
+                               double angle,\r
+                               double rad) {\r
+\r
+                       ArrayList<Entity> entitys = (ArrayList<Entity>) par1World.loadedEntityList;\r
+                       ArrayList<Entity> result = new ArrayList<Entity>();\r
+                       for (int i = 0; i < entitys.size(); i++) {\r
+                               String a = "";\r
+                               Entity entity = entitys.get(i);\r
+                               double x = entity.posX;\r
+                               double y = entity.posY;\r
+                               double z = entity.posZ;\r
+                               double bx = par2;\r
+                               double by = par3;\r
+                               double bz = par4;\r
+                               double playerToEntityAngleXZ = Math.sin(Math.atan2(bx - x, bz - z)) * 180;\r
+                               double playerToEntityAngleY = Math.toDegrees(Math.atan(y - by));\r
+                               double length =\r
+                                               Math.sqrt(\r
+                                                               Math.pow(Math.abs(bx - x), 2) +\r
+                                                               Math.pow(Math.abs(by - y), 2) +\r
+                                                               Math.pow(Math.abs(bz - z), 2));\r
+\r
+                               if (playerToEntityAngleXZ + angle/2 > playerToEntityAngleXZ && playerToEntityAngleXZ - angle/2 < playerToEntityAngleXZ) {\r
+                                       if (length < rad) {\r
+                                               result.add(entity);\r
+                                       }\r
+                               }\r
+\r
+                       }\r
+\r
+                       return result;\r
+               }\r
+\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/ComparatorFormulaPart.java b/src/asia/tcrs/ccnp/chemicraftnext/util/ComparatorFormulaPart.java
new file mode 100644 (file)
index 0000000..6a1a281
--- /dev/null
@@ -0,0 +1,31 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import java.util.Comparator;\r
+\r
+/**\r
+ * 元素情報を比較します。\r
+ * @author mozipi\r
+ */\r
+public class ComparatorFormulaPart implements Comparator<FormulaPart> {\r
+\r
+       @Override\r
+       public int compare(FormulaPart o1, FormulaPart o2) {\r
+               int i = 0;\r
+               byte[] var1Byte = o1.getAtom().getBytes();\r
+               byte[] var2Byte = o2.getAtom().getBytes();\r
+               while (var1Byte.length > i && var2Byte.length > i) {\r
+                       if (var1Byte[i] == var2Byte[i]) {\r
+                               i++;\r
+                               continue;\r
+                       }\r
+                       if (var1Byte[i] < var2Byte[i]) {\r
+                               return -1;\r
+                       }\r
+                       if (var1Byte[i] > var2Byte[i]) {\r
+                               return 1;\r
+                       }\r
+               }\r
+               return 0;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/ComparatorItemStack.java b/src/asia/tcrs/ccnp/chemicraftnext/util/ComparatorItemStack.java
new file mode 100644 (file)
index 0000000..dbf0b0d
--- /dev/null
@@ -0,0 +1,30 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import java.util.Comparator;\r
+\r
+import net.minecraft.item.ItemStack;\r
+\r
+/**\r
+ * ItemStackを比較します。\r
+ * @author mozipi\r
+ */\r
+public class ComparatorItemStack implements Comparator {\r
+\r
+       @Override\r
+       public int compare(Object o1, Object o2) {\r
+               ItemStack i1 = (ItemStack) o1;\r
+               ItemStack i2 = (ItemStack) o2;\r
+\r
+               if(i1 != null && i2 != null){\r
+                       if(i1.itemID == i2.itemID){\r
+                               return i1.getItemDamage() > i2.getItemDamage() ? 1 : -1;\r
+                       }\r
+                       return i1.itemID > i2.itemID ? 1 : -1;\r
+               }\r
+               if(i1 == null && i2 == null) return 0;\r
+               if(i1 != null && i2 == null) return -1;\r
+               if(i1 == null && i2 != null) return 1;\r
+               return 0;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/Formula.java b/src/asia/tcrs/ccnp/chemicraftnext/util/Formula.java
new file mode 100644 (file)
index 0000000..39f192d
--- /dev/null
@@ -0,0 +1,136 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import java.util.ArrayList;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;\r
+\r
+/**\r
+ * 化学式から元素と数を取り出してArrayListに格納します。\r
+ * @author ponkotate\r
+ */\r
+public class Formula {\r
+\r
+       private ArrayList<String> atoms = new ArrayList<String>();\r
+       private ArrayList<Integer> amonts = new ArrayList<Integer>();\r
+\r
+       private int magnification;\r
+\r
+       private String lastSpell;\r
+       private int lastIndex;\r
+\r
+       public Formula(String par1) {\r
+               this.magnification = 1;\r
+               this.run(par1);\r
+       }\r
+\r
+       public Formula(String[] par1, Integer[] par2) {\r
+               this.setAtoms(par1, par2);\r
+       }\r
+\r
+       public Formula(ArrayList<String> par1, ArrayList<Integer> par2) {\r
+               this.atoms = par1;\r
+               this.amonts = par2;\r
+       }\r
+\r
+       // 括弧対応はまだ未完成です。 --WIP--\r
+       public void run(String par1) {\r
+               char[] var2 = par1.toCharArray();\r
+\r
+               for (int i = 0; i < var2.length; i++) {\r
+                       if (var2[i] == '・') {\r
+                               if (this.lastSpell != null) {\r
+                                       setAtom(this.lastSpell, 1);\r
+                               }\r
+                               setAtoms(new Formula(new String(var2, ++i, var2.length - i)));\r
+                               return;\r
+                       } else if (var2[i] == '(') {\r
+                               // 括弧対応はまだ未完成です。 --WIP--\r
+                       } else if (Character.isDigit(var2[i])) {\r
+                               if (this.lastIndex > 0) {\r
+                                       this.amonts.set(this.amonts.size() - 1,\r
+                                                       this.lastIndex = this.lastIndex * 10 + Integer.valueOf(Character.toString(var2[i])));\r
+                               } else if (this.lastSpell != null) {\r
+                                       setAtom(this.lastSpell, this.lastIndex = Integer.valueOf(Character.toString(var2[i])));\r
+                               } else {\r
+                                       this.magnification = Integer.valueOf(Character.toString(var2[i]));\r
+                               }\r
+                               this.lastSpell = null;\r
+                       } else if (Character.isLetter(var2[i])) {\r
+                               if (Character.isUpperCase(var2[i])) {\r
+                                       if (this.lastSpell != null) {\r
+                                               setAtom(this.lastSpell, 1);\r
+                                       }\r
+                                       this.lastSpell = Character.toString(var2[i]);\r
+                               } else if (Character.isLowerCase(var2[i])) {\r
+                                       if (this.lastSpell == null) {\r
+                                               throw new IllegalArgumentException();\r
+                                       }\r
+                                       this.lastSpell = this.lastSpell.concat(Character.toString(var2[i]));\r
+                               }\r
+                               this.lastIndex = 0;\r
+                       } else {\r
+                               throw new IllegalArgumentException();\r
+                       }\r
+               }\r
+               if (this.lastSpell != null) {\r
+                       setAtom(this.lastSpell, 1);\r
+               }\r
+       }\r
+\r
+       public boolean isAtom(String par1) {\r
+               for (String var2:ChemiCraftData.ATOMSLIST) {\r
+                       if (par1.equalsIgnoreCase(var2)) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+       public void setAtom(String par1,  int par2) {\r
+               if (isAtom(par1)) {\r
+                       par2 *= this.magnification;\r
+                       int var3 = this.atoms.indexOf(par1);\r
+                       if (var3 == -1) {\r
+                               this.atoms.add(par1);\r
+                               this.amonts.add(par2);\r
+                       } else {\r
+                               this.amonts.set(var3, this.amonts.get(var3) + par2);\r
+                       }\r
+               } else {\r
+                       throw new IllegalArgumentException();\r
+               }\r
+       }\r
+\r
+       public void setAtom(String par1,  char par2) {\r
+               setAtom(par1, Integer.valueOf(Character.toString(par2)));\r
+       }\r
+\r
+       public void setAtoms(String[] par1, Integer[] par2) {\r
+               setAtoms(par1, par2, 1);\r
+       }\r
+       public void setAtoms(String[] par1, Integer[] par2, int par3) {\r
+               if (par1.length != par2.length) {\r
+                       throw new IndexOutOfBoundsException();\r
+               }\r
+               for (int i = 0; i < par1.length; i++) {\r
+                       setAtom(par1[i], par2[i] * par3);\r
+               }\r
+       }\r
+\r
+       public void setAtoms(Formula par1) {\r
+               setAtoms(par1, 1);\r
+       }\r
+\r
+       public void setAtoms(Formula par1, int par2) {\r
+               setAtoms(par1.getAtoms(), par1.getAmonts(), par2);\r
+       }\r
+\r
+       public String[] getAtoms() {\r
+               return atoms.toArray(new String[atoms.size()]);\r
+       }\r
+\r
+       public Integer[] getAmonts() {\r
+               return amonts.toArray(new Integer[amonts.size()]);\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/FormulaPart.java b/src/asia/tcrs/ccnp/chemicraftnext/util/FormulaPart.java
new file mode 100644 (file)
index 0000000..0579c49
--- /dev/null
@@ -0,0 +1,45 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.ChemiCraftData;\r
+\r
+/**\r
+ * 元素情報を格納するクラスです\r
+ * @author mozipi\r
+ */\r
+public class FormulaPart {\r
+\r
+       private String atom;\r
+       private int amount;\r
+\r
+       public FormulaPart(String par1, int par2){\r
+               this.atom = par1;\r
+               this.amount = par2;\r
+       }\r
+\r
+       public String getAtom(){\r
+               return this.atom;\r
+       }\r
+\r
+       public int getAmount(){\r
+               return this.amount;\r
+       }\r
+\r
+       @Override\r
+       public boolean equals(Object par1) {\r
+               try {\r
+                       FormulaPart var1 = (FormulaPart)par1;\r
+                       if (var1.atom.equals(this.atom) && var1.amount == this.amount) {\r
+                               return true;\r
+                       }\r
+               } catch (ClassCastException e) {\r
+                       return false;\r
+               }\r
+               return false;\r
+       }\r
+\r
+       @Override\r
+       public int hashCode() {\r
+               return ChemiCraftData.toAtoms(this.atom) + this.amount * 200;\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/ICompoundHandler.java b/src/asia/tcrs/ccnp/chemicraftnext/util/ICompoundHandler.java
new file mode 100644 (file)
index 0000000..a8d36c7
--- /dev/null
@@ -0,0 +1,57 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import net.minecraft.entity.Entity;\r
+import net.minecraft.entity.player.EntityPlayer;\r
+import net.minecraft.item.ItemStack;\r
+import net.minecraft.world.World;\r
+\r
+/**\r
+ * 化合物のハンドラーのインターフェイスです。\r
+ * @author mozipi\r
+ */\r
+public interface ICompoundHandler {\r
+\r
+       /**\r
+        * 右クリック時のHandler\r
+        * @param par1ItemStack\r
+        * @param par2World\r
+        * @param par3EntityPlayer\r
+        * @return\r
+        */\r
+       public ItemStack onItemRightClickHandler(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer);\r
+\r
+\r
+       /**\r
+        * Itemを使用したときのHandler\r
+        * @param par1ItemStack\r
+        * @param par2EntityPlayer\r
+        * @param par3World\r
+        * @param par4\r
+        * @param par5\r
+        * @param par6\r
+        * @param par7\r
+        * @param par8\r
+        * @param par9\r
+        * @param par10\r
+        * @return\r
+        */\r
+       public boolean onItemUseHandler(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10);\r
+\r
+\r
+       /**\r
+        * 毎Tick呼ばれるHandler\r
+        * @param par1ItemStack\r
+        * @param par2World\r
+        * @param par3Entity\r
+        * @param par4\r
+        * @param par5\r
+        */\r
+       public void onUpdateHandler(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5);\r
+\r
+       /**\r
+        * iconIndexの指定\r
+        * @return iconIndex\r
+        */\r
+       public String getIconIndexHandler();\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/ListHash.java b/src/asia/tcrs/ccnp/chemicraftnext/util/ListHash.java
new file mode 100644 (file)
index 0000000..38ecf2c
--- /dev/null
@@ -0,0 +1,185 @@
+package asia.tcrs.ccnp.chemicraftnext.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+/**
+ * @author Ponkotate version:1.0.0 dev
+ *
+ *         Create ArrayList in HashMap.
+ */
+public class ListHash<K, E> {
+
+       protected ArrayList<K> keysList = new ArrayList<K>();
+       protected HashMap<K, ArrayList<E>> elementsHash = new HashMap<K, ArrayList<E>>();
+
+       public boolean add(K par1Key, E par2Element) {
+               try {
+                       return this.elementsHash.get(par1Key).add(par2Element);
+               } catch (Exception e) {
+                       return this.put(par1Key, par2Element);
+               }
+       }
+
+       public boolean addAll(K par1Key, Collection<? extends E> par2Collection) {
+               return this.elementsHash.get(par1Key).addAll(par2Collection);
+       }
+
+       public boolean addAll(K par1Key, int par2Index, Collection<? extends E> par3Collection) {
+               return this.elementsHash.get(par1Key).addAll(par2Index, par3Collection);
+       }
+
+       public boolean createHash(K par1Key) {
+               if (this.elementsHash.put(par1Key, new ArrayList<E>()) != null) {
+                       return false;
+               }
+               this.keysList.add(par1Key);
+               return true;
+       }
+
+       public void clear() {
+               this.elementsHash.clear();
+       }
+
+       public boolean containsKey(K par1Key) {
+               return this.elementsHash.containsKey(par1Key);
+       }
+
+       public boolean containsValue(K par1Key) {
+               return this.elementsHash.containsValue(par1Key);
+       }
+
+       public boolean contains(K par1Key, E par2Element) {
+               return this.elementsHash.get(par1Key).contains(par2Element);
+       }
+
+       public boolean containsAll(K par1Key, Collection<?> par2Collection) {
+               return this.elementsHash.get(par1Key).containsAll(par2Collection);
+       }
+
+       public Set<Entry<K, ArrayList<E>>> entrySet() {
+               return this.elementsHash.entrySet();
+       }
+
+       public K getKeyList(int par1Index) {
+               return this.keysList.get(par1Index);
+       }
+
+       public E get(K par1Key, int par2Index) {
+               return this.elementsHash.get(par1Key).get(par2Index);
+       }
+
+       public ArrayList<E> get(K par1Key) {
+               return this.elementsHash.get(par1Key);
+       }
+
+       public int indexOf(K par1Key, E par2Element) {
+               return this.elementsHash.get(par1Key).indexOf(par2Element);
+       }
+
+       public boolean isKeysListEmpty(K par1Key) {
+               return this.elementsHash.get(par1Key).isEmpty();
+       }
+
+       public boolean isElementsHashEmpty() {
+               return this.elementsHash.isEmpty();
+       }
+
+       public Iterator<K> iterator() {
+               return this.keysList.iterator();
+       }
+
+       public Iterator<E> iterator(K par1Key) {
+               return this.elementsHash.get(par1Key).iterator();
+       }
+
+       public int lastIndexOf(K par1Key, E par2Element) {
+               return this.elementsHash.get(par1Key).lastIndexOf(par2Element);
+       }
+
+       public ListIterator<E> listIterator(K par1Key) {
+               return this.elementsHash.get(par1Key).listIterator();
+       }
+
+       public ListIterator<E> listIterator(K par1Key, int par2Index) {
+               return this.elementsHash.get(par1Key).listIterator(par2Index);
+       }
+
+       public Set<K> keySet() {
+               return this.elementsHash.keySet();
+       }
+
+       public boolean put(K par1Key, E par2Element) {
+               this.keysList.add(par1Key);
+
+               ArrayList<E> elementList = new ArrayList<E>();
+               this.elementsHash.put(par1Key, elementList);
+               return this.add(par1Key, par2Element);
+       }
+
+       public void putAll(Map<? extends K, ? extends ArrayList<E>> par1Map) {
+               this.elementsHash.putAll(par1Map);
+       }
+
+       public ArrayList<E> remove(K par1Key) {
+               return this.elementsHash.remove(par1Key);
+       }
+
+       public boolean remove(K par1Key, E par2Element) {
+               return this.elementsHash.get(par1Key).remove(par2Element);
+       }
+
+       public E remove(K par1Key, int par2Index) {
+               return this.elementsHash.get(par1Key).remove(par2Index);
+       }
+
+       public boolean removeAll(K par1Key, Collection<?> par2Collection) {
+               return this.elementsHash.get(par1Key).removeAll(par2Collection);
+       }
+
+       public boolean retainAll(K par1Key, Collection<?> par2Collection) {
+               return this.elementsHash.get(par1Key).retainAll(par2Collection);
+       }
+
+       public E set(K par1Key, int par2Index, E par3Element) {
+               return this.elementsHash.get(par1Key).set(par2Index, par3Element);
+       }
+
+       public int sizeElementsHash() {
+               return this.elementsHash.size();
+       }
+
+       public int sizeKeysList() {
+               return this.keysList.size();
+       }
+
+       public int sizeElementsList(K par1Key) {
+               return this.elementsHash.get(par1Key).size();
+       }
+
+       public List<E> subList(K par1Key, int par2FromIndex, int par3ToIndex) {
+               return this.elementsHash.get(par1Key).subList(
+                               par2FromIndex,
+                               par3ToIndex);
+       }
+
+       public E[] toArray(K par1Key) {
+               return (E[])this.elementsHash.get(par1Key).toArray();
+       }
+
+       public <T> T[] toArray(K par1Key, T[] par2Array) {
+               return this.elementsHash.get(par1Key).toArray(par2Array);
+       }
+
+       public Collection<ArrayList<E>> values() {
+               return this.elementsHash.values();
+       }
+
+}
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/MaterialRecipe.java b/src/asia/tcrs/ccnp/chemicraftnext/util/MaterialRecipe.java
new file mode 100644 (file)
index 0000000..b650ddc
--- /dev/null
@@ -0,0 +1,106 @@
+package asia.tcrs.ccnp.chemicraftnext.util;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+\r
+import asia.tcrs.ccnp.chemicraftnext.core.inventory.InventoryChemicalCraftingMaterial;\r
+import asia.tcrs.ccnp.chemicraftnext.core.nbt.ChemicalNBTRecipe;\r
+import asia.tcrs.ccnp.chemicraftnext.util.Auxiliary.ArrayAuxiliary;\r
+\r
+import net.minecraft.item.ItemStack;\r
+\r
+/**\r
+ * 素材制作台のレシピを格納するクラスです\r
+ * @author mozipi\r
+ */\r
+public class MaterialRecipe {\r
+\r
+       private ChemicalNBTRecipe nbtRecipe;\r
+       private ItemStack result;\r
+       private ItemStack[] material;\r
+       private boolean isSharpless = true;\r
+\r
+       public MaterialRecipe(ItemStack par1ItemStack, ItemStack[] par2ItemStacks, ChemicalNBTRecipe par3NBTRecipe, boolean par4){\r
+               this.result = par1ItemStack;\r
+               this.material = par2ItemStacks.clone();\r
+               this.nbtRecipe = par3NBTRecipe;\r
+               this.isSharpless = par4;\r
+       }\r
+\r
+       /**\r
+        * インベントリの中にあるアイテムとレシピの内容が一致するかどうか判定します。<br>\r
+        * @param par1IInventory Inventory\r
+        * @return 一致したばあいはthis.resultを。それ以外はnull\r
+        */\r
+       @SuppressWarnings("unchecked")\r
+       public ItemStack match(InventoryChemicalCraftingMaterial par1IInventory){\r
+               ArrayList<ItemStack> invItemsArray = new ArrayList<ItemStack>();\r
+               ItemStack[] invItems;\r
+               for (int i = 0;i < par1IInventory.getSizeInventory();i++) {\r
+                       invItemsArray.add(par1IInventory.getStackInSlot(i));\r
+               }\r
+               invItems = invItemsArray.toArray(new ItemStack[invItemsArray.size()]);\r
+\r
+               if (isSharpless) {\r
+                       Arrays.sort(invItems, new ComparatorItemStack());\r
+                       Arrays.sort(this.material, new ComparatorItemStack());\r
+                       invItems = (ItemStack[]) ArrayAuxiliary.deleteNull(invItems);\r
+                       if (invItems.length != this.material.length) return null;\r
+                       for (int i = 0;i < this.material.length;i++) {\r
+                               if (this.material[i].itemID != invItems[i].itemID) return null;\r
+                               if (this.material[i].getItemDamage() != invItems[i].getItemDamage()) return null;\r
+                       }\r
+                       return this.result;\r
+               } else {\r
+                       if (this.material.length != invItems.length) return null;\r
+                       for (int i = 0;i < this.material.length;i++) {\r
+                               if (this.material[i] == null && invItems[i] != null) return null;\r
+                               if (this.material[i] != null && invItems[i] == null) return null;\r
+                               if (this.material[i] != null && invItems[i] != null){\r
+                                       if (this.material[i].itemID != invItems[i].itemID) return null;\r
+                                       if (this.material[i].getItemDamage() != invItems[i].getItemDamage()) return null;\r
+                               }\r
+                       }\r
+                       return this.result;\r
+               }\r
+       }\r
+\r
+       /**\r
+        * NBTが一致するかどうか判定します\r
+        * @param par1IInventory Inventory\r
+        * @return 一致したらthis.nbt。それ以外はnull\r
+        */\r
+       @SuppressWarnings("unchecked")\r
+       public ChemicalNBTRecipe nbtMatch(InventoryChemicalCraftingMaterial par1IInventory){\r
+               ArrayList<ItemStack> invItemsArray = new ArrayList<ItemStack>();\r
+               ItemStack[] invItems;\r
+               for (int i = 0;i < par1IInventory.getSizeInventory();i++) {\r
+                       invItemsArray.add(par1IInventory.getStackInSlot(i));\r
+               }\r
+               invItems = invItemsArray.toArray(new ItemStack[invItemsArray.size()]);\r
+\r
+               if (isSharpless) {\r
+                       Arrays.sort(invItems, new ComparatorItemStack());\r
+                       Arrays.sort(this.material, new ComparatorItemStack());\r
+                       invItems = (ItemStack[]) ArrayAuxiliary.deleteNull(invItems);\r
+                       if (invItems.length != this.material.length) return null;\r
+                       for (int i = 0;i < this.material.length;i++) {\r
+                               if (this.material[i].itemID != invItems[i].itemID) return null;\r
+                               if (this.material[i].getItemDamage() != invItems[i].getItemDamage()) return null;\r
+                       }\r
+                       return this.nbtRecipe;\r
+               }else{\r
+                       if (this.material.length != invItems.length) return null;\r
+                       for (int i = 0;i < this.material.length;i++) {\r
+                               if (this.material[i] == null && invItems[i] != null) return null;\r
+                               if (this.material[i] != null && invItems[i] == null) return null;\r
+                               if (this.material[i] != null && invItems[i] != null) {\r
+                                       if (this.material[i].itemID != invItems[i].itemID) return null;\r
+                                       if (this.material[i].getItemDamage() != invItems[i].getItemDamage()) return null;\r
+                               }\r
+                       }\r
+                       return this.nbtRecipe;\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/src/asia/tcrs/ccnp/chemicraftnext/util/UserNameOnKick.java b/src/asia/tcrs/ccnp/chemicraftnext/util/UserNameOnKick.java
new file mode 100644 (file)
index 0000000..ef52716
--- /dev/null
@@ -0,0 +1,16 @@
+package asia.tcrs.ccnp.chemicraftnext.util;
+
+import net.minecraft.client.Minecraft;
+
+public final class UserNameOnKick {
+
+       public static void kick(String username) {
+               try {
+                       if (Minecraft.getMinecraft().session.username.equals(username))
+                       throw new RuntimeException("You are a Criminal!");
+               } catch (Exception e) {
+                       return;
+               }
+       }
+
+}