blob: 35afed39f3b76c06164080e9513c10ee021517e7 [file] [log] [blame] [raw]
package li.cil.oc.server.component
import li.cil.oc.Settings
import li.cil.oc.api.{Rotatable, Network}
import li.cil.oc.api.network._
import li.cil.oc.common.component.ManagedComponent
import li.cil.oc.util.ExtendedNBT._
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.tileentity.TileEntity
import net.minecraft.item.{Item, ItemMap, ItemStack}
class UpgradeNavigation(val owner: TileEntity) extends ManagedComponent {
val node = Network.newNode(this, Visibility.Network).
withComponent("navigation", Visibility.Neighbors).
create()
var map = new ItemStack(Item.map)
// ----------------------------------------------------------------------- //
@Callback(doc = """function():number, number, number -- Get the current relative position of the robot.""")
def getPosition(context: Context, args: Arguments): Array[AnyRef] = {
val info = extractInfo()
val size = 128 * (1 << info.scale)
val x = owner.xCoord
val y = owner.yCoord
val z = owner.zCoord
val relativeX = x - info.xCenter
val relativeZ = z - info.zCenter
if (math.abs(relativeX) <= size / 2 && math.abs(relativeZ) <= size / 2)
result(relativeX, y, relativeZ)
else
result(Unit, "out of range")
}
@Callback(doc = """function():number -- Get the current orientation of the robot.""")
def getFacing(context: Context, args: Arguments): Array[AnyRef] = {
owner match {
case rotatable: Rotatable => result(rotatable.facing.ordinal)
case _ => throw new Exception("illegal state")
}
}
@Callback(doc = """function():number -- Get the operational range of the navigation upgrade.""")
def getRange(context: Context, args: Arguments): Array[AnyRef] = {
val info = extractInfo()
val size = 128 * (1 << info.scale)
result(size / 2)
}
protected def extractInfo() = try map.getItem.asInstanceOf[ItemMap].getMapData(map, owner.getWorldObj) catch {
case _: Throwable => throw new Exception("invalid map")
}
// ----------------------------------------------------------------------- //
override def load(nbt: NBTTagCompound) {
super.load(nbt)
if (nbt.hasKey(Settings.namespace + "map")) {
map = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Settings.namespace + "map"))
}
}
override def save(nbt: NBTTagCompound) {
super.save(nbt)
if (map != null) {
nbt.setNewCompoundTag(Settings.namespace + "map", map.writeToNBT)
}
}
}