mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-17 11:15:12 -04:00
Added debug.runCommand
, which uses the global OC fake player for executing commands. Closes #697.
This commit is contained in:
parent
dc83623ac1
commit
95d6baaa48
@ -8,13 +8,20 @@ import li.cil.oc.api.machine.Callback
|
|||||||
import li.cil.oc.api.machine.Context
|
import li.cil.oc.api.machine.Context
|
||||||
import li.cil.oc.api.network.Visibility
|
import li.cil.oc.api.network.Visibility
|
||||||
import li.cil.oc.api.prefab
|
import li.cil.oc.api.prefab
|
||||||
|
import li.cil.oc.server.component.DebugCard.CommandSender
|
||||||
|
import li.cil.oc.util.BlockPosition
|
||||||
import net.minecraft.block.Block
|
import net.minecraft.block.Block
|
||||||
|
import net.minecraft.command.ICommandSender
|
||||||
import net.minecraft.entity.player.EntityPlayerMP
|
import net.minecraft.entity.player.EntityPlayerMP
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
import net.minecraft.server.MinecraftServer
|
import net.minecraft.server.MinecraftServer
|
||||||
|
import net.minecraft.server.management.UserListOpsEntry
|
||||||
|
import net.minecraft.util.IChatComponent
|
||||||
import net.minecraft.world.World
|
import net.minecraft.world.World
|
||||||
|
import net.minecraft.world.WorldServer
|
||||||
import net.minecraft.world.WorldSettings.GameType
|
import net.minecraft.world.WorldSettings.GameType
|
||||||
import net.minecraftforge.common.DimensionManager
|
import net.minecraftforge.common.DimensionManager
|
||||||
|
import net.minecraftforge.common.util.FakePlayerFactory
|
||||||
|
|
||||||
class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment {
|
class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment {
|
||||||
override val node = Network.newNode(this, Visibility.Neighbors).
|
override val node = Network.newNode(this, Visibility.Neighbors).
|
||||||
@ -61,6 +68,14 @@ class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment {
|
|||||||
checkEnabled()
|
checkEnabled()
|
||||||
result(new DebugCard.PlayerValue(args.checkString(0)))
|
result(new DebugCard.PlayerValue(args.checkString(0)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Callback(doc = """function(command:string):number -- Runs an arbitrary command using a fake player.""")
|
||||||
|
def runCommand(context: Context, args: Arguments): Array[AnyRef] = {
|
||||||
|
val command = args.checkString(0)
|
||||||
|
val sender = new CommandSender(host)
|
||||||
|
val value = MinecraftServer.getServer.getCommandManager.executeCommand(sender, command)
|
||||||
|
result(value, sender.messages.orNull)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object DebugCard {
|
object DebugCard {
|
||||||
@ -296,4 +311,31 @@ object DebugCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CommandSender(val host: EnvironmentHost) extends ICommandSender {
|
||||||
|
val fakePlayer = FakePlayerFactory.get(host.world.asInstanceOf[WorldServer], Settings.get.fakePlayerProfile)
|
||||||
|
|
||||||
|
var messages: Option[String] = None
|
||||||
|
|
||||||
|
override def getCommandSenderName = fakePlayer.getCommandSenderName
|
||||||
|
|
||||||
|
override def getEntityWorld = host.world
|
||||||
|
|
||||||
|
override def addChatMessage(message: IChatComponent) {
|
||||||
|
messages = Option(messages.getOrElse("") + message.getUnformattedText)
|
||||||
|
}
|
||||||
|
|
||||||
|
override def canCommandSenderUseCommand(level: Int, command: String) = {
|
||||||
|
val profile = fakePlayer.getGameProfile
|
||||||
|
val server = fakePlayer.mcServer
|
||||||
|
val config = server.getConfigurationManager
|
||||||
|
config.func_152596_g(profile) && (config.func_152603_m.func_152683_b(profile) match {
|
||||||
|
case entry: UserListOpsEntry => entry.func_152644_a >= level
|
||||||
|
case _ => server.getOpPermissionLevel >= level
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
override def getPlayerCoordinates = BlockPosition(host).toChunkCoordinates
|
||||||
|
|
||||||
|
override def func_145748_c_() = fakePlayer.func_145748_c_()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package li.cil.oc.util
|
package li.cil.oc.util
|
||||||
|
|
||||||
import li.cil.oc.api.driver.EnvironmentHost
|
import li.cil.oc.api.driver.EnvironmentHost
|
||||||
|
import net.minecraft.util.ChunkCoordinates
|
||||||
import net.minecraft.world.World
|
import net.minecraft.world.World
|
||||||
import net.minecraftforge.common.util.ForgeDirection
|
import net.minecraftforge.common.util.ForgeDirection
|
||||||
|
|
||||||
@ -24,6 +25,8 @@ case class BlockPosition(x: Int, y: Int, z: Int, world: Option[World]) {
|
|||||||
z + direction.offsetZ,
|
z + direction.offsetZ,
|
||||||
world
|
world
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def toChunkCoordinates = new ChunkCoordinates(x, y, z)
|
||||||
}
|
}
|
||||||
|
|
||||||
object BlockPosition {
|
object BlockPosition {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user