Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

PvP Color

Iniciado por Swarlog, Jul 27, 2025, 12:35 AM

Tema anterior - Siguiente tema

Swarlog

CitarCORE:

Index: config/custom.properties
===================================================================
--- config/custom.properties	(revision 0)
+++ config/custom.properties	(working copy)
@@ -0,0 +1,7 @@
+#=============================================================
+#                       Custom settings
+#=============================================================
+# Enable / disable pvp features
+# Note: pvp_color.xml and pvp_reward.xml are located in "data/xml" folder
+# Default: false
+EnablePvpFeatures = false
\ No newline at end of file
Index: java/net/sf/l2j/Config.java
===================================================================
--- java/net/sf/l2j/Config.java	(revision 21)
+++ java/net/sf/l2j/Config.java	(working copy)
@@ -43,6 +43,7 @@
 	protected static final Logger _log = Logger.getLogger(Config.class.getName());
 	
 	public static final String CLANS_FILE = "./config/clans.properties";
+	public static final String CUSTOM_FILE = "./config/custom.properties";
 	public static final String EVENTS_FILE = "./config/events.properties";
 	public static final String GEOENGINE_FILE = "./config/geoengine.properties";
 	public static final String HEXID_FILE = "./config/hexid.txt";
@@ -132,6 +133,12 @@
 	public static int CH_FRONT2_FEE;
 	
 	// --------------------------------------------------
+	// Custom settings
+	// --------------------------------------------------
+	
+	public static boolean ENABLE_PVP_FEATURES;
+	
+	// --------------------------------------------------
 	// Events settings
 	// --------------------------------------------------
 	
@@ -761,6 +768,10 @@
 			CH_FRONT1_FEE = clans.getProperty("ClanHallFrontPlatformFunctionFeeLvl1", 3031);
 			CH_FRONT2_FEE = clans.getProperty("ClanHallFrontPlatformFunctionFeeLvl2", 9331);
 			
+			// Custom settings
+			ExProperties custom = load(CUSTOM_FILE);
+			ENABLE_PVP_FEATURES = custom.getProperty("EnablePvpFeatures", false);
+			
 			// Events config
 			ExProperties events = load(EVENTS_FILE);
 			ALT_OLY_START_TIME = events.getProperty("AltOlyStartTime", 18);
Index: java/net/sf/l2j/gameserver/GameServer.java
===================================================================
--- java/net/sf/l2j/gameserver/GameServer.java	(revision 21)
+++ java/net/sf/l2j/gameserver/GameServer.java	(working copy)
@@ -57,6 +57,7 @@
 import net.sf.l2j.gameserver.datatables.NpcTable;
 import net.sf.l2j.gameserver.datatables.NpcWalkerRoutesTable;
 import net.sf.l2j.gameserver.datatables.PetDataTable;
+import net.sf.l2j.gameserver.datatables.PvpFeaturesTable;
 import net.sf.l2j.gameserver.datatables.RecipeTable;
 import net.sf.l2j.gameserver.datatables.ServerMemo;
 import net.sf.l2j.gameserver.datatables.SkillTable;
@@ -200,6 +201,9 @@
 		PartyMatchRoomList.getInstance();
 		RaidBossPointsManager.getInstance();
 		
+		if (Config.ENABLE_PVP_FEATURES)
+			PvpFeaturesTable.getInstance();
+		
 		StringUtil.printSection("Community server");
 		if (Config.ENABLE_COMMUNITY_BOARD) // Forums has to be loaded before clan data
 			ForumsBBSManager.getInstance().initRoot();
Index: java/net/sf/l2j/gameserver/datatables/PvpFeaturesTable.java
===================================================================
--- java/net/sf/l2j/gameserver/datatables/PvpFeaturesTable.java	(revision 0)
+++ java/net/sf/l2j/gameserver/datatables/PvpFeaturesTable.java	(working copy)
@@ -0,0 +1,228 @@
+/*
+ * 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 net.sf.l2j.gameserver.datatables;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import net.sf.l2j.gameserver.model.holder.IntIntHolder;
+import net.sf.l2j.gameserver.templates.StatsSet;
+import net.sf.l2j.gameserver.xmlfactory.XMLDocumentFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * @author rapfersan92
+ */
+public class PvpFeaturesTable
+{
+	protected static final Logger _log = Logger.getLogger(PvpFeaturesTable.class.getName());
+	
+	private static List<PvpColor> _pvpColors;
+	private static List<PvpReward> _pvpRewards;
+	
+	public static PvpFeaturesTable getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	private static class SingletonHolder
+	{
+		protected static final PvpFeaturesTable _instance = new PvpFeaturesTable();
+	}
+	
+	protected PvpFeaturesTable()
+	{
+		_pvpColors = new ArrayList<>();
+		_pvpRewards = new ArrayList<>();
+		loadPvpColor();
+		loadPvpReward();
+	}
+	
+	public void reload()
+	{
+		_pvpColors.clear();
+		_pvpRewards.clear();
+		loadPvpColor();
+		loadPvpReward();
+	}
+	
+	private void loadPvpColor()
+	{
+		try
+		{
+			File f = new File("./data/xml/pvp_color.xml");
+			Document doc = XMLDocumentFactory.getInstance().loadDocument(f);
+			
+			Node n = doc.getFirstChild();
+			for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+			{
+				if (d.getNodeName().equalsIgnoreCase("template"))
+				{
+					NamedNodeMap attrs = d.getAttributes();
+					int pvpAmount = Integer.valueOf(attrs.getNamedItem("pvpAmount").getNodeValue());
+					int nameColor = Integer.decode("0x" + attrs.getNamedItem("nameColor").getNodeValue());
+					int titleColor = Integer.decode("0x" + attrs.getNamedItem("titleColor").getNodeValue());
+					String skills = attrs.getNamedItem("skills").getNodeValue();
+					
+					StatsSet set = new StatsSet();
+					set.set("pvpAmount", pvpAmount);
+					set.set("nameColor", nameColor);
+					set.set("titleColor", titleColor);
+					set.set("skills", skills);
+					
+					_pvpColors.add(new PvpColor(set));
+				}
+			}
+		}
+		catch (Exception e)
+		{
+			_log.warning("Exception: PvpFeaturesTable loadPvpColor: " + e);
+		}
+		
+		_log.info("PvpFeaturesTable: Loaded " + _pvpColors.size() + " color's template(s).");
+	}
+	
+	private void loadPvpReward()
+	{
+		try
+		{
+			File f = new File("./data/xml/pvp_reward.xml");
+			Document doc = XMLDocumentFactory.getInstance().loadDocument(f);
+			
+			Node n = doc.getFirstChild();
+			for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+			{
+				if (d.getNodeName().equalsIgnoreCase("template"))
+				{
+					NamedNodeMap attrs = d.getAttributes();
+					int itemId = Integer.valueOf(attrs.getNamedItem("itemId").getNodeValue());
+					int itemCount = Integer.valueOf(attrs.getNamedItem("itemCount").getNodeValue());
+					double chance = Double.valueOf(attrs.getNamedItem("chance").getNodeValue());
+					
+					StatsSet set = new StatsSet();
+					set.set("itemId", itemId);
+					set.set("itemCount", itemCount);
+					set.set("chance", chance);
+					
+					_pvpRewards.add(new PvpReward(set));
+				}
+			}
+		}
+		catch (Exception e)
+		{
+			_log.warning("Exception: PvpFeaturesTable loadPvpReward: " + e);
+		}
+		
+		_log.info("PvpFeaturesTable: Loaded " + _pvpRewards.size() + " reward's template(s).");
+	}
+	
+	public List<PvpColor> getPvpColorsTable()
+	{
+		return _pvpColors;
+	}
+	
+	public List<PvpReward> getPvpRewardsTable()
+	{
+		return _pvpRewards;
+	}
+	
+	public class PvpColor
+	{
+		private int _pvpAmount;
+		private int _nameColor;
+		private int _titleColor;
+		private IntIntHolder[] _skillHolder;
+		
+		public PvpColor(StatsSet set)
+		{
+			_pvpAmount = set.getInteger("pvpAmount");
+			_nameColor = set.getInteger("nameColor");
+			_titleColor = set.getInteger("titleColor");
+			
+			String[] skills = set.getString("skills").split(";");
+			if (skills != null)
+			{
+				_skillHolder = new IntIntHolder[skills.length];
+				int used = 0;
+				
+				for (String val : skills)
+				{
+					String[] valSplit = val.split(",");
+					int skillId = Integer.parseInt(valSplit[0]);
+					int skillLevel = Integer.parseInt(valSplit[1]);
+					if (skillId == 0 || skillLevel == 0)
+						continue;
+					
+					_skillHolder[used] = new IntIntHolder(skillId, skillLevel);
+					++used;
+				}
+			}
+		}
+		
+		public int getPvpAmount()
+		{
+			return _pvpAmount;
+		}
+		
+		public int getNameColor()
+		{
+			return _nameColor;
+		}
+		
+		public int getTitleColor()
+		{
+			return _titleColor;
+		}
+		
+		public IntIntHolder[] getSkillHolder()
+		{
+			return _skillHolder;
+		}
+	}
+	
+	public class PvpReward
+	{
+		private int _itemId;
+		private int _itemCount;
+		private double _chance;
+		
+		public PvpReward(StatsSet set)
+		{
+			_itemId = set.getInteger("itemId");
+			_itemCount = set.getInteger("itemCount");
+			_chance = set.getDouble("chance");
+		}
+		
+		public int getItemId()
+		{
+			return _itemId;
+		}
+		
+		public int getItemCount()
+		{
+			return _itemCount;
+		}
+		
+		public double getChance()
+		{
+			return _chance;
+		}
+	}
+}
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminAdmin.java
===================================================================
--- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminAdmin.java	(revision 21)
+++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminAdmin.java	(working copy)
@@ -28,6 +28,7 @@
 import net.sf.l2j.gameserver.datatables.MultisellData;
 import net.sf.l2j.gameserver.datatables.NpcTable;
 import net.sf.l2j.gameserver.datatables.NpcWalkerRoutesTable;
+import net.sf.l2j.gameserver.datatables.PvpFeaturesTable;
 import net.sf.l2j.gameserver.datatables.SkillTable;
 import net.sf.l2j.gameserver.datatables.TeleportLocationTable;
 import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
@@ -238,6 +239,11 @@
 					NpcWalkerRoutesTable.getInstance().reload();
 					activeChar.sendMessage("NPCwalkers' routes have been reloaded.");
 				}
+				else if (type.startsWith("pvp"))
+				{
+					PvpFeaturesTable.getInstance().reload();
+					activeChar.sendMessage("Pvp's colors have been reloaded.");
+				}
 				else if (type.startsWith("skill"))
 				{
 					SkillTable.getInstance().reload();
@@ -258,7 +264,7 @@
 			{
 				activeChar.sendMessage("Usage : //reload <acar|announcement|config|crest|door>");
 				activeChar.sendMessage("Usage : //reload <htm|item|multisell|npc|npcwalker>");
-				activeChar.sendMessage("Usage : //reload <skill|teleport|zone>");
+				activeChar.sendMessage("Usage : //reload <pvp|skill|teleport|zone>");
 			}
 		}
 		return true;
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java	(revision 21)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java	(working copy)
@@ -58,6 +58,9 @@
 import net.sf.l2j.gameserver.datatables.ItemTable;
 import net.sf.l2j.gameserver.datatables.MapRegionTable;
 import net.sf.l2j.gameserver.datatables.PetDataTable;
+import net.sf.l2j.gameserver.datatables.PvpFeaturesTable;
+import net.sf.l2j.gameserver.datatables.PvpFeaturesTable.PvpColor;
+import net.sf.l2j.gameserver.datatables.PvpFeaturesTable.PvpReward;
 import net.sf.l2j.gameserver.datatables.RecipeTable;
 import net.sf.l2j.gameserver.datatables.SkillTable;
 import net.sf.l2j.gameserver.datatables.SkillTable.FrequentSkill;
@@ -2013,6 +2016,9 @@
 		
 		// Add Death Penalty Buff Level
 		restoreDeathPenaltyBuffLevel();
+		
+		if (Config.ENABLE_PVP_FEATURES)
+			pvpColor();
 	}
 	
 	/**
@@ -4233,6 +4239,12 @@
 				// Add PvP point to attacker.
 				setPvpKills(getPvpKills() + 1);
 				
+				if (Config.ENABLE_PVP_FEATURES)
+				{
+					pvpColor();
+					pvpReward();
+				}
+				
 				// Send UserInfo packet to attacker with its Karma and PK Counter
 				sendPacket(new UserInfo(this));
 			}
@@ -8665,6 +8677,9 @@
 		
 		revalidateZone(true);
 		notifyFriends(true);
+		
+		if (Config.ENABLE_PVP_FEATURES)
+			pvpColor();
 	}
 	
 	public long getLastAccess()
@@ -10705,4 +10720,39 @@
 				break;
 		}
 	}
+	
+	private void pvpColor()
+	{
+		for (PvpColor pvpFeatures : PvpFeaturesTable.getInstance().getPvpColorsTable())
+		{
+			if (getPvpKills() >= pvpFeatures.getPvpAmount())
+			{
+				getAppearance().setNameColor(pvpFeatures.getNameColor());
+				getAppearance().setTitleColor(pvpFeatures.getTitleColor());
+				
+				final IntIntHolder[] skills = pvpFeatures.getSkillHolder();
+				if (skills == null)
+					continue;
+				
+				for (IntIntHolder skillHolder : skills)
+				{
+					if (skillHolder == null)
+						continue;
+					
+					addSkill(skillHolder.getSkill(), false);
+				}
+			}
+		}
+		
+		broadcastUserInfo();
+	}
+	
+	private void pvpReward()
+	{
+		for (PvpReward pvpFeatures : PvpFeaturesTable.getInstance().getPvpRewardsTable())
+		{
+			if (Rnd.nextDouble() < pvpFeatures.getChance())
+				addItem("Pvp Reward", pvpFeatures.getItemId(), pvpFeatures.getItemCount(), this, true);
+		}
+	}
 }
\ No newline at end of file

CitarDATA:

Index: data/html/admin/server_menu.htm
===================================================================
--- data/html/admin/server_menu.htm	(revision 21)
+++ data/html/admin/server_menu.htm	(working copy)
@@ -18,7 +18,7 @@
 	Reload
 	<table width=240>
 		<tr>
-			<td><combobox width=120 height=21 var="cb" list=acar;announcement;config;crest;cw;door;htm;item;multisell;npc;npcwalker;skill;teleport;zone;></td>
+			<td><combobox width=120 height=21 var="cb" list=acar;announcement;config;crest;cw;door;htm;item;multisell;npc;npcwalker;pvp;skill;teleport;zone;></td>
 			<td><button value="Reload" action="bypass -h admin_reload $cb" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal"></td>
 		</tr>
 	</table><br>
Index: data/xml/pvp_color.xml
===================================================================
--- data/xml/pvp_color.xml	(revision 0)
+++ data/xml/pvp_color.xml	(working copy)
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list>
+	<!-- 
+		No limit for templates. If you want to edit or add new templates, do it by copying a line and replacing values.
+		Listed values below are used for examples.
+	 -->
+	<template pvpAmount="100" nameColor="FF9900" titleColor="FFFF77" skills="3206,10;"/>
+	<template pvpAmount="200" nameColor="FF99FF" titleColor="FFFF77" skills="3156,1;"/>
+	<template pvpAmount="300" nameColor="00FF00" titleColor="FFFF77" skills="3157,1;"/>
+	<template pvpAmount="400" nameColor="00FFFF" titleColor="FFFF77" skills="3147,1;"/>
+	<template pvpAmount="500" nameColor="FFFF00" titleColor="FFFF77" skills="3158,1;"/>
+</list>
\ No newline at end of file
Index: data/xml/pvp_reward.xml
===================================================================
--- data/xml/pvp_reward.xml	(revision 0)
+++ data/xml/pvp_reward.xml	(working copy)
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list>
+	<!-- 
+		No limit for templates. If you want to edit or add new templates, do it by copying a line and replacing values.
+		Listed values below are used for examples.
+	 -->
+	<template itemId="57" itemCount="1000" chance="0.7"/>
+</list>
\ No newline at end of file