No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.
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;
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,
### 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
+}
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
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;
+ }
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();
}
}
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(",");
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
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;
// =========================================================
# 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
### 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);
CrownManager.getInstance().checkCrowns(activeChar);
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");