From 9652cd9dd2c5908b5fd9dc04fb93425d79c451fa Mon Sep 17 00:00:00 2001
From: Zoey76 <zoey_76@msn.com>
Date: Mon, 1 Apr 2013 12:17:49 +0000
Subject: [PATCH] BETA: Dynamic translation system. 	* Adds server
 real-time translation system for player chats. 	* See this feature in
 action and upcoming full community board: http://youtu.be/EDti9WKPBC0 	
 * Recommended quality HD/Full screen.

---
 .../handlers/chathandlers/ChatAll.java        |  2 +-
 .../handlers/chathandlers/ChatAlliance.java   |  2 +-
 .../chathandlers/ChatBattlefield.java         |  2 +-
 .../handlers/chathandlers/ChatClan.java       |  2 +-
 .../handlers/chathandlers/ChatHeroVoice.java  |  2 +-
 .../handlers/chathandlers/ChatParty.java      |  2 +-
 .../chathandlers/ChatPartyMatchRoom.java      |  2 +-
 .../chathandlers/ChatPartyRoomAll.java        |  2 +-
 .../chathandlers/ChatPartyRoomCommander.java  |  2 +-
 .../handlers/chathandlers/ChatPetition.java   |  2 +-
 .../handlers/chathandlers/ChatShout.java      |  2 +-
 .../handlers/chathandlers/ChatTell.java       |  2 +-
 .../handlers/chathandlers/ChatTrade.java      |  2 +-
 .../chathandlers/ChatTranslationTool.java     | 63 +++++++++++++++++++
 14 files changed, 76 insertions(+), 13 deletions(-)
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTranslationTool.java

diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAll.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAll.java
index 4d52ef79ab..75519e52ad 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAll.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAll.java
@@ -104,7 +104,7 @@ public class ChatAll implements IChatHandler
 			}
 			else
 			{
-				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getAppearance().getVisibleName(), text);
+				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getAppearance().getVisibleName(), ChatTranslationTool.traslate(text));
 				Collection<L2PcInstance> plrs = activeChar.getKnownList().getKnownPlayers().values();
 				for (L2PcInstance player : plrs)
 				{
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAlliance.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAlliance.java
index 02199326af..c6acf9e27c 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAlliance.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatAlliance.java
@@ -46,7 +46,7 @@ public class ChatAlliance implements IChatHandler
 				return;
 			}
 			
-			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 			activeChar.getClan().broadcastToOnlineAllyMembers(cs);
 		}
 	}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatBattlefield.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatBattlefield.java
index 2f99e8db07..bc89861e4d 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatBattlefield.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatBattlefield.java
@@ -52,7 +52,7 @@ public class ChatBattlefield implements IChatHandler
 				return;
 			}
 			
-			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 			for (L2PcInstance player : L2World.getInstance().getAllPlayersArray())
 			{
 				if (player.getSiegeSide() == activeChar.getSiegeSide())
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatClan.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatClan.java
index 21b01fd52f..5bfebecb25 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatClan.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatClan.java
@@ -50,7 +50,7 @@ public class ChatClan implements IChatHandler
 				return;
 			}
 			
-			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 			activeChar.getClan().broadcastCSToOnlineMembers(cs, activeChar);
 		}
 	}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatHeroVoice.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatHeroVoice.java
index 625f5ca099..e6b7c9c63f 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatHeroVoice.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatHeroVoice.java
@@ -58,8 +58,8 @@ public class ChatHeroVoice implements IChatHandler
 				activeChar.sendMessage("Action failed. Heroes are only able to speak in the global channel once every 10 seconds.");
 				return;
 			}
-			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
 			
+			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 			for (L2PcInstance player : L2World.getInstance().getAllPlayersArray())
 			{
 				if ((player != null) && !BlockList.isBlocked(player, activeChar))
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatParty.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatParty.java
index 269f67eae6..210df190dd 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatParty.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatParty.java
@@ -50,7 +50,7 @@ public class ChatParty implements IChatHandler
 				return;
 			}
 			
-			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+			CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 			activeChar.getParty().broadcastCreatureSay(cs, activeChar);
 		}
 	}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyMatchRoom.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyMatchRoom.java
index 272da61c22..fd810dc8fd 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyMatchRoom.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyMatchRoom.java
@@ -55,7 +55,7 @@ public class ChatPartyMatchRoom implements IChatHandler
 					return;
 				}
 				
-				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 				for (L2PcInstance _member : _room.getPartyMembers())
 				{
 					_member.sendPacket(cs);
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomAll.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomAll.java
index d8dcf5eb9d..e0b891b274 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomAll.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomAll.java
@@ -52,7 +52,7 @@ public class ChatPartyRoomAll implements IChatHandler
 					return;
 				}
 				
-				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 				activeChar.getParty().getCommandChannel().broadcastCreatureSay(cs, activeChar);
 			}
 		}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomCommander.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomCommander.java
index 955bf826e0..87477370d7 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomCommander.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPartyRoomCommander.java
@@ -52,7 +52,7 @@ public class ChatPartyRoomCommander implements IChatHandler
 					return;
 				}
 				
-				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+				CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 				activeChar.getParty().getCommandChannel().broadcastCreatureSay(cs, activeChar);
 			}
 		}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPetition.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPetition.java
index 7e3d0f1166..3dd64c0ef8 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPetition.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatPetition.java
@@ -55,7 +55,7 @@ public class ChatPetition implements IChatHandler
 			return;
 		}
 		
-		PetitionManager.getInstance().sendActivePetitionMessage(activeChar, text);
+		PetitionManager.getInstance().sendActivePetitionMessage(activeChar, ChatTranslationTool.traslate(text));
 	}
 	
 	/**
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatShout.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatShout.java
index 62c0aeb6a3..7a3746c405 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatShout.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatShout.java
@@ -52,7 +52,7 @@ public class ChatShout implements IChatHandler
 			return;
 		}
 		
-		CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+		CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 		
 		L2PcInstance[] pls = L2World.getInstance().getAllPlayersArray();
 		
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTell.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTell.java
index 023442f6e6..7c5d8d678a 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTell.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTell.java
@@ -63,7 +63,7 @@ public class ChatTell implements IChatHandler
 			return;
 		}
 		
-		CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+		CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 		L2PcInstance receiver = null;
 		
 		receiver = L2World.getInstance().getPlayer(target);
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTrade.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTrade.java
index 1a30ca11d7..59dbc2f7e8 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTrade.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTrade.java
@@ -52,7 +52,7 @@ public class ChatTrade implements IChatHandler
 			return;
 		}
 		
-		CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
+		CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), ChatTranslationTool.traslate(text));
 		
 		L2PcInstance[] pls = L2World.getInstance().getAllPlayersArray();
 		
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTranslationTool.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTranslationTool.java
new file mode 100644
index 0000000000..96fde80d50
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/chathandlers/ChatTranslationTool.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2004-2013 L2J DataPack
+ * 
+ * This file is part of L2J DataPack.
+ * 
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package handlers.chathandlers;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.l2jserver.util.Rnd;
+
+/**
+ * Translation tool.
+ * @author Zoey76
+ */
+public class ChatTranslationTool
+{
+	private static final List<Character> TRANSLATION_TABLE = Arrays.asList('@', '8', '(', '9', '3', 'F', '6', 'h', '|', 'j', 'k', 'L', 'm', 'n', '0', 'p', 'q', 'R', '$', '7', 'u', 'v', 'W', '%', 'y', 'z');
+	
+	protected static String traslate(String text)
+	{
+		final StringBuilder result = new StringBuilder(text.length() + 10);
+		Character x;
+		for (char c : text.toCharArray())
+		{
+			x = getChar(c);
+			if (Character.isLetter(x) && Rnd.nextBoolean())
+			{
+				x = Character.isUpperCase(x) ? Character.toLowerCase(x) : Character.toUpperCase(x);
+			}
+			result.append(x);
+		}
+		return result.toString();
+	}
+	
+	private static final Character getChar(char c)
+	{
+		int index = -1;
+		if ((c > 96) && (c < 123))
+		{
+			index = c - 97;
+		}
+		else if ((c > 64) && (c < 91))
+		{
+			index = c - 65;
+		}
+		return index < 0 ? c : TRANSLATION_TABLE.get(index);
+	}
+}
\ No newline at end of file
-- 
GitLab