immibis

Untitled

Oct 19th, 2013
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.54 KB | None | 0 0
  1. package mods.immibis.infinitubes;
  2.  
  3. import buildcraft.api.power.IPowerReceptor;
  4. import buildcraft.api.power.PowerHandler;
  5. import buildcraft.api.power.PowerHandler.PowerReceiver;
  6. import ic2.api.energy.event.EnergyTileLoadEvent;
  7. import ic2.api.energy.event.EnergyTileUnloadEvent;
  8. import ic2.api.energy.tile.IEnergySink;
  9. import mods.immibis.core.api.MultiInterfaceClass;
  10. import mods.immibis.core.api.MultiInterfaceClass.Interface;
  11. import net.minecraft.nbt.NBTTagCompound;
  12. import net.minecraft.tileentity.TileEntity;
  13. import net.minecraft.world.World;
  14. import net.minecraftforge.common.ForgeDirection;
  15. import net.minecraftforge.common.MinecraftForge;
  16.  
  17. @MultiInterfaceClass(
  18. base = "mods.immibis.infinitubes.PowerJunctionTileBase",
  19. interfaces = {
  20. @Interface(check="buildcraft.api.power.IPowerReceptor", impl="mods.immibis.infinitubes.PowerJunctionTile$BCImpl"),
  21. @Interface(check="ic2.api.energy.tile.IEnergySink", impl="mods.immibis.infinitubes.PowerJunctionTile$ICImpl")
  22. }
  23. )
  24. public class PowerJunctionTile extends PowerJunctionTileBase {
  25.  
  26. public static class BCImpl extends PowerJunctionTileBase implements IPowerReceptor {
  27.  
  28. private static final float RATIO = 0.8f; // MJ per item
  29. private static final int MAX_RATE = 200; // maximum input in MJ/t
  30.  
  31. private PowerHandler provider;
  32.  
  33. public BCImpl() {
  34. provider = new PowerHandler(this, PowerHandler.Type.MACHINE);
  35. provider.configure(1, MAX_RATE, (int)Math.max(RATIO, 1), (int)(6400*Math.max(RATIO, 1)));
  36. provider.configurePowerPerdition(0, 0);
  37. }
  38.  
  39. @Override
  40. public void doWork(PowerHandler workProvider) {
  41. int items = (int)(workProvider.getEnergyStored() / RATIO);
  42. //System.out.println("a "+items);
  43. if(items <= 0)
  44. return;
  45.  
  46. WorldTubeMap.TubeNet net = getNet();
  47. if(net == null)
  48. return;
  49.  
  50. items = Math.min(items, net.maxStoredPower() - net.storedPower);
  51. //System.out.println("b "+items);
  52. if(items <= 0)
  53. return;
  54.  
  55. items = (int)(workProvider.useEnergy(RATIO, items * RATIO, true) / RATIO);
  56. //System.out.println("c "+items);
  57. if(items <= 0)
  58. return;
  59.  
  60. net.storedPower += items;
  61. WorldTubeMap.getForWorld(worldObj).setDirty(true);
  62. }
  63.  
  64. @Override
  65. public PowerReceiver getPowerReceiver(ForgeDirection side) {
  66. return provider.getPowerReceiver();
  67. }
  68.  
  69. @Override
  70. public World getWorld() {
  71. return worldObj;
  72. }
  73.  
  74. @Override
  75. public void updateEntity() {
  76. super.updateEntity();
  77.  
  78. if(provider != null)
  79. provider.update();
  80. }
  81.  
  82. }
  83.  
  84. public static class ICImpl extends PowerJunctionTileBase implements IEnergySink {
  85.  
  86. private boolean addedToEnet = false;
  87.  
  88. private int RATIO = 2; // EU per item
  89. private int MAX_STORED = 2048; // max internal storage (not tubenet storage); also max transferred/tick
  90. private int storedEU = 0;
  91.  
  92. @Override
  93. public void readFromNBT(NBTTagCompound tag) {
  94. super.readFromNBT(tag);
  95. storedEU = tag.getInteger("storedEU");
  96. }
  97.  
  98. @Override
  99. public void writeToNBT(NBTTagCompound tag) {
  100. super.writeToNBT(tag);
  101. tag.setInteger("storedEU", storedEU);
  102. }
  103.  
  104. @Override
  105. public void invalidate() {
  106. super.invalidate();
  107. if(addedToEnet) {
  108. MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this));
  109. addedToEnet = false;
  110. }
  111. }
  112.  
  113. @Override
  114. public void onChunkUnload() {
  115. super.onChunkUnload();
  116. if(addedToEnet) {
  117. MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this));
  118. addedToEnet = false;
  119. }
  120. }
  121.  
  122. @Override
  123. public void updateEntity() {
  124. if(!addedToEnet && !worldObj.isRemote) {
  125. MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this));
  126. addedToEnet = true;
  127. }
  128. super.updateEntity();
  129.  
  130. if(storedEU > 0) {
  131. WorldTubeMap.TubeNet net = getNet();
  132. if(net != null) {
  133. int maxAdded = Math.min(net.maxStoredPower() - net.storedPower, storedEU / RATIO);
  134. if(maxAdded > 0) {
  135. storedEU -= maxAdded * RATIO;
  136. net.storedPower += maxAdded;
  137. WorldTubeMap.getForWorld(worldObj).setDirty(true);
  138. }
  139. }
  140. }
  141. }
  142.  
  143. @Override
  144. public boolean acceptsEnergyFrom(TileEntity arg0, ForgeDirection arg1) {
  145. return true;
  146. }
  147.  
  148. @Override
  149. public double demandedEnergyUnits() {
  150. return MAX_STORED - storedEU;
  151. }
  152.  
  153. @Override
  154. public double injectEnergyUnits(ForgeDirection arg0, double arg1) {
  155. if(storedEU >= MAX_STORED)
  156. return arg1;
  157. storedEU += (int)arg1;
  158. return arg1 - (int)arg1;
  159. }
  160.  
  161. @Override
  162. public int getMaxSafeInput() {
  163. return Integer.MAX_VALUE;
  164. }
  165.  
  166. }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment