BlackSpark644

TilePowerBank.scala

May 16th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 4.60 KB | None | 0 0
  1. package me.jonak.upower.block.tileentities
  2.  
  3. import me.jonak.upower.traits.{TraitTilePowerAcceptor, TraitTilePowerOutputter}
  4. import net.minecraft.block.state.IBlockState
  5. import net.minecraft.nbt.NBTTagCompound
  6. import net.minecraft.network.NetworkManager
  7. import net.minecraft.network.play.server.SPacketUpdateTileEntity
  8. import net.minecraft.tileentity.TileEntity
  9. import net.minecraft.util.ITickable
  10. import net.minecraft.util.math.BlockPos
  11. import net.minecraft.world.World
  12.  
  13. /**
  14.   * Created by jonak on 5/11/2016.
  15.   */
  16.  
  17. object TilePowerBank
  18. {
  19.     def getPercentTen(maxPower: Long, currentPower: Long): Integer = Integer.valueOf(Math.floor(currentPower.asInstanceOf[Double] / maxPower.asInstanceOf[Double] * 10).asInstanceOf[Int])
  20. }
  21.  
  22. class TilePowerBank(initialPower: Long = 0, maxPowerInit: Long = 0, maxOutputInit: Long = 0)
  23.     extends TileEntity with TraitTilePowerAcceptor with TraitTilePowerOutputter with ITickable
  24. {
  25.     import TilePowerBank._
  26.  
  27.     def this() {
  28.         this(0,0,0)
  29.     }
  30.  
  31.     override protected var powerContained = initialPower
  32.     override protected var currentOutput = maxOutputInit
  33.     override protected var maxOutput = maxOutputInit
  34.     override protected var maxPower = maxPowerInit
  35.     //TODO: I/O sides
  36.  
  37.     /**
  38.       * Simple tick counter for [[me.jonak.upower.block.tileentities.TilePowerBank.update()]]
  39.       */
  40.     private var tick: Int = 0
  41.  
  42.     override def usePower(powerRequested: Long): Long =
  43.     {
  44.         // Uses a certain amount of power and returns the power given out.
  45.         var powerGiven = powerRequested // Defines the amount of power that actually leaves the bank
  46.         if (powerRequested > maxOutput)
  47.             powerGiven = maxOutput
  48.         if (powerContained - powerRequested < 0)
  49.             powerGiven = powerContained
  50.  
  51.         powerContained -= powerGiven
  52.  
  53.         return powerGiven // TODO: Check if power requested is more than maxOutput or powerContained and do something with that.
  54.     }
  55.  
  56.  
  57.     override def addPower(powerReceived: Long): Long =
  58.     {
  59.         // Adds a certain amount of power and returns the power taken.
  60.         var powerTaken = powerReceived // Defines the amount of power that the bank actually takes.
  61.  
  62.         val currentPower = powerContained
  63.  
  64.         if (powerContained + powerReceived > getMaxPower)
  65.         {
  66.             powerTaken = getMaxPower - powerContained // powerReceived - ((getPowerContained + powerReceived) - getMaxPower)
  67.         }
  68.  
  69.         powerContained += powerTaken
  70.  
  71.         markDirty()
  72.  
  73.         val currentState = worldObj.getBlockState(getPos)
  74.  
  75.         val currentPercentTen = getPercentTen(maxPower, currentPower)
  76.         val newPercentTen = getPercentTen(maxPower, powerContained)
  77.         if(currentPercentTen.compareTo(newPercentTen) != 0)
  78.         {
  79.             worldObj.notifyBlockUpdate(
  80.                 getPos,
  81.                 currentState,
  82.                 currentState
  83.                     .getBlock
  84.                     .getActualState(
  85.                         currentState,
  86.                         worldObj,
  87.                         getPos
  88.                     ),
  89.                 16
  90.             )
  91.             worldObj.setBlockState(
  92.                 getPos,
  93.                 currentState
  94.                     .getBlock
  95.                     .getActualState(
  96.                         currentState,
  97.                         worldObj,
  98.                         getPos
  99.                     ),
  100.                 16
  101.             )
  102.         }
  103.  
  104.         println("NEW POWER = " + powerContained)
  105.  
  106.         return powerTaken // TODO: Check if power added exceeds maxPower and deal with that.
  107.     }
  108.  
  109.     //TODO: Functions invoked by GUI elements for raising/lowering output, etc
  110.     //TODO: Functions for I/O sides
  111.  
  112.     override def readFromNBT(tag: NBTTagCompound): Unit =
  113.     {
  114.         // Reads data from NBT to the variables.
  115.         super.readFromNBT(tag)
  116.         maxPower = tag.getLong("maxPower")
  117.         maxOutput = tag.getLong("maxOutput")
  118.         powerContained = tag.getLong("currentPower")
  119.         currentOutput = tag.getLong("currentOutput")
  120.     }
  121.  
  122.     override def writeToNBT(tag: NBTTagCompound): Unit =
  123.     {
  124.         // Reads data from the variables to NBT
  125.         tag.setLong("maxPower", maxPower)
  126.         tag.setLong("maxOutput", maxOutput)
  127.         tag.setDouble("currentPower", powerContained)
  128.         tag.setLong("currentOutput", currentOutput)
  129.         super.writeToNBT(tag)
  130.     }
  131.  
  132.     override def shouldRefresh(world: World, pos: BlockPos, oldState: IBlockState, newState: IBlockState): Boolean =
  133.     {
  134.         // Checks if the tile should be recreated
  135.         oldState.getBlock != newState.getBlock
  136.     }
  137.  
  138.     override def getDescriptionPacket: SPacketUpdateTileEntity =
  139.     {
  140.         // Sends an update packet to the client
  141.         val tag: NBTTagCompound = new NBTTagCompound
  142.         writeToNBT(tag)
  143.         println("SERVER -- Data sent")
  144.         new SPacketUpdateTileEntity(pos, 1, tag)
  145.     }
  146.  
  147.     override def onDataPacket(net: NetworkManager, packet: SPacketUpdateTileEntity): Unit =
  148.     {
  149.         println("CLIENT -- Data recieved")
  150.         readFromNBT(packet.getNbtCompound)
  151.     }
  152.  
  153.     override def update(): Unit =
  154.     {
  155.         if(!worldObj.isRemote)
  156.         {
  157.             tick += 1
  158.             if (tick > 2)
  159.             {
  160.                 addPower(1L) //TODO: Remove this (testing only)
  161.                 tick = 0
  162.             }
  163.         }
  164.     }
  165. }
Add Comment
Please, Sign In to add comment