Advertisement
Exokem

Untitled

Mar 30th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.17 KB | None | 0 0
  1. //Container
  2. public class ContainerArcFurnace extends Container {
  3.     private final TileEntityArcFurnace tileentity;
  4.     private int cookTime, totalCookTime, burnTime, currentBurnTime;
  5.  
  6.     public ContainerArcFurnace(InventoryPlayer player, TileEntityArcFurnace tileentity) {
  7.         this.tileentity = tileentity;
  8.         IItemHandler handler = tileentity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
  9.  
  10.         this.addSlotToContainer(new SlotItemHandler(handler, 0, 25, 23));
  11.         this.addSlotToContainer(new SlotItemHandler(handler, 1, 50, 23));
  12.         this.addSlotToContainer(new SlotItemHandler(handler, 2, 37, 45));
  13.         this.addSlotToContainer(new SlotItemHandler(handler, 3, 133, 33));
  14.         this.addSlotToContainer(new SlotItemHandler(handler, 4, 90, 23));
  15.  
  16.         for(int y = 0; y < 3; y++) {
  17.             for(int x = 0; x < 9; x++) {
  18.                 this.addSlotToContainer(new Slot(player, x + y*9 + 9, 8 + x*18, 84 + y*18));
  19.             }
  20.         }
  21.  
  22.         for(int x = 0; x < 9; x++) {
  23.             this.addSlotToContainer(new Slot(player, x, 8 + x * 18, 142));
  24.         }
  25.     }
  26.  
  27.     @Override
  28.     public void detectAndSendChanges() {
  29.         super.detectAndSendChanges();
  30.  
  31.         for(int i = 0; i < this.listeners.size(); ++i) {
  32.             IContainerListener listener = (IContainerListener)this.listeners.get(i);
  33.  
  34.             if(this.cookTime != this.tileentity.getField(2)) listener.sendWindowProperty(this, 2, this.tileentity.getField(2));
  35.             if(this.burnTime != this.tileentity.getField(0)) listener.sendWindowProperty(this, 0, this.tileentity.getField(0));
  36.             if(this.currentBurnTime != this.tileentity.getField(1)) listener.sendWindowProperty(this, 1, this.tileentity.getField(1));
  37.             if(this.totalCookTime != this.tileentity.getField(3)) listener.sendWindowProperty(this, 3, this.tileentity.getField(3));
  38.         }
  39.  
  40.         this.cookTime = this.tileentity.getField(2);
  41.         this.burnTime = this.tileentity.getField(0);
  42.         this.currentBurnTime = this.tileentity.getField(1);
  43.         this.totalCookTime = this.tileentity.getField(3);
  44.     }
  45.  
  46.     @Override
  47.     @SideOnly(Side.CLIENT)
  48.     public void updateProgressBar(int id, int data) {
  49.         this.tileentity.setField(id, data);
  50.     }
  51.  
  52.     @Override
  53.     public boolean canInteractWith(EntityPlayer playerIn) {
  54.         return this.tileentity.isUsableByPlayer(playerIn);
  55.     }
  56.  
  57.     @Override
  58.     public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) {
  59.         ItemStack stack = ItemStack.EMPTY;
  60.         Slot slot = (Slot)this.inventorySlots.get(index);
  61.  
  62.         if(slot != null && slot.getHasStack()) {
  63.             ItemStack stack1 = slot.getStack();
  64.             stack = stack1.copy();
  65.  
  66.             if(index == 3) {
  67.                 if(!this.mergeItemStack(stack1, 4, 40, true)) return ItemStack.EMPTY;
  68.                 slot.onSlotChange(stack1, stack);
  69.             }
  70.             else if(index != 2 && index != 1 && index != 0) {
  71.                 Slot slot1 = (Slot)this.inventorySlots.get(index + 1);
  72.  
  73.                 if(!RecipeArcFurnace.getInstance().getResult(stack1, slot1.getStack()).isEmpty()) {
  74.                     if(!this.mergeItemStack(stack1, 0, 2, false)) {
  75.                         return ItemStack.EMPTY;
  76.                     }
  77.                     else if(TileEntityArcFurnace.isItemFuel(stack1)) {
  78.                         if(!this.mergeItemStack(stack1, 2, 3, false)) return ItemStack.EMPTY;
  79.                     }
  80.                     else if(TileEntityArcFurnace.isItemFuel(stack1)) {
  81.                         if(!this.mergeItemStack(stack1, 2, 3, false)) return ItemStack.EMPTY;
  82.                     }
  83.                     else if(TileEntityArcFurnace.isItemFuel(stack1)) {
  84.                         if(!this.mergeItemStack(stack1, 2, 3, false)) return ItemStack.EMPTY;
  85.                     }
  86.                     else if(index >= 4 && index < 31) {
  87.                         if(!this.mergeItemStack(stack1, 31, 40, false)) return ItemStack.EMPTY;
  88.                     }
  89.                     else if(index >= 31 && index < 40 && !this.mergeItemStack(stack1, 4, 31, false)) {
  90.                         return ItemStack.EMPTY;
  91.                     }
  92.                 }
  93.             }
  94.             else if(!this.mergeItemStack(stack1, 4, 40, false)) {
  95.                 return ItemStack.EMPTY;
  96.             }
  97.             if(stack1.isEmpty()) {
  98.                 slot.putStack(ItemStack.EMPTY);
  99.             }
  100.             else {
  101.                 slot.onSlotChanged();
  102.  
  103.             }
  104.             if(stack1.getCount() == stack.getCount()) return ItemStack.EMPTY;
  105.             slot.onTake(playerIn, stack1);
  106.         }
  107.         return stack;
  108.     }
  109.  
  110. }
  111.  
  112. //TileEntity
  113. public class TileEntityArcFurnace extends TileEntity implements ITickable {
  114.  
  115.     private ItemStackHandler handler = new ItemStackHandler(5);
  116.     private String customName;
  117.     private ItemStack smelting = ItemStack.EMPTY;
  118.  
  119.     private int burnTime;
  120.     private int currentBurnTime;
  121.     private int cookTime;
  122.     private int totalCookTime = 200;
  123.  
  124.     @Override
  125.     public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
  126.         if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return true;
  127.         else return false;
  128.     }
  129.  
  130.     @Override
  131.     public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
  132.         if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return (T) this.handler;
  133.         return super.getCapability(capability, facing);
  134.     }
  135.  
  136.     public boolean hasCustomName() {
  137.         return this.customName != null && !this.customName.isEmpty();
  138.     }
  139.  
  140.     public void setCustomName(String customName) {
  141.         this.customName = customName;
  142.     }
  143.  
  144.     @Override
  145.     public ITextComponent getDisplayName() {
  146.         return this.hasCustomName() ? new TextComponentString(this.customName) : new TextComponentTranslation("container.arc_furnace");
  147.     }
  148.  
  149.     @Override
  150.     public void readFromNBT(NBTTagCompound compound) {
  151.         super.readFromNBT(compound);
  152.         this.handler.deserializeNBT(compound.getCompoundTag("Inventory"));
  153.         this.burnTime = compound.getInteger("BurnTime");
  154.         this.cookTime = compound.getInteger("CookTime");
  155.         this.totalCookTime = compound.getInteger("CookTimeTotal");
  156.         this.currentBurnTime = getItemBurnTime((ItemStack)this.handler.getStackInSlot(2));
  157.  
  158.         if(compound.hasKey("CustomName", 8)) this.setCustomName(compound.getString("CustomName"));
  159.     }
  160.  
  161.     @Override
  162.     public NBTTagCompound writeToNBT(NBTTagCompound compound) {
  163.         super.writeToNBT(compound);
  164.         compound.setInteger("BurnTime", (short)this.burnTime);
  165.         compound.setInteger("CookTime", (short)this.cookTime);
  166.         compound.setInteger("CookTimeTotal", (short)this.totalCookTime);
  167.         compound.setTag("Inventory", this.handler.serializeNBT());
  168.  
  169.         if(this.hasCustomName()) compound.setString("CustomName", this.customName);
  170.         return compound;
  171.     }
  172.  
  173.     public boolean isBurning() {
  174.         return this.burnTime > 0;
  175.     }
  176.  
  177.     @SideOnly(Side.CLIENT)
  178.     public static boolean isBurning(TileEntityArcFurnace te) {
  179.         return te.getField(0) > 0;
  180.     }
  181.  
  182.     public void update() {
  183.         if(this.isBurning()) {
  184.             --this.burnTime;
  185.             MachineArcFurnace.setState(true, world, pos);
  186.         }
  187.  
  188.         ItemStack[] inputs = new ItemStack[] {handler.getStackInSlot(0), handler.getStackInSlot(1)};
  189.         ItemStack fuel = this.handler.getStackInSlot(2);
  190.  
  191.         if(this.isBurning() || !fuel.isEmpty() && !this.handler.getStackInSlot(0).isEmpty() || this.handler.getStackInSlot(1).isEmpty()) {
  192.             if(!this.isBurning() && this.canSmelt()) {
  193.                 this.burnTime = getItemBurnTime(fuel);
  194.                 this.currentBurnTime = burnTime;
  195.  
  196.                 if(this.isBurning() && !fuel.isEmpty()) {
  197.                     Item item = fuel.getItem();
  198.                     fuel.shrink(1);
  199.  
  200.                     if(fuel.isEmpty()) {
  201.                         ItemStack item1 = item.getContainerItem(fuel);
  202.                         this.handler.setStackInSlot(2, item1);
  203.                     }
  204.                 }
  205.             }
  206.         }
  207.  
  208.         if(this.isBurning() && this.canSmelt() && cookTime > 0) {
  209.             cookTime++;
  210.             if(cookTime == totalCookTime) {
  211.                 if(handler.getStackInSlot(3).getCount() > 0) {
  212.                     handler.getStackInSlot(3).grow(1);
  213.                 }
  214.                 else {
  215.                     handler.insertItem(3, smelting, false);
  216.                 }
  217.  
  218.                 smelting = ItemStack.EMPTY;
  219.                 cookTime = 0;
  220.                 return;
  221.             }
  222.         }
  223.         else {
  224.             if(this.canSmelt() && this.isBurning()) {
  225.                 ItemStack output = RecipeArcFurnace.getInstance().getResult(inputs[0], inputs[1]);
  226.                 if(!output.isEmpty()) {
  227.                     smelting = output;
  228.                     cookTime++;
  229.                     inputs[0].shrink(1);
  230.                     inputs[1].shrink(1);
  231.                     handler.setStackInSlot(0, inputs[0]);
  232.                     handler.setStackInSlot(1, inputs[1]);
  233.                 }
  234.             }
  235.         }
  236.     }
  237.  
  238.     private boolean canSmelt() {
  239.         if(((ItemStack)this.handler.getStackInSlot(0)).isEmpty() || ((ItemStack)this.handler.getStackInSlot(1)).isEmpty()) return false;
  240.         else {
  241.             ItemStack result = RecipeArcFurnace.getInstance().getResult((ItemStack)this.handler.getStackInSlot(0), (ItemStack)this.handler.getStackInSlot(1));
  242.             if(result.isEmpty()) return false;
  243.             else {
  244.                 ItemStack output = (ItemStack)this.handler.getStackInSlot(3);
  245.                 if(output.isEmpty()) return true;
  246.                 if(!output.isItemEqual(result)) return false;
  247.                 int res = output.getCount() + result.getCount();
  248.                 return res <= 64 && res <= output.getMaxStackSize();
  249.             }
  250.         }
  251.     }
  252.  
  253.     public static int getItemBurnTime(ItemStack fuel) {
  254.         if(fuel.isEmpty()) return 0;
  255.         else {
  256.             Item item = fuel.getItem();
  257.  
  258.             if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.AIR) {
  259.                 Block block = Block.getBlockFromItem(item);
  260.  
  261.                 if (block == Blocks.WOODEN_SLAB) return 150;
  262.                 if (block.getDefaultState().getMaterial() == Material.WOOD) return 300;
  263.                 if (block == Blocks.COAL_BLOCK) return 16000;
  264.             }
  265.  
  266.             if (item instanceof ItemTool && "WOOD".equals(((ItemTool)item).getToolMaterialName())) return 200;
  267.             if (item instanceof ItemSword && "WOOD".equals(((ItemSword)item).getToolMaterialName())) return 200;
  268.             if (item instanceof ItemHoe && "WOOD".equals(((ItemHoe)item).getMaterialName())) return 200;
  269.             if (item == Items.STICK) return 100;
  270.             if (item == Items.COAL) return 1600;
  271.             if (item == Items.LAVA_BUCKET) return 20000;
  272.             if (item == Item.getItemFromBlock(Blocks.SAPLING)) return 100;
  273.             if (item == Items.BLAZE_ROD) return 2400;
  274.  
  275.             return GameRegistry.getFuelValue(fuel);
  276.         }
  277.     }
  278.  
  279.     public static boolean isItemFuel(ItemStack fuel) {
  280.         return getItemBurnTime(fuel) > 0;
  281.     }
  282.  
  283.     public boolean isUsableByPlayer(EntityPlayer player) {
  284.         return this.world.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
  285.     }
  286.  
  287.     public int getField(int id) {
  288.         switch(id) {
  289.             case 0:
  290.                 return this.burnTime;
  291.             case 1:
  292.                 return this.currentBurnTime;
  293.             case 2:
  294.                 return this.cookTime;
  295.             case 3:
  296.                 return this.totalCookTime;
  297.             default:
  298.                 return 0;
  299.         }
  300.     }
  301.  
  302.     public void setField(int id, int value) {
  303.         switch(id)
  304.         {
  305.             case 0:
  306.                 this.burnTime = value;
  307.                 break;
  308.             case 1:
  309.                 this.currentBurnTime = value;
  310.                 break;
  311.             case 2:
  312.                 this.cookTime = value;
  313.                 break;
  314.             case 3:
  315.                 this.totalCookTime = value;
  316.         }
  317.     }
  318. }
  319.  
  320. //Error + Stacktrace
  321. [22:04:14] [Server thread/FATAL] [minecraft/MinecraftServer]: Error executing task
  322. java.util.concurrent.ExecutionException: java.lang.RuntimeException: Slot 4 not in valid range - [0,4)
  323.     at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_181]
  324.     at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_181]
  325.     at net.minecraft.util.Util.runTask(Util.java:54) [Util.class:?]
  326.     at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:798) [MinecraftServer.class:?]
  327.     at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743) [MinecraftServer.class:?]
  328.     at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) [IntegratedServer.class:?]
  329.     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592) [MinecraftServer.class:?]
  330.     at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
  331. Caused by: java.lang.RuntimeException: Slot 4 not in valid range - [0,4)
  332.     at net.minecraftforge.items.ItemStackHandler.validateSlotIndex(ItemStackHandler.java:214) ~[ItemStackHandler.class:?]
  333.     at net.minecraftforge.items.ItemStackHandler.getStackInSlot(ItemStackHandler.java:73) ~[ItemStackHandler.class:?]
  334.     at net.minecraftforge.items.SlotItemHandler.getStack(SlotItemHandler.java:79) ~[SlotItemHandler.class:?]
  335.     at net.minecraft.inventory.Container.getInventory(Container.java:75) ~[Container.class:?]
  336.     at net.minecraft.inventory.Container.addListener(Container.java:61) ~[Container.class:?]
  337.     at net.minecraftforge.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:101) ~[FMLNetworkHandler.class:?]
  338.     at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2809) ~[EntityPlayer.class:?]
  339.     at exokem.exkva.objects.machines.MachineArcFurnace.onBlockActivated(MachineArcFurnace.java:55) ~[MachineArcFurnace.class:?]
  340.     at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:475) ~[PlayerInteractionManager.class:?]
  341.     at net.minecraft.network.NetHandlerPlayServer.processTryUseItemOnBlock(NetHandlerPlayServer.java:769) ~[NetHandlerPlayServer.class:?]
  342.     at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) ~[CPacketPlayerTryUseItemOnBlock.class:?]
  343.     at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) ~[CPacketPlayerTryUseItemOnBlock.class:?]
  344.     at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?]
  345.     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_181]
  346.     at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_181]
  347.     at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
  348.     ... 5 more
  349. [22:04:14] [Server thread/ERROR] [minecraft/MinecraftServer]: Encountered an unexpected exception
  350. net.minecraft.util.ReportedException: Ticking player
  351.     at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:848) ~[MinecraftServer.class:?]
  352.     at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743) ~[MinecraftServer.class:?]
  353.     at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) ~[IntegratedServer.class:?]
  354.     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592) [MinecraftServer.class:?]
  355.     at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
  356. Caused by: java.lang.RuntimeException: Slot 4 not in valid range - [0,4)
  357.     at net.minecraftforge.items.ItemStackHandler.validateSlotIndex(ItemStackHandler.java:214) ~[ItemStackHandler.class:?]
  358.     at net.minecraftforge.items.ItemStackHandler.getStackInSlot(ItemStackHandler.java:73) ~[ItemStackHandler.class:?]
  359.     at net.minecraftforge.items.SlotItemHandler.getStack(SlotItemHandler.java:79) ~[SlotItemHandler.class:?]
  360.     at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:97) ~[Container.class:?]
  361.     at exokem.exkva.objects.containers.ContainerArcFurnace.detectAndSendChanges(ContainerArcFurnace.java:44) ~[ContainerArcFurnace.class:?]
  362.     at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:365) ~[EntityPlayerMP.class:?]
  363.     at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2171) ~[World.class:?]
  364.     at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:871) ~[WorldServer.class:?]
  365.     at net.minecraft.world.World.updateEntity(World.java:2130) ~[World.class:?]
  366.     at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:672) ~[WorldServer.class:?]
  367.     at net.minecraft.world.World.updateEntities(World.java:1906) ~[World.class:?]
  368.     at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:643) ~[WorldServer.class:?]
  369.     at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:842) ~[MinecraftServer.class:?]
  370.     ... 4 more
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement