blob: 1de1a27b385356975debeeadf198e78b7e5005fc [file] [log] [blame] [raw]
package li.cil.oc.server.component
import java.util
import li.cil.oc.Constants
import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute
import li.cil.oc.api.driver.DeviceInfo.DeviceClass
import li.cil.oc.Settings
import li.cil.oc.api.Network
import li.cil.oc.api.driver.DeviceInfo
import li.cil.oc.api.machine.Arguments
import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context
import li.cil.oc.api.network.Visibility
import li.cil.oc.api.prefab
import li.cil.oc.common.entity
import li.cil.oc.util.ExtendedArguments._
import li.cil.oc.util.InventoryUtils
import net.minecraft.entity.item.EntityItem
import net.minecraftforge.common.util.ForgeDirection
import scala.collection.convert.WrapAsJava._
class Drone(val agent: entity.Drone) extends prefab.ManagedEnvironment with Agent with DeviceInfo {
override val node = Network.newNode(this, Visibility.Network).
withComponent("drone").
withConnector(Settings.get.bufferDrone).
create()
private final lazy val deviceInfo = Map(
DeviceAttribute.Class -> DeviceClass.System,
DeviceAttribute.Description -> "Drone",
DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor,
DeviceAttribute.Product -> "Overwatcher",
DeviceAttribute.Capacity -> agent.inventorySize.toString
)
override def getDeviceInfo: util.Map[String, String] = deviceInfo
override protected def checkSideForAction(args: Arguments, n: Int) =
args.checkSideAny(n)
override protected def suckableItems(side: ForgeDirection) = entitiesInBlock(position) ++ super.suckableItems(side)
override protected def onSuckCollect(entity: EntityItem) = {
if (InventoryUtils.insertIntoInventory(entity.getEntityItem, inventory, slots = Option(insertionSlots))) {
world.playSoundAtEntity(agent, "random.pop", 0.2f, ((world.rand.nextFloat - world.rand.nextFloat) * 0.7f + 1) * 2)
}
}
override def onWorldInteraction(context: Context, duration: Double): Unit = {
super.onWorldInteraction(context, duration * 2)
}
// ----------------------------------------------------------------------- //
@Callback(doc = "function():string -- Get the status text currently being displayed in the GUI.")
def getStatusText(context: Context, args: Arguments): Array[AnyRef] = result(agent.statusText)
@Callback(doc = "function(value:string):string -- Set the status text to display in the GUI, returns new value.")
def setStatusText(context: Context, args: Arguments): Array[AnyRef] = {
agent.statusText = args.checkString(0)
context.pause(0.1)
result(agent.statusText)
}
@Callback(doc = "function():number -- Get the current color of the flap lights as an integer encoded RGB value (0xRRGGBB).")
def getLightColor(context: Context, args: Arguments): Array[AnyRef] = result(agent.lightColor)
@Callback(doc = "function(value:number):number -- Set the color of the flap lights to the specified integer encoded RGB value (0xRRGGBB).")
def setLightColor(context: Context, args: Arguments): Array[AnyRef] = {
agent.lightColor = args.checkInteger(0)
context.pause(0.1)
result(agent.lightColor)
}
// ----------------------------------------------------------------------- //
@Callback(doc = "function(dx:number, dy:number, dz:number) -- Change the target position by the specified offset.")
def move(context: Context, args: Arguments): Array[AnyRef] = {
val dx = args.checkDouble(0).toFloat
val dy = args.checkDouble(1).toFloat
val dz = args.checkDouble(2).toFloat
agent.targetX += dx
agent.targetY += dy
agent.targetZ += dz
null
}
@Callback(doc = "function():number -- Get the current distance to the target position.")
def getOffset(context: Context, args: Arguments): Array[AnyRef] =
result(agent.getDistance(agent.targetX, agent.targetY, agent.targetZ))
@Callback(doc = "function():number -- Get the current velocity in m/s.")
def getVelocity(context: Context, args: Arguments): Array[AnyRef] =
result(math.sqrt(agent.motionX * agent.motionX + agent.motionY * agent.motionY + agent.motionZ * agent.motionZ) * 20) // per second
@Callback(doc = "function():number -- Get the maximum velocity, in m/s.")
def getMaxVelocity(context: Context, args: Arguments): Array[AnyRef] = {
result(agent.maxVelocity * 20) // per second
}
@Callback(doc = "function():number -- Get the currently set acceleration.")
def getAcceleration(context: Context, args: Arguments): Array[AnyRef] = {
result(agent.targetAcceleration * 20) // per second
}
@Callback(doc = "function(value:number):number -- Try to set the acceleration to the specified value and return the new acceleration.")
def setAcceleration(context: Context, args: Arguments): Array[AnyRef] = {
agent.targetAcceleration = (args.checkDouble(0) / 20.0).toFloat
result(agent.targetAcceleration * 20)
}
}