Posted May 8, 20169 yr Essentially what I'm trying to do is create a GUI that can send vanilla commands and display the results of the commands. Here's what I've tried: Minecraft.getMinecraft().thePlayer.sendChatMessage(command) doesn't work because that sends the results of the commands to the GuiChat , not my custom GuiScreen . ClientCommandHandler.instance.executeCommand(commandSender, command) doesn't work because CommandHandler 's commandMap is empty, implying normal commands aren't sent that way. In answers for 1.8 and before, people have said to use MinecraftServer.getServer().getCommandManager().executeCommand(commandSender, command) , but in 1.9 getServer() is not static. Minecraft.getMinecraft().thePlayer.getServer().getCommandManager().executeCommand(commandSender, command) also doesn't work because Minecraft.getMinecraft().thePlayer.getServer() is null. I've ran out of ideas other than creating a new EntityPlayerSP and having that send commands, but I don't think that would work very well—if at all—and it's not a very elegant solution. So, how can I either send commands with a custom ICommandSender or intercept/copy the text sent to the player if I use Minecraft.getMinecraft().thePlayer.sendChatMessage(command) ?
May 9, 20169 yr Send a packet to the server with the information required to execute the command. This includes the command and some way to identify the ICommandSender you want to use. On the server, get the MinecraftServer instance from the sending player's World ( World#getMinecraftServer ) and then use its ICommandManager to execute the command. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
May 9, 20169 yr Author Send a packet to the server with the information required to execute the command. This includes the command and some way to identify the ICommandSender you want to use. As far as I can tell, there is no way to directly do this. On the server, get the MinecraftServer instance from the sending player's World ( World#getMinecraftServer ) and then use its ICommandManager to execute the command. That has the same problem as Minecraft.getMinecraft().thePlayer.getServer() : the server is null. Minecraft.getMinecraft().getNetHandler().addToSendQueue(new CPacketChatMessage("/help")) will execute a command. This behaves exactly as if the player had typed it in chat: if they do not have permission they will receive an error. That is just a more low-level way of saying Minecraft.getMinecraft().thePlayer.sendChatMessage(command) , which doesn't work because that sends the results of the commands to the GuiChat, not my custom GuiScreen. I'm going to see how command blocks handle it; they might have what I'm looking for.
May 9, 20169 yr Send a packet to the server with the information required to execute the command. This includes the command and some way to identify the ICommandSender you want to use. As far as I can tell, there is no way to directly do this. Use a custom packet. On the server, get the MinecraftServer instance from the sending player's World ( World#getMinecraftServer ) and then use its ICommandManager to execute the command. That has the same problem as Minecraft.getMinecraft().thePlayer.getServer() : the server is null. It should never return null on a server-side World . I'm going to see how command blocks handle it; they might have what I'm looking for. GuiCommandBlock#actionPerformed sends a CPacketCustomPayload with the command and either the command block position or minecart entity ID. The server-side handler then retrieves the TileEntity or Entity from this data and saves the changes. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
May 9, 20169 yr Author I've figured out that Minecraft.getMinecraft().getIntegratedServer() works in singleplayer. Because I don't really intend for this to be a server mod, I think I'll just make it not work but not crash when attempting to execute a command on a server: MinecraftServer server = Minecraft.getMinecraft().getIntegratedServer(); if(server == null) { parent.parent.out.println("You cannot run vanilla commands on a server!"); } else { server.getCommandManager().executeCommand(parent, command); } Thanks anyways for the help, Choonster and diesieben!
May 9, 20169 yr Author This is a really bad idea. Executing server commands from the client thread will cause all kinds of problems. Pardon my ignorance, but isn't that what I'm doing with Minecraft.getMinecraft()[b].getIntegratedServer()[/b].getCommandManager().executeCommand(parent, command) ? And if there is not integrated server (i.e. I'm in multiplayer), I don't even attempt to run the command.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.