diff --git a/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java b/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java index 650423abe..60c523925 100644 --- a/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java +++ b/forge/forge_common/net/minecraft/src/forge/ForgeHooks.java @@ -209,6 +209,70 @@ public class ForgeHooks } static LinkedList entityInteractHandlers = new LinkedList(); + public static String onServerChat(EntityPlayer player, String message) + { + for (IChatHandler handler : chatHandlers) + { + message = handler.onServerChat(player, message); + if (message == null) + { + return null; + } + } + return message; + } + + public static boolean onChatCommand(EntityPlayer player, boolean isOp, String command) + { + for (IChatHandler handler : chatHandlers) + { + if (handler.onChatCommand(player, isOp, command)) + { + return true; + } + } + return false; + } + + public static boolean onServerCommand(Object listener, String username, String command) + { + for (IChatHandler handler : chatHandlers) + { + if (handler.onServerCommand(listener, username, command)) + { + return true; + } + } + return false; + } + + public static String onServerCommandSay(Object listener, String username, String message) + { + for (IChatHandler handler : chatHandlers) + { + message = handler.onServerCommandSay(listener, username, message); + if (message == null) + { + return null; + } + } + return message; + } + + public static String onClientChatRecv(String message) + { + for (IChatHandler handler : chatHandlers) + { + message = handler.onClientChatRecv(message); + if (message == null) + { + return null; + } + } + return message; + } + static LinkedList chatHandlers = new LinkedList(); + // Plant Management // ------------------------------------------------------------ static class ProbableItem diff --git a/forge/forge_common/net/minecraft/src/forge/IChatHandler.java b/forge/forge_common/net/minecraft/src/forge/IChatHandler.java new file mode 100644 index 000000000..10cf5b17d --- /dev/null +++ b/forge/forge_common/net/minecraft/src/forge/IChatHandler.java @@ -0,0 +1,76 @@ +package net.minecraft.src.forge; + +import net.minecraft.src.EntityPlayer; + +public interface IChatHandler +{ + /** + * Called when a player sends a normal chat message to the server, + * you can manipulate the message parameter by returning a modified + * version from this function. + * + * This is only called on the server side. + * + * @param player The player issuing the message + * @param message The message the player is sending + * @return The message to be displayed, normal case is the 'message' parameter. Return null to cancel displaying this message. + */ + public String onServerChat(EntityPlayer player, String message); + + /** + * Called when a player sends a normal chat message to the server + * that starts with a '/'. + * + * This is only called on the server side. + * + * Return true from this function to indicate that you have + * handled the command and no further processing is necessary. + * + * @param player The player trying to issue the command + * @param isOp True if the player is on the Op list + * @param command The command trying to be issued + * @return True if no further processing is necessary, false to continue processing. + */ + public boolean onChatCommand(EntityPlayer player, boolean isOp, String command); + + /** + * Called when either the console or a player issues a / command that is not handled elsewhere. + * + * This is only called on the server side. + * + * Return true from this function to indicate that you have + * handled the command and no further processing is necessary. + * + * The listener will always be a instance of ICommandListener, but because the client does + * not have this class it is defined as a Object to allow client compilation. + * + * @param listener The source of the command, will always be a instance of ICommandListener + * @param username The username of the person issuing the command, 'CONSOLE' if it's not a player. + * @param command The command trying to be issued + * @return True if no further processing is necessary, false to continue processing. + */ + public boolean onServerCommand(Object listener, String username, String command); + + /** + * + * Called when either the console or a player issues the /say command + * + * This is only called on the server side. + * + * @param listener The source of the command, will always be a instance of ICommandListener + * @param username The username of the person issuing the command, 'CONSOLE' if it's not a player. + * @param message The message trying to be sent, without the /say + * @return The message to be displayed, normal case is the 'message' parameter. Return null to cancel displaying this message. + */ + public String onServerCommandSay(Object listener, String username, String message); + + /** + * Called when the client receives a Chat packet. + * + * This is only called on the client side + * + * @param message The chat message received + * @return The message to be displayed, normal case is the 'message' parameter. Return null to cancel displaying this message. + */ + public String onClientChatRecv(String message); +} diff --git a/forge/forge_common/net/minecraft/src/forge/MinecraftForge.java b/forge/forge_common/net/minecraft/src/forge/MinecraftForge.java index c9586f16d..8975b5be9 100755 --- a/forge/forge_common/net/minecraft/src/forge/MinecraftForge.java +++ b/forge/forge_common/net/minecraft/src/forge/MinecraftForge.java @@ -120,6 +120,15 @@ public class MinecraftForge ForgeHooks.entityInteractHandlers.add(handler); } + /** + * Registers a new chat handler. + * @param handler The Handler to be registered + */ + public static void registerChatHandler(IChatHandler handler) + { + ForgeHooks.chatHandlers.add(handler); + } + /** * This is not supposed to be called outside of Minecraft internals. */ diff --git a/forge/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch b/forge/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch index 0c4706528..31fab91a0 100644 --- a/forge/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch +++ b/forge/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch @@ -50,7 +50,22 @@ ModLoader.serverLogin(this, par1Packet1Login); } -@@ -675,7 +704,19 @@ +@@ -587,8 +616,12 @@ + + public void handleChat(Packet3Chat par1Packet3Chat) + { +- this.mc.ingameGUI.addChatMessage(par1Packet3Chat.message); +- ModLoader.serverChat(par1Packet3Chat.message); ++ par1Packet3Chat.message = ForgeHooks.onClientChatRecv(par1Packet3Chat.message); ++ if (par1Packet3Chat.message != null) ++ { ++ this.mc.ingameGUI.addChatMessage(par1Packet3Chat.message); ++ ModLoader.serverChat(par1Packet3Chat.message); ++ } + } + + public void handleAnimation(Packet18Animation par1Packet18Animation) +@@ -675,7 +708,19 @@ } else if (par1Packet2Handshake.username.equals("-")) { @@ -71,7 +86,7 @@ } else { -@@ -688,7 +729,19 @@ +@@ -688,7 +733,19 @@ if (var6.equalsIgnoreCase("ok")) { @@ -92,7 +107,7 @@ } else { -@@ -1156,5 +1209,40 @@ +@@ -1156,5 +1213,40 @@ public void handleCustomPayload(Packet250CustomPayload var1) { ModLoader.receivePacket(var1); diff --git a/forge/patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch b/forge/patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch index 1e5d950f6..c5e9cc18a 100644 --- a/forge/patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch +++ b/forge/patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch @@ -1,14 +1,15 @@ --- ../src_base/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java 0000-00-00 00:00:00.000000000 -0000 +++ ../src_work/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -4,6 +4,7 @@ +@@ -4,6 +4,8 @@ import java.util.Set; import java.util.logging.Logger; import net.minecraft.server.MinecraftServer; +import net.minecraft.src.forge.DimensionManager; ++import net.minecraft.src.forge.ForgeHooks; public class ConsoleCommandHandler { -@@ -52,9 +53,9 @@ +@@ -52,9 +54,9 @@ var5.savePlayerStates(); } @@ -20,7 +21,7 @@ boolean var8 = var7.levelSaving; var7.levelSaving = false; var7.saveWorld(true, (IProgressUpdate)null); -@@ -67,20 +68,18 @@ +@@ -67,20 +69,18 @@ { this.sendNoticeToOps(var4, "Disabling level saving.."); @@ -45,7 +46,7 @@ } } else -@@ -356,20 +355,18 @@ +@@ -356,20 +356,18 @@ if ("add".equalsIgnoreCase(var20)) { @@ -70,7 +71,22 @@ } this.sendNoticeToOps(var4, "Set time to " + var18); -@@ -414,7 +411,7 @@ +@@ -387,8 +385,12 @@ + else if (var2.toLowerCase().startsWith("say ")) + { + var2 = var2.substring(var2.indexOf(" ")).trim(); +- minecraftLogger.info("[" + var4 + "] " + var2); +- var5.sendPacketToAllPlayers(new Packet3Chat("\u00a7d[Server] " + var2)); ++ var2 = ForgeHooks.onServerCommandSay(var3, var3.getUsername(), var2); ++ if (var2 != null) ++ { ++ minecraftLogger.info("[" + var4 + "] " + var2); ++ var5.sendPacketToAllPlayers(new Packet3Chat("\u00a7d[Server] " + var2)); ++ } + } + else if (var2.toLowerCase().startsWith("tell ")) + { +@@ -414,7 +416,7 @@ } else if (var2.toLowerCase().startsWith("toggledownfall")) { @@ -79,3 +95,14 @@ var3.log("Toggling rain and snow, hold on..."); } else if (var2.toLowerCase().startsWith("banlist")) +@@ -433,6 +435,10 @@ + var3.log("Ban list:" + this.func_40648_a(this.minecraftServer.getBannedPlayersList(), ", ")); + } + } ++ else if (ForgeHooks.onServerCommand(var3, var3.getUsername(), var2)) ++ { ++ //Nom Nom Nom, Do we need to log anything, Let the command handle it themselves. ++ } + else + { + minecraftLogger.info("Unknown console command. Type \"help\" for help."); diff --git a/forge/patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch b/forge/patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch index b6dced1a4..eb766e254 100644 --- a/forge/patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch +++ b/forge/patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch @@ -1,15 +1,16 @@ --- ../src_base/minecraft_server/net/minecraft/src/NetServerHandler.java 0000-00-00 00:00:00.000000000 -0000 +++ ../src_work/minecraft_server/net/minecraft/src/NetServerHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -4,6 +4,8 @@ +@@ -4,6 +4,9 @@ import java.util.Random; import java.util.logging.Logger; import net.minecraft.server.MinecraftServer; ++import net.minecraft.src.forge.ForgeHooks; +import net.minecraft.src.forge.MessageManager; +import java.io.UnsupportedEncodingException; public class NetServerHandler extends NetHandler implements ICommandListener { -@@ -372,8 +374,11 @@ +@@ -372,8 +375,11 @@ double var10 = this.playerEntity.posY - ((double)var6 + 0.5D) + 1.5D; double var12 = this.playerEntity.posZ - ((double)var7 + 0.5D); double var14 = var8 * var8 + var10 * var10 + var12 * var12; @@ -22,7 +23,7 @@ { return; } -@@ -465,8 +470,9 @@ +@@ -465,8 +471,9 @@ { var12 = var11; } @@ -34,7 +35,35 @@ { this.playerEntity.itemInWorldManager.activeBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8); } -@@ -764,9 +770,10 @@ +@@ -597,9 +604,13 @@ + } + else + { +- var2 = "<" + this.playerEntity.username + "> " + var2; +- logger.info(var2); +- this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat(var2)); ++ var2 = ForgeHooks.onServerChat(playerEntity, var2); ++ if (var2 != null) ++ { ++ var2 = "<" + this.playerEntity.username + "> " + var2; ++ logger.info(var2); ++ this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat(var2)); ++ } + } + + this.field_45001_m += 20; +@@ -647,6 +658,10 @@ + { + logger.info("ModLoaderMP : " + this.playerEntity.username + " issued command: " + par1Str.substring(1)); + } ++ else if (ForgeHooks.onChatCommand(this.playerEntity, this.mcServer.configManager.isOp(playerEntity.username), par1Str.substring(1))) ++ { ++ logger.info("Forge: " + playerEntity.username + " issues command: " + par1Str.substring(1)); ++ } + else + { + String var3; +@@ -764,9 +779,10 @@ */ public void handleRespawn(Packet9Respawn par1Packet9Respawn) { @@ -46,7 +75,7 @@ } else { -@@ -775,7 +782,7 @@ +@@ -775,7 +791,7 @@ return; } @@ -55,7 +84,7 @@ } } -@@ -965,4 +972,49 @@ +@@ -965,4 +981,49 @@ { this.playerEntity.capabilities.isFlying = par1Packet202PlayerAbilities.field_50005_b && this.playerEntity.capabilities.allowFlying; }