Jump to content

[1.9] Execute command with custom ICommandSender


Recommended Posts

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)

?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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!

  • Thanks 1
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Unfortunately, you probably won't get any help with your problem here, since this is the Forge forums. As it says in the FAQ that you presumably read before posting, "We only support Forge here. We cannot help you with Fabric, Spigot, etc..." Forge and Fabric are completely different and run by different people, so it's unlikely (to say the least) that anyone here will be willing or able to assist with a Fabric problem. I'd recommend joining the Fabric Discord Server that's linked on the Fabric website. They might be able to help you there. I'd also recommend notifying the developers of whatever mod you're using. 
    • From what I've found, you can only manipulate the player's motion on the client side. It's extremely annoying. If you know how to use packets, you can use packets to transfer the information from the server. Take a look at my implementation on GitHub here if you want. You'd want something similar to the way I've done the PlayerAddVelocityPacket. Unfortunately, packets are rather complex; I'd recommend you watch a few tutorials on them before even trying to work with them. Feel free to use my code as a reference, but please give attribution if you plan to directly copy it.
    • I’m truly grateful for the service of the Fastfund Cryptocurrency Recovery Team. I never would have imagined that I could recover my stolen bitcoins and regain access to my wallet after losing everything to a fake investment platform. It’s truly amazing the kind of service Fastfund Recovery provides, I was able to recover all that was stolen from me within 72 hours, Fastfund Recovery offers top-notch services and is very professional indeed. If you ever doubt the recovery of cryptocurrency once it is lost, I suggest you rethink and research more before losing hope. So many victims of cryptocurrencconcluded that it is impossible to recover their funds. SpyWall is here to provide that service for you. I highly recommend their services to everyone who wishes to recover any cryptocurrency Fastfund Recovery can be contacted via their E-mail address: Fastfundrecovery8 (At) gmail com. Telegram: (at)fastfundsrecovery I’m truly grateful for their service and work ethics.
    • At CAPTAIN WEBGENESIS, They stand behind their commitment to provide unmatched expertise, cutting-edge technology, and ethical practices for crypto recovery. Your trust to Captain WebGenesis means everything, and they are dedicated to staying up-to-date with the latest advancements in the field. By entrusting your crypto recovery needs to Captain WebGenesis, you can rest assured that your assets are in capable hands, ready to be recovered and restored. Their proven track record of success and focus on transparency and client communication set us apart as the gold standard in the industry. 
    • DINASTI555 WEBSITE TERPERCAYA GACOR ANTI BONCOS TRIK BERMAIN PASTI MENANG BESAR     ↓DAFTAR & LOGIN↓  Dinasti555 satu satu nya website gacor anti boncos 100% jika kalah modal di kembali kan 100% kedalam akun tanpa ribet , Dinasti555 juga merupakan website terperaya dari tahun 2022-2024 pasti withdraw berapapun kemenangan member di bayar seutuh nya , di mana lagi nyari situs seperti Dinasti555 yang telah teruji klinis oleh pihak PAGGCOR. Berikut Dinasti555 memberikan bocoran trik pola gacor pasti wd ga akan boncos : ⚠️ BOLEH BUYSPIN JIKA FEELING SEDANG BAGUS. ⚠️ GANTI GAME LAIN JIKA TIDAK BAGUS. ⚠️ INI HANYA BERSIFAT REKOMENDASI ‼️ ---------------------------------------------------- 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 Pola Pancingan RTP kemenangan mingguan 88 - 97% : 🥇 Spin Manual 20x 🥈 Spin Turbo 30x 🥉 Spin Cepat 20x Jika belum dapat FREESPIN, Boleh Langsung buy FITUR ( Bet 200, 400, 800, 1200 - Sesuaikan dengan keadaan saldo ) Salam JP 💎
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.