Jump to content

Recommended Posts

Posted

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)

  • 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.



  • Posts

    • Added: 🎁 Seasonal Bonus System When the seasonal bonus is enabled, players receive additional bonus coins equal to bonus_season_percent of their donation amount. 💡 How it works (example): A player donates through their personal account and immediately receives regular coins. At the same time, bonus coins equal to 30% of the donation are credited. Example: Donation: 1000 coins → Bonus: 300 coins (30%) These bonus coins are not available immediately — they can be claimed later when the next season begins. 📅 When the bonus can be claimed: bonus_season_claim_start_date – the date when the "Claim" button becomes available. bonus_season_claim_end_date – the date after which the bonus can no longer be claimed. During this time window, the "Claim" button will appear in the personal account, allowing players to collect their accumulated bonus. 'bonus_season_enabled' => true, // Enable/disable the seasonal bonus system 'bonus_season_percent' => 30, // Percentage of the donation to be given as bonus coins (30 = 30%) 'bonus_season_claim_start_date' => '2025-07-30 00:00:00', // Date when the Claim button becomes available in the new season   'bonus_season_enabled' => true, // Вкл./Выкл Сезонную бонусную систему? 'bonus_season_percent' => 30, // Процент, при донате получает монеты в процентах 30 = 30%, которые может использовать в следующем открытии 'bonus_season_claim_start_date' => '2025-07-30 00:00:00', // Дата когда доступна кнопка Claim в новом сезоне 'bonus_season_claim_end_date' => '2025-08-15 20:00:00', // Дата окончания когда кнопка Claim в новом сезоне
    • Discord         :  utchiha_market Telegram        : https://t.me/utchiha_market  
    • HELLO EVERYONE. WE ARE SELLING A LOT OF ADENA ON L2 REBORN DISCORD - GODDARDSHOP   HURRY TO BUY OR YOU MAY NOT MAKE IT!!!
    • you can find the extender at GX-EXT Discord! http://prntscr.com/coUwKnD4Zs_w https://l2servers.com.ar/   @GX-Ext
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock