Advertisement
Guest User

TileEntity

a guest
Mar 7th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.62 KB | None | 0 0
  1. package net.asdfowkw.tech.blocks.windgenerator;
  2.  
  3. import net.asdfowkw.tech.common.EnergyBuffer;
  4. import net.minecraft.entity.player.EntityPlayer;
  5. import net.minecraft.nbt.NBTTagCompound;
  6. import net.minecraft.tileentity.TileEntity;
  7. import net.minecraft.util.EnumFacing;
  8. import net.minecraft.util.ITickable;
  9. import net.minecraftforge.common.capabilities.Capability;
  10. import net.minecraftforge.common.capabilities.CapabilityInject;
  11. import net.minecraftforge.energy.CapabilityEnergy;
  12. import net.minecraftforge.energy.IEnergyStorage;
  13. import net.minecraftforge.items.CapabilityItemHandler;
  14. import net.minecraftforge.items.ItemStackHandler;
  15.  
  16. import javax.annotation.Nullable;
  17.  
  18. public class TileEntityWindGenerator extends TileEntity implements ITickable {
  19.  
  20. public static final int SLOT_COUNT = 3;
  21. public static final int POWER_LIMIT = 16000;
  22. public static final int POWERGEN = 40;
  23. public static final int POWER_TRANSFER_MAX = 320;
  24.  
  25. @CapabilityInject(IEnergyStorage.class)
  26. public static Capability<IEnergyStorage> ENERGY = null;
  27.  
  28. public EnergyBuffer buffer = new EnergyBuffer(POWER_LIMIT);
  29. private final ItemStackHandler fuelSlot = new ItemStackHandler(SLOT_COUNT);
  30.  
  31. @Override
  32. public void update(){
  33. if (world.isRemote){
  34. return;
  35. }
  36. boolean anyChanged;
  37. anyChanged = generatePower();
  38. anyChanged |= transferPower();
  39. if(anyChanged){
  40. this.markDirty();
  41. }
  42. }
  43.  
  44. public int getPowerLevel(){
  45. return buffer.getEnergyStored();
  46. }
  47.  
  48. private boolean generatePower() {
  49. boolean anyChanged = false;
  50. if (buffer.getEnergyStored() < POWER_LIMIT){
  51. buffer.setEnergy(buffer.getEnergyStored() + POWERGEN);
  52. System.out.println(getPowerLevel());
  53. anyChanged = true;
  54. }
  55. return anyChanged;
  56. }
  57.  
  58. private boolean transferPower() {
  59. boolean anyChanged = false;
  60.  
  61. int sendPower = Math.min(POWER_TRANSFER_MAX, buffer.getEnergyStored());
  62. if(sendPower > 0){
  63. IEnergyStorage[] handlers = new IEnergyStorage[6];
  64. int[] wantedSide = new int[6];
  65. int accepted = 0;
  66. for(EnumFacing neighbor : EnumFacing.VALUES){
  67. TileEntity e = world.getTileEntity(pos.offset(neighbor));
  68. EnumFacing from = neighbor.getOpposite();
  69.  
  70. if(e == null){
  71. continue;
  72. }
  73.  
  74. IEnergyStorage handler = null;
  75. if (e.hasCapability(CapabilityEnergy.ENERGY, from)) {
  76. handler = e.getCapability(CapabilityEnergy.ENERGY, from);
  77. if(!handler.canReceive()){
  78. handler = null;
  79. }
  80. }
  81. if(handler != null){
  82. handlers[from.ordinal()] = handler;
  83. int wanted = handler.receiveEnergy(sendPower, true);
  84. wantedSide[from.ordinal()] = wanted;
  85. accepted += wanted;
  86. }
  87. }
  88.  
  89. if(accepted > 0){
  90. for(EnumFacing from : EnumFacing.VALUES){
  91. IEnergyStorage handler = handlers[from.ordinal()];
  92. int wanted = wantedSide[from.ordinal()];
  93. if(handler == null || wanted == 0){
  94. continue;
  95. }
  96. int given = Math.min(Math.min(buffer.getEnergyStored(), wanted), wanted * accepted / sendPower);
  97. int received = Math.min(given, handler.receiveEnergy(given, false));
  98. buffer.setEnergy(buffer.getEnergyStored() - received);
  99. if(buffer.getEnergyStored() <= 0){
  100. break;
  101. }
  102. }
  103. anyChanged = true;
  104. }
  105. }
  106. return anyChanged;
  107. }
  108.  
  109. //hasCapability is checking if the current block can accept energy from XX face.
  110. @Override
  111. public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
  112. if (capability == ENERGY) {
  113. return true;
  114. }
  115. if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY){
  116. return true;
  117. }
  118. return super.hasCapability(capability, facing);
  119. }
  120.  
  121. @SuppressWarnings("unchecked")
  122. @Override
  123. public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
  124. if (capability == ENERGY){
  125. return (T) buffer;
  126. }
  127. if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY){
  128. return (T) fuelSlot;
  129. }
  130. return super.getCapability(capability, facing);
  131. }
  132.  
  133. @Override
  134. public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
  135. nbt.setTag("storedEnergy", CapabilityEnergy.ENERGY.writeNBT(buffer, null));
  136. //nbt.setTag("ItemStackHandler", this.fuelSlot.serializeNBT());
  137. return super.writeToNBT(nbt);
  138. }
  139.  
  140. @Override
  141. public void readFromNBT(NBTTagCompound nbt) {
  142. CapabilityEnergy.ENERGY.readNBT(buffer, null, nbt.getTag("storedEnergy"));
  143. super.readFromNBT(nbt);
  144. }
  145.  
  146. public boolean isUseableByPlayer(EntityPlayer player) {
  147. return world.getTileEntity(pos) == this
  148. && player.getDistanceSq(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D) <= 64.0D;
  149. }
  150.  
  151. public int[] getFields()
  152. {
  153. return new int[]{buffer.getEnergyStored()};
  154. }
  155.  
  156. public void setFields(int[] values)
  157. {
  158. buffer.setEnergy(values[0]);
  159. }
  160.  
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement