CCCPaste

7c6035f2d6a33

Index: L2jFrozen_GameServer/config/system_config/events/SiegeRewards.properties
================================================================================
# ===========================================================
# Siege Reward System by Erol & Setekh
# ===========================================================
# Description:
# This system rewards victorious clan members after a siege.
# Supports both online and offline members.
# Separate rewards for clan leader.
#
# Instructions:
# 1. Set ActivateSystem = True to enable the system.
# 2. Set RewardOnlineOnly = True if only online members should be rewarded.
# 3. Configure rewards for members in RewardInfo (ItemID,Count;ItemID,Count;...)
# 4. Configure rewards for clan leader in RewardClInfo (ItemID,Count;ItemID,Count;...)
#
# Example:
# RewardInfo = 57,2000;5575,2000000
# RewardClInfo = 57,5000;5575,5000000
# ===========================================================

# Activates the Siege Reward System (True = ON, False = OFF)
ActivateSystem = False

# Reward only online members? (True = only online, False = include offline)
RewardOnlineOnly = False

# Reward list for regular clan members (ID,Count;ID,Count;...)
RewardInfo = 57,2000;5575,2000000

# Reward list for clan leader (ID,Count;ID,Count;...)
RewardClInfo = 57,2000;5575,2000000

Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java
===============================================================================

		if (Config.RESTART_BY_TIME_OF_DAY)
		{
			ShowNextRestart(activeChar);
		}
 
+       	if(SiegeRewardManager.ACTIVATED_SYSTEM && !SiegeRewardManager.REWARD_ACTIVE_MEMBERS_ONLY)
+       	        	SiegeRewardManager.getInstance().processWorldEnter(activeChar);
+       	       	
		// NPCBuffer
		if (PowerPakConfig.BUFFER_ENABLED)
			CharSchemesTable.getInstance().onPlayerLogin(activeChar.getObjectId());

Index: head-src/com/l2jarchid/gameserver/model/entity/Siege.java
===================================================================
			// Respawn door to castle
			getCastle().spawnDoor();
+
+            // Siege Reward Manager
+            if(getCastle().getOwnerId() > 0)
+            	SiegeRewardManager.getInstance().notifySiegeEnded(ClanTable.getInstance().getClan(getCastle().getOwnerId()), getCastle().getName());
         }
     }

Index: head-src/com/l2jfrozen/gameserver/GameServer.java
===================================================================

		RecipeController.getInstance();
		EventDroplist.getInstance();
		AugmentationData.getInstance();
+
+		// Siege Reward Manager - Seth
+		SiegeRewardManager.getInstance();
+		
		MonsterRace.getInstance();
		MercTicketManager.getInstance();

Index: head-src/com/l2jfrozen/gameserver/custom/SiegeRewardManager.java
========================================================================

package com.l2jfrozen.gameserver.custom;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;

import com.l2jfrozen.gameserver.model.L2Clan;
import com.l2jfrozen.gameserver.model.L2ClanMember;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.util.database.L2DatabaseFactory;

public class SiegeRewardManager
{
	private static SiegeRewardManager _instance;
	private static final Logger _log = Logger.getLogger(SiegeRewardManager.class.getName());

	public static boolean ACTIVATED_SYSTEM;
	public static boolean REWARD_ACTIVE_MEMBERS_ONLY;

	private final List memberRewards;
	private final List leaderRewards;
	private final Map> offlineRewards;

	private SiegeRewardManager()
	{
		memberRewards = new ArrayList<>();
		leaderRewards = new ArrayList<>();
		offlineRewards = new ConcurrentHashMap<>();
		_log.info("SiegeRewardManager initialized.");
	}

	public static SiegeRewardManager getInstance()
	{
		if (_instance == null)
		{
			_instance = new SiegeRewardManager();
			_instance.loadConfigs();
			_instance.loadOfflineMembers();
		}
		return _instance;
	}

	private void loadConfigs()
	{
		try (FileInputStream fis = new FileInputStream(new File("./config/system_config/events/SiegeRewards.properties")))
		{
			Properties prop = new Properties();
			prop.load(fis);

			ACTIVATED_SYSTEM = Boolean.parseBoolean(prop.getProperty("ActivateSystem", "false"));
			REWARD_ACTIVE_MEMBERS_ONLY = Boolean.parseBoolean(prop.getProperty("RewardOnlineOnly", "false"));

			if (ACTIVATED_SYSTEM)
			{
				String[] memberItems = prop.getProperty("RewardInfo", "").split(";");
				for (String s : memberItems)
					memberRewards.add(new MemberReward(s.split(",")));

				String[] leaderItems = prop.getProperty("RewardClInfo", "").split(";");
				for (String s : leaderItems)
					leaderRewards.add(new LeaderReward(s.split(",")));
			}
		}
		catch (Exception e)
		{
			_log.severe("Failed to load SiegeRewardManager configs: " + e);
		}

		_log.info("SiegeRewardManager Loaded: " + memberRewards.size() + " member reward(s), " + leaderRewards.size() + " leader reward(s).");
	}

	private void loadOfflineMembers()
	{
		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
			PreparedStatement st = con.prepareStatement("SELECT charId, itemId, count, castle_name FROM reward_list");
			ResultSet rs = st.executeQuery())
		{
			while (rs.next())
			{
				int charId = rs.getInt("charId");
				int itemId = rs.getInt("itemId");
				int count = rs.getInt("count");
				String castleName = rs.getString("castle_name");

				ToReward tr = new ToReward(itemId, count, castleName);
				offlineRewards.computeIfAbsent(charId, k -> new ArrayList<>()).add(tr);
			}
		}
		catch (SQLException e)
		{
			_log.severe("Error loading offline siege rewards: " + e);
		}
	}

	public void storeOfflineReward(int charId, String castleName)
	{
		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
			PreparedStatement st = con.prepareStatement("REPLACE INTO reward_list VALUES(?,?,?,?)"))
		{
			for (MemberReward rew : memberRewards)
			{
				st.setInt(1, charId);
				st.setInt(2, rew.getItemId());
				st.setInt(3, rew.getItemCount());
				st.setString(4, castleName);
				st.addBatch();
			}
			st.executeBatch();
		}
		catch (SQLException e)
		{
			_log.severe("Error storing offline reward: " + e);
		}
	}

	public void processWorldEnter(L2PcInstance player)
	{
		List rewards = offlineRewards.get(player.getObjectId());
		if (rewards == null) return;

		Set castles = new HashSet<>();

		for (ToReward tr : rewards)
		{
			if (player.getInventory().validateCapacity(tr.count))
				player.addItem("SiegeReward", tr.itemId, tr.count, player, true);

			castles.add(tr.castleName);
		}

		player.sendMessage("Congratulations! You have been rewarded for the siege(s): " + String.join(", ", castles));
		offlineRewards.remove(player.getObjectId());
	}

	public void notifySiegeEnded(L2Clan clan, String castleName)
	{
		int leaderId = clan.getLeaderId();

		for (L2ClanMember member : clan.getMembers())
		{
			L2PcInstance player = member.getPlayerInstance();

			if (player != null && player.isOnline() == 1)
			{
				boolean isLeader = (member.getObjectId() == leaderId);

				List rewardsList = isLeader ? leaderRewards : memberRewards;

				for (Reward rew : rewardsList)
				{
					if (player.getInventory().validateCapacity(rew.getItemCount()))
						player.addItem("SiegeReward", rew.getItemId(), rew.getItemCount(), player, true);
				}

				player.sendMessage("Congratulations! You have been rewarded for the " + castleName + " siege victory!");
			}
			else
			{
				storeOfflineReward(member.getObjectId(), castleName);
			}
		}
	}

	// ----------------------- Inner classes -----------------------
	private static class ToReward
	{
		int itemId, count;
		String castleName;

		public ToReward(int itemId, int count, String castleName)
		{
			this.itemId = itemId;
			this.count = count;
			this.castleName = castleName;
		}
	}

	private interface Reward
	{
		int getItemId();
		int getItemCount();
	}

	private static class MemberReward implements Reward
	{
		private final int itemId, itemCount;

		public MemberReward(String[] params)
		{
			this.itemId = Integer.parseInt(params[0]);
			this.itemCount = Integer.parseInt(params[1]);
		}

		@Override
		public int getItemId()
		{
			return itemId;
		}

		@Override
		public int getItemCount()
		{
			return itemCount;
		}
	}

	private static class LeaderReward implements Reward
	{
		private final int itemId, itemCount;

		public LeaderReward(String[] params)
		{
			this.itemId = Integer.parseInt(params[0]);
			this.itemCount = Integer.parseInt(params[1]);
		}

		@Override
		public int getItemId()
		{
			return itemId;
		}
		@Override
		public int getItemCount()
		{
			return itemCount;
		}
	}
}

Index: L2jFrozen_DataPack/sql/reward_list.sql
==============================================

+SET FOREIGN_KEY_CHECKS=0;
+-- ----------------------------
+-- Table structure for `reward_list`
+-- ----------------------------
+DROP TABLE IF EXISTS `reward_list`;
+CREATE TABLE `reward_list` (
+  `charid` int(11) NOT NULL default '0',
+  `itemId` int(11) NOT NULL default '0',
+  `count` int(22) NOT NULL default '0',
+  `castle_name` varchar(50) NOT NULL default '',
+  `rewarded` int(2) NOT NULL default '0',
+  PRIMARY KEY  (`charid`,`itemId`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+-- ----------------------------
+-- Records of reward_list
+-- ----------------------------

Index: L2jFrozen_DataPack/tools/database_installer.sh
======================================================

$MYG < ../sql/quest_global_data.sql &> /dev/null
$MYG < ../sql/reward_log.sql &> /dev/null
+$MYG < ../sql/reward_list.sql &> /dev/null
$MYG < ../sql/raidboss_spawnlist.sql &> /dev/null

Index: L2jFrozen_DataPack/tools/Database Installer.bat
=======================================================

echo *** Sucesfull 69 percents. ***
%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/reward_log.sql
+%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/reward_list.sql
%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/raidboss_spawnlist.sql

Index: L2jFrozen_DataPack/tools/full_install.sql
=================================================

DROP TABLE IF EXISTS quest_global_data;
DROP TABLE IF EXISTS reward_log;
+DROP TABLE IF EXISTS reward_list;
DROP TABLE IF EXISTS raidboss_spawnlist;