From c66ecb0f1e08e92ea92c8e3aa145b909d0b87968 Mon Sep 17 00:00:00 2001 From: Johannes Lohrer Date: Wed, 18 Dec 2013 23:31:35 +0100 Subject: [PATCH] created locator made components use context instead of owner --- assets/opencomputers/lang/de_DE.lang | 1 + assets/opencomputers/lang/en_US.lang | 2 + li/cil/oc/CraftingHandler.scala | 25 ++++++++++- li/cil/oc/Items.scala | 2 + li/cil/oc/Recipes.scala | 6 ++- li/cil/oc/common/Proxy.scala | 1 + li/cil/oc/common/item/Locator.scala | 28 ++++++++++++ li/cil/oc/server/component/Locator.scala | 50 ++++++++++++++++++++++ li/cil/oc/server/component/Reader.scala | 50 +++++++++++----------- li/cil/oc/server/driver/item/Locator.scala | 28 ++++++++++++ li/cil/oc/util/RotationHelper.scala | 18 ++++++++ 11 files changed, 182 insertions(+), 29 deletions(-) create mode 100644 li/cil/oc/common/item/Locator.scala create mode 100644 li/cil/oc/server/component/Locator.scala create mode 100644 li/cil/oc/server/driver/item/Locator.scala create mode 100644 li/cil/oc/util/RotationHelper.scala diff --git a/assets/opencomputers/lang/de_DE.lang b/assets/opencomputers/lang/de_DE.lang index 629ed0661..bf47e5239 100644 --- a/assets/opencomputers/lang/de_DE.lang +++ b/assets/opencomputers/lang/de_DE.lang @@ -91,6 +91,7 @@ oc:tooltip.Generator=Kann verwendet werden um unterwegs Energie aus Brennstoffen oc:tooltip.GraphicsCard=Erlaubt es den angezeigten Inhalt von Bildschirmen zu ändern.[nl] Höchstauflösung: §f%sx%s§7.[nl] Maximale Farbtiefe: §f%s§7.[nl] Operationen/Tick: §f%s§7. oc:tooltip.IronNugget=Ein Nugget das aus Eisen besteht, darum wird es ja auch Eisennugget genannt, duh... oc:tooltip.Keyboard=Kann an Bildschirmen befestigt werden um auf ihnen zu tippen. +oc:tooltip.Locator=Kann benutzt werden um die Position des Robters zu bestimmen. Die Position ist relativ zur Mitte der Karte, die im Locator verbaut wurde. oc:tooltip.Memory=Braucht ein jeder Computer um zu starten. Je mehr vorhanden, desto komplexere Programme können ausgeführt werden. oc:tooltip.Microchip=Tritt auch unter dem Alias Integrierter Schaltkreis auf. Keine Ahnung warum das auch mit Redstone klappt, aber es funktioniert. oc:tooltip.NetworkCard=Erlaubt es Computern die über mehrere Blöcke miteinander verbunden sind (z.B. Kabel) mittels Netzwerknachrichten zu kommunizieren. diff --git a/assets/opencomputers/lang/en_US.lang b/assets/opencomputers/lang/en_US.lang index c35d26d61..0a08e3f16 100644 --- a/assets/opencomputers/lang/en_US.lang +++ b/assets/opencomputers/lang/en_US.lang @@ -42,6 +42,7 @@ oc:item.GraphicsCard2.name=Superior Graphics Card oc:item.Acid.name=Grog oc:item.HardDiskDrive.name=Hard Disk Drive oc:item.IronNugget.name=Iron Nugget +oc:item.Locator.name=Locator oc:item.Memory.name=Memory oc:item.Microchip0.name=Simple Microchip oc:item.Microchip1.name=Advanced Microchip @@ -96,6 +97,7 @@ oc:tooltip.Generator=Can be used to generate energy from fuel on the go. Burns i oc:tooltip.GraphicsCard=Used to change what's displayed on screens.[nl] Maximum resolution: §f%sx%s§7.[nl] Maximum color depth: §f%s§7.[nl] Operations/tick: §f%s§7. oc:tooltip.IronNugget=A nugget made of iron, that's why it's called an Iron Nugget, duh... oc:tooltip.Keyboard=Can be attached to screens to allow typing on them. +oc:tooltip.Locator=Can be used to identify the position of the Robot. The position is relative to the center of the Map that is built in to the Locator. oc:tooltip.Memory=Required to get computers to run. The more you have, the more complex the programs you can run. oc:tooltip.Microchip=The chip formerly known as Integrated Circuit. I have no idea why this works with redstone, but it does. oc:tooltip.NetworkCard=Allows distant computers connected by other blocks (such as cable) to communicate by sending messages to each other. diff --git a/li/cil/oc/CraftingHandler.scala b/li/cil/oc/CraftingHandler.scala index 0cae3fa15..06379d1d6 100644 --- a/li/cil/oc/CraftingHandler.scala +++ b/li/cil/oc/CraftingHandler.scala @@ -3,7 +3,10 @@ package li.cil.oc import cpw.mods.fml.common.ICraftingHandler import net.minecraft.entity.player.EntityPlayer import net.minecraft.inventory.IInventory -import net.minecraft.item.{Item, ItemStack} +import net.minecraft.item.{ItemMap, Item, ItemStack} +import net.minecraftforge.oredict.OreDictionary +import net.minecraft.world.storage.MapInfo +import li.cil.oc.server.driver.Registry object CraftingHandler extends ICraftingHandler { override def onCrafting(player: EntityPlayer, craftedStack: ItemStack, inventory: IInventory) = { @@ -28,6 +31,26 @@ object CraftingHandler extends ICraftingHandler { } } } + if (!player.getEntityWorld.isRemote&&craftedStack.isItemEqual(Items.locator.createItemStack())) { + for (i <- 0 to inventory.getSizeInventory) { + val stack = inventory.getStackInSlot(i) + if(stack != null && stack.getItem== Item.map) + { + var map = stack.getItem.asInstanceOf[ItemMap] + val info = map.getMapData(stack, player.getEntityWorld) + + val nbt = Registry.driverFor(craftedStack) match { + case Some(driver)=>driver.dataTag(craftedStack) + case _ => null + } + nbt.setInteger(Settings.namespace +"xCenter",info.xCenter) + nbt.setInteger(Settings.namespace +"xCenter",info.zCenter) + nbt.setInteger(Settings.namespace +"scale",128*(1< MCTileEntity, TileEntitySign, TileEntityFurnace} +import scala.Some +import li.cil.oc.common.tileentity.Rotatable +import li.cil.oc.util.RotationHelper + +class Locator(val owner: MCTileEntity, val xCenter: Int, val zCenter: Int,val scale:Int) extends ManagedComponent { + val node = api.Network.newNode(this, Visibility.Network). + withComponent("locator", Visibility.Neighbors). + + create() + + @LuaCallback("getPosition") + def getPosition(context: RobotContext, args: Arguments): Array[AnyRef] = { + val player = context.player() + println("start: "+xCenter+","+zCenter) + val x = player.posX.floor.toInt + val z = player.posZ.floor.toInt + println("curr: "+x+","+z) + val xDist = x - xCenter + val zDist = z - zCenter + + if (math.abs(xDist) <= scale/2 && math.abs(zDist) <= scale/2) + result(xDist, zDist) + else + result(Unit, "out of range") + } + @LuaCallback("getFacing") + def getFacing(context: RobotContext, args: Arguments): Array[AnyRef] = { + val player = context.player() + val d = RotationHelper.fromYaw(player.rotationYaw) + + result(d.offsetX,d.offsetY,d.offsetZ) + } + + // ----------------------------------------------------------------------- // + + override val canUpdate = false + + + // ----------------------------------------------------------------------- // + +} diff --git a/li/cil/oc/server/component/Reader.scala b/li/cil/oc/server/component/Reader.scala index edc283fc5..7c0dee065 100644 --- a/li/cil/oc/server/component/Reader.scala +++ b/li/cil/oc/server/component/Reader.scala @@ -9,6 +9,9 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.tileentity.{TileEntity => MCTileEntity, TileEntitySign, TileEntityFurnace} import scala.Some import li.cil.oc.common.tileentity.Rotatable +import li.cil.oc.util.RotationHelper._ +import net.minecraftforge.common.ForgeDirection +import li.cil.oc.util.RotationHelper class Reader(val owner: MCTileEntity) extends ManagedComponent { val node = api.Network.newNode(this, Visibility.Network). @@ -21,48 +24,43 @@ class Reader(val owner: MCTileEntity) extends ManagedComponent { @LuaCallback("read") def read(context: RobotContext, args: Arguments): Array[AnyRef] = { - owner match { - case rotatable: Rotatable => { - val te = rotatable.getWorldObj.getBlockTileEntity(rotatable.xCoord+rotatable.facing.offsetX,rotatable.yCoord+rotatable.facing.offsetY,rotatable.zCoord+rotatable.facing.offsetZ) - te match{ - case sign:TileEntitySign=>{ - val text = sign.signText.mkString("\n") + val player = context.player() + val d = RotationHelper.fromYaw(player.rotationYaw) + val te = player.getEntityWorld.getBlockTileEntity(player.posX.floor.toInt + d.offsetX, player.posY.floor.toInt + d.offsetY, player.posZ.floor.toInt + d.offsetZ) + te match { + case sign: TileEntitySign => { + val text = sign.signText.mkString("\n") - return result(text) - } - case _=> - } + return result(text) } case _ => } + result(Unit, "no sign") } @LuaCallback("write") - def write(context: Context, args: Arguments): Array[AnyRef] = { - owner match { - case rotatable: Rotatable => { - val te = rotatable.getWorldObj.getBlockTileEntity(rotatable.xCoord+rotatable.facing.offsetX,rotatable.yCoord+rotatable.facing.offsetY,rotatable.zCoord+rotatable.facing.offsetZ) - te match{ - case sign:TileEntitySign=>{ + def write(context: RobotContext, args: Arguments): Array[AnyRef] = { + val player = context.player() + val d = RotationHelper.fromYaw(player.rotationYaw) + val te = player.getEntityWorld.getBlockTileEntity(player.posX.floor.toInt + d.offsetX, player.posY.floor.toInt + d.offsetY, player.posZ.floor.toInt + d.offsetZ) + te match { + case sign: TileEntitySign => { val text = args.checkString(0).split("\n") - val number = Math.min(4,text.size) - for(i <-0 to number-1){ + val number = Math.min(4, text.size) + for (i <- 0 to number - 1) { var line = text(i) - if(line.size>15){ - line = line.substring(0,15) + if (line.size > 15) { + line = line.substring(0, 15) } - sign.signText(i)= line + sign.signText(i) = line } - sign.worldObj.markBlockForUpdate(rotatable.xCoord+rotatable.facing.offsetX,rotatable.yCoord+rotatable.facing.offsetY,rotatable.zCoord+rotatable.facing.offsetZ) + sign.worldObj.markBlockForUpdate(player.posX.floor.toInt + d.offsetX, player.posY.floor.toInt + d.offsetY, player.posZ.floor.toInt + d.offsetZ) return result(true) } - case _=> + case _ => } - } - case _ => - } result(Unit, "no sign") } diff --git a/li/cil/oc/server/driver/item/Locator.scala b/li/cil/oc/server/driver/item/Locator.scala new file mode 100644 index 000000000..779be9f6c --- /dev/null +++ b/li/cil/oc/server/driver/item/Locator.scala @@ -0,0 +1,28 @@ +package li.cil.oc.server.driver.item + +import li.cil.oc.{Settings, Items} +import li.cil.oc.api.driver.Slot +import li.cil.oc.server.component +import net.minecraft.item.ItemStack +import net.minecraft.tileentity.{TileEntity => MCTileEntity} +import li.cil.oc.server.driver.Registry + +object Locator extends Item { + override def worksWith(stack: ItemStack) = isOneOf(stack, Items.locator) + + override def createEnvironment(stack: ItemStack, container: MCTileEntity) ={ + val nbt = Registry.driverFor(stack) match { + case Some(driver)=>driver.dataTag(stack) + case _ => null + } + val x = if(nbt.hasKey(Settings.namespace +"xCenter")) nbt.getInteger(Settings.namespace +"xCenter") + else container.xCoord + val z = if(nbt.hasKey(Settings.namespace +"zCenter")) nbt.getInteger(Settings.namespace +"zCenter") + else container.zCoord + val scale = if(nbt.hasKey(Settings.namespace +"scale")) nbt.getInteger(Settings.namespace +"scale") + else container.zCoord + new component.Locator(container,x,z,scale) + } + + override def slot(stack: ItemStack) = Slot.Upgrade +} diff --git a/li/cil/oc/util/RotationHelper.scala b/li/cil/oc/util/RotationHelper.scala new file mode 100644 index 000000000..3ca5dfa3d --- /dev/null +++ b/li/cil/oc/util/RotationHelper.scala @@ -0,0 +1,18 @@ +package li.cil.oc.util + +import net.minecraftforge.common.ForgeDirection + + +object RotationHelper { + + def fromYaw(yaw: Float ) = { + (yaw / 360 * 4).round & 3 match { + case 0 => ForgeDirection.SOUTH + case 1 => ForgeDirection.WEST + case 2 => ForgeDirection.NORTH + case 3 => ForgeDirection.EAST + } + } + + +}