blob: adb30e230547cfb561418c187d4fd82083534c50 [file] [log] [blame] [raw]
package li.cil.oc.server.component
import li.cil.oc.Settings
import li.cil.oc.api.Network
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._
import li.cil.oc.api.prefab
import net.minecraft.nbt.NBTTagCompound
class EEPROM extends prefab.ManagedEnvironment {
override val node = Network.newNode(this, Visibility.Network).
withComponent("eeprom", Visibility.Network).
withConnector().
create()
var data = Array.empty[Byte]
var label = "EEPROM"
// ----------------------------------------------------------------------- //
@Callback(direct = true, doc = """function():string -- Get the currently stored byte array.""")
def get(context: Context, args: Arguments): Array[AnyRef] = result(data)
@Callback(doc = """function(data:string) -- Overwrite the currently stored byte array.""")
def set(context: Context, args: Arguments): Array[AnyRef] = {
if (!node.tryChangeBuffer(-Settings.get.eepromWriteCost)) {
return result(Unit, "not enough energy")
}
val newData = args.checkByteArray(0)
if (newData.length > 4 * 1024) throw new IllegalArgumentException("not enough space")
data = newData
context.pause(2) // deliberately slow to discourage use as normal storage medium
null
}
@Callback(direct = true, doc = """function():string -- Get the label of the EEPROM.""")
def getLabel(context: Context, args: Arguments): Array[AnyRef] = result(label)
@Callback(doc = """function(data:string) -- Set the label of the EEPROM.""")
def setLabel(context: Context, args: Arguments): Array[AnyRef] = {
label = args.checkString(0).take(16)
null
}
// ----------------------------------------------------------------------- //
override def load(nbt: NBTTagCompound) {
super.load(nbt)
data = nbt.getByteArray(Settings.namespace + "eeprom")
if (nbt.hasKey(Settings.namespace + "label")) {
label = nbt.getString(Settings.namespace + "label")
}
}
override def save(nbt: NBTTagCompound) {
super.save(nbt)
nbt.setByteArray(Settings.namespace + "eeprom", data)
nbt.setString(Settings.namespace + "label", label)
}
}