From 3b96f1ff6d2dde8100f5f30602a63a659fc2040e Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sat, 11 Jul 2015 20:09:34 +0300 Subject: [PATCH 1/4] Add Netsplitter to RU lang --- .../assets/opencomputers/doc/ru_RU/block/index.md | 3 ++- .../assets/opencomputers/doc/ru_RU/block/netSplitter.md | 7 +++++++ src/main/resources/assets/opencomputers/lang/ru_RU.lang | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md index 0a412c466..e7f37a7b5 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md @@ -23,7 +23,6 @@ ### Расширения * [Адаптер](adapter.md) -* [Кабель](cable.md) * [Геоанализатор](geolyzer.md) * [Датчик движения](motionSensor.md) * [Редстоун I/O](redstone.md) @@ -38,6 +37,8 @@ ## Сеть * [Точка доступа](accessPoint.md) +* [Кабель](cable.md) +* [Сетевой сплиттер](netSplitter.md) * [Коммутатор](switch.md) ## Управление питанием diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md new file mode 100644 index 000000000..13a1efa6f --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md @@ -0,0 +1,7 @@ +# Сетевой переключатель/сплиттер (KVM) + +![*.net *.split](oredict:oc:netSplitter) + +Сетевой переключатель/сплиттер позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны может быть переключено с помощью [ключа](../item/wrench.md). Когда редстоун сигнал подается на сетевой переключатель/сплиттер, соединения всех сторон инвертируются. + +Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя/сплиттера. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 1f3d94450..638931644 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -36,6 +36,7 @@ tile.oc.screen2.name=Монитор (2-ой уровень) tile.oc.screen3.name=Монитор (3-ий уровень) tile.oc.serverRack.name=Серверная стойка tile.oc.switch.name=Коммутатор +tile.oc.netSplitter.name=Сетевой переключатель/сплиттер tile.oc.waypoint.name=Путевая точка # Items @@ -330,6 +331,7 @@ oc:tooltip.TabletCase=Простой корпус для планшета. По oc:tooltip.Terminal=Позволяет дистанционно управлять сервером, пока вы находитесь в радиусе его действия. Действует как портативный дисплей с клавиатурой.[nl] Shift+ПКМ по серверу в стойке для привязки к нему терминала. oc:tooltip.TexturePicker=Простой инструмент, позволяющий узнать название текстуры блока, которое можно использовать в 3D печати. oc:tooltip.Tier=§8Уровень %s +oc:tooltip.NetSplitter=Работает как активных коннектор. Соединение каждой из сторон может быть переключено с помощью ключа. При подаче редстоун сигнала, все соединения инвертируются. oc:tooltip.TooLong=Удерживайте [§f%s§7], чтобы отобразить описание. oc:tooltip.Transistor=Базовый элемент для других частей компьютера. Он немного деформирован, но отлично выполняет свою работу. oc:tooltip.UpgradeAngel=Позволяет роботам размещать блоки в воздухе, даже если отсутствует точка опоры. From c3958ff6429a1e8f981ce0b91c9ad8e0ca1e5bb1 Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sat, 11 Jul 2015 20:12:11 +0300 Subject: [PATCH 2/4] Correction --- .../resources/assets/opencomputers/doc/ru_RU/block/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md index e7f37a7b5..16169b6c5 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md @@ -38,7 +38,7 @@ ## Сеть * [Точка доступа](accessPoint.md) * [Кабель](cable.md) -* [Сетевой сплиттер](netSplitter.md) +* [Сетевой переключатель/сплиттер](netSplitter.md) * [Коммутатор](switch.md) ## Управление питанием From dd46e54cbd60e1b0af9ed0917543dc0ab6224332 Mon Sep 17 00:00:00 2001 From: cyber01 Date: Sat, 11 Jul 2015 20:28:06 +0300 Subject: [PATCH 3/4] Correction2 --- .../resources/assets/opencomputers/doc/ru_RU/block/index.md | 2 +- .../assets/opencomputers/doc/ru_RU/block/netSplitter.md | 6 +++--- src/main/resources/assets/opencomputers/lang/ru_RU.lang | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md index 16169b6c5..5a8833c46 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md @@ -38,7 +38,7 @@ ## Сеть * [Точка доступа](accessPoint.md) * [Кабель](cable.md) -* [Сетевой переключатель/сплиттер](netSplitter.md) +* [Сетевой переключатель](netSplitter.md) * [Коммутатор](switch.md) ## Управление питанием diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md index 13a1efa6f..78a3ed03a 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/netSplitter.md @@ -1,7 +1,7 @@ -# Сетевой переключатель/сплиттер (KVM) +# Сетевой переключатель ![*.net *.split](oredict:oc:netSplitter) -Сетевой переключатель/сплиттер позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны может быть переключено с помощью [ключа](../item/wrench.md). Когда редстоун сигнал подается на сетевой переключатель/сплиттер, соединения всех сторон инвертируются. +Сетевой переключатель позволяет контролировать соединение между подсетями. В отличие от [коммутатора](switch.md) или [конвертера энергии](powerConverter.md) позволяет непосредственно соединить подсети, делая при этом доступными все компоненты. Соединение каждой стороны переключается [ключем](../item/wrench.md). При подаче сигнала красного камня все соединения инвертируются. -Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя/сплиттера. \ No newline at end of file +Таким образом, этот блок может быть использован для переключения соединения определенных компонентов сети. Используйте [редстоун I/O](redstone.md) или [редстоун карты](../item/redstoneCard1.md) для автоматизации сетевого переключателя. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 638931644..658abedaf 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -36,7 +36,7 @@ tile.oc.screen2.name=Монитор (2-ой уровень) tile.oc.screen3.name=Монитор (3-ий уровень) tile.oc.serverRack.name=Серверная стойка tile.oc.switch.name=Коммутатор -tile.oc.netSplitter.name=Сетевой переключатель/сплиттер +tile.oc.netSplitter.name=Сетевой переключатель tile.oc.waypoint.name=Путевая точка # Items @@ -331,7 +331,7 @@ oc:tooltip.TabletCase=Простой корпус для планшета. По oc:tooltip.Terminal=Позволяет дистанционно управлять сервером, пока вы находитесь в радиусе его действия. Действует как портативный дисплей с клавиатурой.[nl] Shift+ПКМ по серверу в стойке для привязки к нему терминала. oc:tooltip.TexturePicker=Простой инструмент, позволяющий узнать название текстуры блока, которое можно использовать в 3D печати. oc:tooltip.Tier=§8Уровень %s -oc:tooltip.NetSplitter=Работает как активных коннектор. Соединение каждой из сторон может быть переключено с помощью ключа. При подаче редстоун сигнала, все соединения инвертируются. +oc:tooltip.NetSplitter=Работает как переключатель. Соединение каждой стороны переключается ключем. При подаче сигнала красного камня все соединения инвертируются. oc:tooltip.TooLong=Удерживайте [§f%s§7], чтобы отобразить описание. oc:tooltip.Transistor=Базовый элемент для других частей компьютера. Он немного деформирован, но отлично выполняет свою работу. oc:tooltip.UpgradeAngel=Позволяет роботам размещать блоки в воздухе, даже если отсутствует точка опоры. From 5c8572ba379ce0bc0ba2be0d47eab0da32aebb67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 11 Jul 2015 22:48:41 +0200 Subject: [PATCH 4/4] Added command to spawn a creative computer with the basic stuff built-in. Closes #1289. --- .../oc/common/tileentity/Disassembler.scala | 6 +- .../oc/server/command/CommandHandler.scala | 3 +- .../server/command/SpawnComputerCommand.scala | 72 +++++++++++++++++++ .../scala/li/cil/oc/util/InventoryUtils.scala | 4 +- 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index 78121cbb2..59771ccce 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -36,7 +36,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra var disassembleNextInstantly = false - def progress = if (queue.isEmpty) 0 else (1 - (queue.size * Settings.get.disassemblerItemCost - buffer) / totalRequiredEnergy) * 100 + def progress = if (queue.isEmpty) 0.0 else (1 - (queue.size * Settings.get.disassemblerItemCost - buffer) / totalRequiredEnergy) * 100 private def setActive(value: Boolean) = if (value != isActive) { isActive = value @@ -113,7 +113,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra private def drop(stack: ItemStack) { if (stack != null) { for (side <- ForgeDirection.VALID_DIRECTIONS if stack.stackSize > 0) { - InventoryUtils.insertIntoInventoryAt(stack, BlockPosition(this).offset(side), side.getOpposite) + InventoryUtils.insertIntoInventoryAt(stack, BlockPosition(this).offset(side), Some(side.getOpposite)) } if (stack.stackSize > 0) { spawnStackInWorld(stack, Option(ForgeDirection.UP)) @@ -160,7 +160,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override def isItemValidForSlot(i: Int, stack: ItemStack) = allowDisassembling(stack) && (((Settings.get.disassembleAllTheThings || api.Items.get(stack) != null) && ItemUtils.getIngredients(stack).nonEmpty) || - DisassemblerTemplates.select(stack) != None) + DisassemblerTemplates.select(stack).isDefined) private def allowDisassembling(stack: ItemStack) = stack != null && (!stack.hasTagCompound || !stack.getTagCompound.getBoolean(Settings.namespace + "undisassemblable")) diff --git a/src/main/scala/li/cil/oc/server/command/CommandHandler.scala b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala index 0e2763b1b..0c70c60fe 100644 --- a/src/main/scala/li/cil/oc/server/command/CommandHandler.scala +++ b/src/main/scala/li/cil/oc/server/command/CommandHandler.scala @@ -4,7 +4,8 @@ import cpw.mods.fml.common.event.FMLServerStartingEvent object CommandHandler { def register(e: FMLServerStartingEvent) { - e.registerServerCommand(WirelessRenderingCommand) e.registerServerCommand(NonDisassemblyAgreementCommand) + e.registerServerCommand(WirelessRenderingCommand) + e.registerServerCommand(SpawnComputerCommand) } } diff --git a/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala new file mode 100644 index 000000000..690e47056 --- /dev/null +++ b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala @@ -0,0 +1,72 @@ +package li.cil.oc.server.command + +import li.cil.oc.Constants +import li.cil.oc.api +import li.cil.oc.common.command.SimpleCommand +import li.cil.oc.common.tileentity +import li.cil.oc.util.BlockPosition +import li.cil.oc.util.ExtendedWorld._ +import li.cil.oc.util.InventoryUtils +import net.minecraft.command.ICommandSender +import net.minecraft.command.WrongUsageException +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.util.ChatComponentText +import net.minecraft.util.MovingObjectPosition +import net.minecraft.util.Vec3 +import net.minecraftforge.common.util.ForgeDirection + +object SpawnComputerCommand extends SimpleCommand("oc_spawnComputer") { + aliases += "oc_sc" + + final val MaxDistance = 16 + + override def getCommandUsage(source: ICommandSender): String = name + + override def processCommand(source: ICommandSender, command: Array[String]) { + source match { + case player: EntityPlayer => + val world = player.getEntityWorld + val origin = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight, player.posZ) + val direction = player.getLookVec + val lookAt = origin.addVector(direction.xCoord * MaxDistance, direction.yCoord * MaxDistance, direction.zCoord * MaxDistance) + world.rayTraceBlocks(origin, lookAt) match { + case hit: MovingObjectPosition if hit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK => + val hitPos = BlockPosition(hit.blockX, hit.blockY, hit.blockZ, world) + val casePos = hitPos.offset(ForgeDirection.getOrientation(hit.sideHit)) + val screenPos = casePos.offset(ForgeDirection.UP) + val keyboardPos = screenPos.offset(ForgeDirection.UP) + + if (!world.isAirBlock(casePos) || !world.isAirBlock(screenPos) || !world.isAirBlock(keyboardPos)) { + player.addChatMessage(new ChatComponentText("Target position obstructed.")) + return + } + + world.setBlock(casePos, api.Items.get(Constants.BlockName.CaseCreative).block()) + world.setBlock(screenPos, api.Items.get(Constants.BlockName.ScreenTier2).block()) + world.setBlock(keyboardPos, api.Items.get(Constants.BlockName.Keyboard).block()) + world.getTileEntity(keyboardPos) match { + case t: tileentity.traits.Rotatable => t.setFromFacing(ForgeDirection.UP) + case _ => // ??? + } + + api.Network.joinOrCreateNetwork(world.getTileEntity(casePos)) + + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.APUCreative).createItemStack(1), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.RAMTier6).createItemStack(2), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.HDDTier3).createItemStack(1), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.LuaBios).createItemStack(1), casePos) + InventoryUtils.insertIntoInventoryAt(api.Items.get(Constants.ItemName.OpenOS).createItemStack(1), casePos) + case _ => player.addChatMessage(new ChatComponentText("You need to be looking at a nearby block.")) + } + case _ => throw new WrongUsageException("Can only be used by players.") + } + } + + // OP levels for reference: + // 1 - Ops can bypass spawn protection. + // 2 - Ops can use /clear, /difficulty, /effect, /gamemode, /gamerule, /give, /summon, /setblock and /tp, and can edit command blocks. + // 3 - Ops can use /ban, /deop, /kick, and /op. + // 4 - Ops can use /stop. + + override def getRequiredPermissionLevel = 2 +} diff --git a/src/main/scala/li/cil/oc/util/InventoryUtils.scala b/src/main/scala/li/cil/oc/util/InventoryUtils.scala index 8a51f0d70..951498bd9 100644 --- a/src/main/scala/li/cil/oc/util/InventoryUtils.scala +++ b/src/main/scala/li/cil/oc/util/InventoryUtils.scala @@ -211,8 +211,8 @@ object InventoryUtils { * Utility method for calling insertIntoInventory on an inventory * in the world. */ - def insertIntoInventoryAt(stack: ItemStack, position: BlockPosition, side: ForgeDirection, limit: Int = 64, simulate: Boolean = false): Boolean = - inventoryAt(position).exists(insertIntoInventory(stack, _, Option(side), limit, simulate)) + def insertIntoInventoryAt(stack: ItemStack, position: BlockPosition, side: Option[ForgeDirection] = None, limit: Int = 64, simulate: Boolean = false): Boolean = + inventoryAt(position).exists(insertIntoInventory(stack, _, side, limit, simulate)) /** * Utility method for calling extractFromInventory on an inventory