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 extends Reward> 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;