mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-17 03:05:30 -04:00
Analyzer can now be used on entities, too, if they implement an appropriate interface (Analyzable, Environment), made that work for drones. Closes #773.
This commit is contained in:
parent
aed90fc804
commit
44194b6422
@ -2,6 +2,7 @@ package li.cil.oc.common.entity
|
|||||||
|
|
||||||
import cpw.mods.fml.relauncher.Side
|
import cpw.mods.fml.relauncher.Side
|
||||||
import cpw.mods.fml.relauncher.SideOnly
|
import cpw.mods.fml.relauncher.SideOnly
|
||||||
|
import li.cil.oc.Localization
|
||||||
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
|
||||||
@ -38,7 +39,7 @@ import net.minecraftforge.fluids.IFluidTank
|
|||||||
// internal.Rotatable is also in internal.Drone, but it wasn't since the start
|
// internal.Rotatable is also in internal.Drone, but it wasn't since the start
|
||||||
// so this is to ensure it is implemented here, in the very unlikely case that
|
// so this is to ensure it is implemented here, in the very unlikely case that
|
||||||
// someone decides to ship that specific version of the API.
|
// someone decides to ship that specific version of the API.
|
||||||
class Drone(val world: World) extends Entity(world) with MachineHost with internal.Drone with internal.Rotatable {
|
class Drone(val world: World) extends Entity(world) with MachineHost with internal.Drone with internal.Rotatable with Analyzable {
|
||||||
// Some basic constants.
|
// Some basic constants.
|
||||||
val gravity = 0.05f
|
val gravity = 0.05f
|
||||||
// low for slow fall (float down)
|
// low for slow fall (float down)
|
||||||
@ -138,6 +139,22 @@ class Drone(val world: World) extends Entity(world) with MachineHost with intern
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
|
override def onAnalyze(player: EntityPlayer, side: Int, hitX: Float, hitY: Float, hitZ: Float) = {
|
||||||
|
machine.lastError match {
|
||||||
|
case value if value != null =>
|
||||||
|
player.addChatMessage(Localization.Analyzer.LastError(value))
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
player.addChatMessage(Localization.Analyzer.Components(machine.componentCount, maxComponents))
|
||||||
|
val list = machine.users
|
||||||
|
if (list.size > 0) {
|
||||||
|
player.addChatMessage(Localization.Analyzer.Users(list))
|
||||||
|
}
|
||||||
|
Array(machine.node)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def cpuArchitecture = info.components.map(stack => (stack, Driver.driverFor(stack, getClass))).collectFirst {
|
override def cpuArchitecture = info.components.map(stack => (stack, Driver.driverFor(stack, getClass))).collectFirst {
|
||||||
case (stack, driver: Processor) if driver.slot(stack) == Slot.CPU => driver.architecture(stack)
|
case (stack, driver: Processor) if driver.slot(stack) == Slot.CPU => driver.architecture(stack)
|
||||||
}.orNull
|
}.orNull
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package li.cil.oc.common.item
|
package li.cil.oc.common.item
|
||||||
|
|
||||||
|
import cpw.mods.fml.common.eventhandler.SubscribeEvent
|
||||||
import li.cil.oc.Localization
|
import li.cil.oc.Localization
|
||||||
|
import li.cil.oc.api
|
||||||
import li.cil.oc.api.network.Analyzable
|
import li.cil.oc.api.network.Analyzable
|
||||||
import li.cil.oc.api.network._
|
import li.cil.oc.api.network._
|
||||||
import li.cil.oc.server.PacketSender
|
import li.cil.oc.server.PacketSender
|
||||||
@ -10,52 +12,72 @@ import net.minecraft.entity.player.EntityPlayer
|
|||||||
import net.minecraft.entity.player.EntityPlayerMP
|
import net.minecraft.entity.player.EntityPlayerMP
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraftforge.common.util.ForgeDirection
|
import net.minecraftforge.common.util.ForgeDirection
|
||||||
|
import net.minecraftforge.event.entity.player.EntityInteractEvent
|
||||||
|
|
||||||
class Analyzer(val parent: Delegator) extends Delegate {
|
object Analyzer {
|
||||||
override def onItemUse(stack: ItemStack, player: EntityPlayer, position: BlockPosition, side: Int, hitX: Float, hitY: Float, hitZ: Float) = {
|
private lazy val analyzer = api.Items.get("analyzer")
|
||||||
val world = position.world.get
|
|
||||||
player match {
|
@SubscribeEvent
|
||||||
case realPlayer: EntityPlayerMP =>
|
def onInteract(e: EntityInteractEvent): Unit = {
|
||||||
world.getTileEntity(position) match {
|
val player = e.entityPlayer
|
||||||
case analyzable: Analyzable =>
|
val held = player.getHeldItem
|
||||||
if (!world.isRemote) {
|
if (api.Items.get(held) == analyzer) {
|
||||||
analyzeNodes(analyzable.onAnalyze(realPlayer, side, hitX, hitY, hitZ), realPlayer)
|
if (analyze(e.target, player, 0, 0, 0, 0))
|
||||||
}
|
e.setCanceled(true)
|
||||||
true
|
|
||||||
case host: SidedEnvironment =>
|
|
||||||
if (!world.isRemote) {
|
|
||||||
analyzeNodes(Array(host.sidedNode(ForgeDirection.getOrientation(side))), realPlayer)
|
|
||||||
}
|
|
||||||
true
|
|
||||||
case host: Environment =>
|
|
||||||
if (!world.isRemote) {
|
|
||||||
analyzeNodes(Array(host.node), realPlayer)
|
|
||||||
}
|
|
||||||
true
|
|
||||||
case _ => super.onItemUse(stack, realPlayer, position, side, hitX, hitY, hitZ)
|
|
||||||
}
|
|
||||||
case _ => false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def analyzeNodes(nodes: Array[Node], player: EntityPlayerMP) = if (nodes != null) for (node <- nodes if node != null) {
|
def analyze(thing: AnyRef, player: EntityPlayer, side: Int, hitX: Float, hitY: Float, hitZ: Float): Boolean = {
|
||||||
node match {
|
val world = player.worldObj
|
||||||
case connector: Connector =>
|
thing match {
|
||||||
if (connector.localBufferSize > 0) {
|
case analyzable: Analyzable =>
|
||||||
player.addChatMessage(Localization.Analyzer.StoredEnergy(f"${connector.localBuffer}%.2f/${connector.localBufferSize}%.2f"))
|
if (!world.isRemote) {
|
||||||
|
analyzeNodes(analyzable.onAnalyze(player, side, hitX, hitY, hitZ), player)
|
||||||
}
|
}
|
||||||
player.addChatMessage(Localization.Analyzer.TotalEnergy(f"${connector.globalBuffer}%.2f/${connector.globalBufferSize}%.2f"))
|
true
|
||||||
|
case host: SidedEnvironment =>
|
||||||
|
if (!world.isRemote) {
|
||||||
|
analyzeNodes(Array(host.sidedNode(ForgeDirection.getOrientation(side))), player)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
case host: Environment =>
|
||||||
|
if (!world.isRemote) {
|
||||||
|
analyzeNodes(Array(host.node), player)
|
||||||
|
}
|
||||||
|
true
|
||||||
case _ =>
|
case _ =>
|
||||||
|
false
|
||||||
}
|
}
|
||||||
node match {
|
}
|
||||||
case component: Component =>
|
|
||||||
player.addChatMessage(Localization.Analyzer.ComponentName(component.name))
|
private def analyzeNodes(nodes: Array[Node], player: EntityPlayer) = if (nodes != null) for (node <- nodes if node != null) {
|
||||||
|
player match {
|
||||||
|
case playerMP: EntityPlayerMP =>
|
||||||
|
node match {
|
||||||
|
case connector: Connector =>
|
||||||
|
if (connector.localBufferSize > 0) {
|
||||||
|
playerMP.addChatMessage(Localization.Analyzer.StoredEnergy(f"${connector.localBuffer}%.2f/${connector.localBufferSize}%.2f"))
|
||||||
|
}
|
||||||
|
playerMP.addChatMessage(Localization.Analyzer.TotalEnergy(f"${connector.globalBuffer}%.2f/${connector.globalBufferSize}%.2f"))
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
node match {
|
||||||
|
case component: Component =>
|
||||||
|
playerMP.addChatMessage(Localization.Analyzer.ComponentName(component.name))
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
val address = node.address()
|
||||||
|
if (address != null && !address.isEmpty) {
|
||||||
|
playerMP.addChatMessage(Localization.Analyzer.Address(address))
|
||||||
|
PacketSender.sendAnalyze(address, playerMP)
|
||||||
|
}
|
||||||
case _ =>
|
case _ =>
|
||||||
}
|
}
|
||||||
val address = node.address()
|
}
|
||||||
if (address != null && !address.isEmpty) {
|
}
|
||||||
player.addChatMessage(Localization.Analyzer.Address(address))
|
|
||||||
PacketSender.sendAnalyze(address, player)
|
class Analyzer(val parent: Delegator) extends Delegate {
|
||||||
}
|
override def onItemUse(stack: ItemStack, player: EntityPlayer, position: BlockPosition, side: Int, hitX: Float, hitY: Float, hitZ: Float) = {
|
||||||
|
Analyzer.analyze(position.world.get.getTileEntity(position), player, side, hitX, hitY, hitZ)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ trait Delegate {
|
|||||||
type Icon = net.minecraft.util.IIcon
|
type Icon = net.minecraft.util.IIcon
|
||||||
type IconRegister = net.minecraft.client.renderer.texture.IIconRegister
|
type IconRegister = net.minecraft.client.renderer.texture.IIconRegister
|
||||||
|
|
||||||
val parent: Delegator
|
def parent: Delegator
|
||||||
|
|
||||||
def unlocalizedName = getClass.getSimpleName
|
def unlocalizedName = getClass.getSimpleName
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ import li.cil.oc.common.SaveHandler
|
|||||||
import li.cil.oc.common.asm.SimpleComponentTickHandler
|
import li.cil.oc.common.asm.SimpleComponentTickHandler
|
||||||
import li.cil.oc.common.entity.Drone
|
import li.cil.oc.common.entity.Drone
|
||||||
import li.cil.oc.common.event._
|
import li.cil.oc.common.event._
|
||||||
|
import li.cil.oc.common.item.Analyzer
|
||||||
import li.cil.oc.common.item.Tablet
|
import li.cil.oc.common.item.Tablet
|
||||||
import li.cil.oc.common.recipe.Recipes
|
import li.cil.oc.common.recipe.Recipes
|
||||||
import li.cil.oc.common.template._
|
import li.cil.oc.common.template._
|
||||||
@ -47,6 +48,7 @@ object ModOpenComputers extends ModProxy {
|
|||||||
FMLCommonHandler.instance.bus.register(SimpleComponentTickHandler.Instance)
|
FMLCommonHandler.instance.bus.register(SimpleComponentTickHandler.Instance)
|
||||||
FMLCommonHandler.instance.bus.register(Tablet)
|
FMLCommonHandler.instance.bus.register(Tablet)
|
||||||
|
|
||||||
|
MinecraftForge.EVENT_BUS.register(Analyzer)
|
||||||
MinecraftForge.EVENT_BUS.register(AngelUpgradeHandler)
|
MinecraftForge.EVENT_BUS.register(AngelUpgradeHandler)
|
||||||
MinecraftForge.EVENT_BUS.register(ChunkloaderUpgradeHandler)
|
MinecraftForge.EVENT_BUS.register(ChunkloaderUpgradeHandler)
|
||||||
MinecraftForge.EVENT_BUS.register(EventHandler)
|
MinecraftForge.EVENT_BUS.register(EventHandler)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user