One of my biggest beefs about hMod was how it handled onChat. None of the plugins could interact with each other. Bukkit looks like it'll solve it sort of. Right now, you've got an event object that all plugin now interact with. Awesome since now people can edit the player and message object that's passed into it. That's~ about it though. We have an output message and a player object that I'm assuming will be formated as such: <player.getName> message Oh joys. 90% of plugins that hook onChat want to skin the entire message or at least, not edit that part of the message. That won't do. Bukkit is rather simple right now, inDev and all, but here's my take on it. My first idea was to have a global format string defined in the config and plugins can register their arguments into it. Adding a new plugin could mess up that order, and you don't want every bit of information flowing in for each line. Edit: Or do you? Now that I reflect on it a bit most things could get by with this. Still, you'd want some inGame editing to the order of things. Next up comes the method where you insert the format string in the event directly for plugins to interact with. Problem here is that each plugin would have to deal with a relative path. This would then force the admin to order the plugins (or at least their importance) carefully. You also still have to incorporate those would want to make channels, or only let select people view what he/she said. Truthfully, channels without client side work makes it crap, but we'll have to make do. Anyways, even if we pass a list of players for the plugins to decide what get's sent to who, we could still end up with plugins fighting over messages (the focus of a players output). The only way to fix that is to move all channel related stuff into the server itself (ahhhh fuck). Loathing as that might be, it's how most games work normally (but MC was never designed for bigness). You could also just leave it and either one focus based plugin or have channels need prefixed command calls instead (/talk #bukkit Blah blah blah / .local chat powah!). This is probably simplest since most of the smaller server's don't need channels. The alternative is that we just make a collossal mess of one chat plugin that does everything. __________________________ Now we come to the section where I post pointless code. PHP: // CraftBukkit start PlayerChatEvent event = new PlayerChatEvent(Type.PLAYER_CHAT, player, s, server.getOnlinePlayers()); server.getPluginManager().callEvent(event); s = MessageFormat.format(event.getFormat(), event.getFormatArgs()); for (Player receivingPlayer : event.getReceivingPlayers()) receivingPlayer.sendMessage(s); //s = (new StringBuilder()).append("<").append(event.getPlayer().getName()).append("> ").append(event.getMessage()).toString(); // CraftBukkit stop a.info(event.getLogString()); //d.f.a(new Packet3Chat(s)); PHP: public class PlayerChatEvent extends PlayerEvent implements Cancellable { private boolean cancel = false; private String message, format, logString; private List<Player> receivingPlayers; private ArrayList<String> formatArgs; public PlayerChatEvent(final Type type, final Player player, final String message) { super(type, player); this.message = message; } public PlayerChatEvent(final Type type, final Player player, final String message, Player[] receivingPlayers) { super(type, player); this.message = message; this.setLogString("<" + player.getName() + "> " + message); this.setReceivingPlayers(Arrays.asList(receivingPlayers)); this.addFormatArg(player.getName()); this.addFormatArg(message); this.format = "<{0}> {1}"; } PHP: // Plugin// Could also return the ChatCall instance as well.public void onChat(ChatCall cc) { // Simple message string replacement. cc.setMessage(cc.getMessage().replaceAll("monkeys", "gorrilas")); // Change the skin completely cc.setFormat("{0}: {1}"); // Insert a value into the format eg: "[HP: 20] Player: blarg" boolean result = cc.insertIntoFormat( cc.getFormat().indexOf("{0}"), "[HP: {"+cc.getNextFormatArgIndex()+"}] "); if (result) cc.addFormatArg((String)player.getHealth()); // Send to only allies (aka remove everyone else) for (int i = cc.getRecievers().size(); i >= 0; i--) { Player player = cc.getRecievers().get(i); if (!guildPluginVariableThingy.isAlly(cc.talker, player)) cc.removeReciever(i); } // Send to only allies (aka get online allies from plugin) cc.setRecievers(guildPluginVariableThingy.getOnlineAllies(cc.talker));} PS: I doubt that code is runnable. Disreguard the ChatCall class thing. I sketched up that code before I found the chat call in craftbucket and it's related event.
Interesting problem. From a programing point of view, I love to see this get solved. I dare not attempt it myself though, not enough experience/knowlege yet.
We are considering letting plugins pass a formatstring to define how to display the message, but it might get a little messy. In addition, Players will have a .getDisplayName() and appropriate functions to define how a name should display in chat and various places.