Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
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;
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)