TileEntityCampFire.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package me.km.blocks.campfire;
  2. import java.util.Arrays;
  3. import me.km.blocks.ModBlocks;
  4. import me.km.inventory.ContainerCampFire;
  5. import net.minecraft.entity.player.EntityPlayer;
  6. import net.minecraft.entity.player.InventoryPlayer;
  7. import net.minecraft.init.Items;
  8. import net.minecraft.inventory.Container;
  9. import net.minecraft.inventory.ItemStackHelper;
  10. import net.minecraft.item.Item;
  11. import net.minecraft.item.ItemStack;
  12. import net.minecraft.nbt.NBTTagCompound;
  13. import net.minecraft.tileentity.TileEntityLockable;
  14. import net.minecraft.util.ITickable;
  15. import net.minecraft.util.NonNullList;
  16. public class TileEntityCampFire extends TileEntityLockable implements ITickable
  17. {
  18. private NonNullList<ItemStack> stacks = NonNullList.<ItemStack>withSize(6, ItemStack.EMPTY);
  19. private int burnTime;
  20. /** The number of ticks that a fresh copy of the currently-burning item would keep the furnace burning for */
  21. private int[] cookTime;
  22. private String furnaceCustomName;
  23. public TileEntityCampFire()
  24. {
  25. this.cookTime = new int[3];
  26. Arrays.fill(this.cookTime, 0);
  27. this.furnaceCustomName = null;
  28. this.burnTime = 9600;
  29. }
  30. @Override
  31. public int getSizeInventory()
  32. {
  33. return this.stacks.size();
  34. }
  35. @Override
  36. public boolean isEmpty()
  37. {
  38. return !this.stacks.stream().anyMatch(stack -> !stack.isEmpty());
  39. }
  40. @Override
  41. public ItemStack getStackInSlot(int index)
  42. {
  43. return this.stacks.get(index);
  44. }
  45. @Override
  46. public ItemStack decrStackSize(int index, int count)
  47. {
  48. return ItemStackHelper.getAndSplit(this.stacks, index, count);
  49. }
  50. @Override
  51. public ItemStack removeStackFromSlot(int index)
  52. {
  53. return ItemStackHelper.getAndRemove(this.stacks, index);
  54. }
  55. @Override
  56. public void setInventorySlotContents(int index, ItemStack stack)
  57. {
  58. ItemStack itemstack = this.stacks.get(index);
  59. boolean flag = !stack.isEmpty() && stack.isItemEqual(itemstack) && ItemStack.areItemStackTagsEqual(stack, itemstack);
  60. this.stacks.set(index, stack);
  61. if(stack.getCount() > this.getInventoryStackLimit())
  62. {
  63. stack.setCount(this.getInventoryStackLimit());
  64. }
  65. if(index >= 0 && index <= 2 && !flag)
  66. {
  67. this.cookTime[index] = 0;
  68. this.markDirty();
  69. }
  70. }
  71. @Override
  72. public String getName()
  73. {
  74. return this.hasCustomName() ? this.furnaceCustomName : "container.campfire";
  75. }
  76. @Override
  77. public boolean hasCustomName()
  78. {
  79. return this.furnaceCustomName != null && !this.furnaceCustomName.isEmpty();
  80. }
  81. public void setCustomInventoryName(String name)
  82. {
  83. this.furnaceCustomName = name;
  84. }
  85. @Override
  86. public void readFromNBT(NBTTagCompound com)
  87. {
  88. super.readFromNBT(com);
  89. this.stacks = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
  90. ItemStackHelper.loadAllItems(com, this.stacks);
  91. this.burnTime = com.getInteger("BurnTime");
  92. this.cookTime = com.getIntArray("CookTime");
  93. if(com.hasKey("CustomName", 8))
  94. {
  95. this.furnaceCustomName = com.getString("CustomName");
  96. }
  97. }
  98. @Override
  99. public NBTTagCompound writeToNBT(NBTTagCompound compound)
  100. {
  101. super.writeToNBT(compound);
  102. compound.setInteger("BurnTime", this.burnTime);
  103. compound.setIntArray("CookTime", this.cookTime);
  104. ItemStackHelper.saveAllItems(compound, this.stacks);
  105. if(this.hasCustomName())
  106. {
  107. compound.setString("CustomName", this.furnaceCustomName);
  108. }
  109. return compound;
  110. }
  111. @Override
  112. public int getInventoryStackLimit()
  113. {
  114. return 64;
  115. }
  116. public boolean isBurning()
  117. {
  118. return this.burnTime > 0;
  119. }
  120. @Override
  121. public void update()
  122. {
  123. if(!this.world.isRemote)
  124. {
  125. boolean update = false;
  126. for(int i = 0; i < 3; i++)
  127. {
  128. ItemStack input = stacks.get(i);
  129. if(!input.isEmpty())
  130. {
  131. ItemStack output = stacks.get(i + 3);
  132. if(output.getCount() >= output.getMaxStackSize())
  133. {
  134. continue;
  135. }
  136. ItemStack result = getResult(input);
  137. if(result == ItemStack.EMPTY)
  138. {
  139. continue;
  140. }
  141. boolean empty = output.isEmpty();
  142. if(empty || output.isItemEqual(result))
  143. {
  144. this.cookTime[i]++;
  145. this.burnTime--;
  146. if(this.cookTime[i] >= 200)
  147. {
  148. this.cookTime[i] = 0;
  149. input.shrink(1);
  150. if(empty)
  151. {
  152. output = result;
  153. stacks.set(i + 3, output);
  154. }
  155. else
  156. {
  157. output.grow(1);
  158. }
  159. update = true;
  160. }
  161. }
  162. }
  163. }
  164. if(this.burnTime < 0)
  165. {
  166. world.setBlockState(pos, ModBlocks.campFireBurnt.getDefaultState());
  167. }
  168. if(update)
  169. {
  170. this.markDirty();
  171. }
  172. }
  173. }
  174. public ItemStack getResult(ItemStack stack)
  175. {
  176. Item item = stack.getItem();
  177. Item result = null;
  178. int dv = 0;
  179. if(item == Items.PORKCHOP)
  180. {
  181. result = Items.COOKED_PORKCHOP;
  182. }
  183. else if(item == Items.BEEF)
  184. {
  185. result = Items.COOKED_BEEF;
  186. }
  187. else if(item == Items.CHICKEN)
  188. {
  189. result = Items.COOKED_CHICKEN;
  190. }
  191. else if(item == Items.FISH)
  192. {
  193. result = Items.COOKED_FISH;
  194. dv = stack.getItemDamage();
  195. }
  196. else if(item == Items.POTATO)
  197. {
  198. result = Items.BAKED_POTATO;
  199. }
  200. else if(item == Items.MUTTON)
  201. {
  202. result = Items.COOKED_MUTTON;
  203. }
  204. else if(item == Items.RABBIT)
  205. {
  206. result = Items.COOKED_RABBIT;
  207. }
  208. if(result != null)
  209. {
  210. return new ItemStack(result, 1, dv);
  211. }
  212. return ItemStack.EMPTY;
  213. }
  214. @Override
  215. public boolean isUsableByPlayer(EntityPlayer p)
  216. {
  217. if(this.world.getTileEntity(this.pos) != this)
  218. {
  219. return false;
  220. }
  221. else
  222. {
  223. return p.getDistanceSq(pos.getX() + 0.5d, pos.getY() + 0.5d, pos.getZ() + 0.5d) <= 64.0D;
  224. }
  225. }
  226. @Override
  227. public void openInventory(EntityPlayer player)
  228. {
  229. }
  230. @Override
  231. public void closeInventory(EntityPlayer player)
  232. {
  233. }
  234. @Override
  235. public boolean isItemValidForSlot(int index, ItemStack stack)
  236. {
  237. return false;
  238. }
  239. @Override
  240. public String getGuiID()
  241. {
  242. return "km:campfire";
  243. }
  244. @Override
  245. public Container createContainer(InventoryPlayer pInv, EntityPlayer p)
  246. {
  247. return new ContainerCampFire(pInv, this);
  248. }
  249. @Override
  250. public int getField(int id)
  251. {
  252. return this.cookTime[id];
  253. }
  254. @Override
  255. public void setField(int id, int value)
  256. {
  257. this.cookTime[id] = value;
  258. }
  259. @Override
  260. public int getFieldCount()
  261. {
  262. return 3;
  263. }
  264. @Override
  265. public void clear()
  266. {
  267. this.stacks.clear();
  268. }
  269. }