if(par1 == 0){
return 17;
}else if(par1 == 1){
- return 0;
+ return 1;
}else{
return 16;
}
if(par1 == 0){
return 17;
}else if(par1 == 1){
- return 0;
+ return 3;
}else{
return 16;
}
if(par1 == 0){
return 17;
}else if(par1 == 1){
- return 0;
+ return 2;
}else{
return 16;
}
import net.minecraft.src.Block;\r
import net.minecraft.src.CreativeTabs;\r
import net.minecraft.src.Item;\r
+import net.minecraft.src.ItemStack;\r
import net.minecraft.src.Material;\r
import net.minecraftforge.common.Configuration;\r
import net.minecraftforge.common.Property;\r
// GUIを追加します\r
NetworkRegistry.instance().registerGuiHandler(instance, proxy);\r
\r
+ //分解レシピを追加します\r
+ ChemiCraftAPI.instance.addDecompositionRecipe(new ItemStack(Block.dirt, 1, 0), new ItemStack[]{new ItemStack(Block.stone, 16, 0)});\r
+\r
//Textureをpreloadします\r
proxy.registerTextures();\r
}\r
import java.util.ArrayList;
+import net.minecraft.src.ItemStack;
+
/**
* ChemiCraftのAPI
* 基本的にAddonはこのクラスのインスタンスを使う
*/
private static ArrayList<ICompoundHandler> compoundHandlers = new ArrayList<ICompoundHandler>();
+
/**
* List of item name of handler to compounds.
*/
/**
+ * 分解台の素材のリスト
+ */
+ private static ArrayList<ItemStack> decompositionMaterial = new ArrayList<ItemStack>();
+
+
+ /**
+ * 分解台の結果のリスト
+ */
+ private static ArrayList<ItemStack[]> decompositionResults = new ArrayList<ItemStack[]>();
+
+
+ /**
+ * 化合台の素材のリスト
+ */
+ private static ArrayList<ItemStack[]> chemicalCombinationMaterials = new ArrayList<ItemStack[]>();
+
+
+ /**
+ * 化合台の結果のリスト
+ */
+ private static ArrayList<ItemStack> chemicalCombinationResult = new ArrayList<ItemStack>();
+
+
+
+ /**
+ * ChemiCraftの化学作業台類のレシピのマネージャー
+ */
+ private static ChemiCraftCraftingManager chemiCraftCraftingManager = new ChemiCraftCraftingManager();
+
+
+
+ /**
* add compound.
* @param name compound name.
*/
+ /**
+ * 分解レシピを追加します。resultの要素数は0<= n <= 16にしてください。
+ * @param material 素材
+ * @param result 結果
+ */
+ public static void addDecompositionRecipe(ItemStack material, ItemStack[] result){
+ if(result.length <= 16){
+ decompositionMaterial.add(material);
+ decompositionResults.add(result);
+ }else{
+ System.err.println("ChemiCraft内でエラー:addDecompositionRecipeの引数resultの要素数が16を超えています。" + "Material:" + material + " Result:" + result);
+ }
+ }
+
+
+
+ /**
+ * 化合レシピを追加します。materialの要素数は0<= n <= 16にしてください。
+ * @param material 素材
+ * @param result 結果
+ */
+ public static void addChemicalCombinationRecipe(ItemStack[] material, ItemStack result){
+ if(material.length <= 16){
+ chemicalCombinationMaterials.add(material);
+ chemicalCombinationResult.add(result);
+ }else{
+ System.err.println("ChemiCraft内でエラー:addChemicalCombinationRecipeの引数materialの要素数が16を超えています。" + "Material:" + material + " Result:" + result);
+ }
+ }
//以下システム関連//////////////////////////////////////////////////////
public static ArrayList<ICompoundHandler> getCompoundHandler(){
return compoundsLangList;
}
+
+
+ public static ArrayList<ItemStack> getDecompositionMaterial(){
+ return decompositionMaterial;
+ }
+
+
+
+ public static ArrayList<ItemStack[]> getDecompositionResult(){
+ return decompositionResults;
+ }
+
+
+
+ public static ArrayList<ItemStack[]> getChemicalCombinationMaterial(){
+ return chemicalCombinationMaterials;
+ }
+
+
+
+ public static ArrayList<ItemStack> getChemicalCombinationResult(){
+ return chemicalCombinationResult;
+ }
+
+
+
+ public static ChemiCraftCraftingManager getCraftingManager(){
+ return chemiCraftCraftingManager;
+ }
+
}
--- /dev/null
+package chemicraft;
+
+import java.util.ArrayList;
+
+import net.minecraft.src.IInventory;
+import net.minecraft.src.ItemStack;
+
+public class ChemiCraftCraftingManager {
+
+ public ItemStack[] getDecompositionResults(IInventory par1IInventory){
+ ((InventoryDecomposition)par1IInventory).setFlag(false);
+ ItemStack[] results = null;
+ for(int i1 = 0;i1 < ChemiCraftAPI.instance.getDecompositionMaterial().size();i1++){
+ ArrayList<Integer> materialID = new ArrayList<Integer>();
+ ArrayList<Integer> materialDamage = new ArrayList<Integer>();
+ results = new ItemStack[ChemiCraftAPI.instance.getDecompositionResult().get(i1).length];
+
+ materialID.add(ChemiCraftAPI.instance.getDecompositionMaterial().get(i1).itemID);
+ materialDamage.add(ChemiCraftAPI.instance.getDecompositionMaterial().get(i1).getItemDamage());
+ if(par1IInventory.getStackInSlot(16) == null){ this.clearResults(par1IInventory, 16); return new ItemStack[16];}
+ if(materialID.get(0) != par1IInventory.getStackInSlot(16).itemID){ this.clearResults(par1IInventory, 16); return new ItemStack[16];}
+ if(materialDamage.get(0) != par1IInventory.getStackInSlot(16).getItemDamage()){ this.clearResults(par1IInventory, 16); return new ItemStack[16];}
+
+ for(int i = 0;i < ChemiCraftAPI.instance.getDecompositionResult().get(i1).length;i++){
+
+ results[i] = new ItemStack(
+ ChemiCraftAPI.instance.getDecompositionResult().get(i1)[i].itemID,
+ ChemiCraftAPI.instance.getDecompositionResult().get(i1)[i].stackSize,
+ ChemiCraftAPI.instance.getDecompositionResult().get(i1)[i].getItemDamage()
+ );
+ }
+ }
+ return results;
+ }
+
+
+
+ private void clearResults(IInventory par1IInventory, int par2){
+ ((InventoryDecomposition)par1IInventory).setFlag(false);
+ for(int i = 0;i < par2;i++){
+ par1IInventory.setInventorySlotContents(i, null);
+ }
+ }
+
+}
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.IInventory;
import net.minecraft.src.InventoryPlayer;
-import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
+import net.minecraft.src.Packet;
import net.minecraft.src.Slot;
import net.minecraft.src.World;
private TileEntityDecompositionTable tileEntity;
+ /**
+ * the inventory.
+ */
+ private InventoryDecomposition inv;
+
+
+
+ /**
+ * the inventoryPlayer.
+ */
+ private InventoryPlayer invp;
+
+
public ContainerDecompositionTable(EntityPlayer par1EntityPlayer, TileEntityDecompositionTable par2)
{
this.posY = par2.yCoord;
this.posZ = par2.zCoord;
this.tileEntity = par2;
+ this.inv = par2.getInventorys();
+ this.invp = par1EntityPlayer.inventory;
//GenerateInventory
this.generateSlots("Decomposition", par2.getInventorys());
//GeneratePlayerInventory
{
this.addSlotToContainer(new Slot(par1EntityPlayer.inventory, var3, 8 + var3 * 18, 143));
}
+
+ this.tileEntity.getInventorys().setEventHandler(this);
}
@Override
- public void onCraftMatrixChanged(IInventory par1IInventory){}
+ public void onCraftMatrixChanged(IInventory par1IInventory){
+ ((InventoryDecomposition) par1IInventory).setFlag(false);
+ this.putStacksInSlots(ChemiCraftAPI.getCraftingManager().getDecompositionResults(par1IInventory));
+ ((InventoryDecomposition) par1IInventory).setFlag(true);
+ }
@Override
+ public ItemStack slotClick(int par1, int par2, boolean par3, EntityPlayer par4EntityPlayer)
+ {
+ if(par1 < 16){
+ return null;
+ }else{
+ super.slotClick(par1, par2, par3, par4EntityPlayer);
+ }
+ return null;
+ }
+
+
+
+ @Override
public ItemStack transferStackInSlot(int par1){
return null;
}
- private void generateSlots(String activeTabs, IInventory[] inventorys){
+ public void addPlayerInv(int par1, ItemStack par2ItemStack){
+ this.putStackInSlot(par1, par2ItemStack);
+ }
+
+
+
+ public void onButtonClick(int par1){
+ if(par1 == 0){
+ for(int loop = 0;loop < 1;loop++){
+ if(this.inv.getStackInSlot(16) == null) break;
+ for(int i = 0;i < this.inv.getSizeInventory();i++){
+ if(i < 16 && this.inv.getStackInSlot(i) != null){
+ if(this.invp.player.inventory.getFirstEmptyStack() != -1){
+ this.tileEntity.setItemDrop(false);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ }else{
+ this.tileEntity.setItemDrop(true);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ this.updateCraftingResults();
+ }
+ }
+ }
+ }
+ }else if(par1 == 1){
+ for(int loop = 0;loop < 16;loop++){
+ if(this.inv.getStackInSlot(16) == null) break;
+ for(int i = 0;i < this.inv.getSizeInventory();i++){
+ if(i < 16 && this.inv.getStackInSlot(i) != null){
+ if(this.invp.player.inventory.getFirstEmptyStack() != -1){
+ this.tileEntity.setItemDrop(false);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ }else{
+ this.tileEntity.setItemDrop(true);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ }
+ }
+ }
+ }
+ }else if(par1 == 2){
+ for(int loop = 0;loop < 32;loop++){
+ if(this.inv.getStackInSlot(16) == null) break;
+ for(int i = 0;i < this.inv.getSizeInventory();i++){
+ if(i < 16 && this.inv.getStackInSlot(i) != null){
+ if(this.invp.player.inventory.getFirstEmptyStack() != -1){
+ this.tileEntity.setItemDrop(false);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ }else{
+ this.tileEntity.setItemDrop(true);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ }
+ }
+ }
+ }
+ }else if(par1 == 3){
+ for(int loop = 0;loop < 64;loop++){
+ if(this.inv.getStackInSlot(16) == null) break;
+ for(int i = 0;i < this.inv.getSizeInventory();i++){
+ if(i < 16 && this.inv.getStackInSlot(i) != null){
+ if(this.invp.player.inventory.getFirstEmptyStack() != -1){
+ this.tileEntity.setItemDrop(false);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ }else{
+ this.tileEntity.setItemDrop(true);
+ PacketDispatcher.sendPacketToServer(this.tileEntity.getDescriptionPacket());
+ }
+ }
+ }
+ }
+ }
+ this.onCraftMatrixChanged(this.inv);
+ }
+
+
+
+ private void generateSlots(String activeTabs, IInventory inventorys){
int count = 0;
for(int i = 0;i < 4;i++){
for(int j = 0;j < 4;j++){
- this.addSlotToContainer(new SlotDecompositionResult(inventorys[0], count, 90 + 18 * j, 8 + 18 * i));
+ this.addSlotToContainer(new SlotDecompositionResult(inventorys, count, 90 + 18 * j, 8 + 18 * i));
count++;
}
}
- this.addSlotToContainer(new Slot(inventorys[0], count, 28, 30));
+ this.addSlotToContainer(new Slot(inventorys, count, 28, 30));
}
}
import net.minecraft.src.Block;
import net.minecraft.src.EntityPlayer;
+import net.minecraft.src.GuiButton;
import net.minecraft.src.GuiContainer;
import net.minecraft.src.InventoryBasic;
import net.minecraft.src.InventoryPlayer;
import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
+import net.minecraft.src.StatCollector;
import cpw.mods.fml.common.Side;
import cpw.mods.fml.common.asm.SideOnly;
import cpw.mods.fml.common.network.PacketDispatcher;
@Override
+ public void initGui(){
+ super.initGui();
+ this.controlList.add(new GuiButton(0, this.guiLeft + 44, this.guiTop+2, 20, 10,"x1"));
+ this.controlList.add(new GuiButton(0, this.guiLeft + 44+20, this.guiTop+2, 20, 10,"x16"));
+ this.controlList.add(new GuiButton(0, this.guiLeft + 44, this.guiTop+2+10, 20, 10,"x32"));
+ this.controlList.add(new GuiButton(0, this.guiLeft + 44+20, this.guiTop+2+10, 20, 10,"x64"));
+ }
+
+
+
+
+ @Override
+ protected void drawGuiContainerForegroundLayer()
+ {
+ this.fontRenderer.drawString("Takeout:", 3, 8, 0x000000);
+ }
+
+
+
+ @Override
protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3){
this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture(ChemiCraft.instance.guiDecompositionTexture));
this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
}
+
+
+ @Override
+ protected void actionPerformed(GuiButton par1GuiButton){
+ this.container.onButtonClick(par1GuiButton.id);
+ }
+
}
package chemicraft;
+import net.minecraft.src.Container;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.IInventory;
import net.minecraft.src.ItemStack;
private ItemStack[] inventory = new ItemStack[16+1];
+ private Container eventHandler;
+
+ private boolean flag;
+
+ public void setEventHandler(Container par1Container){
+ this.eventHandler = par1Container;
+ this.flag = true;
+ }
+
+ public void setFlag(boolean par1){
+ this.flag = par1;
+ }
+
@Override
public int getSizeInventory() {
return inventory.length;
@Override
public void setInventorySlotContents(int var1, ItemStack var2) {
inventory[var1] = var2;
+ if(flag){
+ this.eventHandler.onCraftMatrixChanged(this);
+ }
}
@Override
@Override
public void onInventoryChanged() {
-
+ if(flag){
+ this.eventHandler.onCraftMatrixChanged(this);
+ }
}
@Override
@Override\r
public void onPacketData(NetworkManager manager, Packet250CustomPayload packet, Player player) {\r
if (packet.channel.equals("chemicraft")) {\r
- ByteArrayDataInput var1 = ByteStreams.newDataInput(packet.data);\r
+ ByteArrayDataInput badi = ByteStreams.newDataInput(packet.data);\r
\r
World worldClient;\r
World worldServer;\r
- TileEntity tileEntity;\r
+ TileEntity var1;\r
TileEntityDecompositionTable var2;\r
\r
// TileEntityのx, y, z座標\r
int x, y, z;\r
\r
// 座標読み込み\r
- x = var1.readInt();\r
- y = var1.readInt();\r
- z = var1.readInt();\r
+ x = badi.readInt();\r
+ y = badi.readInt();\r
+ z = badi.readInt();\r
\r
worldClient = ChemiCraft.instance.proxy.getClientWorld();\r
worldServer = ((EntityPlayer)player).worldObj;\r
if(worldClient != null){\r
- tileEntity = worldClient.getBlockTileEntity(x, y, z);\r
- if (tileEntity instanceof TileEntityDecompositionTable) {\r
- var2 = (TileEntityDecompositionTable) tileEntity;\r
- var2.readPacket(var1);\r
+ var1 = worldClient.getBlockTileEntity(x, y, z);\r
+ if (var1 instanceof TileEntityDecompositionTable) {\r
+ var2 = (TileEntityDecompositionTable) var1;\r
+ var2.readPacket(badi, (EntityPlayer)player);\r
}\r
return;\r
}\r
if(worldServer != null){\r
- tileEntity = worldServer.getBlockTileEntity(x, y, z);\r
- if (tileEntity instanceof TileEntityDecompositionTable) {\r
- var2 = (TileEntityDecompositionTable) tileEntity;\r
- var2.readPacket(var1);\r
+ var1 = worldServer.getBlockTileEntity(x, y, z);\r
+ if (var1 instanceof TileEntityDecompositionTable) {\r
+ var2 = (TileEntityDecompositionTable) var1;\r
+ var2.readPacket(badi, (EntityPlayer)player);\r
}\r
return;\r
}\r
package chemicraft;
import java.io.DataOutputStream;
-import java.util.ArrayList;
+import net.minecraft.src.EntityPlayer;
import net.minecraft.src.IInventory;
import net.minecraft.src.ItemStack;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.NBTTagList;
import net.minecraft.src.Packet;
import net.minecraft.src.TileEntity;
+import net.minecraft.src.WorldServer;
import com.google.common.io.ByteArrayDataInput;
-import cpw.mods.fml.common.network.PacketDispatcher;
-
public class TileEntityDecompositionTable extends TileEntity {
- /**
- * DecompositionのInventory
- */
- public IInventory decompositionInv = new InventoryDecomposition();
+ private IInventory decompositionInv = new InventoryDecomposition();
+ private boolean isItemDrop = false;
public TileEntityDecompositionTable() {
super();
}
- public IInventory[] getInventorys(){
- ArrayList<IInventory> inventorys = new ArrayList<IInventory>();
- inventorys.add(this.decompositionInv);
- return inventorys.toArray(new IInventory[1]);
+ public InventoryDecomposition getInventorys(){
+ return (InventoryDecomposition) this.decompositionInv;
+ }
+
+
+ public void setItemDrop(boolean par1){
+ this.isItemDrop = par1;
}
}
- public void readPacket(ByteArrayDataInput data) {
+ public void readPacket(ByteArrayDataInput data, EntityPlayer entityPlayer) {
+ int id;
+ int damage;
+ int size;
try {
+
+ this.isItemDrop = data.readBoolean();
+
+ for(int i = 0;i < 16;i++){
+ id = data.readInt();
+ damage = data.readInt();
+ size = data.readInt();
+ if(id != 0){
+ if(!this.isItemDrop){
+ entityPlayer.inventory.addItemStackToInventory(new ItemStack(id, size, damage));
+ }else{
+ entityPlayer.dropPlayerItem(new ItemStack(id, size, damage));
+ }
+ }
+ }
+ id = data.readInt();
+ damage = data.readInt();
+ size = data.readInt();
+ if(id != 0){
+ if(entityPlayer.worldObj instanceof WorldServer){
+ this.decompositionInv.setInventorySlotContents(16, new ItemStack(id, --size, damage));
+ }
+ }
} catch (Exception e) {
e.printStackTrace();
}
public void writePacket(DataOutputStream dos){
try {
+
+ dos.writeBoolean(this.isItemDrop);
+
+ for(int i = 0;i < this.decompositionInv.getSizeInventory();i++){
+ if(this.decompositionInv.getStackInSlot(i) != null){
+ dos.writeInt(this.decompositionInv.getStackInSlot(i).itemID);
+ dos.writeInt(this.decompositionInv.getStackInSlot(i).getItemDamage());
+ dos.writeInt(this.decompositionInv.getStackInSlot(i).stackSize);
+ }else{
+ dos.writeInt(0);
+ dos.writeInt(0);
+ dos.writeInt(0);
+ }
+ }
+
} catch (Exception e) {
e.printStackTrace();
}