Jump to content

Handling chat in a server mod.


Chronicide

Recommended Posts

Hey everyone,

 

The part of my mod that I'm working on involves the server handling all chat messages. I want the server to receive the chat message, and decide who it should go to. Right now, as an initial proof of concept, I'm trying to have the server intercept the message and then hand deliver it to everyone with some text appended. Once I have that working, I'll focus on my logic around deciding who each message should go to. Here's what I have:

 

 public class ServerChatEventHandler 
{
@ForgeSubscribe
public void onServerChatEvent(ServerChatEvent event)
{
	EntityPlayerMP sender = event.player;

	List<EntityPlayerMP> players = MinecraftServer.getServer().getConfigurationManager().playerEntityList;
	for (EntityPlayerMP receiver : players)
	{
		receiver.sendChatToPlayer("You hear " + sender.username + " say '" + event.message);
	}
}
}

 

then in my mod class:

 

@Init
public void load(FMLInitializationEvent event)
{
proxy.registerRenderers();

MinecraftForge.EVENT_BUS.register(new ServerChatEventHandler());

}

 

This works as expected on a single player game... since I don't cancel the event, I receive the original message and the one sent by the server. When I pack up my mod and deploy it to my test server, it swallows all chat messages. I type something in chat, and it disappears.

 

Does anyone know what I'm doing wrong? My code as it is shouldn't prevent the original chat message from going through, but it does just that when used on in SMP.

 

I would appreciate any advice anyone could offer. Thanks!

 

- Scott

 

Link to comment
Share on other sites

I could be wrong, but it seems a lot like you're registering your eventhandler only on the client.

 

	
        @ServerStarting
public void serverStart(FMLServerStartingEvent event) 
{
	server = event.getServer();
	MinecraftForge.EVENT_BUS.register(new EventHookContainerClass());
}

 

In general, you should have two EventHookContainerClass, one for Clients only and one for Servers only.

 

Good luck!

Have a modding question? PM me and hopefully I'll be able to help. Good at 2d Pixel Art? We need your help!  http://www.minecraftforum.net/topic/1806355-looking-for-2d-pixel-artist/

Link to comment
Share on other sites

I have to concede my ignorance here. I tried putting that serverStart code in my mod's main class, and it didn't do anything. Where am I supposed to put that?

 

Is there any example or tutorial out there for how to properly build a mod that works both in SMP and SSP?

 

Just for the sake of clarity, I've added the following to my mod's main class:

 

private static MinecraftServer server;

@ServerStarting
public void serverStart(FMLServerStartingEvent event) 
{
 server = event.getServer();
 MinecraftForge.EVENT_BUS.register(new ServerChatEventHandler());
}

 

Link to comment
Share on other sites

What do you have inside of your ServerChatEventHandler()?

 

By the way, for the sake of time, I recommend testing the server portion of the mod by running the server in Eclipse (or whatever you're using for editing). This saves time that you would have used for compiling and stuff.

Have a modding question? PM me and hopefully I'll be able to help. Good at 2d Pixel Art? We need your help!  http://www.minecraftforum.net/topic/1806355-looking-for-2d-pixel-artist/

Link to comment
Share on other sites

I haven't changed anything in the event handler class. I just changed where I registered it.

 

public class ServerChatEventHandler 
{
@ForgeSubscribe
public void onServerChatEvent(ServerChatEvent event)
{
  EntityPlayerMP sender = event.player;
  
  List<EntityPlayerMP> players = MinecraftServer.getServer().getConfigurationManager().playerEntityList;
  for (EntityPlayerMP receiver : players)
  {
   receiver.sendChatToPlayer("You hear " + sender.username + " say '" + event.message);
  }
}
}

 

My register code (in the mod's main class... along side @PreInit, @Init, @PostInit:

 

private static MinecraftServer server;

 

@ServerStarting
public void serverStart(FMLServerStartingEvent event) 
{
  server = event.getServer();
  MinecraftForge.EVENT_BUS.register(new ServerChatEventHandler());
}

 

And not to show how slow I am, but how do I run the server in eclipse? It would be awesome not to have to compile to test the server components.

Link to comment
Share on other sites

I'll look through that code to see if there's anything obvious.

In the meantime, you can run a server in Eclipse by clicking the dropdown arrow next to the normal 'Run' green arrow in the top left and clicking 'Server'. I can't imagine how awful it would be to code servermods without that. =P

 

With the changed registration, does singleplayer still function?

Have a modding question? PM me and hopefully I'll be able to help. Good at 2d Pixel Art? We need your help!  http://www.minecraftforum.net/topic/1806355-looking-for-2d-pixel-artist/

Link to comment
Share on other sites

Zetal, I can't thank you enough. Months and months of making a small change, compiling, obfuscating, zipping, and installing my mod to test the tiny change. I can't believe how stupid I've been. Also, being able to read the console from the server allowed me to catch a bug in a utility class that prevented my chat handing event from working. Issue is resolved, and I'd have never figured it out without your help. Thanks!

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



×
×
  • Create New...

Important Information

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