mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-08-03 19:17:27 -04:00
Fixed a few compile errors.
This commit is contained in:
parent
4673a8048b
commit
1adb34ab3c
@ -1,5 +1,8 @@
|
|||||||
package li.cil.oc.api.fs;
|
package li.cil.oc.api.fs;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraftforge.common.util.INBTSerializable;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -14,7 +17,7 @@ import java.io.FileNotFoundException;
|
|||||||
* you call any of the functions of a file system directly it is your
|
* you call any of the functions of a file system directly it is your
|
||||||
* responsibility to ensure the path has been cleaned up.
|
* responsibility to ensure the path has been cleaned up.
|
||||||
*/
|
*/
|
||||||
public interface FileSystem extends Persistable {
|
public interface FileSystem extends INBTSerializable<NBTTagCompound> {
|
||||||
/**
|
/**
|
||||||
* Whether this file system is read-only.
|
* Whether this file system is read-only.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
package li.cil.oc.common.capabilities;
|
|
||||||
|
|
||||||
import li.cil.oc.api.network.NodeContainer;
|
|
||||||
import li.cil.oc.api.tileentity.Colored;
|
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
|
||||||
import net.minecraftforge.common.capabilities.CapabilityInject;
|
|
||||||
import net.minecraftforge.common.capabilities.CapabilityManager;
|
|
||||||
|
|
||||||
// Gotta be Java, @CapabilityInject don't werk for Scala ;_;
|
|
||||||
public final class Capabilities {
|
|
||||||
@CapabilityInject(Colored.class)
|
|
||||||
public static Capability<Colored> ColoredCapability;
|
|
||||||
|
|
||||||
@CapabilityInject(NodeContainer.class)
|
|
||||||
public static Capability<NodeContainer> EnvironmentCapability;
|
|
||||||
|
|
||||||
@CapabilityInject(SidedEnvironment.class)
|
|
||||||
public static Capability<SidedEnvironment> SidedEnvironmentCapability;
|
|
||||||
|
|
||||||
public static void init() {
|
|
||||||
CapabilityManager.INSTANCE.register(NodeContainer.class, new CapabilityEnvironment.DefaultStorage(), CapabilityEnvironment.DefaultImpl.class);
|
|
||||||
CapabilityManager.INSTANCE.register(SidedEnvironment.class, new CapabilitySidedEnvironment.DefaultStorage(), CapabilitySidedEnvironment.DefaultImpl.class);
|
|
||||||
CapabilityManager.INSTANCE.register(Colored.class, new CapabilityColored.DefaultStorage(), CapabilityColored.DefaultImpl.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Capabilities() {
|
|
||||||
}
|
|
||||||
}
|
|
@ -12,7 +12,7 @@ import net.minecraftforge.oredict.OreDictionary
|
|||||||
|
|
||||||
trait InventoryAnalytics extends InventoryAware with NetworkAware {
|
trait InventoryAnalytics extends InventoryAware with NetworkAware {
|
||||||
@Callback(doc = """function([slot:number]):table -- Get a description of the stack in the specified slot or the selected slot.""")
|
@Callback(doc = """function([slot:number]):table -- Get a description of the stack in the specified slot or the selected slot.""")
|
||||||
def getStackInInternalSlot(context: Context, args: Arguments): Array[AnyRef] = if (Settings.get.allowItemStackInspection) {
|
def getStackInInternalSlot(context: Context, args: Arguments): Array[AnyRef] = if (Settings.Misc.allowItemStackInspection) {
|
||||||
val slot = optSlot(args, 0)
|
val slot = optSlot(args, 0)
|
||||||
result(inventory.getStackInSlot(slot))
|
result(inventory.getStackInSlot(slot))
|
||||||
}
|
}
|
||||||
|
@ -21,13 +21,13 @@ trait TankInventoryControl extends WorldAware with InventoryAware with TankAware
|
|||||||
withFluidInfo(optSlot(args, 0), (_, capacity) => result(capacity))
|
withFluidInfo(optSlot(args, 0), (_, capacity) => result(capacity))
|
||||||
|
|
||||||
@Callback(doc = """function([slot:number]):table -- Get a description of the fluid in the tank item in the specified slot or the selected slot.""")
|
@Callback(doc = """function([slot:number]):table -- Get a description of the fluid in the tank item in the specified slot or the selected slot.""")
|
||||||
def getFluidInTankInSlot(context: Context, args: Arguments): Array[AnyRef] = if (Settings.get.allowItemStackInspection) {
|
def getFluidInTankInSlot(context: Context, args: Arguments): Array[AnyRef] = if (Settings.Misc.allowItemStackInspection) {
|
||||||
withFluidInfo(optSlot(args, 0), (fluid, _) => result(fluid.orNull))
|
withFluidInfo(optSlot(args, 0), (fluid, _) => result(fluid.orNull))
|
||||||
}
|
}
|
||||||
else result(Unit, "not enabled in config")
|
else result(Unit, "not enabled in config")
|
||||||
|
|
||||||
@Callback(doc = """function([tank:number]):table -- Get a description of the fluid in the tank in the specified slot or the selected slot.""")
|
@Callback(doc = """function([tank:number]):table -- Get a description of the fluid in the tank in the specified slot or the selected slot.""")
|
||||||
def getFluidInInternalTank(context: Context, args: Arguments): Array[AnyRef] = if (Settings.get.allowItemStackInspection) {
|
def getFluidInInternalTank(context: Context, args: Arguments): Array[AnyRef] = if (Settings.Misc.allowItemStackInspection) {
|
||||||
result(Option(tank.getFluidTank(optTank(args, 0))).map(_.getFluid).orNull)
|
result(Option(tank.getFluidTank(optTank(args, 0))).map(_.getFluid).orNull)
|
||||||
}
|
}
|
||||||
else result(Unit, "not enabled in config")
|
else result(Unit, "not enabled in config")
|
||||||
|
@ -70,7 +70,7 @@ trait WorldInventoryAnalytics extends WorldAware with SideRestricted with Networ
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Callback(doc = """function(side:number, slot:number):table -- Get a description of the stack in the inventory on the specified side of the device.""")
|
@Callback(doc = """function(side:number, slot:number):table -- Get a description of the stack in the inventory on the specified side of the device.""")
|
||||||
def getStackInSlot(context: Context, args: Arguments): Array[AnyRef] = if (Settings.get.allowItemStackInspection) {
|
def getStackInSlot(context: Context, args: Arguments): Array[AnyRef] = if (Settings.Misc.allowItemStackInspection) {
|
||||||
val facing = checkSideForAction(args, 0)
|
val facing = checkSideForAction(args, 0)
|
||||||
withInventory(facing, inventory => result(inventory.getStackInSlot(args.checkSlot(inventory, 1))))
|
withInventory(facing, inventory => result(inventory.getStackInSlot(args.checkSlot(inventory, 1))))
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ trait WorldTankAnalytics extends WorldAware with SideRestricted {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Callback(doc = """function(side:number):table -- Get a description of the fluid in the the tank on the specified side.""")
|
@Callback(doc = """function(side:number):table -- Get a description of the fluid in the the tank on the specified side.""")
|
||||||
def getFluidInTank(context: Context, args: Arguments): Array[AnyRef] = if (Settings.get.allowItemStackInspection) {
|
def getFluidInTank(context: Context, args: Arguments): Array[AnyRef] = if (Settings.Misc.allowItemStackInspection) {
|
||||||
val facing = checkSideForAction(args, 0)
|
val facing = checkSideForAction(args, 0)
|
||||||
FluidUtil.fluidHandlerAt(position.offset(facing), facing.getOpposite) match {
|
FluidUtil.fluidHandlerAt(position.offset(facing), facing.getOpposite) match {
|
||||||
case Some(handler) =>
|
case Some(handler) =>
|
||||||
|
@ -12,9 +12,8 @@ import net.minecraft.util.EnumFacing
|
|||||||
import net.minecraft.util.math.BlockPos
|
import net.minecraft.util.math.BlockPos
|
||||||
import net.minecraft.world.World
|
import net.minecraft.world.World
|
||||||
|
|
||||||
// TODO Remove blocks in OC 1.7.
|
|
||||||
class CompoundBlockDriver(val sidedBlocks: Array[DriverBlock]) extends DriverBlock {
|
class CompoundBlockDriver(val sidedBlocks: Array[DriverBlock]) extends DriverBlock {
|
||||||
override def createEnvironment(world: World, pos: BlockPos, side: EnumFacing) = {
|
override def createEnvironment(world: World, pos: BlockPos, side: EnumFacing): CompoundBlockNodeContainer = {
|
||||||
val list = sidedBlocks.map {
|
val list = sidedBlocks.map {
|
||||||
driver => Option(driver.createEnvironment(world, pos, side)) match {
|
driver => Option(driver.createEnvironment(world, pos, side)) match {
|
||||||
case Some(environment) => (driver.getClass.getName, environment)
|
case Some(environment) => (driver.getClass.getName, environment)
|
||||||
@ -25,10 +24,10 @@ class CompoundBlockDriver(val sidedBlocks: Array[DriverBlock]) extends DriverBlo
|
|||||||
else new CompoundBlockNodeContainer(cleanName(tryGetName(world, pos, list.map(_._2))), list: _*)
|
else new CompoundBlockNodeContainer(cleanName(tryGetName(world, pos, list.map(_._2))), list: _*)
|
||||||
}
|
}
|
||||||
|
|
||||||
override def worksWith(world: World, pos: BlockPos, side: EnumFacing) = sidedBlocks.forall(_.worksWith(world, pos, side)) && blocks.forall(_.worksWith(world, pos))
|
override def worksWith(world: World, pos: BlockPos, side: EnumFacing): Boolean = sidedBlocks.forall(_.worksWith(world, pos, side))
|
||||||
|
|
||||||
override def equals(obj: Any) = obj match {
|
override def equals(obj: Any): Boolean = obj match {
|
||||||
case multi: CompoundBlockDriver if multi.sidedBlocks.length == sidedBlocks.length && multi.blocks.length == blocks.length => sidedBlocks.intersect(multi.sidedBlocks).length == sidedBlocks.length && blocks.intersect(multi.blocks).length == blocks.length
|
case multi: CompoundBlockDriver if multi.sidedBlocks.length == sidedBlocks.length && multi.blocks.length == blocks.length => sidedBlocks.intersect(multi.sidedBlocks).length == sidedBlocks.length
|
||||||
case _ => false
|
case _ => false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,14 +6,13 @@ import com.google.common.hash.Hashing
|
|||||||
import li.cil.oc.OpenComputers
|
import li.cil.oc.OpenComputers
|
||||||
import li.cil.oc.api
|
import li.cil.oc.api
|
||||||
import li.cil.oc.api.network._
|
import li.cil.oc.api.network._
|
||||||
import li.cil.oc.util.ExtendedNBT._
|
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
|
||||||
class CompoundBlockNodeContainer(val name: String, val environments: (String, NodeContainerItem)*) extends NodeContainerItem {
|
class CompoundBlockNodeContainer(val name: String, val environments: (String, NodeContainerItem)*) extends NodeContainerItem {
|
||||||
// Block drivers with visibility < network usually won't make much sense,
|
// Block drivers with visibility < network usually won't make much sense,
|
||||||
// but let's play it safe and use the least possible visibility based on
|
// but let's play it safe and use the least possible visibility based on
|
||||||
// the drivers we encapsulate.
|
// the drivers we encapsulate.
|
||||||
val getNode = api.Network.newNode(this, (environments.filter(_._2.getNode != null).map(_._2.getNode.getReachability) ++ Seq(Visibility.NONE)).max).
|
val getNode: ComponentNode = api.Network.newNode(this, (environments.filter(_._2.getNode != null).map(_._2.getNode.getReachability) ++ Seq(Visibility.NONE)).max).
|
||||||
withComponent(name).
|
withComponent(name).
|
||||||
create()
|
create()
|
||||||
|
|
||||||
@ -26,7 +25,7 @@ class CompoundBlockNodeContainer(val name: String, val environments: (String, No
|
|||||||
case _ =>
|
case _ =>
|
||||||
}
|
}
|
||||||
|
|
||||||
override def canUpdate = environments.exists(_._2.canUpdate)
|
override def canUpdate: Boolean = environments.exists(_._2.canUpdate)
|
||||||
|
|
||||||
override def update() {
|
override def update() {
|
||||||
for (environment <- updatingEnvironments) {
|
for (environment <- updatingEnvironments) {
|
||||||
@ -54,14 +53,29 @@ class CompoundBlockNodeContainer(val name: String, val environments: (String, No
|
|||||||
|
|
||||||
private final val TypeHashTag = "typeHash"
|
private final val TypeHashTag = "typeHash"
|
||||||
|
|
||||||
override def load(nbt: NBTTagCompound) {
|
|
||||||
|
override def serializeNBT(): NBTTagCompound = {
|
||||||
|
val nbt = new NBTTagCompound()
|
||||||
|
nbt.setLong(TypeHashTag, typeHash)
|
||||||
|
getNode.save(nbt)
|
||||||
|
for ((driver, environment) <- environments) {
|
||||||
|
try {
|
||||||
|
nbt.setTag(driver, environment.serializeNBT())
|
||||||
|
} catch {
|
||||||
|
case e: Throwable => OpenComputers.log.warn(s"A block component of type '${environment.getClass.getName}' (provided by driver '$driver') threw an error while saving.", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nbt
|
||||||
|
}
|
||||||
|
|
||||||
|
override def deserializeNBT(nbt: NBTTagCompound): Unit = {
|
||||||
// Ignore existing data if the underlying type is different.
|
// Ignore existing data if the underlying type is different.
|
||||||
if (nbt.hasKey(TypeHashTag) && nbt.getLong(TypeHashTag) != typeHash) return
|
if (nbt.hasKey(TypeHashTag) && nbt.getLong(TypeHashTag) != typeHash) return
|
||||||
getNode.load(nbt)
|
getNode.load(nbt)
|
||||||
for ((driver, environment) <- environments) {
|
for ((driver, environment) <- environments) {
|
||||||
if (nbt.hasKey(driver)) {
|
if (nbt.hasKey(driver)) {
|
||||||
try {
|
try {
|
||||||
environment.load(nbt.getCompoundTag(driver))
|
environment.deserializeNBT(nbt.getCompoundTag(driver))
|
||||||
} catch {
|
} catch {
|
||||||
case e: Throwable => OpenComputers.log.warn(s"A block component of type '${environment.getClass.getName}' (provided by driver '$driver') threw an error while loading.", e)
|
case e: Throwable => OpenComputers.log.warn(s"A block component of type '${environment.getClass.getName}' (provided by driver '$driver') threw an error while loading.", e)
|
||||||
}
|
}
|
||||||
@ -70,15 +84,6 @@ class CompoundBlockNodeContainer(val name: String, val environments: (String, No
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def save(nbt: NBTTagCompound) {
|
override def save(nbt: NBTTagCompound) {
|
||||||
nbt.setLong(TypeHashTag, typeHash)
|
|
||||||
getNode.save(nbt)
|
|
||||||
for ((driver, environment) <- environments) {
|
|
||||||
try {
|
|
||||||
nbt.setNewCompoundTag(driver, environment.save)
|
|
||||||
} catch {
|
|
||||||
case e: Throwable => OpenComputers.log.warn(s"A block component of type '${environment.getClass.getName}' (provided by driver '$driver') threw an error while saving.", e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private def typeHash = {
|
private def typeHash = {
|
||||||
|
@ -11,7 +11,6 @@ import li.cil.oc.api.driver.EnvironmentProvider
|
|||||||
import li.cil.oc.api.driver.InventoryProvider
|
import li.cil.oc.api.driver.InventoryProvider
|
||||||
import li.cil.oc.api.driver.item.HostAware
|
import li.cil.oc.api.driver.item.HostAware
|
||||||
import li.cil.oc.api.machine.Value
|
import li.cil.oc.api.machine.Value
|
||||||
import li.cil.oc.api.network.{Environment, EnvironmentHost, NodeContainerItem}
|
|
||||||
import li.cil.oc.api.util.Location
|
import li.cil.oc.api.util.Location
|
||||||
import li.cil.oc.util.InventoryUtils
|
import li.cil.oc.util.InventoryUtils
|
||||||
import net.minecraft.entity.player.EntityPlayer
|
import net.minecraft.entity.player.EntityPlayer
|
||||||
@ -26,34 +25,35 @@ import net.minecraftforge.items.IItemHandler
|
|||||||
import scala.collection.convert.WrapAsJava._
|
import scala.collection.convert.WrapAsJava._
|
||||||
import scala.collection.convert.WrapAsScala._
|
import scala.collection.convert.WrapAsScala._
|
||||||
import scala.collection.mutable
|
import scala.collection.mutable
|
||||||
|
import scala.collection.mutable.ArrayBuffer
|
||||||
import scala.math.ScalaNumber
|
import scala.math.ScalaNumber
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class keeps track of registered drivers and provides installation logic
|
* This class keeps track of registered drivers and provides installation logic
|
||||||
* for each registered driver.
|
* for each registered driver.
|
||||||
*
|
*
|
||||||
* Each component type must register its driver with this class to be used with
|
* Each component type must register its driver with this class to be used with
|
||||||
* computers, since this class is used to determine whether an object is a
|
* computers, since this class is used to determine whether an object is a
|
||||||
* valid component or not.
|
* valid component or not.
|
||||||
*
|
*
|
||||||
* All drivers must be installed once the game starts - in the init phase - and
|
* All drivers must be installed once the game starts - in the init phase - and
|
||||||
* are then injected into all computers started up past that point. A driver is
|
* are then injected into all computers started up past that point. A driver is
|
||||||
* a set of functions made available to the computer. These functions will
|
* a set of functions made available to the computer. These functions will
|
||||||
* usually require a component of the type the driver wraps to be installed in
|
* usually require a component of the type the driver wraps to be installed in
|
||||||
* the computer, but may also provide context-free functions.
|
* the computer, but may also provide context-free functions.
|
||||||
*/
|
*/
|
||||||
private[oc] object Registry extends api.detail.DriverAPI {
|
private[oc] object Registry extends api.detail.DriverAPI {
|
||||||
val sidedBlocks = mutable.ArrayBuffer.empty[DriverBlock]
|
val sidedBlocks: ArrayBuffer[DriverBlock] = mutable.ArrayBuffer.empty[DriverBlock]
|
||||||
|
|
||||||
val items = mutable.ArrayBuffer.empty[DriverItem]
|
val items: ArrayBuffer[DriverItem] = mutable.ArrayBuffer.empty[DriverItem]
|
||||||
|
|
||||||
val converters = mutable.ArrayBuffer.empty[api.driver.Converter]
|
val converters: ArrayBuffer[Converter] = mutable.ArrayBuffer.empty[api.driver.Converter]
|
||||||
|
|
||||||
val environmentProviders = mutable.ArrayBuffer.empty[api.driver.EnvironmentProvider]
|
val environmentProviders: ArrayBuffer[EnvironmentProvider] = mutable.ArrayBuffer.empty[api.driver.EnvironmentProvider]
|
||||||
|
|
||||||
val inventoryProviders = mutable.ArrayBuffer.empty[api.driver.InventoryProvider]
|
val inventoryProviders: ArrayBuffer[InventoryProvider] = mutable.ArrayBuffer.empty[api.driver.InventoryProvider]
|
||||||
|
|
||||||
val blacklist = mutable.ArrayBuffer.empty[(ItemStack, mutable.Set[Class[_]])]
|
val blacklist: ArrayBuffer[(ItemStack, mutable.Set[Class[_]])] = mutable.ArrayBuffer.empty[(ItemStack, mutable.Set[Class[_]])]
|
||||||
|
|
||||||
/** Used to keep track of whether we're past the init phase. */
|
/** Used to keep track of whether we're past the init phase. */
|
||||||
var locked = false
|
var locked = false
|
||||||
@ -104,7 +104,7 @@ private[oc] object Registry extends api.detail.DriverAPI {
|
|||||||
case _ => null
|
case _ => null
|
||||||
}
|
}
|
||||||
|
|
||||||
override def driverFor(stack: ItemStack, host: Class[_ <: Location]) =
|
override def driverFor(stack: ItemStack, host: Class[_ <: Location]): DriverItem =
|
||||||
if (stack != null) {
|
if (stack != null) {
|
||||||
val hostAware = items.collect {
|
val hostAware = items.collect {
|
||||||
case driver: HostAware if driver.worksWith(stack) => driver
|
case driver: HostAware if driver.worksWith(stack) => driver
|
||||||
@ -116,7 +116,7 @@ private[oc] object Registry extends api.detail.DriverAPI {
|
|||||||
}
|
}
|
||||||
else null
|
else null
|
||||||
|
|
||||||
override def driverFor(stack: ItemStack) =
|
override def driverFor(stack: ItemStack): DriverItem =
|
||||||
if (stack != null) items.find(_.worksWith(stack)).orNull
|
if (stack != null) items.find(_.worksWith(stack)).orNull
|
||||||
else null
|
else null
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ private[oc] object Registry extends api.detail.DriverAPI {
|
|||||||
override def environmentsFor(stack: ItemStack): util.Set[Class[_]] = environmentProviders.map(_.getEnvironment(stack)).filter(_ != null).toSet[Class[_]]
|
override def environmentsFor(stack: ItemStack): util.Set[Class[_]] = environmentProviders.map(_.getEnvironment(stack)).filter(_ != null).toSet[Class[_]]
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
override def inventoryFor(stack: ItemStack, player: EntityPlayer):IInventory = {
|
override def inventoryFor(stack: ItemStack, player: EntityPlayer): IInventory = {
|
||||||
OpenComputers.log.warn("A mod is using the deprecated method li.cil.oc.api.Driver.inventoryFor; use itemHandlerFor instead.")
|
OpenComputers.log.warn("A mod is using the deprecated method li.cil.oc.api.Driver.inventoryFor; use itemHandlerFor instead.")
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@ -139,15 +139,15 @@ private[oc] object Registry extends api.detail.DriverAPI {
|
|||||||
inventoryProviders.find(provider => provider.worksWith(stack, player)).
|
inventoryProviders.find(provider => provider.worksWith(stack, player)).
|
||||||
map(provider => InventoryUtils.asItemHandler(provider.getInventory(stack, player))).
|
map(provider => InventoryUtils.asItemHandler(provider.getInventory(stack, player))).
|
||||||
getOrElse {
|
getOrElse {
|
||||||
if(stack.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null))
|
if (stack.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null))
|
||||||
stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)
|
stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)
|
||||||
else null
|
else null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override def blockDrivers = sidedBlocks.toSeq
|
override def blockDrivers: util.List[DriverBlock] = sidedBlocks.toSeq
|
||||||
|
|
||||||
override def itemDrivers = items.toSeq
|
override def itemDrivers: util.List[DriverItem] = items.toSeq
|
||||||
|
|
||||||
def blacklistHost(stack: ItemStack, host: Class[_]) {
|
def blacklistHost(stack: ItemStack, host: Class[_]) {
|
||||||
blacklist.find(_._1.isItemEqual(stack)) match {
|
blacklist.find(_._1.isItemEqual(stack)) match {
|
||||||
@ -156,7 +156,7 @@ private[oc] object Registry extends api.detail.DriverAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def convert(value: Array[AnyRef]) = if (value != null) value.map(arg => convertRecursively(arg, new util.IdentityHashMap())) else null
|
def convert(value: Array[AnyRef]): Array[AnyRef] = if (value != null) value.map(arg => convertRecursively(arg, new util.IdentityHashMap())) else null
|
||||||
|
|
||||||
def convertRecursively(value: Any, memo: util.IdentityHashMap[AnyRef, AnyRef], force: Boolean = false): AnyRef = {
|
def convertRecursively(value: Any, memo: util.IdentityHashMap[AnyRef, AnyRef], force: Boolean = false): AnyRef = {
|
||||||
val valueRef = value match {
|
val valueRef = value match {
|
||||||
@ -239,7 +239,7 @@ private[oc] object Registry extends api.detail.DriverAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def convertList(obj: AnyRef, list: Iterator[(Any, Int)], memo: util.IdentityHashMap[AnyRef, AnyRef]) = {
|
def convertList(obj: AnyRef, list: Iterator[(Any, Int)], memo: util.IdentityHashMap[AnyRef, AnyRef]): Array[AnyRef] = {
|
||||||
val converted = mutable.ArrayBuffer.empty[AnyRef]
|
val converted = mutable.ArrayBuffer.empty[AnyRef]
|
||||||
memo += obj -> converted
|
memo += obj -> converted
|
||||||
for ((value, index) <- list) {
|
for ((value, index) <- list) {
|
||||||
@ -248,7 +248,7 @@ private[oc] object Registry extends api.detail.DriverAPI {
|
|||||||
converted.toArray
|
converted.toArray
|
||||||
}
|
}
|
||||||
|
|
||||||
def convertMap(obj: AnyRef, map: Map[_, _], memo: util.IdentityHashMap[AnyRef, AnyRef]) = {
|
def convertMap(obj: AnyRef, map: Map[_, _], memo: util.IdentityHashMap[AnyRef, AnyRef]): AnyRef = {
|
||||||
val converted = memo.getOrElseUpdate(obj, mutable.Map.empty[AnyRef, AnyRef]) match {
|
val converted = memo.getOrElseUpdate(obj, mutable.Map.empty[AnyRef, AnyRef]) match {
|
||||||
case map: mutable.Map[AnyRef, AnyRef]@unchecked => map
|
case map: mutable.Map[AnyRef, AnyRef]@unchecked => map
|
||||||
case map: java.util.Map[AnyRef, AnyRef]@unchecked => mapAsScalaMap(map)
|
case map: java.util.Map[AnyRef, AnyRef]@unchecked => mapAsScalaMap(map)
|
||||||
|
@ -4,14 +4,15 @@ import java.io.FileNotFoundException
|
|||||||
import java.util.concurrent.Callable
|
import java.util.concurrent.Callable
|
||||||
|
|
||||||
import li.cil.oc.api
|
import li.cil.oc.api
|
||||||
|
import li.cil.oc.api.fs.FileSystem
|
||||||
|
import li.cil.oc.api.fs.Handle
|
||||||
import li.cil.oc.api.fs.Mode
|
import li.cil.oc.api.fs.Mode
|
||||||
import li.cil.oc.util.ExtendedNBT._
|
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
|
||||||
import scala.collection.mutable
|
import scala.collection.mutable
|
||||||
|
|
||||||
class CompositeReadOnlyFileSystem(factories: mutable.LinkedHashMap[String, Callable[api.fs.FileSystem]]) extends api.fs.FileSystem {
|
class CompositeReadOnlyFileSystem(factories: mutable.LinkedHashMap[String, Callable[api.fs.FileSystem]]) extends api.fs.FileSystem {
|
||||||
var parts = mutable.LinkedHashMap.empty[String, api.fs.FileSystem]
|
var parts: mutable.LinkedHashMap[String, FileSystem] = mutable.LinkedHashMap.empty[String, api.fs.FileSystem]
|
||||||
for ((name, factory) <- factories) {
|
for ((name, factory) <- factories) {
|
||||||
val fs = factory.call()
|
val fs = factory.call()
|
||||||
if (fs != null) {
|
if (fs != null) {
|
||||||
@ -23,21 +24,21 @@ class CompositeReadOnlyFileSystem(factories: mutable.LinkedHashMap[String, Calla
|
|||||||
|
|
||||||
override def isReadOnly = true
|
override def isReadOnly = true
|
||||||
|
|
||||||
override def spaceTotal = math.max(spaceUsed, parts.values.map(_.spaceTotal).sum)
|
override def spaceTotal: Long = math.max(spaceUsed, parts.values.map(_.spaceTotal).sum)
|
||||||
|
|
||||||
override def spaceUsed = parts.values.map(_.spaceUsed).sum
|
override def spaceUsed: Long = parts.values.map(_.spaceUsed).sum
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def exists(path: String) = findFileSystem(path).isDefined
|
override def exists(path: String): Boolean = findFileSystem(path).isDefined
|
||||||
|
|
||||||
override def size(path: String) = findFileSystem(path).fold(0L)(_.size(path))
|
override def size(path: String): Long = findFileSystem(path).fold(0L)(_.size(path))
|
||||||
|
|
||||||
override def isDirectory(path: String) = findFileSystem(path).fold(false)(_.isDirectory(path))
|
override def isDirectory(path: String): Boolean = findFileSystem(path).fold(false)(_.isDirectory(path))
|
||||||
|
|
||||||
override def lastModified(path: String) = findFileSystem(path).fold(0L)(_.lastModified(path))
|
override def lastModified(path: String): Long = findFileSystem(path).fold(0L)(_.lastModified(path))
|
||||||
|
|
||||||
override def list(path: String) = if (isDirectory(path)) {
|
override def list(path: String): Array[String] = if (isDirectory(path)) {
|
||||||
parts.values.foldLeft(mutable.Set.empty[String])((acc, fs) => {
|
parts.values.foldLeft(mutable.Set.empty[String])((acc, fs) => {
|
||||||
if (fs.exists(path)) try {
|
if (fs.exists(path)) try {
|
||||||
val l = fs.list(path)
|
val l = fs.list(path)
|
||||||
@ -70,27 +71,32 @@ class CompositeReadOnlyFileSystem(factories: mutable.LinkedHashMap[String, Calla
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def open(path: String, mode: Mode) = findFileSystem(path) match {
|
override def open(path: String, mode: Mode): Int = findFileSystem(path) match {
|
||||||
case Some(fs) => fs.open(path, mode)
|
case Some(fs) => fs.open(path, mode)
|
||||||
case _ => throw new FileNotFoundException(path)
|
case _ => throw new FileNotFoundException(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
override def getHandle(handle: Int) = parts.valuesIterator.map(_.getHandle(handle)).find(_ != null).orNull
|
override def getHandle(handle: Int): Handle = parts.valuesIterator.map(_.getHandle(handle)).find(_ != null).orNull
|
||||||
|
|
||||||
override def close() = parts.values.foreach(_.close())
|
override def close(): Unit = parts.values.foreach(_.close())
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def load(nbt: NBTTagCompound) {
|
override def serializeNBT(): NBTTagCompound = {
|
||||||
|
val nbt = new NBTTagCompound()
|
||||||
for ((name, fs) <- parts) {
|
for ((name, fs) <- parts) {
|
||||||
fs.load(nbt.getCompoundTag(name))
|
nbt.setTag(name, fs.serializeNBT)
|
||||||
|
}
|
||||||
|
nbt
|
||||||
|
}
|
||||||
|
|
||||||
|
override def deserializeNBT(nbt: NBTTagCompound): Unit = {
|
||||||
|
for ((name, fs) <- parts) {
|
||||||
|
fs.deserializeNBT(nbt.getCompoundTag(name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override def save(nbt: NBTTagCompound) {
|
override def load(nbt: NBTTagCompound) {
|
||||||
for ((name, fs) <- parts) {
|
|
||||||
nbt.setNewCompoundTag(name, fs.save)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
@ -6,13 +6,15 @@ import java.net.URISyntaxException
|
|||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
|
import li.cil.oc.Constants
|
||||||
import li.cil.oc.OpenComputers
|
import li.cil.oc.OpenComputers
|
||||||
import li.cil.oc.Settings
|
import li.cil.oc.Settings
|
||||||
import li.cil.oc.api
|
import li.cil.oc.api
|
||||||
|
import li.cil.oc.api.fs.FileSystem
|
||||||
import li.cil.oc.api.fs.Label
|
import li.cil.oc.api.fs.Label
|
||||||
import li.cil.oc.api.network.EnvironmentHost
|
|
||||||
import li.cil.oc.api.util.Location
|
import li.cil.oc.api.util.Location
|
||||||
import li.cil.oc.server.component
|
import li.cil.oc.server.component
|
||||||
|
import li.cil.oc.server.component.FileSystem
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
import net.minecraftforge.common.DimensionManager
|
import net.minecraftforge.common.DimensionManager
|
||||||
@ -20,7 +22,7 @@ import net.minecraftforge.common.DimensionManager
|
|||||||
import scala.util.Try
|
import scala.util.Try
|
||||||
|
|
||||||
object FileSystem extends api.detail.FileSystemAPI {
|
object FileSystem extends api.detail.FileSystemAPI {
|
||||||
lazy val isCaseInsensitive = Settings.Debug.forceCaseInsensitiveFS || (try {
|
lazy val isCaseInsensitive: Boolean = Settings.Debug.forceCaseInsensitiveFS || (try {
|
||||||
val uuid = UUID.randomUUID().toString
|
val uuid = UUID.randomUUID().toString
|
||||||
val lowerCase = new io.File(DimensionManager.getCurrentSaveRootDirectory, uuid + "oc_rox")
|
val lowerCase = new io.File(DimensionManager.getCurrentSaveRootDirectory, uuid + "oc_rox")
|
||||||
val upperCase = new io.File(DimensionManager.getCurrentSaveRootDirectory, uuid + "OC_ROX")
|
val upperCase = new io.File(DimensionManager.getCurrentSaveRootDirectory, uuid + "OC_ROX")
|
||||||
@ -45,11 +47,12 @@ object FileSystem extends api.detail.FileSystemAPI {
|
|||||||
// Worst-case: we're on Windows or using a FAT32 partition mounted in *nix.
|
// Worst-case: we're on Windows or using a FAT32 partition mounted in *nix.
|
||||||
// Note: we allow / as the path separator and expect all \s to be converted
|
// Note: we allow / as the path separator and expect all \s to be converted
|
||||||
// accordingly before the path is passed to the file system.
|
// accordingly before the path is passed to the file system.
|
||||||
private val invalidChars = """\:*?"<>|""".toSet
|
private val invalidChars =
|
||||||
|
"""\:*?"<>|""".toSet
|
||||||
|
|
||||||
def isValidFilename(name: String) = !name.exists(invalidChars.contains)
|
def isValidFilename(name: String): Boolean = !name.exists(invalidChars.contains)
|
||||||
|
|
||||||
def validatePath(path: String) = {
|
def validatePath(path: String): String = {
|
||||||
if (!isValidFilename(path)) {
|
if (!isValidFilename(path)) {
|
||||||
throw new java.io.IOException("path contains invalid characters")
|
throw new java.io.IOException("path contains invalid characters")
|
||||||
}
|
}
|
||||||
@ -88,9 +91,9 @@ object FileSystem extends api.detail.FileSystemAPI {
|
|||||||
case _ =>
|
case _ =>
|
||||||
System.getProperty("java.class.path").split(System.getProperty("path.separator")).
|
System.getProperty("java.class.path").split(System.getProperty("path.separator")).
|
||||||
find(cp => {
|
find(cp => {
|
||||||
val fsp = new io.File(new io.File(cp), innerPath)
|
val fsp = new io.File(new io.File(cp), innerPath)
|
||||||
fsp.exists() && fsp.isDirectory
|
fsp.exists() && fsp.isDirectory
|
||||||
}) match {
|
}) match {
|
||||||
case None => null
|
case None => null
|
||||||
case Some(dir) => new ReadOnlyFileSystem(new io.File(new io.File(dir), innerPath))
|
case Some(dir) => new ReadOnlyFileSystem(new io.File(new io.File(dir), innerPath))
|
||||||
}
|
}
|
||||||
@ -98,7 +101,7 @@ object FileSystem extends api.detail.FileSystemAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override def fromSaveDirectory(root: String, capacity: Long, buffered: Boolean) = {
|
override def fromSaveDirectory(root: String, capacity: Long, buffered: Boolean): Capacity = {
|
||||||
val path = new io.File(DimensionManager.getCurrentSaveRootDirectory, Settings.savePath + root)
|
val path = new io.File(DimensionManager.getCurrentSaveRootDirectory, Settings.savePath + root)
|
||||||
if (!path.isDirectory) {
|
if (!path.isDirectory) {
|
||||||
path.delete()
|
path.delete()
|
||||||
@ -113,29 +116,29 @@ object FileSystem extends api.detail.FileSystemAPI {
|
|||||||
|
|
||||||
def fromMemory(capacity: Long): api.fs.FileSystem = new RamFileSystem(capacity)
|
def fromMemory(capacity: Long): api.fs.FileSystem = new RamFileSystem(capacity)
|
||||||
|
|
||||||
override def asReadOnly(fileSystem: api.fs.FileSystem) =
|
override def asReadOnly(fileSystem: api.fs.FileSystem): FileSystem =
|
||||||
if (fileSystem.isReadOnly) fileSystem
|
if (fileSystem.isReadOnly) fileSystem
|
||||||
else new ReadOnlyWrapper(fileSystem)
|
else new ReadOnlyWrapper(fileSystem)
|
||||||
|
|
||||||
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label, host: Location, accessSound: String, speed: Int) =
|
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label, host: Location, accessSound: String, speed: Int): FileSystem =
|
||||||
Option(fileSystem).flatMap(fs => Some(new component.FileSystem(fs, label, Option(host), Option(accessSound), (speed - 1) max 0 min 5))).orNull
|
Option(fileSystem).flatMap(fs => Some(new component.FileSystem(fs, label, Option(host), Option(accessSound), (speed - 1) max 0 min 5))).orNull
|
||||||
|
|
||||||
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: String, host: Location, accessSound: String, speed: Int) =
|
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: String, host: Location, accessSound: String, speed: Int): FileSystem =
|
||||||
asManagedEnvironment(fileSystem, new ReadOnlyLabel(label), host, accessSound, speed)
|
asManagedEnvironment(fileSystem, new ReadOnlyLabel(label), host, accessSound, speed)
|
||||||
|
|
||||||
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label, host: Location, sound: String) =
|
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label, host: Location, sound: String): FileSystem =
|
||||||
asManagedEnvironment(fileSystem, label, host, sound, 1)
|
asManagedEnvironment(fileSystem, label, host, sound, 1)
|
||||||
|
|
||||||
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: String, host: Location, sound: String) =
|
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: String, host: Location, sound: String): FileSystem =
|
||||||
asManagedEnvironment(fileSystem, new ReadOnlyLabel(label), host, sound, 1)
|
asManagedEnvironment(fileSystem, new ReadOnlyLabel(label), host, sound, 1)
|
||||||
|
|
||||||
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label) =
|
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label): FileSystem =
|
||||||
asManagedEnvironment(fileSystem, label, null, null, 1)
|
asManagedEnvironment(fileSystem, label, null, null, 1)
|
||||||
|
|
||||||
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: String) =
|
def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: String): FileSystem =
|
||||||
asManagedEnvironment(fileSystem, new ReadOnlyLabel(label), null, null, 1)
|
asManagedEnvironment(fileSystem, new ReadOnlyLabel(label), null, null, 1)
|
||||||
|
|
||||||
def asManagedEnvironment(fileSystem: api.fs.FileSystem) =
|
def asManagedEnvironment(fileSystem: api.fs.FileSystem): FileSystem =
|
||||||
asManagedEnvironment(fileSystem, null: Label, null, null, 1)
|
asManagedEnvironment(fileSystem, null: Label, null, null, 1)
|
||||||
|
|
||||||
abstract class ItemLabel(val stack: ItemStack) extends Label
|
abstract class ItemLabel(val stack: ItemStack) extends Label
|
||||||
@ -143,7 +146,7 @@ object FileSystem extends api.detail.FileSystemAPI {
|
|||||||
private class ReadOnlyLabel(val label: String) extends Label {
|
private class ReadOnlyLabel(val label: String) extends Label {
|
||||||
def setLabel(value: String) = throw new IllegalArgumentException("label is read only")
|
def setLabel(value: String) = throw new IllegalArgumentException("label is read only")
|
||||||
|
|
||||||
def getLabel = label
|
def getLabel: String = label
|
||||||
|
|
||||||
private final val LabelTag = Constants.namespace + "fs.label"
|
private final val LabelTag = Constants.namespace + "fs.label"
|
||||||
|
|
||||||
@ -158,23 +161,23 @@ object FileSystem extends api.detail.FileSystemAPI {
|
|||||||
|
|
||||||
private class ReadOnlyFileSystem(protected val root: io.File)
|
private class ReadOnlyFileSystem(protected val root: io.File)
|
||||||
extends InputStreamFileSystem
|
extends InputStreamFileSystem
|
||||||
with FileInputStreamFileSystem
|
with FileInputStreamFileSystem
|
||||||
|
|
||||||
private class ReadWriteFileSystem(protected val root: io.File, protected val capacity: Long)
|
private class ReadWriteFileSystem(protected val root: io.File, protected val capacity: Long)
|
||||||
extends OutputStreamFileSystem
|
extends OutputStreamFileSystem
|
||||||
with FileOutputStreamFileSystem
|
with FileOutputStreamFileSystem
|
||||||
with Capacity
|
with Capacity
|
||||||
|
|
||||||
private class RamFileSystem(protected val capacity: Long)
|
private class RamFileSystem(protected val capacity: Long)
|
||||||
extends VirtualFileSystem
|
extends VirtualFileSystem
|
||||||
with Volatile
|
with Volatile
|
||||||
with Capacity
|
with Capacity
|
||||||
|
|
||||||
private class BufferedFileSystem(protected val fileRoot: io.File, protected val capacity: Long)
|
private class BufferedFileSystem(protected val fileRoot: io.File, protected val capacity: Long)
|
||||||
extends VirtualFileSystem
|
extends VirtualFileSystem
|
||||||
with Buffered
|
with Buffered
|
||||||
with Capacity {
|
with Capacity {
|
||||||
protected override def segments(path: String) = {
|
protected override def segments(path: String): Array[String] = {
|
||||||
val parts = super.segments(path)
|
val parts = super.segments(path)
|
||||||
if (isCaseInsensitive) toCaseInsensitive(parts) else parts
|
if (isCaseInsensitive) toCaseInsensitive(parts) else parts
|
||||||
}
|
}
|
||||||
|
@ -3,25 +3,26 @@ package li.cil.oc.server.fs
|
|||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
|
|
||||||
import li.cil.oc.api
|
import li.cil.oc.api
|
||||||
|
import li.cil.oc.api.fs.Handle
|
||||||
import li.cil.oc.api.fs.Mode
|
import li.cil.oc.api.fs.Mode
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
|
||||||
private class ReadOnlyWrapper(val fileSystem: api.fs.FileSystem) extends api.fs.FileSystem {
|
private class ReadOnlyWrapper(val fileSystem: api.fs.FileSystem) extends api.fs.FileSystem {
|
||||||
override def isReadOnly = true
|
override def isReadOnly = true
|
||||||
|
|
||||||
override def spaceTotal = fileSystem.spaceUsed()
|
override def spaceTotal: Long = fileSystem.spaceUsed()
|
||||||
|
|
||||||
override def spaceUsed = fileSystem.spaceUsed()
|
override def spaceUsed: Long = fileSystem.spaceUsed()
|
||||||
|
|
||||||
override def exists(path: String) = fileSystem.exists(path)
|
override def exists(path: String): Boolean = fileSystem.exists(path)
|
||||||
|
|
||||||
override def size(path: String) = fileSystem.size(path)
|
override def size(path: String): Long = fileSystem.size(path)
|
||||||
|
|
||||||
override def isDirectory(path: String) = fileSystem.isDirectory(path)
|
override def isDirectory(path: String): Boolean = fileSystem.isDirectory(path)
|
||||||
|
|
||||||
override def lastModified(path: String) = fileSystem.lastModified(path)
|
override def lastModified(path: String): Long = fileSystem.lastModified(path)
|
||||||
|
|
||||||
override def list(path: String) = fileSystem.list(path)
|
override def list(path: String): Array[String] = fileSystem.list(path)
|
||||||
|
|
||||||
override def delete(path: String) = false
|
override def delete(path: String) = false
|
||||||
|
|
||||||
@ -31,17 +32,17 @@ private class ReadOnlyWrapper(val fileSystem: api.fs.FileSystem) extends api.fs.
|
|||||||
|
|
||||||
override def setLastModified(path: String, time: Long) = false
|
override def setLastModified(path: String, time: Long) = false
|
||||||
|
|
||||||
override def open(path: String, mode: Mode) = mode match {
|
override def open(path: String, mode: Mode): Int = mode match {
|
||||||
case Mode.Read => fileSystem.open(path, mode)
|
case Mode.Read => fileSystem.open(path, mode)
|
||||||
case Mode.Write => throw new FileNotFoundException("read-only filesystem; cannot open for writing: " + path)
|
case Mode.Write => throw new FileNotFoundException("read-only filesystem; cannot open for writing: " + path)
|
||||||
case Mode.Append => throw new FileNotFoundException("read-only filesystem; cannot open for appending: " + path)
|
case Mode.Append => throw new FileNotFoundException("read-only filesystem; cannot open for appending: " + path)
|
||||||
}
|
}
|
||||||
|
|
||||||
override def getHandle(handle: Int) = fileSystem.getHandle(handle)
|
override def getHandle(handle: Int): Handle = fileSystem.getHandle(handle)
|
||||||
|
|
||||||
override def close() = fileSystem.close()
|
override def close(): Unit = fileSystem.close()
|
||||||
|
|
||||||
override def load(nbt: NBTTagCompound) = fileSystem.load(nbt)
|
override def serializeNBT(): NBTTagCompound = fileSystem.serializeNBT()
|
||||||
|
|
||||||
override def save(nbt: NBTTagCompound) = fileSystem.save(nbt)
|
override def deserializeNBT(nbt: NBTTagCompound): Unit = fileSystem.deserializeNBT(nbt)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package li.cil.oc.server.machine.luac
|
package li.cil.oc.server.machine.luac
|
||||||
|
|
||||||
import li.cil.oc.api.network.{Component, ComponentNode, NodeComponent}
|
|
||||||
import li.cil.oc.util.ExtendedLuaState.extendLuaState
|
import li.cil.oc.util.ExtendedLuaState.extendLuaState
|
||||||
|
|
||||||
import scala.collection.convert.WrapAsScala._
|
import scala.collection.convert.WrapAsScala._
|
||||||
|
@ -4,7 +4,6 @@ import li.cil.oc.Settings
|
|||||||
import li.cil.oc.api
|
import li.cil.oc.api
|
||||||
import li.cil.oc.api.driver.item.MutableProcessor
|
import li.cil.oc.api.driver.item.MutableProcessor
|
||||||
import li.cil.oc.api.driver.item.Processor
|
import li.cil.oc.api.driver.item.Processor
|
||||||
import li.cil.oc.api.network.{Connector, EnergyNode, PowerNode}
|
|
||||||
import li.cil.oc.util.ExtendedLuaState.extendLuaState
|
import li.cil.oc.util.ExtendedLuaState.extendLuaState
|
||||||
|
|
||||||
import scala.collection.convert.WrapAsScala._
|
import scala.collection.convert.WrapAsScala._
|
||||||
@ -99,13 +98,13 @@ class ComputerAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
|
|||||||
if (Settings.Power.ignorePower)
|
if (Settings.Power.ignorePower)
|
||||||
lua.pushNumber(Double.PositiveInfinity)
|
lua.pushNumber(Double.PositiveInfinity)
|
||||||
else
|
else
|
||||||
lua.pushNumber(node.asInstanceOf[EnergyNode].getGlobalBuffer)
|
lua.pushNumber(node.getNetwork.getEnergyStored)
|
||||||
1
|
1
|
||||||
})
|
})
|
||||||
lua.setField(-2, "energy")
|
lua.setField(-2, "energy")
|
||||||
|
|
||||||
lua.pushScalaFunction(lua => {
|
lua.pushScalaFunction(lua => {
|
||||||
lua.pushNumber(node.asInstanceOf[EnergyNode].getGlobalBufferSize)
|
lua.pushNumber(node.getNetwork.getEnergyCapacity)
|
||||||
1
|
1
|
||||||
})
|
})
|
||||||
lua.setField(-2, "maxEnergy")
|
lua.setField(-2, "maxEnergy")
|
||||||
|
@ -8,18 +8,21 @@ import java.util.regex.Pattern
|
|||||||
|
|
||||||
import com.google.common.base.Strings
|
import com.google.common.base.Strings
|
||||||
import com.google.common.io.PatternFilenameFilter
|
import com.google.common.io.PatternFilenameFilter
|
||||||
|
import li.cil.oc.Constants
|
||||||
import li.cil.oc.OpenComputers
|
import li.cil.oc.OpenComputers
|
||||||
import li.cil.oc.Settings
|
import li.cil.oc.Settings
|
||||||
import li.cil.oc.server.machine.Machine
|
import li.cil.oc.server.machine.Machine
|
||||||
import li.cil.oc.util.ExtendedLuaState._
|
import li.cil.oc.util.ExtendedLuaState._
|
||||||
import li.cil.repack.com.naef.jnlua
|
import li.cil.repack.com.naef.jnlua
|
||||||
|
import li.cil.repack.com.naef.jnlua.LuaState
|
||||||
|
import li.cil.repack.com.naef.jnlua.LuaStateFiveThree
|
||||||
import li.cil.repack.com.naef.jnlua.NativeSupport.Loader
|
import li.cil.repack.com.naef.jnlua.NativeSupport.Loader
|
||||||
import org.apache.commons.lang3.SystemUtils
|
import org.apache.commons.lang3.SystemUtils
|
||||||
|
|
||||||
import scala.util.Random
|
import scala.util.Random
|
||||||
|
|
||||||
object LuaStateFactory {
|
object LuaStateFactory {
|
||||||
def isAvailable = {
|
def isAvailable: Boolean = {
|
||||||
// Force initialization of both.
|
// Force initialization of both.
|
||||||
val lua52 = Lua52.isAvailable
|
val lua52 = Lua52.isAvailable
|
||||||
val lua53 = Lua53.isAvailable
|
val lua53 = Lua53.isAvailable
|
||||||
@ -29,7 +32,7 @@ object LuaStateFactory {
|
|||||||
object Lua52 extends LuaStateFactory {
|
object Lua52 extends LuaStateFactory {
|
||||||
override def version: String = "lua52"
|
override def version: String = "lua52"
|
||||||
|
|
||||||
override protected def create(maxMemory: Option[Int]) = maxMemory.fold(new jnlua.LuaState())(new jnlua.LuaState(_))
|
override protected def create(maxMemory: Option[Int]): LuaState = maxMemory.fold(new jnlua.LuaState())(new jnlua.LuaState(_))
|
||||||
|
|
||||||
override protected def openLibs(state: jnlua.LuaState): Unit = {
|
override protected def openLibs(state: jnlua.LuaState): Unit = {
|
||||||
state.openLib(jnlua.LuaState.Library.BASE)
|
state.openLib(jnlua.LuaState.Library.BASE)
|
||||||
@ -47,7 +50,7 @@ object LuaStateFactory {
|
|||||||
object Lua53 extends LuaStateFactory {
|
object Lua53 extends LuaStateFactory {
|
||||||
override def version: String = "lua53"
|
override def version: String = "lua53"
|
||||||
|
|
||||||
override protected def create(maxMemory: Option[Int]) = maxMemory.fold(new jnlua.LuaStateFiveThree())(new jnlua.LuaStateFiveThree(_))
|
override protected def create(maxMemory: Option[Int]): LuaStateFiveThree = maxMemory.fold(new jnlua.LuaStateFiveThree())(new jnlua.LuaStateFiveThree(_))
|
||||||
|
|
||||||
override protected def openLibs(state: jnlua.LuaState): Unit = {
|
override protected def openLibs(state: jnlua.LuaState): Unit = {
|
||||||
state.openLib(jnlua.LuaState.Library.BASE)
|
state.openLib(jnlua.LuaState.Library.BASE)
|
||||||
@ -121,7 +124,7 @@ abstract class LuaStateFactory {
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
def isAvailable = haveNativeLibrary
|
def isAvailable: Boolean = haveNativeLibrary
|
||||||
|
|
||||||
val is64Bit = Architecture.IS_OS_X64
|
val is64Bit = Architecture.IS_OS_X64
|
||||||
|
|
||||||
@ -377,15 +380,15 @@ abstract class LuaStateFactory {
|
|||||||
|
|
||||||
// Inspired by org.apache.commons.lang3.SystemUtils
|
// Inspired by org.apache.commons.lang3.SystemUtils
|
||||||
object Architecture {
|
object Architecture {
|
||||||
val OS_ARCH = try System.getProperty("os.arch") catch {
|
val OS_ARCH: String = try System.getProperty("os.arch") catch {
|
||||||
case ex: SecurityException => null
|
case ex: SecurityException => null
|
||||||
}
|
}
|
||||||
|
|
||||||
val IS_OS_ARM = isOSArchMatch("arm")
|
val IS_OS_ARM: Boolean = isOSArchMatch("arm")
|
||||||
|
|
||||||
val IS_OS_X86 = isOSArchMatch("x86") || isOSArchMatch("i386")
|
val IS_OS_X86: Boolean = isOSArchMatch("x86") || isOSArchMatch("i386")
|
||||||
|
|
||||||
val IS_OS_X64 = isOSArchMatch("x86_64") || isOSArchMatch("amd64")
|
val IS_OS_X64: Boolean = isOSArchMatch("x86_64") || isOSArchMatch("amd64")
|
||||||
|
|
||||||
private def isOSArchMatch(archPrefix: String): Boolean = OS_ARCH != null && OS_ARCH.startsWith(archPrefix)
|
private def isOSArchMatch(archPrefix: String): Boolean = OS_ARCH != null && OS_ARCH.startsWith(archPrefix)
|
||||||
}
|
}
|
||||||
|
@ -142,9 +142,9 @@ abstract class NativeLuaArchitecture(val machine: api.machine.Machine) extends A
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def isInitialized = kernelMemory > 0
|
override def isInitialized: Boolean = kernelMemory > 0
|
||||||
|
|
||||||
override def recomputeMemory(components: java.lang.Iterable[ItemStack]) = {
|
override def recomputeMemory(components: java.lang.Iterable[ItemStack]): Boolean = {
|
||||||
val memory = math.ceil(memoryInBytes(components) * ramScale).toInt
|
val memory = math.ceil(memoryInBytes(components) * ramScale).toInt
|
||||||
Option(lua) match {
|
Option(lua) match {
|
||||||
case Some(l) if Settings.Debug.limitMemory =>
|
case Some(l) if Settings.Debug.limitMemory =>
|
||||||
|
@ -6,12 +6,12 @@ import java.io.DataInputStream
|
|||||||
import java.io.DataOutputStream
|
import java.io.DataOutputStream
|
||||||
|
|
||||||
import li.cil.oc.OpenComputers
|
import li.cil.oc.OpenComputers
|
||||||
import li.cil.oc.api.Persistable
|
|
||||||
import li.cil.oc.api.machine.Value
|
import li.cil.oc.api.machine.Value
|
||||||
import li.cil.oc.server.machine.ArgumentsImpl
|
import li.cil.oc.server.machine.ArgumentsImpl
|
||||||
import li.cil.oc.util.ExtendedLuaState.extendLuaState
|
import li.cil.oc.util.ExtendedLuaState.extendLuaState
|
||||||
import net.minecraft.nbt.CompressedStreamTools
|
import net.minecraft.nbt.CompressedStreamTools
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
import net.minecraftforge.common.util.INBTSerializable
|
||||||
|
|
||||||
import scala.collection.convert.WrapAsScala._
|
import scala.collection.convert.WrapAsScala._
|
||||||
|
|
||||||
@ -20,10 +20,9 @@ class UserdataAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
|
|||||||
lua.newTable()
|
lua.newTable()
|
||||||
|
|
||||||
lua.pushScalaFunction(lua => {
|
lua.pushScalaFunction(lua => {
|
||||||
val nbt = new NBTTagCompound()
|
val persistable = lua.toJavaObjectRaw(1).asInstanceOf[INBTSerializable]
|
||||||
val persistable = lua.toJavaObjectRaw(1).asInstanceOf[Persistable]
|
|
||||||
lua.pushString(persistable.getClass.getName)
|
lua.pushString(persistable.getClass.getName)
|
||||||
persistable.save(nbt)
|
val nbt = persistable.serializeNBT()
|
||||||
val baos = new ByteArrayOutputStream()
|
val baos = new ByteArrayOutputStream()
|
||||||
val dos = new DataOutputStream(baos)
|
val dos = new DataOutputStream(baos)
|
||||||
CompressedStreamTools.write(nbt, dos)
|
CompressedStreamTools.write(nbt, dos)
|
||||||
@ -36,12 +35,12 @@ class UserdataAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
|
|||||||
try {
|
try {
|
||||||
val className = lua.toString(1)
|
val className = lua.toString(1)
|
||||||
val clazz = Class.forName(className)
|
val clazz = Class.forName(className)
|
||||||
val persistable = clazz.newInstance.asInstanceOf[Persistable]
|
val persistable = clazz.newInstance.asInstanceOf[INBTSerializable]
|
||||||
val data = lua.toByteArray(2)
|
val data = lua.toByteArray(2)
|
||||||
val bais = new ByteArrayInputStream(data)
|
val bais = new ByteArrayInputStream(data)
|
||||||
val dis = new DataInputStream(bais)
|
val dis = new DataInputStream(bais)
|
||||||
val nbt = CompressedStreamTools.read(dis)
|
val nbt = CompressedStreamTools.read(dis)
|
||||||
persistable.load(nbt)
|
persistable.deserializeNBT(nbt)
|
||||||
lua.pushJavaObjectRaw(persistable)
|
lua.pushJavaObjectRaw(persistable)
|
||||||
1
|
1
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import li.cil.oc.Settings
|
|||||||
import li.cil.oc.api
|
import li.cil.oc.api
|
||||||
import li.cil.oc.api.driver.item.MutableProcessor
|
import li.cil.oc.api.driver.item.MutableProcessor
|
||||||
import li.cil.oc.api.driver.item.Processor
|
import li.cil.oc.api.driver.item.Processor
|
||||||
import li.cil.oc.api.network.EnergyNode
|
|
||||||
import li.cil.oc.util.ScalaClosure._
|
import li.cil.oc.util.ScalaClosure._
|
||||||
import li.cil.repack.org.luaj.vm2.LuaValue
|
import li.cil.repack.org.luaj.vm2.LuaValue
|
||||||
import li.cil.repack.org.luaj.vm2.Varargs
|
import li.cil.repack.org.luaj.vm2.Varargs
|
||||||
@ -55,9 +54,9 @@ class ComputerAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
|
|||||||
if (Settings.Power.ignorePower)
|
if (Settings.Power.ignorePower)
|
||||||
LuaValue.valueOf(Double.PositiveInfinity)
|
LuaValue.valueOf(Double.PositiveInfinity)
|
||||||
else
|
else
|
||||||
LuaValue.valueOf(node.asInstanceOf[EnergyNode].getGlobalBuffer))
|
LuaValue.valueOf(node.getNetwork.getEnergyStored))
|
||||||
|
|
||||||
computer.set("maxEnergy", (_: Varargs) => LuaValue.valueOf(node.asInstanceOf[EnergyNode].getGlobalBufferSize))
|
computer.set("maxEnergy", (_: Varargs) => LuaValue.valueOf(node.getNetwork.getEnergyCapacity))
|
||||||
|
|
||||||
computer.set("getArchitectures", (args: Varargs) => {
|
computer.set("getArchitectures", (args: Varargs) => {
|
||||||
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
machine.host.internalComponents.map(stack => (stack, api.Driver.driverFor(stack))).collectFirst {
|
||||||
|
@ -4,6 +4,7 @@ import java.io.FileNotFoundException
|
|||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
import com.google.common.base.Strings
|
import com.google.common.base.Strings
|
||||||
|
import li.cil.oc.Constants
|
||||||
import li.cil.oc.OpenComputers
|
import li.cil.oc.OpenComputers
|
||||||
import li.cil.oc.Settings
|
import li.cil.oc.Settings
|
||||||
import li.cil.oc.api
|
import li.cil.oc.api
|
||||||
@ -95,9 +96,9 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def isInitialized = doneWithInitRun
|
override def isInitialized: Boolean = doneWithInitRun
|
||||||
|
|
||||||
override def recomputeMemory(components: java.lang.Iterable[ItemStack]) = {
|
override def recomputeMemory(components: java.lang.Iterable[ItemStack]): Boolean = {
|
||||||
memory = memoryInBytes(components)
|
memory = memoryInBytes(components)
|
||||||
memory > 0
|
memory > 0
|
||||||
}
|
}
|
||||||
@ -114,7 +115,7 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
synchronizedCall = null
|
synchronizedCall = null
|
||||||
}
|
}
|
||||||
|
|
||||||
override def runThreaded(isSynchronizedReturn: Boolean) = {
|
override def runThreaded(isSynchronizedReturn: Boolean): ExecutionResult = {
|
||||||
try {
|
try {
|
||||||
// Resume the Lua state and remember the number of results we get.
|
// Resume the Lua state and remember the number of results we get.
|
||||||
val results = if (isSynchronizedReturn) {
|
val results = if (isSynchronizedReturn) {
|
||||||
@ -215,7 +216,7 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def initialize() = {
|
override def initialize(): Boolean = {
|
||||||
lua = JsePlatform.debugGlobals()
|
lua = JsePlatform.debugGlobals()
|
||||||
lua.set("package", LuaValue.NIL)
|
lua.set("package", LuaValue.NIL)
|
||||||
lua.set("require", LuaValue.NIL)
|
lua.set("require", LuaValue.NIL)
|
||||||
@ -231,7 +232,7 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
|
|
||||||
recomputeMemory(machine.host.internalComponents)
|
recomputeMemory(machine.host.internalComponents)
|
||||||
|
|
||||||
val kernel = lua.load(classOf[Machine].getResourceAsStream(Settings.scriptPath + "machine.lua"), "=machine", "t", lua)
|
val kernel = lua.load(classOf[Machine].getResourceAsStream(Constants.scriptPath + "machine.lua"), "=machine", "t", lua)
|
||||||
thread = new LuaThread(lua, kernel) // Left as the first value on the stack.
|
thread = new LuaThread(lua, kernel) // Left as the first value on the stack.
|
||||||
|
|
||||||
true
|
true
|
||||||
@ -240,7 +241,7 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
override def onConnect() {
|
override def onConnect() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override def close() = {
|
override def close(): Unit = {
|
||||||
lua = null
|
lua = null
|
||||||
thread = null
|
thread = null
|
||||||
synchronizedCall = null
|
synchronizedCall = null
|
||||||
|
@ -2,8 +2,9 @@ package li.cil.oc.server.network
|
|||||||
|
|
||||||
import li.cil.oc.Settings
|
import li.cil.oc.Settings
|
||||||
import li.cil.oc.common.tileentity.{TileEntityWaypoint, Waypoint}
|
import li.cil.oc.common.tileentity.{TileEntityWaypoint, Waypoint}
|
||||||
import li.cil.oc.util.BlockPosition
|
|
||||||
import li.cil.oc.util.RTree
|
import li.cil.oc.util.RTree
|
||||||
|
import net.minecraft.util.math.BlockPos
|
||||||
|
import net.minecraft.world.World
|
||||||
import net.minecraftforge.event.world.ChunkEvent
|
import net.minecraftforge.event.world.ChunkEvent
|
||||||
import net.minecraftforge.event.world.WorldEvent
|
import net.minecraftforge.event.world.WorldEvent
|
||||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
|
||||||
@ -48,8 +49,8 @@ object Waypoints {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def findWaypoints(pos: BlockPosition, range: Double): Iterable[TileEntityWaypoint] = {
|
def findWaypoints(world: World, pos: BlockPos, range: Double): Iterable[TileEntityWaypoint] = {
|
||||||
dimensions.get(pos.world.get.provider.getDimension) match {
|
dimensions.get(world.provider.getDimension) match {
|
||||||
case Some(set) =>
|
case Some(set) =>
|
||||||
val bounds = pos.bounds.expand(range * 0.5, range * 0.5, range * 0.5)
|
val bounds = pos.bounds.expand(range * 0.5, range * 0.5, range * 0.5)
|
||||||
set.query((bounds.minX, bounds.minY, bounds.minZ), (bounds.maxX, bounds.maxY, bounds.maxZ))
|
set.query((bounds.minX, bounds.minY, bounds.minZ), (bounds.maxX, bounds.maxY, bounds.maxZ))
|
||||||
|
@ -147,8 +147,8 @@ object Audio {
|
|||||||
checkALError()
|
checkALError()
|
||||||
|
|
||||||
AL10.alSource3f(source, AL10.AL_POSITION, x, y, z)
|
AL10.alSource3f(source, AL10.AL_POSITION, x, y, z)
|
||||||
AL10.alSourcef(source, AL10.AL_REFERENCE_DISTANCE, maxDistance)
|
AL10.alSourcef(source, AL10.AL_REFERENCE_DISTANCE, maxDistance.toFloat)
|
||||||
AL10.alSourcef(source, AL10.AL_MAX_DISTANCE, maxDistance)
|
AL10.alSourcef(source, AL10.AL_MAX_DISTANCE, maxDistance.toFloat)
|
||||||
AL10.alSourcef(source, AL10.AL_GAIN, gain * 0.3f)
|
AL10.alSourcef(source, AL10.AL_GAIN, gain * 0.3f)
|
||||||
checkALError()
|
checkALError()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user