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 d7424db6b..7019a7131 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -93,7 +93,7 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra def disassemble(stack: ItemStack, instant: Boolean = false) { // Validate the item, never trust Minecraft / other Mods on anything! - if (stack != null && isItemValidForSlot(0, stack)) { + if (isItemValidForSlot(0, stack)) { val ingredients = ItemUtils.getIngredients(stack) DisassemblerTemplates.select(stack) match { case Some(template) => @@ -158,8 +158,11 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override def getInventoryStackLimit = 64 override def isItemValidForSlot(i: Int, stack: ItemStack) = - ((Settings.get.disassembleAllTheThings || api.Items.get(stack) != null) && ItemUtils.getIngredients(stack).nonEmpty) || - DisassemblerTemplates.select(stack) != None + allowDisassembling(stack) && + (((Settings.get.disassembleAllTheThings || api.Items.get(stack) != null) && ItemUtils.getIngredients(stack).nonEmpty) || + DisassemblerTemplates.select(stack) != None) + + private def allowDisassembling(stack: ItemStack) = stack != null && (!stack.hasTagCompound || !stack.getTagCompound.getBoolean(Settings.namespace + "undisassemblable")) override def setInventorySlotContents(slot: Int, stack: ItemStack): Unit = { super.setInventorySlotContents(slot, stack) diff --git a/src/main/scala/li/cil/oc/server/CommandHandler.scala b/src/main/scala/li/cil/oc/server/CommandHandler.scala index 18c7dce3c..653c60c26 100644 --- a/src/main/scala/li/cil/oc/server/CommandHandler.scala +++ b/src/main/scala/li/cil/oc/server/CommandHandler.scala @@ -4,6 +4,9 @@ import cpw.mods.fml.common.event.FMLServerStartingEvent import li.cil.oc.Settings import net.minecraft.command.CommandBase import net.minecraft.command.ICommandSender +import net.minecraft.command.WrongUsageException +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.nbt.NBTTagCompound import scala.collection.convert.wrapAsJava._ import scala.collection.mutable @@ -11,6 +14,7 @@ import scala.collection.mutable object CommandHandler { def register(e: FMLServerStartingEvent) { e.registerServerCommand(WirelessRenderingCommand) + e.registerServerCommand(NonDisassemblyAgreementCommand) } // OP levels for reference: @@ -35,6 +39,39 @@ object CommandHandler { override def getRequiredPermissionLevel = 2 } + object NonDisassemblyAgreementCommand extends SimpleCommand("oc_preventDisassembling") { + aliases += "oc_nodis" + aliases += "oc_prevdis" + + override def getCommandUsage(source: ICommandSender) = name + " " + + override def processCommand(source: ICommandSender, command: Array[String]) { + source match { + case player: EntityPlayer => + val stack = player.getHeldItem + if (stack != null) { + if (!stack.hasTagCompound) { + stack.setTagCompound(new NBTTagCompound()) + } + val nbt = stack.getTagCompound + val preventDisassembly = + if (command != null && command.length > 0) + CommandBase.parseBoolean(source, command(0)) + else + !nbt.getBoolean(Settings.namespace + "undisassemblable") + if (preventDisassembly) + nbt.setBoolean(Settings.namespace + "undisassemblable", true) + else + nbt.removeTag(Settings.namespace + "undisassemblable") + if (nbt.hasNoTags) stack.setTagCompound(null) + } + case _ => throw new WrongUsageException("Can only be used by players.") + } + } + + override def getRequiredPermissionLevel = 2 + } + abstract class SimpleCommand(val name: String) extends CommandBase { protected var aliases = mutable.ListBuffer.empty[String]