diff --git a/src/main/scala/li/cil/oc/common/entity/Drone.scala b/src/main/scala/li/cil/oc/common/entity/Drone.scala index bd98acc98..6adbfd408 100644 --- a/src/main/scala/li/cil/oc/common/entity/Drone.scala +++ b/src/main/scala/li/cil/oc/common/entity/Drone.scala @@ -26,7 +26,6 @@ import net.minecraft.entity.item.EntityItem import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound -import net.minecraft.util.AxisAlignedBB import net.minecraft.util.MovingObjectPosition import net.minecraft.util.Vec3 import net.minecraft.world.World diff --git a/src/main/scala/li/cil/oc/server/component/Drone.scala b/src/main/scala/li/cil/oc/server/component/Drone.scala index 9395addce..97c504b25 100644 --- a/src/main/scala/li/cil/oc/server/component/Drone.scala +++ b/src/main/scala/li/cil/oc/server/component/Drone.scala @@ -8,6 +8,7 @@ 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.BlockPosition import li.cil.oc.util.ExtendedArguments._ import li.cil.oc.util.InventoryUtils import net.minecraft.entity.item.EntityItem @@ -45,6 +46,8 @@ class Drone(val host: entity.Drone) extends prefab.ManagedEnvironment with trait override protected def checkSideForAction(args: Arguments, n: Int) = args.checkSide(n, ForgeDirection.VALID_DIRECTIONS: _*) + override protected def suckableItems(side: ForgeDirection) = entitiesInBlock(BlockPosition(host)) ++ super.suckableItems(side) + override protected def onSuckCollect(entity: EntityItem) = { world.playSoundAtEntity(host, "random.pop", 0.2f, ((world.rand.nextFloat - world.rand.nextFloat) * 0.7f + 1) * 2) InventoryUtils.insertIntoInventory(entity.getEntityItem, inventory, slots = Option(insertionSlots)) @@ -52,6 +55,8 @@ class Drone(val host: entity.Drone) extends prefab.ManagedEnvironment with trait // ----------------------------------------------------------------------- // + // ----------------------------------------------------------------------- // + @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 @@ -67,10 +72,15 @@ class Drone(val host: entity.Drone) extends prefab.ManagedEnvironment with trait def getOffset(context: Context, args: Arguments): Array[AnyRef] = result(host.getDistance(host.targetX, host.targetY, host.targetZ)) - @Callback(doc = "function():number -- Get the current velocity.") + @Callback(doc = "function():number -- Get the current velocity in m/s.") def getVelocity(context: Context, args: Arguments): Array[AnyRef] = result(math.sqrt(host.motionX * host.motionX + host.motionY * host.motionY + host.motionZ * host.motionZ) * 20) // per second + @Callback(doc = "function():number -- Get the maximum velocity, in m/s.") + def getMaxVelocity(context: Context, args: Arguments): Array[AnyRef] = { + result(host.maxVelocity * 20) // per second + } + @Callback(doc = "function():number -- Get the currently set acceleration.") def getAcceleration(context: Context, args: Arguments): Array[AnyRef] = { result(host.targetAcceleration * 20) // per second diff --git a/src/main/scala/li/cil/oc/server/component/traits/InventoryWorldInterop.scala b/src/main/scala/li/cil/oc/server/component/traits/InventoryWorldInterop.scala index b89277d5f..e0db7343e 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/InventoryWorldInterop.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/InventoryWorldInterop.scala @@ -11,6 +11,7 @@ import li.cil.oc.util.InventoryUtils import li.cil.oc.util.ResultWrapper.result import net.minecraft.entity.item.EntityItem import net.minecraft.item.ItemBlock +import net.minecraftforge.common.util.ForgeDirection trait InventoryWorldInterop extends InventoryAware with WorldAware with SideRestricted { @Callback @@ -74,7 +75,7 @@ trait InventoryWorldInterop extends InventoryAware with WorldAware with SideRest result(true) } else { - for (entity <- entitiesOnSide[EntityItem](facing) if !entity.isDead && entity.delayBeforeCanPickup <= 0) { + for (entity <- suckableItems(facing) if !entity.isDead && entity.delayBeforeCanPickup <= 0) { val stack = entity.getEntityItem val size = stack.stackSize onSuckCollect(entity) @@ -87,5 +88,7 @@ trait InventoryWorldInterop extends InventoryAware with WorldAware with SideRest } } + protected def suckableItems(side: ForgeDirection) = entitiesOnSide[EntityItem](side) + protected def onSuckCollect(entity: EntityItem): Unit = entity.onCollideWithPlayer(fakePlayer) }