Jump to content

[Share] XML based color engine


Recommended Posts

Since i started to practice with XML parsing heres my 1st try its tested and working fine on Gracia CT2.4.

 

### Eclipse Workspace Patch 1.0
#P L2J-DataPack
Index: data/CustomColor.xml
===================================================================
--- data/CustomColor.xml	(revision 0)
+++ data/CustomColor.xml	(revision 0)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<list>
+	<PvPColorList pvpCount = "1" pvpColorId = "FFFFFF" />
+	<PvPColorList pvpCount = "1000" pvpColorId = "FF9933" />
+	<PkColorList pkCount = "1" pkColorId = "FFFF77" />
+	<PkColorList pkCount = "1000" pkColorId = "FF9933" />
+</list>
\ No newline at end of file
#P L2J-GameServer
Index: java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java	(revision 228)
+++ java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java	(working copy)
@@ -26,6 +26,7 @@
import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager;
import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
import com.l2jserver.gameserver.datatables.CharSchemesTable;
+import com.l2jserver.gameserver.datatables.CustomColorTable;
import com.l2jserver.gameserver.datatables.CustomSkillTable;
import com.l2jserver.gameserver.datatables.GMSkillTable;
import com.l2jserver.gameserver.datatables.GmListTable;
@@ -190,16 +191,17 @@
				GMSkillTable.getInstance().addSkills(activeChar);
		}

-		/*if(activeChar.getPvpKills() > 0) 
+		if (activeChar.getPvpKills() > 0)
		{
-			int nameColor = Integer.decode("0x" + ColorNameManager.getInstance().getColor(activeChar.getPvpKills(), true));
-			activeChar.getAppearance().setNameColor(nameColor);
+			int pvpColor = Integer.decode("0x" + CustomColorTable.getCustomPvpColor(activeChar.getPvpKills()));
+			activeChar.getAppearance().setNameColor(pvpColor);
		}
-		if(activeChar.getPkKills() > 0) 
+		
+		if (activeChar.getPkKills() > 0)
		{
-			int nameColor = Integer.decode("0x" + ColorNameManager.getInstance().getColor(activeChar.getPkKills(), false));
-			activeChar.getAppearance().setTitleColor(nameColor);
-		}*/
+			int pkColor = Integer.decode("0x" + CustomColorTable.getCustomPvpColor(activeChar.getPkKills()));
+			activeChar.getAppearance().setTitleColor(pkColor);
+		}

		if (Config.CUSTOM_SKILL_TABLE_ENABLED)
			if (activeChar.getPvpKills() >= Config.PVP_SKILL_REWARD)
Index: java/com/l2jserver/gameserver/datatables/CustomColorTable.java
===================================================================
--- java/com/l2jserver/gameserver/datatables/CustomColorTable.java	(revision 0)
+++ java/com/l2jserver/gameserver/datatables/CustomColorTable.java	(revision 0)
@@ -0,0 +1,172 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 com.l2jserver.gameserver.datatables;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import javolution.util.FastMap;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.Config;
+
+/**
+ * @author Intrepid
+ *
+ */
+public class CustomColorTable
+{
+	private static final Logger _log = Logger.getLogger(CustomColorTable.class.getName());
+	private static FastMap<Integer, String> _pvpcolors;
+	private static FastMap<Integer, String> _pkcolors;
+	
+	/**
+	 * 
+	 * @return or initialize new instance
+	 */
+	public static CustomColorTable getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	/**
+	 * Read XML data from CustomColor.xml
+	 */
+	private CustomColorTable()
+	{
+		_pvpcolors = new FastMap<Integer, String>();
+		_pkcolors = new FastMap<Integer, String>();
+		
+		File colorFile = new File(Config.DATAPACK_ROOT, "data/CustomColor.xml");
+		Document doc = null;
+		try
+		{
+			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+			dbf.setIgnoringComments(true);
+			dbf.setValidating(false);
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			doc = db.parse(colorFile);
+			
+			for (Node root = doc.getFirstChild(); root != null; root = root.getNextSibling())
+			{
+				if ("list".equalsIgnoreCase(root.getNodeName()))
+				{
+					for (Node child = root.getFirstChild(); child != null; child = child.getNextSibling())
+					{
+						if ("PvPColorList".equalsIgnoreCase(child.getNodeName()))
+						{
+							int pvpCount;
+							String pvpcolorId;
+							Node attr;
+							NamedNodeMap attrs = child.getAttributes();
+							
+							attr = attrs.getNamedItem("pvpCount");
+							if (attr == null)
+							{
+								_log.warning("CustomColorTable: missing pvpCount!");
+								continue;
+							}
+							pvpCount = Integer.parseInt(attr.getNodeValue());
+							
+							pvpcolorId = attrs.getNamedItem("pvpColorId").getNodeValue();
+							
+							_pvpcolors.put(pvpCount, pvpcolorId);
+							_log.info("Loaded: " + _pvpcolors.size() + " pvp color ");
+						}
+						if ("PkColorList".equalsIgnoreCase(child.getNodeName()))
+						{
+							int pkCount;
+							String pkcolorId;
+							Node attr;
+							NamedNodeMap attrs = child.getAttributes();
+							
+							attr = attrs.getNamedItem("pkCount");
+							if (attr == null)
+							{
+								_log.warning("CustomColorTable: missing pkCount!");
+								continue;
+							}
+							pkCount = Integer.parseInt(attr.getNodeValue());
+							
+							pkcolorId = attrs.getNamedItem("pkColorId").getNodeValue();
+							
+							_pkcolors.put(pkCount, pkcolorId);
+							_log.info("Loaded: " + _pkcolors.size() + " pk color ");
+						}
+					}
+				}
+			}
+		}
+		catch(IOException ioe)
+		{
+			_log.log(Level.WARNING,"Cannot find the file: " + colorFile + "on place:" + colorFile.getAbsolutePath(), ioe);
+		}
+		catch (Exception e)
+		{
+			_log.log(Level.WARNING,"Error occured while parsing: " + colorFile, e);
+		}
+	}
+	
+	/**
+	 * 
+	 * @param pvpColor
+	 * @return
+	 */
+	public static String getCustomPvpColor(int pvpkill)
+	{
+		return _pvpcolors.get(getValueBefore(pvpkill, _pvpcolors.keySet()));
+	}
+	
+	/**
+	 * 
+	 * @param pkColor
+	 * @return
+	 */
+	public static String getCustomPkColor(int pkkill)
+	{
+		return _pkcolors.get(getValueBefore(pkkill, _pkcolors.keySet()));
+	}
+	
+	/**
+	 * Will return the value just before the given value contained
+	 * in the provided Set of integers
+	 * @param value
+	 * @param set
+	 * @return the value just before the provided one
+	 */
+	private static int getValueBefore(int value, Set<Integer> set)
+	{
+		int counter = 0;
+		for(int i : set)
+			if(i > counter && value > i)
+				counter = i;
+		return counter;
+	}
+	
+	@SuppressWarnings("synthetic-access")
+	private static class SingletonHolder
+	{
+		protected static final CustomColorTable _instance = new CustomColorTable();
+	}
+}
Index: java/com/l2jserver/gameserver/GameServer.java
===================================================================
--- java/com/l2jserver/gameserver/GameServer.java	(revision 228)
+++ java/com/l2jserver/gameserver/GameServer.java	(working copy)
@@ -45,6 +45,7 @@
import com.l2jserver.gameserver.datatables.CharSchemesTable;
import com.l2jserver.gameserver.datatables.CharTemplateTable;
import com.l2jserver.gameserver.datatables.ClanTable;
+import com.l2jserver.gameserver.datatables.CustomColorTable;
import com.l2jserver.gameserver.datatables.CustomSkillTable;
import com.l2jserver.gameserver.datatables.DoorTable;
import com.l2jserver.gameserver.datatables.EnchantGroupsTable;
@@ -430,6 +431,7 @@
		}
		if (Config.CUSTOM_SKILL_TABLE_ENABLED)
			CustomSkillTable.getInstance();
+		CustomColorTable.getInstance();
		HideAndSeekDataParser.getData();
		if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
			OfflineTradersTable.restoreOfflineTraders();

 

In the XML file 1 is necessary to use! Color updated on enterworld.

 

Credits to me(and B1ggBoss's share for the getValueBefore method)

Link to comment
Share on other sites

  • 4 months later...

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
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.



×
×
  • Create New...