Noticias:

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

Menú Principal

Mensajes recientes

#71
L2 | Codes / Voice rango del Next Target
Último mensaje por Swarlog - Ago 03, 2025, 01:37 AM
Solo es un ejemplo para implementar un nuevo comando next target.

Solo debeis crear un nuevo voice command, para el comando".nexttarget" y añadir lo siguiente:

case "nexttarget":
		List<L2Character> chars = activeChar.getKnownList().getKnownCharactersInRadius(1000);
		Collections.shuffle(chars);
		for (L2Character nextMob : chars)
		{
			if ((nextMob != null) && nextMob.isAttackable() && !nextMob.isDead() && nextMob != activeChar.getTarget() && GeoData.getInstance().canSeeTarget(activeChar, nextMob))
			{
				activeChar.setTarget(nextMob);
				break;
			}
		}
		break;
#72
L2 | Implementaciones / Premium Account system
Último mensaje por Swarlog - Ago 03, 2025, 01:37 AM
CitarCORE:

### Eclipse Workspace Patch 1.0
#P L2J_Server
diff --git dist/game/config/Custom.properties dist/game/config/Custom.properties
new file mode 100644
index 0000000..d32f5c6
--- /dev/null
+++ dist/game/config/Custom.properties
@@ -0,0 +1,33 @@
+# ---------------------------------------------------------------------------
+# Premium System (VIP)
+# ---------------------------------------------------------------------------
+# -Admins can manage subscriptions from main admin menu.
+# -Players can use .premium to view account related info.
+# -Caution: Premium rates multiply existing server rates.
+
+# Enable premium system.
+# Default: False
+EnablePremiumSystem = False
+
+# Xp rate for premium players.
+PremiumRateXp = 2
+
+# Sp rate for premium players.
+PremiumRateSp = 2
+
+# Drop chance for premium players.
+PremiumDeathDropChanceMultiplier = 2
+
+# Drop amount for premium players.
+PremiumDeathDropAmountMultiplier = 1
+
+# Spoil chance for premium players.
+PremiumCorpseDropChanceMultiplier = 2
+
+# Spoil amount for premium players.
+PremiumCorpseDropAmountMultiplier = 1
+
+# List of items affected by custom drop rate by id, used now for Adena rate too.
+# Usage: itemId1,multiplier1;itemId2,multiplier2;...
+PremiumDropChanceMultiplierByItemId = 57,2
+PremiumDropAmountMultiplierByItemId = 57,1
\ No newline at end of file
diff --git java/com/l2jserver/Config.java java/com/l2jserver/Config.java
index 796d027..0c68e8e 100644
--- java/com/l2jserver/Config.java
+++ java/com/l2jserver/Config.java
@@ -107,6 +107,7 @@
 	public static final String EMAIL_CONFIG_FILE = "./config/Email.properties";
 	public static final String CH_SIEGE_FILE = "./config/ConquerableHallSiege.properties";
 	public static final String GEODATA_FILE = "./config/GeoData.properties";
+	public static final String CUSTOM_FILE = "./config/Custom.properties";
 	// --------------------------------------------------
 	// L2J Variable Definitions
 	// --------------------------------------------------
@@ -416,6 +417,19 @@
 	public static int CLAN_LEVEL_11_REQUIREMENT;
 	public static boolean ALLOW_WYVERN_ALWAYS;
 	public static boolean ALLOW_WYVERN_DURING_SIEGE;
+	
+	// --------------------------------------------------
+	// Premium Account Settings
+	// --------------------------------------------------
+	public static boolean PREMIUM_SYSTEM_ENABLED;
+	public static float PREMIUM_RATE_XP;
+	public static float PREMIUM_RATE_SP;
+	public static float PREMIUM_RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
+	public static float PREMIUM_RATE_CORPSE_DROP_AMOUNT_MULTIPLIER;
+	public static float PREMIUM_RATE_DEATH_DROP_CHANCE_MULTIPLIER;
+	public static float PREMIUM_RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
+	public static Map<Integer, Float> PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER;
+	public static Map<Integer, Float> PREMIUM_RATE_DROP_CHANCE_MULTIPLIER;
 	
 	// --------------------------------------------------
 	// General Settings
@@ -2496,6 +2510,71 @@
 			}
 			L2JMOD_ALLOW_CHANGE_PASSWORD = L2JModSettings.getBoolean("AllowChangePassword", false);
 			
+			// Load Custom Properties file (if exists)
+			final PropertiesParser CustomSettings = new PropertiesParser(CUSTOM_FILE);
+			PREMIUM_SYSTEM_ENABLED = CustomSettings.getBoolean("EnablePremiumSystem", false);
+			PREMIUM_RATE_XP = CustomSettings.getFloat("PremiumRateXp", 2);
+			PREMIUM_RATE_SP = CustomSettings.getFloat("PremiumRateSp", 2);
+			PREMIUM_RATE_DEATH_DROP_AMOUNT_MULTIPLIER = CustomSettings.getFloat("PremiumDeathDropAmountMultiplier", 1);
+			PREMIUM_RATE_CORPSE_DROP_AMOUNT_MULTIPLIER = CustomSettings.getFloat("PremiumCorpseDropAmountMultiplier", 1);
+			PREMIUM_RATE_DEATH_DROP_CHANCE_MULTIPLIER = CustomSettings.getFloat("PremiumDeathDropChanceMultiplier", 1);
+			PREMIUM_RATE_CORPSE_DROP_CHANCE_MULTIPLIER = CustomSettings.getFloat("PremiumCorpseDropChanceMultiplier", 1);
+			String[] premiumdropAmountMultiplier = CustomSettings.getString("PremiumDropAmountMultiplierByItemId", "").split(";");
+			PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER = new HashMap<>(premiumdropAmountMultiplier.length);
+			if (!premiumdropAmountMultiplier[0].isEmpty())
+			{
+				for (String item : premiumdropAmountMultiplier)
+				{
+					String[] itemSplit = item.split(",");
+					if (itemSplit.length != 2)
+					{
+						_log.warning(StringUtil.concat("Config.load(): invalid config property -> PremiumRateDropItemsById \"", item, "\""));
+					}
+					else
+					{
+						try
+						{
+							PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER.put(Integer.valueOf(itemSplit[0]), Float.valueOf(itemSplit[1]));
+						}
+						catch (NumberFormatException nfe)
+						{
+							if (!item.isEmpty())
+							{
+								_log.warning(StringUtil.concat("Config.load(): invalid config property -> PremiumRateDropItemsById \"", item, "\""));
+							}
+						}
+					}
+				}
+			}
+			
+			String[] premiumdropChanceMultiplier = CustomSettings.getString("PremiumDropChanceMultiplierByItemId", "").split(";");
+			PREMIUM_RATE_DROP_CHANCE_MULTIPLIER = new HashMap<>(premiumdropChanceMultiplier.length);
+			if (!dropChanceMultiplier[0].isEmpty())
+			{
+				for (String item : premiumdropChanceMultiplier)
+				{
+					String[] itemSplit = item.split(",");
+					if (itemSplit.length != 2)
+					{
+						_log.warning(StringUtil.concat("Config.load(): invalid config property -> PremiumRateDropItemsById \"", item, "\""));
+					}
+					else
+					{
+						try
+						{
+							PREMIUM_RATE_DROP_CHANCE_MULTIPLIER.put(Integer.valueOf(itemSplit[0]), Float.valueOf(itemSplit[1]));
+						}
+						catch (NumberFormatException nfe)
+						{
+							if (!item.isEmpty())
+							{
+								_log.warning(StringUtil.concat("Config.load(): invalid config property -> PremiumRateDropItemsById \"", item, "\""));
+							}
+						}
+					}
+				}
+			}
+			
 			// Load PvP L2Properties file (if exists)
 			final PropertiesParser PVPSettings = new PropertiesParser(PVP_CONFIG_FILE);
 			
diff --git java/com/l2jserver/gameserver/GameServer.java java/com/l2jserver/gameserver/GameServer.java
index 25de90c..d82feaf 100644
--- java/com/l2jserver/gameserver/GameServer.java
+++ java/com/l2jserver/gameserver/GameServer.java
@@ -112,6 +112,7 @@
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.MercTicketManager;
 import com.l2jserver.gameserver.instancemanager.PetitionManager;
+import com.l2jserver.gameserver.instancemanager.PremiumManager;
 import com.l2jserver.gameserver.instancemanager.PunishmentManager;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.instancemanager.RaidBossPointsManager;
@@ -243,6 +244,11 @@
 		RaidBossPointsManager.getInstance();
 		PetDataTable.getInstance();
 		CharSummonTable.getInstance().init();
+		if (Config.PREMIUM_SYSTEM_ENABLED)
+		{
+			_log.info("PremiumManager: Premium system is enabled.");
+			PremiumManager.getInstance();
+		}
 		
 		printSection("Clans");
 		ClanTable.getInstance();
diff --git java/com/l2jserver/gameserver/instancemanager/PremiumManager.java java/com/l2jserver/gameserver/instancemanager/PremiumManager.java
new file mode 100644
index 0000000..3815641
--- /dev/null
+++ java/com/l2jserver/gameserver/instancemanager/PremiumManager.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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.instancemanager;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Calendar;
+
+import com.l2jserver.Config;
+import com.l2jserver.L2DatabaseFactory;
+import com.l2jserver.gameserver.model.L2World;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+public class PremiumManager
+{
+	private long endDate = 0;
+	
+	public long getPremiumEndDate(String accountName)
+	{
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement = con.prepareStatement("SELECT premium_service,enddate FROM account_premium WHERE account_name=?");
+			statement.setString(1, accountName);
+			ResultSet rset = statement.executeQuery();
+			while (rset.next())
+			{
+				if (Config.PREMIUM_SYSTEM_ENABLED)
+				{
+					endDate = rset.getLong("enddate");
+					if (endDate <= System.currentTimeMillis())
+					{
+						endDate = 0;
+						removePremiumStatus(accountName);
+					}
+				}
+			}
+			statement.close();
+		}
+		catch (Exception e)
+		{
+		}
+		
+		return endDate;
+	}
+	
+	public void updatePremiumData(int months, String accountName)
+	{
+		long remainingTime = getPremiumEndDate(accountName);
+		if (remainingTime > 0)
+		{
+			remainingTime -= System.currentTimeMillis();
+		}
+		
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			Calendar endDate = Calendar.getInstance();
+			endDate.setTimeInMillis(System.currentTimeMillis() + remainingTime);
+			endDate.set(Calendar.SECOND, 0);
+			endDate.add(Calendar.MONTH, months);
+			
+			PreparedStatement statement = con.prepareStatement("UPDATE account_premium SET premium_service=?,enddate=? WHERE account_name=?");
+			statement.setInt(1, 1);
+			statement.setLong(2, endDate.getTimeInMillis());
+			statement.setString(3, accountName);
+			statement.execute();
+			statement.close();
+		}
+		catch (SQLException e)
+		{
+		}
+		
+		for (L2PcInstance player : L2World.getInstance().getPlayers())
+		{
+			if (player.getAccountNamePlayer().equalsIgnoreCase(accountName))
+			{
+				player.setPremiumStatus(getPremiumEndDate(accountName) > 0 ? true : false);
+			}
+		}
+	}
+	
+	public void removePremiumStatus(String accountName)
+	{
+		// TODO: Add check if account exists. XD
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement = con.prepareStatement("INSERT INTO account_premium (account_name,premium_service,enddate) values(?,?,?) ON DUPLICATE KEY UPDATE premium_service = ?, enddate = ?");
+			statement.setString(1, accountName);
+			statement.setInt(2, 0);
+			statement.setLong(3, 0);
+			statement.setInt(4, 0);
+			statement.setLong(5, 0);
+			statement.execute();
+			statement.close();
+		}
+		catch (SQLException e)
+		{
+		}
+		
+		for (L2PcInstance player : L2World.getInstance().getPlayers())
+		{
+			if (player.getAccountNamePlayer().equalsIgnoreCase(accountName))
+			{
+				player.setPremiumStatus(false);
+			}
+		}
+	}
+	
+	public static final PremiumManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	private static class SingletonHolder
+	{
+		protected static final PremiumManager _instance = new PremiumManager();
+	}
+}
\ No newline at end of file
diff --git java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
index 8762730..c13a577 100644
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
@@ -108,6 +108,7 @@
 import com.l2jserver.gameserver.instancemanager.HandysBlockCheckerManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.ItemsOnGroundManager;
+import com.l2jserver.gameserver.instancemanager.PremiumManager;
 import com.l2jserver.gameserver.instancemanager.PunishmentManager;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.instancemanager.SiegeManager;
@@ -354,6 +355,9 @@
 	private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,fame=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=? WHERE charId=?";
 	private static final String RESTORE_CHARACTER = "SELECT * FROM characters WHERE charId=?";
 	
+	// Character Premium System String Definitions:
+	private static final String RESTORE_PREMIUMSERVICE = "SELECT premium_service,enddate FROM account_premium WHERE account_name=?";
+	
 	// Character Teleport Bookmark:
 	private static final String INSERT_TP_BOOKMARK = "INSERT INTO character_tpbookmark (charId,Id,x,y,z,icon,tag,name) values (?,?,?,?,?,?,?,?)";
 	private static final String UPDATE_TP_BOOKMARK = "UPDATE character_tpbookmark SET icon=?,tag=?,name=? where charId=? AND Id=?";
@@ -554,6 +558,9 @@
 	
 	private boolean _noble = false;
 	private boolean _hero = false;
+	
+	/** Premium System */
+	private boolean _premiumStatus = false;
 	
 	/** The L2FolkInstance corresponding to the last Folk which one the player talked. */
 	private L2Npc _lastFolkNpc = null;
@@ -6774,6 +6781,7 @@
 					
 					player = new L2PcInstance(objectId, template, rset.getString("account_name"), app);
 					player.setName(rset.getString("char_name"));
+					restorePremiumSystemData(player, rset.getString("account_name"));
 					player._lastAccess = rset.getLong("lastAccess");
 					
 					player.getStat().setExp(rset.getLong("exp"));
@@ -13966,6 +13974,58 @@
 		return 0;
 	}
 	
+	public void setPremiumStatus(boolean premiumStatus)
+	{
+		_premiumStatus = premiumStatus;
+	}
+	
+	public boolean hasPremiumStatus()
+	{
+		return _premiumStatus;
+	}
+	
+	private static void restorePremiumSystemData(L2PcInstance player, String account)
+	{
+		boolean success = false;
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement = con.prepareStatement(RESTORE_PREMIUMSERVICE);
+			statement.setString(1, account);
+			ResultSet rset = statement.executeQuery();
+			while (rset.next())
+			{
+				success = true;
+				if (Config.PREMIUM_SYSTEM_ENABLED)
+				{
+					if (rset.getLong("enddate") <= System.currentTimeMillis())
+					{
+						PremiumManager.getInstance().removePremiumStatus(account);
+						player.setPremiumStatus(false);
+					}
+					else
+					{
+						player.setPremiumStatus(rset.getBoolean("premium_service"));
+					}
+				}
+				else
+				{
+					player.setPremiumStatus(false);
+				}
+			}
+			statement.close();
+		}
+		catch (Exception e)
+		{
+			_log.warning("Premium System: Could not restore premium system data for " + account + "." + e);
+			e.printStackTrace();
+		}
+		if (success == false)
+		{
+			PremiumManager.getInstance().removePremiumStatus(player.getAccountName());
+			player.setPremiumStatus(false);
+		}
+	}
+	
 	public void setLastPetitionGmName(String gmName)
 	{
 		_lastPetitionGmName = gmName;
diff --git java/com/l2jserver/gameserver/model/actor/stat/PcStat.java java/com/l2jserver/gameserver/model/actor/stat/PcStat.java
index 1f80731..1c4f46f 100644
--- java/com/l2jserver/gameserver/model/actor/stat/PcStat.java
+++ java/com/l2jserver/gameserver/model/actor/stat/PcStat.java
@@ -139,6 +139,12 @@
 		addToExp *= bonusExp;
 		addToSp *= bonusSp;
 		
+		if (activeChar.hasPremiumStatus())
+		{
+			addToExp *= Config.PREMIUM_RATE_XP;
+			addToSp *= Config.PREMIUM_RATE_SP;
+		}
+		
 		float ratioTakenByPlayer = 0;
 		
 		// if this player has a pet and it is in his range he takes from the owner's Exp, give the pet Exp now
diff --git java/com/l2jserver/gameserver/model/drops/CorpseDropItem.java java/com/l2jserver/gameserver/model/drops/CorpseDropItem.java
index a338f5a..d73f233 100644
--- java/com/l2jserver/gameserver/model/drops/CorpseDropItem.java
+++ java/com/l2jserver/gameserver/model/drops/CorpseDropItem.java
@@ -41,9 +41,9 @@
 	 * @see com.l2jserver.gameserver.model.drops.GeneralDropItem#getGlobalAmountMultiplier()
 	 */
 	@Override
-	protected double getGlobalAmountMultiplier()
+	protected double getGlobalAmountMultiplier(boolean isPremium)
 	{
-		return Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER;
+		return isPremium ? Config.PREMIUM_RATE_CORPSE_DROP_AMOUNT_MULTIPLIER * Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER : Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER;
 	}
 	
 	/*
@@ -51,8 +51,8 @@
 	 * @see com.l2jserver.gameserver.model.drops.GeneralDropItem#getGlobalChanceMultiplier()
 	 */
 	@Override
-	protected double getGlobalChanceMultiplier()
+	protected double getGlobalChanceMultiplier(boolean isPremium)
 	{
-		return Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
+		return isPremium ? Config.PREMIUM_RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER : Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
 	}
 }
diff --git java/com/l2jserver/gameserver/model/drops/DeathDropItem.java java/com/l2jserver/gameserver/model/drops/DeathDropItem.java
index 5ffee75..c85a9e8 100644
--- java/com/l2jserver/gameserver/model/drops/DeathDropItem.java
+++ java/com/l2jserver/gameserver/model/drops/DeathDropItem.java
@@ -41,9 +41,9 @@
 	 * @see com.l2jserver.gameserver.model.drops.GeneralDropItem#getGlobalAmountMultiplier()
 	 */
 	@Override
-	protected double getGlobalAmountMultiplier()
+	protected double getGlobalAmountMultiplier(boolean isPremium)
 	{
-		return Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
+		return isPremium ? Config.PREMIUM_RATE_DEATH_DROP_AMOUNT_MULTIPLIER * Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER : Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
 	}
 	
 	/*
@@ -51,8 +51,8 @@
 	 * @see com.l2jserver.gameserver.model.drops.GeneralDropItem#getGlobalChanceMultiplier()
 	 */
 	@Override
-	protected double getGlobalChanceMultiplier()
+	protected double getGlobalChanceMultiplier(boolean isPremium)
 	{
-		return Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
+		return isPremium ? Config.PREMIUM_RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER : Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
 	}
 }
diff --git java/com/l2jserver/gameserver/model/drops/GeneralDropItem.java java/com/l2jserver/gameserver/model/drops/GeneralDropItem.java
index 34638ce..5e837e0 100644
--- java/com/l2jserver/gameserver/model/drops/GeneralDropItem.java
+++ java/com/l2jserver/gameserver/model/drops/GeneralDropItem.java
@@ -54,12 +54,12 @@
 		_chance = chance;
 	}
 	
-	protected double getGlobalChanceMultiplier()
+	protected double getGlobalChanceMultiplier(boolean isPremium)
 	{
 		return 1.;
 	}
 	
-	protected double getGlobalAmountMultiplier()
+	protected double getGlobalAmountMultiplier(boolean isPremium)
 	{
 		return 1.;
 	}
@@ -69,7 +69,29 @@
 		double multiplier = 1;
 		
 		// individual drop amount
-		Float individualDropAmountMultiplier = Config.RATE_DROP_AMOUNT_MULTIPLIER.get(getItemId());
+		Float individualDropAmountMultiplier = null;
+		if (killer.getActingPlayer().hasPremiumStatus())
+		{
+			final Float normalMultiplier = Config.RATE_DROP_AMOUNT_MULTIPLIER.get(getItemId());
+			final Float premiumMultiplier = Config.PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER.get(getItemId());
+			if ((normalMultiplier != null) && (premiumMultiplier != null))
+			{
+				individualDropAmountMultiplier = normalMultiplier * premiumMultiplier;
+			}
+			else if (normalMultiplier != null)
+			{
+				individualDropAmountMultiplier = normalMultiplier;
+			}
+			else if (premiumMultiplier != null)
+			{
+				individualDropAmountMultiplier = premiumMultiplier;
+			}
+		}
+		else
+		{
+			individualDropAmountMultiplier = Config.RATE_DROP_AMOUNT_MULTIPLIER.get(getItemId());
+		}
+		
 		if (individualDropAmountMultiplier != null)
 		{
 			// individual amount list multiplier
@@ -87,7 +109,7 @@
 			else
 			{
 				// drop type specific amount multiplier
-				multiplier *= getGlobalAmountMultiplier();
+				multiplier *= getGlobalAmountMultiplier(killer.getActingPlayer().hasPremiumStatus());
 			}
 		}
 		
@@ -169,7 +191,29 @@
 		double multiplier = 1;
 		
 		// individual drop chance
-		Float individualDropChanceMultiplier = Config.RATE_DROP_CHANCE_MULTIPLIER.get(getItemId());
+		Float individualDropChanceMultiplier = null;
+		if (killer.getActingPlayer().hasPremiumStatus())
+		{
+			final Float normalMultiplier = Config.RATE_DROP_CHANCE_MULTIPLIER.get(getItemId());
+			final Float premiumMultiplier = Config.PREMIUM_RATE_DROP_CHANCE_MULTIPLIER.get(getItemId());
+			if ((normalMultiplier != null) && (premiumMultiplier != null))
+			{
+				individualDropChanceMultiplier = normalMultiplier * premiumMultiplier;
+			}
+			else if (normalMultiplier != null)
+			{
+				individualDropChanceMultiplier = normalMultiplier;
+			}
+			else if (premiumMultiplier != null)
+			{
+				individualDropChanceMultiplier = premiumMultiplier;
+			}
+		}
+		else
+		{
+				individualDropChanceMultiplier = Config.RATE_DROP_CHANCE_MULTIPLIER.get(getItemId());
+		}
+		
 		if (individualDropChanceMultiplier != null)
 		{
 			multiplier *= individualDropChanceMultiplier;
@@ -183,7 +227,7 @@
 			}
 			else
 			{
-				multiplier *= getGlobalChanceMultiplier();
+				multiplier *= getGlobalChanceMultiplier(killer.getActingPlayer().hasPremiumStatus());
 			}
 		}
 		
diff --git java/com/l2jserver/gameserver/model/drops/GroupedCorpseDropItem.java java/com/l2jserver/gameserver/model/drops/GroupedCorpseDropItem.java
index 9e8df87..fe23b6b 100644
--- java/com/l2jserver/gameserver/model/drops/GroupedCorpseDropItem.java
+++ java/com/l2jserver/gameserver/model/drops/GroupedCorpseDropItem.java
@@ -38,8 +38,8 @@
 	 * @see com.l2jserver.gameserver.model.drops.GroupedGeneralDropItem#getGlobalChanceMultiplier()
 	 */
 	@Override
-	protected double getGlobalChanceMultiplier()
+	protected double getGlobalChanceMultiplier(boolean isPremium)
 	{
-		return Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
+		return isPremium ? Config.PREMIUM_RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER : Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
 	}
 }
diff --git java/com/l2jserver/gameserver/model/drops/GroupedDeathDropItem.java java/com/l2jserver/gameserver/model/drops/GroupedDeathDropItem.java
index cb7f4bb..728f276 100644
--- java/com/l2jserver/gameserver/model/drops/GroupedDeathDropItem.java
+++ java/com/l2jserver/gameserver/model/drops/GroupedDeathDropItem.java
@@ -38,8 +38,8 @@
 	 * @see com.l2jserver.gameserver.model.drops.GroupedGeneralDropItem#getGlobalChanceMultiplier()
 	 */
 	@Override
-	protected double getGlobalChanceMultiplier()
+	protected double getGlobalChanceMultiplier(boolean isPremium)
 	{
-		return Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
+		return isPremium ? Config.PREMIUM_RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER : Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
 	}
 }
diff --git java/com/l2jserver/gameserver/model/drops/GroupedGeneralDropItem.java java/com/l2jserver/gameserver/model/drops/GroupedGeneralDropItem.java
index 79e9f78..044e85f 100644
--- java/com/l2jserver/gameserver/model/drops/GroupedGeneralDropItem.java
+++ java/com/l2jserver/gameserver/model/drops/GroupedGeneralDropItem.java
@@ -48,7 +48,7 @@
 		_chance = chance;
 	}
 	
-	protected double getGlobalChanceMultiplier()
+	protected double getGlobalChanceMultiplier(boolean isPremium)
 	{
 		return 1.;
 	}
@@ -75,7 +75,7 @@
 			final L2Item item = ItemTable.getInstance().getTemplate(gdi.getItemId());
 			if ((item == null) || !item.hasExImmediateEffect())
 			{
-				return getChance() * getGlobalChanceMultiplier();
+				return getChance() * getGlobalChanceMultiplier(killer.getActingPlayer().hasPremiumStatus());
 			}
 		}
 		
diff --git java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java
index d4f7fcb..7a5632c 100644
--- java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java
+++ java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java
@@ -239,6 +239,10 @@
 			
 			// Updates database
 			float adenaRate = Config.RATE_DROP_AMOUNT_MULTIPLIER.getOrDefault(Inventory.ADENA_ID, 1f);
+			if (actor.hasPremiumStatus() && Config.PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER.containsKey(Inventory.ADENA_ID))
+			{
+				adenaRate *= Config.PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER.get(Inventory.ADENA_ID);
+			}
 			if ((item.getId() == Inventory.ADENA_ID) && (count < (10000 * adenaRate)))
 			{
 				// Small adena changes won't be saved to database all the time
@@ -291,6 +295,10 @@
 			// Updates database
 			// If Adena drop rate is not present it will be x1.
 			float adenaRate = Config.RATE_DROP_AMOUNT_MULTIPLIER.getOrDefault(Inventory.ADENA_ID, 1f);
+			if (actor.hasPremiumStatus() && Config.PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER.containsKey(Inventory.ADENA_ID))
+			{
+				adenaRate *= Config.PREMIUM_RATE_DROP_AMOUNT_MULTIPLIER.get(Inventory.ADENA_ID);
+			}
 			if ((itemId == Inventory.ADENA_ID) && (count < (10000 * adenaRate)))
 			{
 				// Small adena changes won't be saved to database all the time

CitarDATA:

### Eclipse Workspace Patch 1.0
#P L2J_DataPack
diff --git dist/game/config/adminCommands.xml dist/game/config/adminCommands.xml
index d4fe593..69f2c4a 100644
--- dist/game/config/adminCommands.xml
+++ dist/game/config/adminCommands.xml
@@ -420,6 +420,14 @@
 	<admin command="admin_untransform" accessLevel="7" />
 	<admin command="admin_transform_menu" accessLevel="7" />
 
+	<!-- PREMIUM SYSTEM -->
+	<admin command="admin_premium_menu" accessLevel="7" />
+	<admin command="admin_premium_add1" accessLevel="7" confirmDlg="true" />
+	<admin command="admin_premium_add2" accessLevel="7" confirmDlg="true" />
+	<admin command="admin_premium_add3" accessLevel="7" confirmDlg="true" />
+	<admin command="admin_premium_info" accessLevel="7" />
+	<admin command="admin_premium_remove" accessLevel="7" confirmDlg="true" />
+
 	<!-- ADMIN QUEST -->
 	<admin command="admin_quest_reload" accessLevel="7" />
 	<admin command="admin_script_load" accessLevel="7" />
diff --git dist/game/data/html/admin/main_menu.htm dist/game/data/html/admin/main_menu.htm
index 1807a16..714f9fc 100644
--- dist/game/data/html/admin/main_menu.htm
+++ dist/game/data/html/admin/main_menu.htm
@@ -28,6 +28,7 @@
 <td><button value="goSpawn" action="bypass -h admin_list_spawns $qbox 1" width=65 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
 </tr><tr>
 <td><button value="Scan" action="bypass -h admin_scan $qbox" width=65 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+<td><button value="Premium" action="bypass -h admin_premium_menu" width=65 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
 </tr>
 </table>
 <br>
diff --git dist/game/data/html/admin/premium_menu.htm dist/game/data/html/admin/premium_menu.htm
new file mode 100644
index 0000000..ce256c6
--- /dev/null
+++ dist/game/data/html/admin/premium_menu.htm
@@ -0,0 +1,16 @@
+<html><title>Premium Service Menu</title><body>
+<center>
+<br>
+<font color="LEVEL">Premium Service Menu</font><br>
+<br>
+Enter Account Name:<br>
+<edit var="acc_name" width=200>
+<br>
+<button value="Add 1 month Premium" action="bypass -h admin_premium_add1 $acc_name" width=200 height=25 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
+<button value="Add 2 months Premium" action="bypass -h admin_premium_add2 $acc_name" width=200 height=25 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
+<button value="Add 3 months Premium" action="bypass -h admin_premium_add3 $acc_name" width=200 height=25 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
+<br>
+<button value="View Premium Info" action="bypass -h admin_premium_info $acc_name" width=200 height=25 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
+<button value="Remove Premium" action="bypass -h admin_premium_remove $acc_name" width=200 height=25 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
+</center>
+</body></html>
\ No newline at end of file
diff --git dist/game/data/scripts/handlers/MasterHandler.java dist/game/data/scripts/handlers/MasterHandler.java
index 38a3e91..70dbca6 100644
--- dist/game/data/scripts/handlers/MasterHandler.java
+++ dist/game/data/scripts/handlers/MasterHandler.java
@@ -83,6 +83,7 @@
 import handlers.admincommandhandlers.AdminPetition;
 import handlers.admincommandhandlers.AdminPledge;
 import handlers.admincommandhandlers.AdminPolymorph;
+import handlers.admincommandhandlers.AdminPremium;
 import handlers.admincommandhandlers.AdminPunishment;
 import handlers.admincommandhandlers.AdminQuest;
 import handlers.admincommandhandlers.AdminReload;
@@ -253,6 +254,7 @@
 import handlers.voicedcommandhandlers.ChatAdmin;
 import handlers.voicedcommandhandlers.Debug;
 import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Premium;
 import handlers.voicedcommandhandlers.StatsVCmd;
 import handlers.voicedcommandhandlers.Wedding;
 
@@ -377,6 +379,7 @@
 			AdminPForge.class,
 			AdminPledge.class,
 			AdminPolymorph.class,
+			AdminPremium.class,
 			AdminPunishment.class,
 			AdminQuest.class,
 			AdminReload.class,
@@ -532,6 +535,7 @@
 			(Config.L2JMOD_MULTILANG_ENABLE && Config.L2JMOD_MULTILANG_VOICED_ALLOW ? Lang.class : null),
 			(Config.L2JMOD_DEBUG_VOICE_COMMAND ? Debug.class : null),
 			(Config.L2JMOD_ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null),
+			(Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null),
 		},
 		{
 			// Target Handlers
diff --git dist/game/data/scripts/handlers/admincommandhandlers/AdminPremium.java dist/game/data/scripts/handlers/admincommandhandlers/AdminPremium.java
new file mode 100644
index 0000000..8a0c1ce
--- /dev/null
+++ dist/game/data/scripts/handlers/admincommandhandlers/AdminPremium.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2004-2015 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.admincommandhandlers;
+
+import java.text.SimpleDateFormat;
+
+import com.l2jserver.gameserver.handler.IAdminCommandHandler;
+import com.l2jserver.gameserver.instancemanager.PremiumManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+public class AdminPremium implements IAdminCommandHandler
+{
+	private static final String[] ADMIN_COMMANDS =
+	{
+		"admin_premium_menu",
+		"admin_premium_add1",
+		"admin_premium_add2",
+		"admin_premium_add3",
+		"admin_premium_info",
+		"admin_premium_remove"
+	};
+	
+	@Override
+	public boolean useAdminCommand(String command, L2PcInstance activeChar)
+	{
+		if (command.equals("admin_premium_menu"))
+		{
+			AdminHtml.showAdminHtml(activeChar, "premium_menu.htm");
+		}
+		else if (command.startsWith("admin_premium_add1"))
+		{
+			try
+			{
+				String val = command.substring(19);
+				addPremiumStatus(activeChar, 1, val);
+			}
+			catch (StringIndexOutOfBoundsException e)
+			{
+				activeChar.sendMessage("Error.");
+			}
+		}
+		else if (command.startsWith("admin_premium_add2"))
+		{
+			try
+			{
+				String val = command.substring(19);
+				addPremiumStatus(activeChar, 2, val);
+			}
+			catch (StringIndexOutOfBoundsException e)
+			{
+				activeChar.sendMessage("Error.");
+			}
+		}
+		else if (command.startsWith("admin_premium_add3"))
+		{
+			try
+			{
+				String val = command.substring(19);
+				addPremiumStatus(activeChar, 3, val);
+			}
+			catch (StringIndexOutOfBoundsException e)
+			{
+				activeChar.sendMessage("Error.");
+			}
+		}
+		else if (command.startsWith("admin_premium_info"))
+		{
+			try
+			{
+				String val = command.substring(19);
+				viewPremiumInfo(activeChar, val);
+			}
+			catch (StringIndexOutOfBoundsException e)
+			{
+				activeChar.sendMessage("Error.");
+			}
+		}
+		else if (command.startsWith("admin_premium_remove"))
+		{
+			try
+			{
+				String val = command.substring(21);
+				removePremium(activeChar, val);
+			}
+			catch (StringIndexOutOfBoundsException e)
+			{
+				activeChar.sendMessage("Error.");
+			}
+		}
+		return true;
+	}
+	
+	private void addPremiumStatus(L2PcInstance admin, int months, String accountName)
+	{
+		// TODO: Add check if account exists XD
+		PremiumManager.getInstance().updatePremiumData(months, accountName);
+		final SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm");
+		final long endDate = PremiumManager.getInstance().getPremiumEndDate(accountName);
+		admin.sendMessage("Account " + accountName + " will now have premium status until " + String.valueOf(format.format(endDate)) + ".");
+	}
+	
+	private void viewPremiumInfo(L2PcInstance admin, String accountName)
+	{
+		if (PremiumManager.getInstance().getPremiumEndDate(accountName) > 0)
+		{
+			final SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm");
+			final long endDate = PremiumManager.getInstance().getPremiumEndDate(accountName);
+			admin.sendMessage("Account " + accountName + " has premium status until " + String.valueOf(format.format(endDate)) + ".");
+		}
+		else
+		{
+			admin.sendMessage("Account " + accountName + " has no premium status.");
+		}
+	}
+	
+	private void removePremium(L2PcInstance admin, String accountName)
+	{
+		if (PremiumManager.getInstance().getPremiumEndDate(accountName) > 0)
+		{
+			PremiumManager.getInstance().removePremiumStatus(accountName);
+			admin.sendMessage("Account " + accountName + " has no longer premium status.");
+		}
+		else
+		{
+			admin.sendMessage("Account " + accountName + " has no premium status.");
+		}
+	}
+	
+	@Override
+	public String[] getAdminCommandList()
+	{
+		return ADMIN_COMMANDS;
+	}
+}
\ No newline at end of file
diff --git dist/game/data/scripts/handlers/voicedcommandhandlers/Premium.java dist/game/data/scripts/handlers/voicedcommandhandlers/Premium.java
new file mode 100644
index 0000000..f5ae68d
--- /dev/null
+++ dist/game/data/scripts/handlers/voicedcommandhandlers/Premium.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2004-2015 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.voicedcommandhandlers;
+
+import java.text.SimpleDateFormat;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.handler.IVoicedCommandHandler;
+import com.l2jserver.gameserver.instancemanager.PremiumManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
+
+public class Premium implements IVoicedCommandHandler
+{
+	private static final String[] VOICED_COMMANDS =
+	{
+		"premium"
+	};
+	
+	@Override
+	public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target)
+	{
+		if (command.startsWith("premium") && Config.PREMIUM_SYSTEM_ENABLED)
+		{
+			SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm");
+			long endDate = PremiumManager.getInstance().getPremiumEndDate(activeChar.getAccountName());
+			if (endDate == 0)
+			{
+				NpcHtmlMessage msg = new NpcHtmlMessage(5);
+				StringBuilder html = new StringBuilder("<html><body><title>Account Details</title><center>");
+				html.append("<table>");
+				html.append("<tr><td><center>Account Status: <font color=\"LEVEL\">Normal<br></font></td></tr>");
+				html.append("<tr><td>Rate XP: <font color=\"LEVEL\"> x" + Config.RATE_XP + "<br1></font></td></tr>");
+				html.append("<tr><td>Rate SP: <font color=\"LEVEL\"> x" + Config.RATE_SP + "<br1></font></td></tr>");
+				html.append("<tr><td>Drop Chance: <font color=\"LEVEL\"> x" + Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
+				html.append("<tr><td>Drop Amount: <font color=\"LEVEL\"> x" + Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER + "<br1></font></td></tr><br>");
+				html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
+				html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER + "<br><br></font></td></tr><br>");
+				html.append("<tr><td><center>Premium Info & Rules<br></td></tr>");
+				html.append("<tr><td>Rate XP: <font color=\"LEVEL\"> x" + (Config.RATE_XP * Config.PREMIUM_RATE_XP) + "<br1></font></td></tr>");
+				html.append("<tr><td>Rate SP: <font color=\"LEVEL\"> x" + (Config.RATE_SP * Config.PREMIUM_RATE_SP) + "<br1></font></td></tr>");
+				html.append("<tr><td>Drop Chance: <font color=\"LEVEL\"> x" + (Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_DEATH_DROP_CHANCE_MULTIPLIER) + "<br1></font></td></tr>");
+				html.append("<tr><td>Drop Amount: <font color=\"LEVEL\"> x" + (Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_DEATH_DROP_AMOUNT_MULTIPLIER) + "<br1></font></td></tr>");
+				html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + (Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_CORPSE_DROP_CHANCE_MULTIPLIER) + "<br1></font></td></tr>");
+				html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + (Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_CORPSE_DROP_AMOUNT_MULTIPLIER) + "<br1></font></td></tr>");
+				html.append("<tr><td> <font color=\"70FFCA\">1. Premium benefits CAN NOT BE TRANSFERED.<br1></font></td></tr>");
+				html.append("<tr><td> <font color=\"70FFCA\">2. Premium does not effect party members.<br1></font></td></tr>");
+				html.append("<tr><td> <font color=\"70FFCA\">3. Premium benefits effect ALL characters in same account.</font></td></tr>");
+				html.append("</table>");
+				html.append("</center></body></html>");
+				msg.setHtml(html.toString());
+				activeChar.sendPacket(msg);
+			}
+			else
+			{
+				NpcHtmlMessage msg = new NpcHtmlMessage(5);
+				StringBuilder html = new StringBuilder("<html><body><title>Premium Account Details</title><center>");
+				html.append("<table>");
+				html.append("<tr><td><center>Account Status: <font color=\"LEVEL\">Premium<br></font></td></tr>");
+				html.append("<tr><td>Rate XP: <font color=\"LEVEL\">x" + (Config.RATE_XP * Config.PREMIUM_RATE_XP) + " <br1></font></td></tr>");
+				html.append("<tr><td>Rate SP: <font color=\"LEVEL\">x" + (Config.RATE_SP * Config.PREMIUM_RATE_SP) + "  <br1></font></td></tr>");
+				html.append("<tr><td>Drop Chance: <font color=\"LEVEL\">x" + (Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_DEATH_DROP_CHANCE_MULTIPLIER) + " <br1></font></td></tr>");
+				html.append("<tr><td>Drop Amount: <font color=\"LEVEL\">x" + (Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_DEATH_DROP_AMOUNT_MULTIPLIER) + " <br1></font></td></tr>");
+				html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\">x" + (Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_CORPSE_DROP_CHANCE_MULTIPLIER) + " <br1></font></td></tr>");
+				html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\">x" + (Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_CORPSE_DROP_AMOUNT_MULTIPLIER) + " <br1></font></td></tr>");
+				html.append("<tr><td>Expires: <font color=\"00A5FF\">" + String.valueOf(format.format(endDate)) + "</font></td></tr>");
+				html.append("<tr><td>Current Date: <font color=\"70FFCA\">" + String.valueOf(format.format(System.currentTimeMillis())) + "<br><br></font></td></tr>");
+				html.append("<tr><td><center>Premium Info & Rules<br></center></td></tr>");
+				html.append("<tr><td><font color=\"70FFCA\">1. Premium accounts CAN NOT BE TRANSFERED.<br1></font></td></tr>");
+				html.append("<tr><td><font color=\"70FFCA\">2. Premium does not effect party members.<br1></font></td></tr>");
+				html.append("<tr><td><font color=\"70FFCA\">3. Premium account effects ALL characters in same account.<br><br><br></font></td></tr>");
+				html.append("<tr><td><center>Thank you for supporting our server.</td></tr>");
+				html.append("</table>");
+				html.append("</center></body></html>");
+				msg.setHtml(html.toString());
+				activeChar.sendPacket(msg);
+			}
+		}
+		else
+		{
+			return false;
+		}
+		return true;
+	}
+	
+	@Override
+	public String[] getVoicedCommandList()
+	{
+		return VOICED_COMMANDS;
+	}
+}
\ No newline at end of file
diff --git dist/sql/game/account_premium.sql dist/sql/game/account_premium.sql
new file mode 100644
index 0000000..ce5aa62
--- /dev/null
+++ dist/sql/game/account_premium.sql
@@ -0,0 +1,7 @@
+DROP TABLE IF EXISTS `account_premium`;
+CREATE TABLE `account_premium` (
+  `account_name` varchar(45) NOT NULL DEFAULT '',
+  `premium_service` int(1) NOT NULL DEFAULT '0',
+  `enddate` decimal(20,0) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`account_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git dist/tools/gs_cleanup.sql dist/tools/gs_cleanup.sql
index 7e29166..844a143 100644
--- dist/tools/gs_cleanup.sql
+++ dist/tools/gs_cleanup.sql
@@ -8,6 +8,7 @@
 
 DROP TABLE IF EXISTS 
 account_gsdata,
+account_premium,
 airships,
 auction,
 auction_bid,

Creditos: NetVirus , sam.jr , Annu.
Actualizado: PoRnosJH y maneco2
#73
L2 | Implementaciones / Fishing Tournament
Último mensaje por Swarlog - Ago 03, 2025, 01:37 AM
### Eclipse Workspace Patch 1.0
#P L2J_Server_BETA
Index: java/com/l2jserver/gameserver/GameServer.java
===================================================================
--- java/com/l2jserver/gameserver/GameServer.java	(revision 6469)
+++ java/com/l2jserver/gameserver/GameServer.java	(working copy)
@@ -102,6 +102,7 @@
 import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;
 import com.l2jserver.gameserver.instancemanager.DayNightSpawnManager;
 import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
+import com.l2jserver.gameserver.instancemanager.FishingChampionshipManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
 import com.l2jserver.gameserver.instancemanager.FourSepulchersManager;
@@ -375,6 +376,11 @@
 			CoupleManager.getInstance();
 		}
 		
+		if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
+		{
+			FishingChampionshipManager.getInstance();
+		}
+		
 		TaskManager.getInstance();
 		
 		AntiFeedManager.getInstance().registerEvent(AntiFeedManager.GAME_ID);
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java	(revision 6469)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java	(working copy)
@@ -12187,7 +12187,7 @@
 	
 	public void startFishCombat(boolean isNoob, boolean isUpperGrade)
 	{
-		_fishCombat = new L2Fishing(this, _fish, isNoob, isUpperGrade);
+		_fishCombat = new L2Fishing(this, _fish, isNoob, isUpperGrade, _lure.getId());
 	}
 	
 	public void endFishing(boolean win)
Index: java/com/l2jserver/Config.java
===================================================================
--- java/com/l2jserver/Config.java	(revision 6469)
+++ java/com/l2jserver/Config.java	(working copy)
@@ -612,6 +612,13 @@
 	public static float ALT_LOTTERY_4_NUMBER_RATE;
 	public static float ALT_LOTTERY_3_NUMBER_RATE;
 	public static long ALT_LOTTERY_2_AND_1_NUMBER_PRIZE;
+	public static boolean ALT_FISH_CHAMPIONSHIP_ENABLED;
+	public static int ALT_FISH_CHAMPIONSHIP_REWARD_ITEM;
+	public static int ALT_FISH_CHAMPIONSHIP_REWARD_1;
+	public static int ALT_FISH_CHAMPIONSHIP_REWARD_2;
+	public static int ALT_FISH_CHAMPIONSHIP_REWARD_3;
+	public static int ALT_FISH_CHAMPIONSHIP_REWARD_4;
+	public static int ALT_FISH_CHAMPIONSHIP_REWARD_5;
 	public static boolean ALT_ITEM_AUCTION_ENABLED;
 	public static int ALT_ITEM_AUCTION_EXPIRED_AFTER;
 	public static long ALT_ITEM_AUCTION_TIME_EXTENDS_ON_BID;
@@ -1938,6 +1945,13 @@
 			ALT_LOTTERY_4_NUMBER_RATE = General.getFloat("AltLottery4NumberRate", 0.2f);
 			ALT_LOTTERY_3_NUMBER_RATE = General.getFloat("AltLottery3NumberRate", 0.2f);
 			ALT_LOTTERY_2_AND_1_NUMBER_PRIZE = General.getLong("AltLottery2and1NumberPrize", 200);
+			ALT_FISH_CHAMPIONSHIP_ENABLED = General.getBoolean("AltFishChampionshipEnabled", true);
+			ALT_FISH_CHAMPIONSHIP_REWARD_ITEM = General.getInt("AltFishChampionshipRewardItemId", 57);
+			ALT_FISH_CHAMPIONSHIP_REWARD_1 = General.getInt("AltFishChampionshipReward1", 800000);
+			ALT_FISH_CHAMPIONSHIP_REWARD_2 = General.getInt("AltFishChampionshipReward2", 500000);
+			ALT_FISH_CHAMPIONSHIP_REWARD_3 = General.getInt("AltFishChampionshipReward3", 300000);
+			ALT_FISH_CHAMPIONSHIP_REWARD_4 = General.getInt("AltFishChampionshipReward4", 200000);
+			ALT_FISH_CHAMPIONSHIP_REWARD_5 = General.getInt("AltFishChampionshipReward5", 100000);
 			ALT_ITEM_AUCTION_ENABLED = General.getBoolean("AltItemAuctionEnabled", true);
 			ALT_ITEM_AUCTION_EXPIRED_AFTER = General.getInt("AltItemAuctionExpiredAfter", 14);
 			ALT_ITEM_AUCTION_TIME_EXTENDS_ON_BID = General.getInt("AltItemAuctionTimeExtendsOnBid", 0) * 1000;
Index: java/com/l2jserver/gameserver/Shutdown.java
===================================================================
--- java/com/l2jserver/gameserver/Shutdown.java	(revision 6469)
+++ java/com/l2jserver/gameserver/Shutdown.java	(working copy)
@@ -30,6 +30,7 @@
 import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;
+import com.l2jserver.gameserver.instancemanager.FishingChampionshipManager;
 import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
 import com.l2jserver.gameserver.instancemanager.HellboundManager;
@@ -567,6 +568,13 @@
 		GlobalVariablesManager.getInstance().storeMe();
 		_log.info("Global Variables Manager: Variables saved(" + tc.getEstimatedTimeAndRestartCounter() + "ms).");
 		
+		// Save Fishing tournament data
+		if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
+		{
+			FishingChampionshipManager.getInstance().shutdown();
+			_log.info("Fishing Championship data has been saved.");
+		}
+		
 		// Save items on ground before closing
 		if (Config.SAVE_DROPPED_ITEM)
 		{
Index: java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java	(revision 6470)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java	(working copy)
@@ -20,15 +20,19 @@
 
 import java.util.List;
 
+import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.SkillData;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.enums.InstanceType;
+import com.l2jserver.gameserver.instancemanager.FishingChampionshipManager;
 import com.l2jserver.gameserver.model.L2SkillLearn;
+import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.base.AcquireSkillType;
 import com.l2jserver.gameserver.model.skills.Skill;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
 public final class L2FishermanInstance extends L2MerchantInstance
@@ -63,6 +67,35 @@
 		{
 			showFishSkillList(player);
 		}
+		else if (command.startsWith("FishingChampionship"))
+		{
+			if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
+			{
+				FishingChampionshipManager.getInstance().showChampScreen(player, this);
+			}
+			else
+			{
+				sendHtml(player, this, "no_fish_event001.htm");
+			}
+		}
+		else if (command.startsWith("FishingReward"))
+		{
+			if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
+			{
+				if (FishingChampionshipManager.getInstance().isWinner(player.getName()))
+				{
+					FishingChampionshipManager.getInstance().getReward(player);
+				}
+				else
+				{
+					sendHtml(player, this, "no_fish_event_reward001.htm");
+				}
+			}
+			else
+			{
+				sendHtml(player, this, "no_fish_event001.htm");
+			}
+		}
 		else
 		{
 			super.onBypassFeedback(player, command);
@@ -107,4 +140,11 @@
 			player.sendPacket(asl);
 		}
 	}
+	
+	private static void sendHtml(L2PcInstance player, L2Npc npc, String htmlName)
+	{
+		final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
+		html.setFile(player.getHtmlPrefix(), "data/html/fisherman/championship/" + htmlName);
+		player.sendPacket(html);
+	}
 }
Index: dist/game/config/General.properties
===================================================================
--- dist/game/config/General.properties	(revision 6469)
+++ dist/game/config/General.properties	(working copy)
@@ -716,6 +716,24 @@
 
 
 # ---------------------------------------------------------------------------
+# Fishing Tournament
+# ---------------------------------------------------------------------------
+
+# Enable or disable the Fishing Tournament system
+AltFishChampionshipEnabled = True
+
+# Item Id used as reward
+AltFishChampionshipRewardItemId = 57
+
+# Item count used as reward (for the 5 first winners)
+AltFishChampionshipReward1 = 800000
+AltFishChampionshipReward2 = 500000
+AltFishChampionshipReward3 = 300000
+AltFishChampionshipReward4 = 200000
+AltFishChampionshipReward5 = 100000
+
+
+# ---------------------------------------------------------------------------
 # Item Auction
 # ---------------------------------------------------------------------------
 
Index: java/com/l2jserver/gameserver/instancemanager/FishingChampionshipManager.java
===================================================================
--- java/com/l2jserver/gameserver/instancemanager/FishingChampionshipManager.java	(revision 0)
+++ java/com/l2jserver/gameserver/instancemanager/FishingChampionshipManager.java	(working copy)
@@ -0,0 +1,549 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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 Server 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.instancemanager;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.l2jserver.Config;
+import com.l2jserver.L2DatabaseFactory;
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author n0nam3
+ * @date 08/08/2010 15:11
+ */
+public class FishingChampionshipManager
+{
+	protected static final Logger _log = Logger.getLogger(FishingChampionshipManager.class.getName());
+	
+	private static final String INSERT = "INSERT INTO fishing_championship(player_name,fish_length,rewarded) VALUES (?,?,?)";
+	private static final String DELETE = "DELETE FROM fishing_championship";
+	private static final String SELECT = "SELECT `player_name`, `fish_length`, `rewarded` FROM fishing_championship";
+	
+	private static final FishingChampionshipManager _instance = new FishingChampionshipManager();
+	
+	public static FishingChampionshipManager getInstance()
+	{
+		return _instance;
+	}
+	
+	protected long _enddate = 0;
+	protected final List<String> _playersName = new ArrayList<>();
+	protected final List<String> _fishLength = new ArrayList<>();
+	protected final List<String> _winPlayersName = new ArrayList<>();
+	protected final List<String> _winFishLength = new ArrayList<>();
+	protected final List<Fisher> _tmpPlayers = new ArrayList<>();
+	protected final List<Fisher> _winPlayers = new ArrayList<>();
+	protected double _minFishLength = 0;
+	protected boolean _needRefresh = true;
+	
+	private FishingChampionshipManager()
+	{
+		restoreData();
+		refreshWinResult();
+		recalculateMinLength();
+		
+		if (_enddate <= System.currentTimeMillis())
+		{
+			_enddate = System.currentTimeMillis();
+			new finishChamp().run();
+		}
+		else
+		{
+			ThreadPoolManager.getInstance().scheduleGeneral(new finishChamp(), _enddate - System.currentTimeMillis());
+		}
+	}
+	
+	protected void setEndOfChamp()
+	{
+		Calendar finishtime = Calendar.getInstance();
+		finishtime.setTimeInMillis(_enddate);
+		finishtime.set(Calendar.MINUTE, 0);
+		finishtime.set(Calendar.SECOND, 0);
+		finishtime.add(Calendar.DAY_OF_MONTH, 6);
+		finishtime.set(Calendar.DAY_OF_WEEK, 3);
+		finishtime.set(Calendar.HOUR_OF_DAY, 19);
+		_enddate = finishtime.getTimeInMillis();
+	}
+	
+	private void restoreData()
+	{
+		_enddate = GlobalVariablesManager.getInstance().getLong("fishChampionshipEnd", 0);
+		
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement = con.prepareStatement(SELECT);
+			ResultSet rs = statement.executeQuery();
+			while (rs.next())
+			{
+				int rewarded = rs.getInt("rewarded");
+				if (rewarded == 0)
+				{
+					_tmpPlayers.add(new Fisher(rs.getString("player_name"), rs.getDouble("fish_length"), 0));
+				}
+				else if (rewarded > 0)
+				{
+					_winPlayers.add(new Fisher(rs.getString("player_name"), rs.getDouble("fish_length"), rewarded));
+				}
+			}
+			rs.close();
+			statement.close();
+		}
+		catch (SQLException e)
+		{
+			_log.log(Level.WARNING, "FishingChampionshipManager: can't restore fishing championship info: " + e.getMessage(), e);
+		}
+	}
+	
+	public synchronized void newFish(L2PcInstance pl, int lureId)
+	{
+		if (!Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
+		{
+			return;
+		}
+		
+		double len = Rnd.get(60, 89) + (Rnd.get(0, 1000) / 1000.);
+		if ((lureId >= 8484) && (lureId <= 8486))
+		{
+			len += Rnd.get(0, 3000) / 1000.;
+		}
+		
+		pl.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CAUGHT_FISH_S1_LENGTH).addString(String.valueOf(len)));
+		
+		if (_tmpPlayers.size() < 5)
+		{
+			for (Fisher fisher : _tmpPlayers)
+			{
+				if (fisher.getName().equalsIgnoreCase(pl.getName()))
+				{
+					if (fisher.getLength() < len)
+					{
+						fisher.setLength(len);
+						pl.sendPacket(SystemMessageId.REGISTERED_IN_FISH_SIZE_RANKING);
+						recalculateMinLength();
+					}
+					return;
+				}
+			}
+			_tmpPlayers.add(new Fisher(pl.getName(), len, 0));
+			pl.sendPacket(SystemMessageId.REGISTERED_IN_FISH_SIZE_RANKING);
+			recalculateMinLength();
+		}
+		else if (_minFishLength < len)
+		{
+			for (Fisher fisher : _tmpPlayers)
+			{
+				if (fisher.getName().equalsIgnoreCase(pl.getName()))
+				{
+					if (fisher.getLength() < len)
+					{
+						fisher.setLength(len);
+						pl.sendPacket(SystemMessageId.REGISTERED_IN_FISH_SIZE_RANKING);
+						recalculateMinLength();
+					}
+					return;
+				}
+			}
+			
+			Fisher minFisher = null;
+			double minLen = 99999.;
+			for (Fisher fisher : _tmpPlayers)
+			{
+				if (fisher.getLength() < minLen)
+				{
+					minFisher = fisher;
+					minLen = minFisher.getLength();
+				}
+			}
+			_tmpPlayers.remove(minFisher);
+			_tmpPlayers.add(new Fisher(pl.getName(), len, 0));
+			pl.sendPacket(SystemMessageId.REGISTERED_IN_FISH_SIZE_RANKING);
+			recalculateMinLength();
+		}
+	}
+	
+	private void recalculateMinLength()
+	{
+		double minLen = 99999.;
+		for (Fisher fisher : _tmpPlayers)
+		{
+			if (fisher.getLength() < minLen)
+			{
+				minLen = fisher.getLength();
+			}
+		}
+		_minFishLength = minLen;
+	}
+	
+	public long getTimeRemaining()
+	{
+		return (_enddate - System.currentTimeMillis()) / 60000;
+	}
+	
+	public String getWinnerName(int par)
+	{
+		if (_winPlayersName.size() >= par)
+		{
+			return _winPlayersName.get(par - 1);
+		}
+		
+		return "None";
+	}
+	
+	public String getCurrentName(int par)
+	{
+		if (_playersName.size() >= par)
+		{
+			return _playersName.get(par - 1);
+		}
+		
+		return "None";
+	}
+	
+	public String getFishLength(int par)
+	{
+		if (_winFishLength.size() >= par)
+		{
+			return _winFishLength.get(par - 1);
+		}
+		
+		return "0";
+	}
+	
+	public String getCurrentFishLength(int par)
+	{
+		if (_fishLength.size() >= par)
+		{
+			return _fishLength.get(par - 1);
+		}
+		
+		return "0";
+	}
+	
+	public boolean isWinner(String playerName)
+	{
+		for (String name : _winPlayersName)
+		{
+			if (name.equals(playerName))
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	public void getReward(L2PcInstance pl)
+	{
+		for (Fisher fisher : _winPlayers)
+		{
+			if (fisher.getName().equalsIgnoreCase(pl.getName()))
+			{
+				if (fisher.getRewardType() != 2)
+				{
+					int rewardCnt = 0;
+					for (int x = 0; x < _winPlayersName.size(); x++)
+					{
+						if (_winPlayersName.get(x).equalsIgnoreCase(pl.getName()))
+						{
+							switch (x)
+							{
+								case 0:
+									rewardCnt = Config.ALT_FISH_CHAMPIONSHIP_REWARD_1;
+									break;
+								
+								case 1:
+									rewardCnt = Config.ALT_FISH_CHAMPIONSHIP_REWARD_2;
+									break;
+								
+								case 2:
+									rewardCnt = Config.ALT_FISH_CHAMPIONSHIP_REWARD_3;
+									break;
+								
+								case 3:
+									rewardCnt = Config.ALT_FISH_CHAMPIONSHIP_REWARD_4;
+									break;
+								
+								case 4:
+									rewardCnt = Config.ALT_FISH_CHAMPIONSHIP_REWARD_5;
+									break;
+							}
+						}
+					}
+					fisher.setRewardType(2);
+					if (rewardCnt > 0)
+					{
+						pl.addItem("fishing_reward", Config.ALT_FISH_CHAMPIONSHIP_REWARD_ITEM, rewardCnt, null, true);
+						
+						final NpcHtmlMessage html = new NpcHtmlMessage();
+						html.setFile(pl.getHtmlPrefix(), "data/html/fisherman/championship/fish_event_reward001.htm");
+						pl.sendPacket(html);
+					}
+				}
+			}
+		}
+	}
+	
+	public void showMidResult(L2PcInstance pl)
+	{
+		final NpcHtmlMessage html = new NpcHtmlMessage();
+		
+		if (_needRefresh)
+		{
+			html.setFile(pl.getHtmlPrefix(), "data/html/fisherman/championship/fish_event003.htm");
+			pl.sendPacket(html);
+			
+			refreshResult();
+			ThreadPoolManager.getInstance().scheduleGeneral(new needRefresh(), 60000);
+			return;
+		}
+		
+		html.setFile(pl.getHtmlPrefix(), "data/html/fisherman/championship/fish_event002.htm");
+		
+		String str = null;
+		for (int x = 1; x <= 5; x++)
+		{
+			str += "<tr><td width=70 align=center>" + x + "</td>";
+			str += "<td width=110 align=center>" + getCurrentName(x) + "</td>";
+			str += "<td width=80 align=center>" + getCurrentFishLength(x) + "</td></tr>";
+		}
+		html.replace("%TABLE%", str);
+		html.replace("%prizeItem%", ItemTable.getInstance().getTemplate(Config.ALT_FISH_CHAMPIONSHIP_REWARD_ITEM).getName());
+		html.replace("%prizeFirst%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_1));
+		html.replace("%prizeTwo%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_2));
+		html.replace("%prizeThree%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_3));
+		html.replace("%prizeFour%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_4));
+		html.replace("%prizeFive%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_5));
+		pl.sendPacket(html);
+	}
+	
+	public void showChampScreen(L2PcInstance pl, L2NpcInstance npc)
+	{
+		final NpcHtmlMessage html = new NpcHtmlMessage();
+		html.setFile(pl.getHtmlPrefix(), "data/html/fisherman/championship/fish_event001.htm");
+		
+		String str = null;
+		for (int x = 1; x <= 5; x++)
+		{
+			str += "<tr><td width=70 align=center>" + x + "</td>";
+			str += "<td width=110 align=center>" + getWinnerName(x) + "</td>";
+			str += "<td width=80 align=center>" + getFishLength(x) + "</td></tr>";
+		}
+		html.replace("%TABLE%", str);
+		html.replace("%prizeItem%", ItemTable.getInstance().getTemplate(Config.ALT_FISH_CHAMPIONSHIP_REWARD_ITEM).getName());
+		html.replace("%prizeFirst%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_1));
+		html.replace("%prizeTwo%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_2));
+		html.replace("%prizeThree%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_3));
+		html.replace("%prizeFour%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_4));
+		html.replace("%prizeFive%", String.valueOf(Config.ALT_FISH_CHAMPIONSHIP_REWARD_5));
+		html.replace("%refresh%", String.valueOf(getTimeRemaining()));
+		html.replace("%objectId%", String.valueOf(npc.getObjectId()));
+		pl.sendPacket(html);
+	}
+	
+	public void shutdown()
+	{
+		GlobalVariablesManager.getInstance().set("fishChampionshipEnd", _enddate);
+		
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement = con.prepareStatement(DELETE);
+			statement.execute();
+			statement.close();
+			
+			for (Fisher fisher : _winPlayers)
+			{
+				statement = con.prepareStatement(INSERT);
+				statement.setString(1, fisher.getName());
+				statement.setDouble(2, fisher.getLength());
+				statement.setInt(3, fisher.getRewardType());
+				statement.execute();
+				statement.close();
+			}
+			
+			for (Fisher fisher : _tmpPlayers)
+			{
+				statement = con.prepareStatement(INSERT);
+				statement.setString(1, fisher.getName());
+				statement.setDouble(2, fisher.getLength());
+				statement.setInt(3, 0);
+				statement.execute();
+				statement.close();
+			}
+		}
+		catch (SQLException e)
+		{
+			_log.log(Level.WARNING, "FishingChampionshipManager: can't update infos: " + e.getMessage(), e);
+		}
+	}
+	
+	private synchronized void refreshResult()
+	{
+		_needRefresh = false;
+		
+		_playersName.clear();
+		_fishLength.clear();
+		
+		Fisher fisher1;
+		Fisher fisher2;
+		
+		for (int x = 0; x <= (_tmpPlayers.size() - 1); x++)
+		{
+			for (int y = 0; y <= (_tmpPlayers.size() - 2); y++)
+			{
+				fisher1 = _tmpPlayers.get(y);
+				fisher2 = _tmpPlayers.get(y + 1);
+				if (fisher1.getLength() < fisher2.getLength())
+				{
+					_tmpPlayers.set(y, fisher2);
+					_tmpPlayers.set(y + 1, fisher1);
+				}
+			}
+		}
+		
+		for (int x = 0; x <= (_tmpPlayers.size() - 1); x++)
+		{
+			_playersName.add(_tmpPlayers.get(x).getName());
+			_fishLength.add(String.valueOf(_tmpPlayers.get(x).getLength()));
+		}
+	}
+	
+	protected void refreshWinResult()
+	{
+		_winPlayersName.clear();
+		_winFishLength.clear();
+		
+		Fisher fisher1;
+		Fisher fisher2;
+		
+		for (int x = 0; x <= (_winPlayers.size() - 1); x++)
+		{
+			for (int y = 0; y <= (_winPlayers.size() - 2); y++)
+			{
+				fisher1 = _winPlayers.get(y);
+				fisher2 = _winPlayers.get(y + 1);
+				if (fisher1.getLength() < fisher2.getLength())
+				{
+					_winPlayers.set(y, fisher2);
+					_winPlayers.set(y + 1, fisher1);
+				}
+			}
+		}
+		
+		for (int x = 0; x <= (_winPlayers.size() - 1); x++)
+		{
+			_winPlayersName.add(_winPlayers.get(x).getName());
+			_winFishLength.add(String.valueOf(_winPlayers.get(x).getLength()));
+		}
+	}
+	
+	private class finishChamp implements Runnable
+	{
+		protected finishChamp()
+		{
+			// Do nothing
+		}
+		
+		@Override
+		public void run()
+		{
+			_winPlayers.clear();
+			for (Fisher fisher : _tmpPlayers)
+			{
+				fisher.setRewardType(1);
+				_winPlayers.add(fisher);
+			}
+			_tmpPlayers.clear();
+			
+			refreshWinResult();
+			setEndOfChamp();
+			shutdown();
+			
+			_log.info("FishingChampionshipManager : new event period start.");
+			ThreadPoolManager.getInstance().scheduleGeneral(new finishChamp(), _enddate - System.currentTimeMillis());
+		}
+	}
+	
+	private class needRefresh implements Runnable
+	{
+		protected needRefresh()
+		{
+			// Do nothing
+		}
+		
+		@Override
+		public void run()
+		{
+			_needRefresh = true;
+		}
+	}
+	
+	private class Fisher
+	{
+		private double _length;
+		private final String _name;
+		private int _reward;
+		
+		public Fisher(String name, double length, int rewardType)
+		{
+			_name = name;
+			_length = length;
+			_reward = rewardType;
+		}
+		
+		public void setLength(double value)
+		{
+			_length = value;
+		}
+		
+		public void setRewardType(int value)
+		{
+			_reward = value;
+		}
+		
+		public String getName()
+		{
+			return _name;
+		}
+		
+		public int getRewardType()
+		{
+			return _reward;
+		}
+		
+		public double getLength()
+		{
+			return _length;
+		}
+	}
+}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/model/fishing/L2Fishing.java
===================================================================
--- java/com/l2jserver/gameserver/model/fishing/L2Fishing.java	(revision 6469)
+++ java/com/l2jserver/gameserver/model/fishing/L2Fishing.java	(working copy)
@@ -23,6 +23,7 @@
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.FishingMonstersData;
 import com.l2jserver.gameserver.datatables.NpcData;
+import com.l2jserver.gameserver.instancemanager.FishingChampionshipManager;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
@@ -51,6 +52,7 @@
 	private final double _regenHp;
 	private final boolean _isUpperGrade;
 	private int _lureType;
+	private final int _lureId;
 	
 	@Override
 	public void run()
@@ -78,7 +80,7 @@
 		}
 	}
 	
-	public L2Fishing(L2PcInstance Fisher, L2Fish fish, boolean isNoob, boolean isUpperGrade)
+	public L2Fishing(L2PcInstance Fisher, L2Fish fish, boolean isNoob, boolean isUpperGrade, int lureId)
 	{
 		_fisher = Fisher;
 		_fishMaxHp = fish.getFishHp();
@@ -87,6 +89,7 @@
 		_fishId = fish.getItemId();
 		_time = fish.getCombatDuration();
 		_isUpperGrade = isUpperGrade;
+		_lureId = lureId;
 		if (isUpperGrade)
 		{
 			_deceptiveMode = Rnd.get(100) >= 90 ? 1 : 0;
@@ -161,6 +164,7 @@
 				{
 					_fisher.sendPacket(SystemMessageId.YOU_CAUGHT_SOMETHING);
 					_fisher.addItem("Fishing", _fishId, 1, null, true);
+					FishingChampionshipManager.getInstance().newFish(_fisher, _lureId);
 				}
 			}
 		}
Index: java/com/l2jserver/gameserver/network/clientpackets/RequestExFishRanking.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/RequestExFishRanking.java	(revision 6469)
+++ java/com/l2jserver/gameserver/network/clientpackets/RequestExFishRanking.java	(working copy)
@@ -18,6 +18,10 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.instancemanager.FishingChampionshipManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
 /**
  * Format: (ch) just a trigger
  * @author -Wooden-
@@ -35,7 +39,16 @@
 	@Override
 	protected void runImpl()
 	{
-		_log.info("C5: RequestExFishRanking");
+		final L2PcInstance activeChar = getClient().getActiveChar();
+		if (activeChar == null)
+		{
+			return;
+		}
+		
+		if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
+		{
+			FishingChampionshipManager.getInstance().showMidResult(activeChar);
+		}
 	}
 	
 	@Override
@@ -43,4 +56,4 @@
 	{
 		return _C__D0_18_REQUESTEXFISHRANKING;
 	}
-}
\ No newline at end of file
+}
#74
L2 | Implementaciones / AIO System
Último mensaje por Swarlog - Ago 03, 2025, 01:36 AM
Es funcional tanto en H5 como Freya, para interlude necesitaran realizar algunas adaptaciones pero nada del otro mundo. By Fissban.

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

    /*
     * Copyright (C) 2013 AdminsProL2
     *
     * 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.model.actor.instance;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.logging.Logger;

    import com.l2jserver.Config;
    import com.l2jserver.L2DatabaseFactory;
    import com.l2jserver.gameserver.datatables.ExperienceTable;
    import com.l2jserver.gameserver.datatables.SkillTable;
    import com.l2jserver.gameserver.model.skills.L2Skill;

    /**
     * @autor Fissban
     */

    public class L2AioInstance
    {
       private static final Logger _log = Logger.getLogger(L2AioInstance.class.getName());
       
       private L2AioInstance()
       {
       }
       
       public boolean leerAio(L2PcInstance player)
       {
          boolean isAio = false;
          
          try (Connection con = L2DatabaseFactory.getInstance().getConnection();
             PreparedStatement statement = con.prepareStatement("SELECT charId FROM aios WHERE charId=?"))
          {
             statement.setInt(1, player.getObjectId());
             ResultSet rset = statement.executeQuery();
             
             isAio = rset.next();
          }
          catch (SQLException sqle)
          {
             _log.severe("Couldnt get aio data from " + player.getName());
             _log.severe(sqle.getMessage());
             return false;
             
          }
          if (isAio)
          {
             return true;
          }
          return false;
       }
       
       public void addAio(L2PcInstance player)
       {
          // insertar datos en la DB
          updatedb(player, true);
          
          // set lvl
          long pXp = player.getExp();
          long tXp = ExperienceTable.getInstance().getExpForLevel(85);
          player.addExpAndSp(tXp - pXp, 0);
          
       }
       
       public void removeAio(L2PcInstance player)
       {
          updatedb(player, false);
       }
       
       private void updatedb(L2PcInstance player, boolean add)
       {
          String sql = "";
          if (add)
          {
             sql = "INSERT INTO aios (charId) VALUES (?)";
          }
          else
          {
             sql = "DELETE FROM aios WHERE charId = ?";
          }
          
          try (Connection con = L2DatabaseFactory.getInstance().getConnection();
             PreparedStatement statement = con.prepareStatement(sql);)
          {
             statement.setInt(1, player.getObjectId());
             statement.execute();
          }
          catch (SQLException sqle)
          {
             _log.severe("Couldnt get aio data from " + player.getName());
             _log.severe(sqle.getMessage());
          }
       }
       
       public void onEnter(L2PcInstance player)
       {
          if (player.isAio())
          {
             if (Config.AIO_CUSTOM_TITLE_AD)
             {
                player.setTitle(Config.AIO_CUSTOM_TITLE);
             }
             if (Config.AIO_COLOR_NAME_TITLE)
             {
                Integer colorName = Integer.decode("0x" + Config.AIOS_NAMECOLOR);
                Integer colorTitle = Integer.decode("0x" + Config.AIOS_TITLECOLOR);
                player.getAppearance().setNameColor(colorName);
                player.getAppearance().setTitleColor(colorTitle);
             }
             for (int skill : Config.AIO_SKILLS.keySet())
             {
                L2Skill sk = SkillTable.getInstance().getInfo(skill, Config.AIO_SKILLS.get(skill));
                player.addSkill(sk, false);
             }
          }
       }
       
       public static L2AioInstance getInstance()
       {
          return SingleTonHolder._instance;
       }
       
       static class SingleTonHolder
       {
          @SuppressWarnings("synthetic-access")
          static L2AioInstance _instance = new L2AioInstance();
       }
    }

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

       public static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
       public static final String SECURITY_CONFIG_FILE = "./config/Security.properties";
       public static final String EMAIL_CONFIG_FILE = "./config/Email.properties";
       public static final String CH_SIEGE_FILE = "./config/ConquerableHallSiege.properties";
    +   // --------------------------------------------------
    +   // L2jAdmins Property File Definitions
    +   // --------------------------------------------------
    +   public static final String AIO_CONFIG_FILE = "./config/AIO.properties";

         FLOOD_PROTECTOR_MULTISELL = new FloodProtectorConfig("MultiSellFloodProtector");
         FLOOD_PROTECTOR_TRANSACTION = new FloodProtectorConfig("TransactionFloodProtector");
         FLOOD_PROTECTOR_MANUFACTURE = new FloodProtectorConfig("ManufactureFloodProtector");
         FLOOD_PROTECTOR_MANOR = new FloodProtectorConfig("ManorFloodProtector");
         FLOOD_PROTECTOR_SENDMAIL = new FloodProtectorConfig("SendMailFloodProtector");
         FLOOD_PROTECTOR_CHARACTER_SELECT = new FloodProtectorConfig("CharacterSelectFloodProtector");
         FLOOD_PROTECTOR_ITEM_AUCTION = new FloodProtectorConfig("ItemAuctionFloodProtector");
+         
+         L2Properties AIOandVIPSettings = new L2Properties();
+         final File AIO = new File(AIO_CONFIG_FILE);
+         try (InputStream is = new FileInputStream(AIO))

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

if (Config.GM_GIVE_SPECIAL_AURA_SKILLS)
         {
            SkillTreesData.getInstance().addSkills(activeChar, true);
         }
      }
+      
+      // System Aio
+      L2AioInstance.getInstance().onEnter(activeChar);

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

    ###########################################
    #                Sistema Aio              #
    ###########################################
    # author: Fissban

    # Enable/Disable Color in Name and Title for Aio users.
    AioColorNameTitle = True

    # Custom Color in name for Aio users.
    AioNameColor = CC00FF

    # Custom Color in title for Aio users.
    AioTitleColor = CC00FF

    # Enable/Disable Custom Title for aio users.
    CustomTitle = True

    # Custom Title for aio users
    SetCustomTitle = AIO

    # Skills gived to Aio players. They are not stored on databse.
    # Player will recive them at Enterworld
    # Format: skillid,skilllevel;skillid,skilllevel;
    AioSkills = 1085,3;1304,3;1087,3;1354,1;1062,2;1005,3;1243,6;1045,6;1048,6;\
    1311,6;168,3;213,8;1007,3;1309,3;1552,3;1006,3;1229,15;1308,3;1253,3;1284,3;\
    1009,3;1310,4;1363,1;1362,1;1397,3;1292,6;1078,6;307,1;276,1;309,1;274,1;275,1;\
    272,1;277,1;273,1;311,1;366,1;365,1;310,1;271,1;1242,3;1257,3;1353,3;1391,3;\
    1352,1;229,7;228,3;1077,3;1218,33;1059,3;1219,33;1217,33;1388,3;1389,3;1240,3;\
    1086,2;1032,3;1073,2;1036,2;1035,4;1068,3;1003,3;1282,2;1356,1;1355,1;1357,33;\
    1044,3;1182,3;1191,3;1033,3;1189,3;1259,4;1306,6;234,23;1040,3;364,1;264,1;306,1;\
    269,1;270,1;265,1;363,1;349,1;308,1;305,1;304,1;267,1;266,1;268,1;1390,3;1303,2;\
    1204,2;1268,4;1413,1;4699,8;4700,8;4703,8

CitarSQL

    CREATE TABLE IF NOT EXISTS `aios` (
      `charId` int(10) NOT NULL,
      PRIMARY KEY (`charId`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

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

    /*
     * Copyright (C) 2013 AdminsProL2
     *
     * 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 handlers.admincommandhandlers;

    import com.l2jserver.gameserver.handler.IAdminCommandHandler;
    import com.l2jserver.gameserver.model.L2Object;
    import com.l2jserver.gameserver.model.actor.instance.L2AioInstance;
    import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

    /**
     * @author fissban
     */

    public class AdminAio implements IAdminCommandHandler
    {
       
       private static final String[] ADMIN_COMMANDS =
       {
          "admin_setaio",
          "admin_removeaio",
          "admin_aio"
       };
       
       @Override
       public String[] getAdminCommandList()
       {
          return ADMIN_COMMANDS;
       }
       
       @Override
       public boolean useAdminCommand(String command, L2PcInstance activeChar)
       {
          // ???
          L2Object target = activeChar.getTarget();
          // ???
          L2PcInstance player = (L2PcInstance) target;
          
          if ((target == null) || !(target instanceof L2PcInstance))
          {
             activeChar.sendMessage("No tienes ningun target!");
             return false;
          }
          
          if (command.equals("admin_setaio") || command.startsWith("admin_setaio"))
          {
             
             if (player.isAio())
             {
                activeChar.sendMessage("El usuario " + player.getName() + " ya es Aio");
             }
             else
             {
                activeChar.sendMessage("El usuario " + player.getName() + " es ahora Aio");
                player.sendMessage("Feclicitaciones, ya eres un Char AIO");
                player.sendMessage("No olvides relogear!");
                L2AioInstance.getInstance().addAio(player);
                
             }
          }
          
          if (command.equals("admin_removeaio") || command.startsWith("admin_removeaio"))
          {
             // if (L2AioInstance.getInstance().Aio())
             if (player.isAio())
             {
                activeChar.sendMessage("El usuario " + player.getName() + " ya no es Aio");
                player.sendMessage("Has perdido el status de AIO!");
                player.sendMessage("No olvides relogear!");
                L2AioInstance.getInstance().removeAio(player);
             }
             else
             {
                activeChar.sendMessage("El usuario " + player.getName() + " no es Aio");
             }
          }
          
          if (command.equals("admin_aio") || command.startsWith("admin_aio"))
          {
             activeChar.sendMessage("Necesita tener targeteado al usuario a hacer o quitar el Aio");
             activeChar.sendMessage("use el comando //setaio para hacer un usuario Aio");
             activeChar.sendMessage("use el comando //removeaio para quitarle el Aio a un usuario");
          }
          return false;
       }
    }

CitaradminCommands.xml

       <admin command="admin_zone_visual_clear" accessLevel="7" />

       <!-- VOICE COMMANDS -->
       <admin command="banchat" accessLevel="7" />
       <admin command="debug" accessLevel="7" />
       <admin command="unbanchat" accessLevel="7" />
       
       <!-- ADMINSPROL2 -->
    +   <admin command="admin_setaio" accessLevel="7" />
    +   <admin command="admin_removeaio" accessLevel="7" />
    +   <admin command="admin_aio" accessLevel="7" />

CitaradminCommands.xsd

                               <xs:enumeration value="debug" />
                               <xs:enumeration value="recall" />
                               <xs:enumeration value="teleportto" />
                               <xs:enumeration value="unbanchat" />
    +                           <xs:enumeration value="admin_setaio" />
    +                           <xs:enumeration value="admin_removeaio" />
    +                           <xs:enumeration value="admin_aio" />

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

          @Override
          public void doCast(L2Skill skill)
          {
             super.doCast(skill);
             
             // cancel the recent fake-death protection instantly if the player attacks or casts spells
             getPlayer().setRecentFakeDeath(false);
          }
       }
       
    +   // System AIO
    +   private boolean _aio;

       public boolean getExchangeRefusal()
       {
          return _exchangeRefusal;
       }
       
       public BlockList getBlockList()
       {
          return _blockList;
       }
       
    +   // System AIO
    +   public void setAio(boolean value)
    +   {
    +      _aio = value;
    +   }
    +   
    +   // System AIO
    +   @Override
    +   public boolean isAio()
    +   {
    +      return _aio;
    +   }
#75
L2 | Implementaciones / Fantasy Isle Parade
Último mensaje por Swarlog - Ago 03, 2025, 01:35 AM
No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Fantasy Isle Parade - L2J-Server Rev.10471 BETA H5

package ai.fantasy_isle;

import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.concurrent.ScheduledFuture;

import javolution.util.FastList;
import ai.npc.AbstractNpcAI;

import com.l2jserver.gameserver.GameTimeController;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.network.serverpackets.NpcSay;

/**
 * Fantasy Isle Parade
 * @author JOJO
 */
public class Parade extends AbstractNpcAI
{
	private static final boolean DEBUG = true;
	
	// @formatter:off
	protected final int[] ACTORS =
	{
		32381,	32379,	32381,	32382,	32383,	32384,	32381,	32385,	32381,	32384,	32383,	32382,		
		32386,	32387,	32388,	32389,	32390,		
		32391,	32392,	32393,	32394,	32395,		
		32396,	32397,	32398,	32399,	32400,		
		32401,	32402,	32403,	32404,	32405,
		32406,	32407,	32408,	
		32409,	32411,	32412,	32413,	32414,	32415,		
		32416,	32417,	32418,	32419,	32420,
		32421,	32422,	32423,	32429,	32430,		
		32447,	32448,	32449,	32450,	
		32451,	32452,	32453,	32454,	32455,	32456,
		0,	0,	0,	32415,
	};
	
	// (Northbound 270 degrees) Route 1
	private final int[][] START1 =
	{
		{-54780,-56810,-2015,49152},
		{-54860,-56810,-2015,49152},
		{-54940,-56810,-2015,49152}
	};
	private final int[][] GOAL1 =
	{
		{-54780,-57965,-2015,49152},
		{-54860,-57965,-2015,49152},
		{-54940,-57965,-2015,49152}
	};
	// (Westbound 180 degrees) Route 2
	private final int[][] START2 =
	{
		{-55715,-58900,-2015,32768},
		{-55715,-58820,-2015,32768},
		{-55715,-58740,-2015,32768}
	};
	private final int[][] GOAL2 =
	{
		{-60850,-58900,-2015,32768},
		{-60850,-58820,-2015,32768},
		{-60850,-58740,-2015,32768}
	};
	// (Southbound 90 degrees) Route 3
	private final int[][] START3 =
	{
		{-61790,-57965,-2015,16384},
		{-61710,-57965,-2015,16384},
		{-61630,-57965,-2015,16384}
	};
	private final int[][] GOAL3 =
	{
		{-61790,-53890,-2116,16384},
		{-61710,-53890,-2116,16384},
		{-61630,-53890,-2116,16384}
	};
	// (Eastbound 0 degrees) Route 4
	private final int[][] START4 =
	{
		{-60840,-52990,-2108,0},
		{-60840,-53070,-2108,0},
		{-60840,-53150,-2108,0}
	};
	private final int[][] GOAL4 =
	{
		{-58620,-52990,-2015,0},
		{-58620,-53070,-2015,0},
		{-58620,-53150,-2015,0}
	};
	// (To 315 degrees northeast) Route 5
	private final int[][] START5 =
	{
		{-57233,-53554,-2015,57344},
		{-57290,-53610,-2015,57344},
		{-57346,-53667,-2015,57344}
	};
	private final int[][] GOAL5 =
	{
		{-55338,-55435,-2015,57344},
		{-55395,-55491,-2015,57344},
		{-55451,-55547,-2015,57344}
	};
	
	protected final int[][][] START =
	{
		START1,
		START2,
		START3,
		START4,
		START5
	};
	protected final int[][][] GOAL =
	{
		GOAL1,
		GOAL2,
		GOAL3,
		GOAL4,
		GOAL5
	};
	// @formatter:on
	
	protected ScheduledFuture<?> spawnTask;
	protected ScheduledFuture<?> deleteTask;
	protected ScheduledFuture<?> cleanTask;
	
	protected int npcIndex;
	protected FastList<L2Npc> spawns;
	
	public Parade()
	{
		super(Parade.class.getSimpleName(), "fantasy_isle");
		
		final long diff = timeLeftMilli(8, 0, 0), cycle = 3600000L; // 8:00 start time, repeated every 6 hours
		if (DEBUG)
		{
			SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm");
			_log.info("Fantasy Isle: Parade script starting at " + format.format(System.currentTimeMillis() + diff) + " and is scheduled each next " + (cycle / 3600000) + " hours.");
		}
		ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Start(), diff, cycle);
	}
	
	protected void load()
	{
		npcIndex = 0;
		spawns = new FastList<L2Npc>().shared();
	}
	
	protected void clean()
	{
		for (Iterator<L2Npc> it = spawns.iterator(); it.hasNext();)
		{
			L2Npc actor = it.next();
			actor.deleteMe();// TODO:NPE
			it.remove();
		}
		spawns = null;
	}
	
	private long timeLeftMilli(int hh, int mm, int ss)
	{
		int now = (GameTimeController.getInstance().getGameTicks() * 60) / 100;
		int dd = ((hh * 3600) + (mm * 60) + ss) - (now % 86400);
		if (dd < 0)
		{
			dd += 86400;
		}
		
		return (dd * 1000L) / 6L;
	}
	
	protected class Start implements Runnable
	{
		@Override
		public void run()
		{
			load();
			spawnTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Spawn(), 0, 5000);
			deleteTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Delete(), 10000, 1000);
			cleanTask = ThreadPoolManager.getInstance().scheduleGeneral(new Clean(), 420000);
		}
	}
	
	protected class Spawn implements Runnable
	{
		@Override
		public void run()
		{
			for (int i = 0; i < 3; ++i)
			{
				if (npcIndex >= ACTORS.length)
				{
					spawnTask.cancel(false);
					break;
				}
				int npcId = ACTORS[npcIndex++];
				if (npcId == 0)
				{
					continue;
				}
				for (int route = 0; route < 5; ++route)
				{ // TODO:Provisional
					int[] start = START[route][i];
					int[] goal = GOAL[route][i];
					L2Npc actor = addSpawn(npcId, start[0], start[1], start[2], start[3], false, 0);
					actor.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(goal[0], goal[1], goal[2], goal[3]));
					spawns.add(actor);// TODO:NPE
				}
			}
		}
	}
	
	protected class Delete implements Runnable
	{
		@Override
		public void run()
		{
			if (spawns.size() > 0)
			{
				for (Iterator<L2Npc> it = spawns.iterator(); it.hasNext();)
				{
					L2Npc actor = it.next();
					if (actor.calculateDistance(actor.getXdestination(), actor.getYdestination(), 0, false, true) < (100 * 100))// TODO:NPE
					{
						actor.deleteMe();
						it.remove();
					}
					else if (!actor.isMoving())
					{
						actor.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(actor.getXdestination(), actor.getYdestination(), actor.getZdestination(), actor.getHeading()));
						// System.out.println("__BASENAME__:__LINE__: " + actor.getNpcId() + " " + actor.getX() + "," + actor.getY() + "," + actor.getZ() + "," + actor.getHeading() + " -> " + actor.getXdestination() + "," + actor.getYdestination() + "," + actor.getZdestination() + " " +
						// (actor.hasAI() ? actor.getAI().getIntention().name() : "NOAI"));
						actor.broadcastPacket(new NpcSay(actor.getObjectId(), 0, actor.getId(), actor.getId() + "/" + actor.getXdestination() + "," + actor.getYdestination() + "," + actor.getZdestination()));
					}
				}
				if (spawns.size() == 0)
				{
					deleteTask.cancel(false);// TODO:NPE
				}
			}
		}
	}
	
	protected class Clean implements Runnable
	{
		@Override
		public void run()
		{
			spawnTask.cancel(false);
			spawnTask = null;
			deleteTask.cancel(false);
			deleteTask = null;
			cleanTask.cancel(false);
			cleanTask = null;
			clean();
		}
	}
	
	public static void main(String[] args)
	{
		new Parade();
	}
}
#76
L2 | Implementaciones / Autorestart Gameserver
Último mensaje por Swarlog - Ago 03, 2025, 01:34 AM
No puedes ver este adjunto.

Citar# If EnableRestartSystem = True Describe hours of the day
# Example: 22:00,23:00 (hh:mm,hh:mm...)
# NOTE: Separate ":" mm:hh and "," others restart time
RestartByTimeOfDay = 00:00,12:00 <<  Here you put the time that will give the restart!

### Eclipse Workspace Patch 1.0
#P L2JFrozen
Index: gameserver/head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java (revision 936)
+++ gameserver/head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java (working copy)
@@ -26,6 +26,7 @@
import com.l2jfrozen.Config;
import com.l2jfrozen.crypt.nProtect;
import com.l2jfrozen.crypt.nProtect.RestrictionType;
+import com.l2jfrozen.gameserver.Restart;
import com.l2jfrozen.gameserver.communitybbs.Manager.RegionBBSManager;
import com.l2jfrozen.gameserver.controllers.GameTimeController;
import com.l2jfrozen.gameserver.datatables.CharSchemesTable;
@@ -466,6 +467,11 @@
}
}

+        if(Config.RESTART_BY_TIME_OF_DAY)
+        {
+                ShowNextRestart(activeChar);
+        }
+
// NPCBuffer
if (PowerPakConfig.BUFFER_ENABLED)
CharSchemesTable.getInstance().onPlayerLogin(activeChar.getObjectId());
@@ -801,6 +807,17 @@
}
}

+    /**
+    * Envia mensagem para o player do proximo restart
+    * NOTE: RESTART_BY_TIME_OF_DAY = TRUE
+    *
+    * @param activeChar
+    */
+    private void ShowNextRestart(L2PcInstance activeChar)
+    {
+            activeChar.sendMessage("Next Restart: " + Restart.getInstance().getRestartNextTime());
+    }
+
@Override
public String getType()
{



### Eclipse Workspace Patch 1.0
#P L2JFrozen
Index: gameserver/head-src/com/l2jfrozen/gameserver/Shutdown.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/Shutdown.java (revision 936)
+++ gameserver/head-src/com/l2jfrozen/gameserver/Shutdown.java (working copy)
@@ -171,6 +171,18 @@
}
}

+    public void autoRestart(int time)
+    {
+            _secondsShut = time;
+
+            countdown();
+         
+            _shutdownMode = GM_RESTART;
+         
+            _instance.setMode(GM_RESTART);
+            System.exit(2);
+    }
+
/**
* Default constucter is only used internal to create the shutdown-hook instance
*/


### Eclipse Workspace Patch 1.0
#P L2JFrozen
Index: gameserver/head-src/com/l2jfrozen/gameserver/Restart.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/Restart.java (revision 0)
+++ gameserver/head-src/com/l2jfrozen/gameserver/Restart.java (revision 0)
@@ -0,0 +1,122 @@
+/*
+ * 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.l2jfrozen.gameserver;
+
+ import java.text.SimpleDateFormat;
+ import java.util.Calendar;
+ import java.util.logging.Logger;
+
+ import com.l2jfrozen.Config;
+ import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
+
+ /**
+ * This Config for Auto Restart GameServer
+ * Initialize class getInstance()
+ * Set Time in Config File
+ * Thank You L2JServer | L2JRussia
+ *
+ * @author L2JRussia
+ *
+ */
+ public class Restart
+ {
+         //Variaveis globais
+         private static Restart _instance = null;
+         protected static final Logger _log = Logger.getLogger(Restart.class.getName());
+         private Calendar NextRestart;
+         private SimpleDateFormat format = new SimpleDateFormat("HH:mm");
+
+         //Singleton
+         public static Restart getInstance()
+         {
+                 if(_instance == null)
+                         _instance = new Restart();
+                 return _instance;
+         }
+
+         public String getRestartNextTime()
+         {
+         if(NextRestart.getTime() != null)
+                 return format.format(NextRestart.getTime());
+                 else
+                         return "Erro";
+         }
+
+         //Connstrutor
+         private Restart()
+         {
+       //:D
+         }
+
+         public void StartCalculationOfNextRestartTime()
+         {
+                 _log.info("#####################################");
+ _log.info("#[Restart System]: System actived...#");
+ _log.info("#####################################");
+                 try
+                 {
+                         Calendar currentTime = Calendar.getInstance();
+                         Calendar testStartTime = null;
+                         long flush2 = 0,timeL = 0;
+                         int count = 0;
+
+                         for (String timeOfDay : Config.RESTART_INTERVAL_BY_TIME_OF_DAY)
+                         {
+                                 testStartTime = Calendar.getInstance();
+                                 testStartTime.setLenient(true);
+                                 String[] splitTimeOfDay = timeOfDay.split(":");
+                                 testStartTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(splitTimeOfDay[0]));
+                                 testStartTime.set(Calendar.MINUTE, Integer.parseInt(splitTimeOfDay[1]));
+                                 testStartTime.set(Calendar.SECOND, 00);
+                                 //Verifica a validade to tempo
+                                 if (testStartTime.getTimeInMillis() < currentTime.getTimeInMillis())
+                                 {
+                                         testStartTime.add(Calendar.DAY_OF_MONTH, 1);
+                                 }
+
+                                 //TimeL Recebe o quanto falta de milisegundos para o restart
+                                 timeL = testStartTime.getTimeInMillis() - currentTime.getTimeInMillis();
+
+                                 //Verifica qual horario sera o proximo restart
+                                 if(count == 0){
+                                 flush2 = timeL;
+                                 NextRestart = testStartTime;
+                                 }
+
+                                 if(timeL <  flush2){
+                                 flush2 = timeL;
+                                 NextRestart = testStartTime;
+                                 }
+
+                                 count ++;
+                         }
+                         _log.info("[AutoRestart]: Next Restart Time: " + NextRestart.getTime().toString());
+             ThreadPoolManager.getInstance().scheduleGeneral(new StartRestartTask(), flush2);
+                 }
+                 catch (Exception e)
+                 {
+                         System.out.println("[AutoRestart]: The restart automated server presented error in load restarts period config !");
+                 }
+         }
+
+         class StartRestartTask implements Runnable
+         {
+                 public void run()
+                 {
+           _log.info("Start automated restart GameServer.");
+           Shutdown.getInstance().autoRestart(Config.RESTART_SECONDS);
+                 }
+         }
+ }
\ No newline at end of file


### Eclipse Workspace Patch 1.0
#P L2JFrozen
Index: gameserver/head-src/com/l2jfrozen/gameserver/GameServer.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/GameServer.java (revision 936)
+++ gameserver/head-src/com/l2jfrozen/gameserver/GameServer.java (working copy)
@@ -549,6 +549,14 @@
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
OfflineTradeTable.restoreOfflineTraders();

+ Util.printSection("Restart Manager");
+        if(Config.RESTART_BY_TIME_OF_DAY)
+                Restart.getInstance().StartCalculationOfNextRestartTime();
+        else
+                _log.info("# Auto Restart System is Disabled #");
+     
+        System.gc();
+
Util.printSection("Info");
_log.info("Operating System: " + Util.getOSName() + " " + Util.getOSVersion() + " " + Util.getOSArch());
_log.info("Available CPUs: " + Util.getAvailableProcessors());



### Eclipse Workspace Patch 1.0
#P L2JFrozen
Index: gameserver/config/custom/la2slipper.properties
===================================================================
--- gameserver/config/custom/la2slipper.properties (revision 936)
+++ gameserver/config/custom/la2slipper.properties (working copy)
@@ -2,6 +2,42 @@
#                        Server Config                      #
#============================================================#

+###########################################
+# Automated restart config                #
+# Mod exclusive LA2JSlipper              #
+# #########################################
+# Enable / Disable Restart Auto
+EnableRestartSystem = False
+
+# If EnableRestartSystem = True Describe hours of the day
+# Example: 22:00,23:00 (hh:mm,hh:mm...)
+# NOTE: Separate ":" mm:hh and "," others restart time
+RestartByTimeOfDay = 00:00,12:00
+
+# Seconds to restart the server ( 360 = 5 Minutos )
+# default = 360
+RestartSeconds = 360
+
# Server Name Enabled: Displays a message on char login
# with the server name you have set below.
ServerNameEnabled = False

### Eclipse Workspace Patch 1.0
#P L2JFrozen
Index: gameserver/head-src/com/l2jfrozen/Config.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/Config.java (revision 936)
+++ gameserver/head-src/com/l2jfrozen/Config.java (working copy)

@@ -2281,6 +2287,13 @@
public static boolean ANNOUNCE_TO_ALL_SPAWN_RB;
public static boolean ANNOUNCE_TRY_BANNED_ACCOUNT;
public static String ALT_Server_Name;
+ public static boolean ENABLE_CLAN_SYSTEM;
+ public static Map CLAN_SKILLS;
+ public static byte CLAN_LEVEL;
+ public static int REPUTATION_QUANTITY;
+              public static boolean RESTART_BY_TIME_OF_DAY;
+              public static int RESTART_SECONDS;
+              public static String[] RESTART_INTERVAL_BY_TIME_OF_DAY;

+         RESTART_BY_TIME_OF_DAY = Boolean.parseBoolean(la2slipperSettings.getProperty("EnableRestartSystem", "false"));
+         RESTART_SECONDS = Integer.parseInt(la2slipperSettings.getProperty("RestartSeconds", "360"));
+         RESTART_INTERVAL_BY_TIME_OF_DAY = la2slipperSettings.getProperty("RestartByTimeOfDay", "20:00").split(",");
#77
L2 | Implementaciones / Heroe al matar X jugadores
Último mensaje por Swarlog - Ago 03, 2025, 01:34 AM
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java   (revision 1901)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java   (working copy)
@@ -488,6 +488,11 @@
 
    private boolean _noble = false;
    private boolean _hero = false;
+   
+   /** Special hero aura values */
+   private int heroConsecutiveKillCount = 0;
+   private boolean isPermaHero = false;
+   private boolean isPVPHero = false;
 
    /** The L2FolkInstance corresponding to the last Folk wich one the player talked. */
    private L2FolkInstance _lastFolkNpc = null;
@@ -1971,6 +1976,13 @@
    public void setPvpKills(int pvpKills)
    {
       _pvpKills = pvpKills;
+      
+      // Set hero aura if pvp kills > 5000
+      if (pvpKills > 5000)
+      {
+         isPermaHero = true;
+         setHero(true);
+      }
    }
 
    /**
@@ -4678,6 +4690,14 @@
 
       stopRentPet();
       stopWaterTask();
+      
+      // Remove kill count for special hero aura if total pvp < 100
+      heroConsecutiveKillCount = 0;
+      if (!isPermaHero)
+      {
+         setHero(false);
+         sendPacket(new UserInfo(this));
+      }
       return true;
    }
 
@@ -4897,6 +4917,13 @@
     {
         // Add karma to attacker and increase its PK counter
         setPvpKills(getPvpKills() + 1);
+       
+        // Increase the kill count for a special hero aura
+        heroConsecutiveKillCount++;
+       
+        // If heroConsecutiveKillCount > 4 (5+ kills) give hero aura
+        if(heroConsecutiveKillCount > 20)
+           setHero(true);
 
         // Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
         sendPacket(new UserInfo(this));
@@ -8715,6 +8742,22 @@
    {
       return _blockList;
    }
+   
+   public void reloadPVPHeroAura()
+   {
+      sendPacket(new UserInfo(this));
+   }
+   
+   public void setHeroAura (boolean heroAura)
+   {
+      isPVPHero = heroAura;
+      return;
+   }
+   
+   public boolean getIsPVPHero()
+   {
+      return isPVPHero;
+   }
 
    public void setHero(boolean hero)
    {
Index: java/net/sf/l2j/gameserver/serverpackets/UserInfo.java
===================================================================
--- java/net/sf/l2j/gameserver/serverpackets/UserInfo.java   (revision 1901)
+++ java/net/sf/l2j/gameserver/serverpackets/UserInfo.java   (working copy)
@@ -337,7 +337,7 @@
 
         writeD(_activeChar.getClanCrestLargeId());
         writeC(_activeChar.isNoble() ? 1 : 0); //0x01: symbol on char menu ctrl+I
-        writeC((_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA)) ? 1 : 0); //0x01: Hero Aura
+        writeC((_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA) || _activeChar.getIsPVPHero()) ? 1 : 0); //0x01: Hero Aura
 
         writeC(_activeChar.isFishing() ? 1 : 0); //Fishing Mode
         writeD(_activeChar.getFishx()); //fishing x
#78
L2 | Implementaciones / Limitar mensajes del chat con ...
Último mensaje por Swarlog - Ago 03, 2025, 01:33 AM
Index: java/config/options.properties
===================================================================
#[False] Does not necessarily imply that the GeoData buffer's content is not resident in physical memory.
ForceGeodata = True
+
+#True = Enable delay 
+ShoutChatDelay = False 
+TradeChatDelay = False

Index: java/net/sf/l2j/Config.java
===================================================================
    /** AI max thread */
    public static int AI_MAX_THREAD;
+
+    public static boolean SHOUT_CHAT_DELAY; 
+    public static boolean TRADE_CHAT_DELAY; 
+
... ...   
                FORCE_GEODATA                   = Boolean.parseBoolean(optionsSettings.getProperty("ForceGeoData", "True"));
                ACCEPT_GEOEDITOR_CONN           = Boolean.parseBoolean(optionsSettings.getProperty("AcceptGeoeditorConn", "False"));
+
+                SHOUT_CHAT_DELAY                  = Boolean.parseBoolean(optionsSettings.getProperty("ShoutChatDelay", "false")); 
+                TRADE_CHAT_DELAY                  = Boolean.parseBoolean(optionsSettings.getProperty("TradeChatDelay", "false"));

Index: java/net/sf/l2j/Config.java
===================================================================
    /** AI max thread */
    public static int AI_MAX_THREAD;
+
+    public static boolean SHOUT_CHAT_DELAY; 
+    public static boolean TRADE_CHAT_DELAY; 
+
... ...   
                FORCE_GEODATA                   = Boolean.parseBoolean(optionsSettings.getProperty("ForceGeoData", "True"));
                ACCEPT_GEOEDITOR_CONN           = Boolean.parseBoolean(optionsSettings.getProperty("AcceptGeoeditorConn", "False"));
+
+                SHOUT_CHAT_DELAY                  = Boolean.parseBoolean(optionsSettings.getProperty("ShoutChatDelay", "false")); 
+                TRADE_CHAT_DELAY                  = Boolean.parseBoolean(optionsSettings.getProperty("TradeChatDelay", "false"));

Index: java/net/sf/l2j/gameserver/clientpackets/Say2.java
===================================================================
case SHOUT: 
+   if (Config.SHOUT_CHAT_DELAY && !activeChar.isGM())
+ {
+ if (!FloodProtector.getInstance().tryPerformAction(activeChar.getObjectId(), FloodProtector.PROTECTED_SHOUTVOICE))
+ {
+ activeChar.sendMessage("Action failed. You are only able to speak in the Shout channel once every 10 seconds.");
+ return;
+ }
+ }
                if (Config.DEFAULT_GLOBAL_CHAT.equalsIgnoreCase("on") ||
                        (Config.DEFAULT_GLOBAL_CHAT.equalsIgnoreCase("gm") && activeChar.isGM()))
... ...   
case TRADE:
+   if (Config.TRADE_CHAT_DELAY && !activeChar.isGM())
+ {
+ if (!FloodProtector.getInstance().tryPerformAction(activeChar.getObjectId(), FloodProtector.PROTECTED_TRADEVOICE))
+ {
+ activeChar.sendMessage("Action failed. You are only able to speak in the Trade channel once every 10 seconds.");
+ return;
+ }
+ }
if (Config.DEFAULT_TRADE_CHAT.equalsIgnoreCase("on") ||
(Config.DEFAULT_TRADE_CHAT.equalsIgnoreCase("gm") && activeChar.isGM()))

Index: java/net/sf/l2j/gameserver/util/FloodProtector.java
===================================================================
         public static final int PROTECTED_ITEMPETSUMMON = 3; 
         public static final int PROTECTED_HEROVOICE             = 4; 
+         public static final int PROTECTED_SHOUTVOICE    = 5; 
+         public static final int PROTECTED_TRADEVOICE    = 6; 

         // =========================================================

config/options:

# Chat configuration
# Values: GLOBAL, REGION, GM, OFF
# Global Chat - Default: REGION
GlobalChat = REGION
# Time limit between using Global Chat in 100ms
GlobalChatTime = 1
# Trade Chat - Default: REGION
TradeChat = REGION
# Time limit between using Trade Chat in 100ms
TradeChatTime = 1
#79
L2 | Implementaciones / Restringir nombres
Último mensaje por Swarlog - Ago 03, 2025, 01:33 AM
### Eclipse Workspace Patch 1.0
#P Heroes
Index: aCis_gameserver/config/server.ini
===================================================================
--- aCis_gameserver/config/server.ini	(revision 12)
+++ aCis_gameserver/config/server.ini	(working copy)
@@ -64,6 +64,9 @@
 # Allow delete chars after D days, 0 = feature disabled.
 DeleteCharAfterDays = 3
 
+#Restricted names for characters
+RestrictedNames = fuck,dildo,admin
+
 # Define how many players are allowed to play simultaneously on your server.
 MaximumOnlineUsers = 500
 
Index: aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/CharacterCreate.java
===================================================================
--- aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/CharacterCreate.java	(revision 7)
+++ aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/CharacterCreate.java	(working copy)
@@ -83,6 +83,18 @@
 			return;
 		}
 		
+		if(Config.FORBIDDEN_NAMES.length > 1)
+		{
+			for(String st : Config.FORBIDDEN_NAMES)
+			{
+				if(_name.toLowerCase().contains(st.toLowerCase()))
+				{
+					sendPacket(new CharCreateFail(CharCreateFail.REASON_INCORRECT_NAME));
+					return;
+				}
+			}
+		}
+		
 		if (_face > 2 || _face < 0)
 		{
 			sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
Index: aCis_gameserver/java/net/sf/l2j/Config.java
===================================================================
--- aCis_gameserver/java/net/sf/l2j/Config.java	(revision 12)
+++ aCis_gameserver/java/net/sf/l2j/Config.java	(working copy)
@@ -538,6 +538,7 @@
 	
 	/** clients related */
 	public static int DELETE_DAYS;
+	public static String[] FORBIDDEN_NAMES;
 	public static int MAXIMUM_ONLINE_USERS;
 	public static int MIN_PROTOCOL_REVISION;
 	public static int MAX_PROTOCOL_REVISION;
@@ -1385,6 +1386,7 @@
 		SERVER_LIST_TESTSERVER = server.getProperty("TestServer", false);
 		
 		DELETE_DAYS = server.getProperty("DeleteCharAfterDays", 7);
+		FORBIDDEN_NAMES = server.getProperty("RestrictedNames", "").split(",");
 		MAXIMUM_ONLINE_USERS = server.getProperty("MaximumOnlineUsers", 100);
 		MIN_PROTOCOL_REVISION = server.getProperty("MinProtocolRevision", 730);
 		MAX_PROTOCOL_REVISION = server.getProperty("MaxProtocolRevision", 746);
#80
L2 | Codes / Anuncios al conectarse un juga...
Último mensaje por Swarlog - Ago 03, 2025, 01:33 AM
Este code es para que cuando se conecte un personaje que sea heroe, noble, vip, etc.. se anuncie en el chat.

Lo primero es abrir el archivo "gameserver/network/clientpackets/EnterWorld.Java"

Luego buscamos la línea donde dice:

CrownManager.getInstance().checkCrowns(activeChar);

Y a continuación añadimos lo siguiente o al menos lo que queremos:

if (activeChar.isHero())
             Announcements.getInstance().announceToAll("The Hero "+ activeChar.getName() +" Has Logged in");

if (activeChar.isNoble())
             Announcements.getInstance().announceToAll("The Noblesse "+ activeChar.getName() +" Has Logged in");

    if (activeChar.isDonator())
                 Announcements.getInstance().announceToAll("The V.I.P. "+ activeChar.getName() +" Has Logged in");

if (activeChar.isGM())
             Announcements.getInstance().announceToAll("The Admin/GM "+ activeChar.getName() +" Has Logged in");

if (activeChar.isNewbie())
             Announcements.getInstance().announceToAll("The New Character "+ activeChar.getName() +" Has Logged in");