From b07f46dc5c78e56ec0350bc9f9d9dfa0807164ba Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Tue, 14 Jul 2015 19:55:19 +0000 Subject: [PATCH] Sync with L2jServer HighFive Jul 14th 2015. --- .../scripts/custom/events/Elpies/Elpies.java | 24 ++-- .../custom/events/Rabbits/Rabbits.java | 16 ++- .../data/scripts/custom/events/Race/Race.java | 38 +++--- .../Q00421_LittleWingsBigAdventure.java | 17 +-- .../scripts/custom/events/Elpies/Elpies.java | 24 ++-- .../custom/events/Rabbits/Rabbits.java | 16 ++- .../scripts/custom/events/Race/Race.java | 39 +++--- trunk/dist/tools/sql/game/characters.sql | 2 +- .../data/sql/impl/OfflineTradersTable.java | 2 +- .../data/xml/impl/SkillTreesData.java | 2 +- .../instancemanager/GrandBossManager.java | 117 ++++-------------- .../l2jserver/gameserver/model/L2Clan.java | 35 +++--- .../gameserver/model/L2ClanMember.java | 10 +- .../l2jserver/gameserver/model/L2Party.java | 58 +++++---- .../gameserver/model/actor/L2Attackable.java | 2 +- .../model/actor/instance/L2PcInstance.java | 77 ++++++++---- .../strategy/IAmountMultiplierStrategy.java | 2 +- .../strategy/IChanceMultiplierStrategy.java | 2 +- .../strategy/IDropCalculationStrategy.java | 2 +- .../IGroupedItemDropCalculationStrategy.java | 2 +- .../IKillerChanceModifierStrategy.java | 2 +- ...onGroupedKillerChanceModifierStrategy.java | 2 +- .../IPreciseDeterminationStrategy.java | 2 +- .../functions/formulas/FuncAtkEvasion.java | 2 +- .../network/clientpackets/EnterWorld.java | 7 +- .../RequestAnswerJoinPledge.java | 2 +- .../RequestOustPledgeMember.java | 6 +- .../RequestWithdrawalPledge.java | 4 +- .../taskmanager/tasks/TaskBirthday.java | 94 ++++---------- 29 files changed, 247 insertions(+), 361 deletions(-) diff --git a/trunk/dist/game/data/scripts/custom/events/Elpies/Elpies.java b/trunk/dist/game/data/scripts/custom/events/Elpies/Elpies.java index b8d9b25d84..8f9fe6935d 100644 --- a/trunk/dist/game/data/scripts/custom/events/Elpies/Elpies.java +++ b/trunk/dist/game/data/scripts/custom/events/Elpies/Elpies.java @@ -18,12 +18,12 @@ */ package custom.events.Elpies; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.SpawnTable; -import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2EventMonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -64,8 +64,8 @@ public final class Elpies extends Event // @formatter:on // Non-final variables private static boolean EVENT_ACTIVE = false; - private static int CURRENT_ELPY_COUNT = 0; private ScheduledFuture _eventTask = null; + private final Set _elpies = ConcurrentHashMap.newKeySet(ELPY_AMOUNT); private Elpies() { @@ -101,13 +101,11 @@ public final class Elpies extends Event EventLocation[] locations = EventLocation.values(); EventLocation randomLoc = locations[getRandom(locations.length)]; - CURRENT_ELPY_COUNT = 0; long despawnDelay = EVENT_DURATION_MINUTES * 60000; for (int i = 0; i < ELPY_AMOUNT; i++) { - addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay); - CURRENT_ELPY_COUNT++; + _elpies.add(addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay)); } Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); @@ -139,14 +137,11 @@ public final class Elpies extends Event _eventTask = null; } - for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY)) + for (L2Npc npc : _elpies) { - L2Npc npc = spawn.getLastSpawn(); - if (npc != null) - { - npc.deleteMe(); - } + npc.deleteMe(); } + _elpies.clear(); Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); Broadcast.toAllOnlinePlayers("Elpy Event finished!"); @@ -158,11 +153,12 @@ public final class Elpies extends Event { if (EVENT_ACTIVE) { + _elpies.remove(npc); + dropItem(npc, killer, DROPLIST_CONSUMABLES); dropItem(npc, killer, DROPLIST_CRYSTALS); - CURRENT_ELPY_COUNT--; - if (CURRENT_ELPY_COUNT <= 0) + if (_elpies.isEmpty()) { Broadcast.toAllOnlinePlayers("All elpies have been killed!"); eventStop(); diff --git a/trunk/dist/game/data/scripts/custom/events/Rabbits/Rabbits.java b/trunk/dist/game/data/scripts/custom/events/Rabbits/Rabbits.java index 2ca12435e9..8232152b31 100644 --- a/trunk/dist/game/data/scripts/custom/events/Rabbits/Rabbits.java +++ b/trunk/dist/game/data/scripts/custom/events/Rabbits/Rabbits.java @@ -20,7 +20,8 @@ package custom.events.Rabbits; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import com.l2jserver.Config; import com.l2jserver.gameserver.model.L2Object; @@ -51,7 +52,7 @@ public final class Rabbits extends Event private static final int EVENT_TIME = 10; private static final int TOTAL_CHEST_COUNT = 75; private static final int TRANSFORMATION_ID = 105; - private final List _npcs = new CopyOnWriteArrayList<>(); + private final Set _npcs = ConcurrentHashMap.newKeySet(TOTAL_CHEST_COUNT + 1); private final List _players = new ArrayList<>(); private boolean _isActive = false; @@ -142,16 +143,13 @@ public final class Rabbits extends Event // Despawn NPCs for (L2Npc npc : _npcs) { - if (npc != null) - { - npc.deleteMe(); - } + npc.deleteMe(); } _npcs.clear(); for (L2PcInstance player : _players) { - if ((player != null) && (player.getTransformationId() == TRANSFORMATION_ID)) + if (player.getTransformationId() == TRANSFORMATION_ID) { player.untransform(); } @@ -213,7 +211,7 @@ public final class Rabbits extends Event npc.deleteMe(); _npcs.remove(npc); - if (_npcs.size() <= 1) + if (_npcs.isEmpty()) { Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests..."); eventStop(); @@ -253,7 +251,7 @@ public final class Rabbits extends Event } } - private static void recordSpawn(List npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) + private static void recordSpawn(Set npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) { final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay); if (npc.getId() == CHEST) diff --git a/trunk/dist/game/data/scripts/custom/events/Race/Race.java b/trunk/dist/game/data/scripts/custom/events/Race/Race.java index 943ca834b7..959cfa2b31 100644 --- a/trunk/dist/game/data/scripts/custom/events/Race/Race.java +++ b/trunk/dist/game/data/scripts/custom/events/Race/Race.java @@ -18,9 +18,8 @@ */ package custom.events.Race; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import com.l2jserver.Config; @@ -43,11 +42,11 @@ import com.l2jserver.gameserver.util.Broadcast; public final class Race extends Event { // Event NPC's list - private List _npclist; + private final Set _npcs = ConcurrentHashMap.newKeySet(); // Npc private L2Npc _npc; // Player list - private List _players; + private final Set _players = ConcurrentHashMap.newKeySet(); // Event Task ScheduledFuture _eventTask = null; // Event state @@ -121,6 +120,7 @@ public final class Race extends Event { return false; } + // Check Custom Table - we use custom NPC's if (!Config.CUSTOM_NPC_DATA) { @@ -128,9 +128,7 @@ public final class Race extends Event eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!"); return false; } - // Initialize list - _npclist = new ArrayList<>(); - _players = new CopyOnWriteArrayList<>(); + // Set Event active _isactive = true; // Spawn Manager @@ -168,7 +166,7 @@ public final class Race extends Event // Transform players and send message for (L2PcInstance player : _players) { - if ((player != null) && player.isOnline()) + if (player.isOnline()) { if (player.isInsideRadius(_npc, 500, false, false)) { @@ -210,22 +208,19 @@ public final class Race extends Event // Teleport to event start point for (L2PcInstance player : _players) { - if ((player != null) && player.isOnline()) + if (player.isOnline()) { player.untransform(); player.teleToLocation(_npc.getX(), _npc.getY(), _npc.getZ(), true); } } - // Despawn NPCs - for (L2Npc _npc : _npclist) - { - if (_npc != null) - { - _npc.deleteMe(); - } - } - _npclist.clear(); _players.clear(); + // Despawn NPCs + for (L2Npc _npc : _npcs) + { + _npc.deleteMe(); + } + _npcs.clear(); // Announce event end Broadcast.toAllOnlinePlayers("* Race Event finished *"); @@ -356,10 +351,7 @@ public final class Race extends Event private L2Npc recordSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) { final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay); - if (npc != null) - { - _npclist.add(npc); - } + _npcs.add(npc); return npc; } diff --git a/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java b/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java index 35c865a150..dc5c21d936 100644 --- a/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java +++ b/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java @@ -89,6 +89,15 @@ public final class Q00421_LittleWingsBigAdventure extends Quest @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + if ("DESPAWN_GUARDIAN".equals(event)) + { + if (npc != null) + { + npc.deleteMe(); + } + return super.onAdvEvent(event, npc, player); + } + final QuestState qs = getQuestState(player, false); String htmltext = null; if (qs == null) @@ -172,14 +181,6 @@ public final class Q00421_LittleWingsBigAdventure extends Quest htmltext = event; break; } - case "DESPAWN_GUARDIAN": - { - if (npc != null) - { - npc.deleteMe(); - } - break; - } } return htmltext; } diff --git a/trunk/dist/game/data_classic/scripts/custom/events/Elpies/Elpies.java b/trunk/dist/game/data_classic/scripts/custom/events/Elpies/Elpies.java index b8d9b25d84..8f9fe6935d 100644 --- a/trunk/dist/game/data_classic/scripts/custom/events/Elpies/Elpies.java +++ b/trunk/dist/game/data_classic/scripts/custom/events/Elpies/Elpies.java @@ -18,12 +18,12 @@ */ package custom.events.Elpies; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.SpawnTable; -import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2EventMonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -64,8 +64,8 @@ public final class Elpies extends Event // @formatter:on // Non-final variables private static boolean EVENT_ACTIVE = false; - private static int CURRENT_ELPY_COUNT = 0; private ScheduledFuture _eventTask = null; + private final Set _elpies = ConcurrentHashMap.newKeySet(ELPY_AMOUNT); private Elpies() { @@ -101,13 +101,11 @@ public final class Elpies extends Event EventLocation[] locations = EventLocation.values(); EventLocation randomLoc = locations[getRandom(locations.length)]; - CURRENT_ELPY_COUNT = 0; long despawnDelay = EVENT_DURATION_MINUTES * 60000; for (int i = 0; i < ELPY_AMOUNT; i++) { - addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay); - CURRENT_ELPY_COUNT++; + _elpies.add(addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay)); } Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); @@ -139,14 +137,11 @@ public final class Elpies extends Event _eventTask = null; } - for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY)) + for (L2Npc npc : _elpies) { - L2Npc npc = spawn.getLastSpawn(); - if (npc != null) - { - npc.deleteMe(); - } + npc.deleteMe(); } + _elpies.clear(); Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); Broadcast.toAllOnlinePlayers("Elpy Event finished!"); @@ -158,11 +153,12 @@ public final class Elpies extends Event { if (EVENT_ACTIVE) { + _elpies.remove(npc); + dropItem(npc, killer, DROPLIST_CONSUMABLES); dropItem(npc, killer, DROPLIST_CRYSTALS); - CURRENT_ELPY_COUNT--; - if (CURRENT_ELPY_COUNT <= 0) + if (_elpies.isEmpty()) { Broadcast.toAllOnlinePlayers("All elpies have been killed!"); eventStop(); diff --git a/trunk/dist/game/data_classic/scripts/custom/events/Rabbits/Rabbits.java b/trunk/dist/game/data_classic/scripts/custom/events/Rabbits/Rabbits.java index 2ca12435e9..8232152b31 100644 --- a/trunk/dist/game/data_classic/scripts/custom/events/Rabbits/Rabbits.java +++ b/trunk/dist/game/data_classic/scripts/custom/events/Rabbits/Rabbits.java @@ -20,7 +20,8 @@ package custom.events.Rabbits; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import com.l2jserver.Config; import com.l2jserver.gameserver.model.L2Object; @@ -51,7 +52,7 @@ public final class Rabbits extends Event private static final int EVENT_TIME = 10; private static final int TOTAL_CHEST_COUNT = 75; private static final int TRANSFORMATION_ID = 105; - private final List _npcs = new CopyOnWriteArrayList<>(); + private final Set _npcs = ConcurrentHashMap.newKeySet(TOTAL_CHEST_COUNT + 1); private final List _players = new ArrayList<>(); private boolean _isActive = false; @@ -142,16 +143,13 @@ public final class Rabbits extends Event // Despawn NPCs for (L2Npc npc : _npcs) { - if (npc != null) - { - npc.deleteMe(); - } + npc.deleteMe(); } _npcs.clear(); for (L2PcInstance player : _players) { - if ((player != null) && (player.getTransformationId() == TRANSFORMATION_ID)) + if (player.getTransformationId() == TRANSFORMATION_ID) { player.untransform(); } @@ -213,7 +211,7 @@ public final class Rabbits extends Event npc.deleteMe(); _npcs.remove(npc); - if (_npcs.size() <= 1) + if (_npcs.isEmpty()) { Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests..."); eventStop(); @@ -253,7 +251,7 @@ public final class Rabbits extends Event } } - private static void recordSpawn(List npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) + private static void recordSpawn(Set npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) { final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay); if (npc.getId() == CHEST) diff --git a/trunk/dist/game/data_classic/scripts/custom/events/Race/Race.java b/trunk/dist/game/data_classic/scripts/custom/events/Race/Race.java index 943ca834b7..6b70d28ffa 100644 --- a/trunk/dist/game/data_classic/scripts/custom/events/Race/Race.java +++ b/trunk/dist/game/data_classic/scripts/custom/events/Race/Race.java @@ -18,15 +18,13 @@ */ package custom.events.Race; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.enums.ChatType; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.quest.Event; @@ -43,11 +41,11 @@ import com.l2jserver.gameserver.util.Broadcast; public final class Race extends Event { // Event NPC's list - private List _npclist; + private final Set _npcs = ConcurrentHashMap.newKeySet(); // Npc private L2Npc _npc; // Player list - private List _players; + private final Set _players = ConcurrentHashMap.newKeySet(); // Event Task ScheduledFuture _eventTask = null; // Event state @@ -121,6 +119,7 @@ public final class Race extends Event { return false; } + // Check Custom Table - we use custom NPC's if (!Config.CUSTOM_NPC_DATA) { @@ -128,9 +127,7 @@ public final class Race extends Event eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!"); return false; } - // Initialize list - _npclist = new ArrayList<>(); - _players = new CopyOnWriteArrayList<>(); + // Set Event active _isactive = true; // Spawn Manager @@ -168,7 +165,7 @@ public final class Race extends Event // Transform players and send message for (L2PcInstance player : _players) { - if ((player != null) && player.isOnline()) + if (player.isOnline()) { if (player.isInsideRadius(_npc, 500, false, false)) { @@ -210,22 +207,19 @@ public final class Race extends Event // Teleport to event start point for (L2PcInstance player : _players) { - if ((player != null) && player.isOnline()) + if (player.isOnline()) { player.untransform(); player.teleToLocation(_npc.getX(), _npc.getY(), _npc.getZ(), true); } } - // Despawn NPCs - for (L2Npc _npc : _npclist) - { - if (_npc != null) - { - _npc.deleteMe(); - } - } - _npclist.clear(); _players.clear(); + // Despawn NPCs + for (L2Npc _npc : _npcs) + { + _npc.deleteMe(); + } + _npcs.clear(); // Announce event end Broadcast.toAllOnlinePlayers("* Race Event finished *"); @@ -356,10 +350,7 @@ public final class Race extends Event private L2Npc recordSpawn(int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) { final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay); - if (npc != null) - { - _npclist.add(npc); - } + _npcs.add(npc); return npc; } diff --git a/trunk/dist/tools/sql/game/characters.sql b/trunk/dist/tools/sql/game/characters.sql index 2b30ff3431..ba889fdfc3 100644 --- a/trunk/dist/tools/sql/game/characters.sql +++ b/trunk/dist/tools/sql/game/characters.sql @@ -54,7 +54,7 @@ CREATE TABLE IF NOT EXISTS `characters` ( `bookmarkslot` SMALLINT UNSIGNED NOT NULL DEFAULT 0, `vitality_points` int(10) NOT NULL DEFAULT '140000', `pccafe_points` int(6) DEFAULT NULL, - `createDate` date NOT NULL DEFAULT '0000-00-00', + `createDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `language` VARCHAR(2) DEFAULT NULL, `faction` TINYINT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`charId`), diff --git a/trunk/java/com/l2jserver/gameserver/data/sql/impl/OfflineTradersTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/OfflineTradersTable.java index 643133252d..4874c9a5c4 100644 --- a/trunk/java/com/l2jserver/gameserver/data/sql/impl/OfflineTradersTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/OfflineTradersTable.java @@ -67,7 +67,7 @@ public class OfflineTradersTable { try { - if ((pc.getPrivateStoreType() != PrivateStoreType.NONE) && ((pc.getClient() == null) || pc.getClient().isDetached())) + if ((pc.getPrivateStoreType() != PrivateStoreType.NONE) && pc.isInOfflineMode()) { stm3.setInt(1, pc.getObjectId()); // Char Id stm3.setLong(2, pc.getOfflineStartTime()); diff --git a/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillTreesData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillTreesData.java index e7eeb15d5f..b15c1747c9 100644 --- a/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillTreesData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillTreesData.java @@ -976,7 +976,7 @@ public final class SkillTreesData implements IXmlReader final Skill oldSkill = clan.getSkills().get(skill.getSkillId()); if (oldSkill != null) { - if (oldSkill.getLevel() < skill.getSkillLevel()) + if ((oldSkill.getLevel() + 1) == skill.getSkillLevel()) { result.add(skill); } diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java index 439938a3ff..f056f44af6 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java @@ -30,7 +30,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; @@ -65,9 +64,9 @@ public final class GrandBossManager implements IStorable protected static Map _storedInfo = new HashMap<>(); - private final Map _bossStatus = new HashMap<>(); + private final Map _bossStatus = new ConcurrentHashMap<>(); - private final List _zones = new CopyOnWriteArrayList<>(); + private final Map _zones = new ConcurrentHashMap<>(); protected GrandBossManager() { @@ -124,21 +123,10 @@ public final class GrandBossManager implements IStorable */ public void initZones() { - Map> zones = new HashMap<>(); - - if (_zones == null) + final Map> zones = new HashMap<>(); + for (Integer zoneId : _zones.keySet()) { - _log.warning(getClass().getSimpleName() + ": Could not read Grand Boss zone data"); - return; - } - - for (L2BossZone zone : _zones) - { - if (zone == null) - { - continue; - } - zones.put(zone.getId(), new ArrayList<>()); + zones.put(zoneId, new ArrayList<>()); } try (Connection con = L2DatabaseFactory.getInstance().getConnection(); @@ -148,8 +136,8 @@ public final class GrandBossManager implements IStorable while (rs.next()) { int id = rs.getInt("player_id"); - int zone_id = rs.getInt("zone"); - zones.get(zone_id).add(id); + int zoneId = rs.getInt("zone"); + zones.get(zoneId).add(id); } _log.info(getClass().getSimpleName() + ": Initialized " + _zones.size() + " Grand Boss Zones"); } @@ -162,13 +150,9 @@ public final class GrandBossManager implements IStorable _log.log(Level.WARNING, "Error while initializing GrandBoss zones: " + e.getMessage(), e); } - for (L2BossZone zone : _zones) + for (Entry e : _zones.entrySet()) { - if (zone == null) - { - continue; - } - zone.setAllowedPlayers(zones.get(zone.getId())); + e.getValue().setAllowedPlayers(zones.get(e.getKey())); } zones.clear(); @@ -176,86 +160,38 @@ public final class GrandBossManager implements IStorable public void addZone(L2BossZone zone) { - if (_zones != null) - { - _zones.add(zone); - } + _zones.put(zone.getId(), zone); } - public final L2BossZone getZone(int zoneId) + public L2BossZone getZone(int zoneId) { - if (_zones != null) - { - for (L2BossZone temp : _zones) - { - if (temp.getId() == zoneId) - { - return temp; - } - } - } - return null; + return _zones.get(zoneId); } - public final L2BossZone getZone(L2Character character) + public L2BossZone getZone(L2Character character) { - if (_zones != null) - { - for (L2BossZone temp : _zones) - { - if (temp.isCharacterInZone(character)) - { - return temp; - } - } - } - return null; + return _zones.values().stream().filter(z -> z.isCharacterInZone(character)).findFirst().orElse(null); } - public final L2BossZone getZone(Location loc) + public L2BossZone getZone(Location loc) { return getZone(loc.getX(), loc.getY(), loc.getZ()); } - public final L2BossZone getZone(int x, int y, int z) + public L2BossZone getZone(int x, int y, int z) { - if (_zones != null) - { - for (L2BossZone temp : _zones) - { - if (temp.isInsideZone(x, y, z)) - { - return temp; - } - } - } - return null; + return _zones.values().stream().filter(zone -> zone.isInsideZone(x, y, z)).findFirst().orElse(null); } public boolean checkIfInZone(String zoneType, L2Object obj) { - L2BossZone temp = getZone(obj.getX(), obj.getY(), obj.getZ()); - if (temp == null) - { - return false; - } - - return temp.getName().equalsIgnoreCase(zoneType); + final L2BossZone temp = getZone(obj.getX(), obj.getY(), obj.getZ()); + return (temp != null) && temp.getName().equalsIgnoreCase(zoneType); } public boolean checkIfInZone(L2PcInstance player) { - if (player == null) - { - return false; - } - L2BossZone temp = getZone(player.getX(), player.getY(), player.getZ()); - if (temp == null) - { - return false; - } - - return true; + return (player != null) && (getZone(player.getX(), player.getY(), player.getZ()) != null); } public int getBossStatus(int bossId) @@ -308,14 +244,9 @@ public final class GrandBossManager implements IStorable try (PreparedStatement insert = con.prepareStatement(INSERT_GRAND_BOSS_LIST)) { - for (L2BossZone zone : _zones) + for (Entry e : _zones.entrySet()) { - if (zone == null) - { - continue; - } - Integer id = zone.getId(); - List list = zone.getAllowedPlayers(); + List list = e.getValue().getAllowedPlayers(); if ((list == null) || list.isEmpty()) { continue; @@ -323,7 +254,7 @@ public final class GrandBossManager implements IStorable for (Integer player : list) { insert.setInt(1, player); - insert.setInt(2, id); + insert.setInt(2, e.getKey()); insert.executeUpdate(); insert.clearParameters(); } @@ -436,7 +367,7 @@ public final class GrandBossManager implements IStorable _zones.clear(); } - public List getZones() + public Map getZones() { return _zones; } diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Clan.java b/trunk/java/com/l2jserver/gameserver/model/L2Clan.java index 2a09464ea7..ed50999c46 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Clan.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Clan.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -353,13 +354,14 @@ public class L2Clan implements IIdentifiable, INamable public void addClanMember(L2PcInstance player) { final L2ClanMember member = new L2ClanMember(this, player); - // store in memory - addClanMember(member); member.setPlayerInstance(player); + addClanMember(member); + player.setClan(this); player.setPledgeClass(L2ClanMember.calculatePledgeClass(player)); player.sendPacket(new PledgeShowMemberListUpdate(player)); player.sendPacket(new PledgeSkillList(this)); + addSkillEffects(player); // Notify to scripts @@ -466,9 +468,10 @@ public class L2Clan implements IIdentifiable, INamable { CastleManager.getInstance().removeCirclet(exMember, getCastleId()); } - if (exMember.isOnline()) + + final L2PcInstance player = exMember.getPlayerInstance(); + if (player != null) { - L2PcInstance player = exMember.getPlayerInstance(); if (!player.isNoble()) { player.setTitle(""); @@ -479,7 +482,7 @@ public class L2Clan implements IIdentifiable, INamable if (player.isClanLeader()) { SiegeManager.getInstance().removeSiegeSkills(player); - player.setClanCreateExpiryTime(System.currentTimeMillis() + (Config.ALT_CLAN_CREATE_DAYS * 86400000L)); // 24*60*60*1000 = 86400000 + player.setClanCreateExpiryTime(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(Config.ALT_CLAN_CREATE_DAYS)); } // remove Clan skills from Player removeSkillEffects(player); @@ -510,7 +513,7 @@ public class L2Clan implements IIdentifiable, INamable } else { - removeMemberInDatabase(exMember, clanJoinExpiryTime, getLeaderId() == objectId ? System.currentTimeMillis() + (Config.ALT_CLAN_CREATE_DAYS * 86400000L) : 0); + removeMemberInDatabase(exMember.getObjectId(), clanJoinExpiryTime, getLeaderId() == objectId ? System.currentTimeMillis() + TimeUnit.DAYS.toMillis(Config.ALT_CLAN_CREATE_DAYS) : 0); } // Notify to scripts @@ -1001,31 +1004,29 @@ public class L2Clan implements IIdentifiable, INamable } /** - * @param member the clan member to be removed. - * @param clanJoinExpiryTime - * @param clanCreateExpiryTime + * Removes a clan member from this clan. + * @param playerId the clan member object ID to be removed + * @param clanJoinExpiryTime the time penalty for the player to join a new clan + * @param clanCreateExpiryTime the time penalty for the player to create a new clan */ - private void removeMemberInDatabase(L2ClanMember member, long clanJoinExpiryTime, long clanCreateExpiryTime) + private void removeMemberInDatabase(int playerId, long clanJoinExpiryTime, long clanCreateExpiryTime) { try (Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement ps1 = con.prepareStatement("UPDATE characters SET clanid=0, title=?, clan_join_expiry_time=?, clan_create_expiry_time=?, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0 WHERE charId=?"); PreparedStatement ps2 = con.prepareStatement("UPDATE characters SET apprentice=0 WHERE apprentice=?"); PreparedStatement ps3 = con.prepareStatement("UPDATE characters SET sponsor=0 WHERE sponsor=?")) { + // Remove clan member. ps1.setString(1, ""); ps1.setLong(2, clanJoinExpiryTime); ps1.setLong(3, clanCreateExpiryTime); - ps1.setInt(4, member.getObjectId()); + ps1.setInt(4, playerId); ps1.execute(); - if (Config.DEBUG) - { - _log.fine("clan member removed in db: " + getId()); - } // Remove apprentice. - ps2.setInt(1, member.getObjectId()); + ps2.setInt(1, playerId); ps2.execute(); // Remove sponsor. - ps3.setInt(1, member.getObjectId()); + ps3.setInt(1, playerId); ps3.execute(); } catch (Exception e) diff --git a/trunk/java/com/l2jserver/gameserver/model/L2ClanMember.java b/trunk/java/com/l2jserver/gameserver/model/L2ClanMember.java index cc58280ac5..c5fd13ebb2 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2ClanMember.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2ClanMember.java @@ -149,8 +149,8 @@ public class L2ClanMember } /** - * Checks if is online. - * @return true, if is online + * Verifies if the clan member is online. + * @return {@code true} if is online */ public boolean isOnline() { @@ -158,11 +158,7 @@ public class L2ClanMember { return false; } - if (_player.getClient() == null) - { - return false; - } - if (_player.getClient().isDetached()) + if (_player.isInOfflineMode()) { return false; } diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Party.java b/trunk/java/com/l2jserver/gameserver/model/L2Party.java index 281ebbdc43..823dc5318a 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Party.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Party.java @@ -692,20 +692,23 @@ public class L2Party extends AbstractPlayerGroup target.addItem("Party", item, player, true); // Send messages to other party members about reward - if (item.getCount() > 1) + if (item.getCount() > 0) { - SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2); - msg.addString(target.getName()); - msg.addItemName(item); - msg.addLong(item.getCount()); - broadcastToPartyMembers(target, msg); - } - else - { - SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2); - msg.addString(target.getName()); - msg.addItemName(item); - broadcastToPartyMembers(target, msg); + if (item.getCount() > 1) + { + SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2); + msg.addString(target.getName()); + msg.addItemName(item); + msg.addLong(item.getCount()); + broadcastToPartyMembers(target, msg); + } + else + { + SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2); + msg.addString(target.getName()); + msg.addItemName(item); + broadcastToPartyMembers(target, msg); + } } } @@ -730,20 +733,23 @@ public class L2Party extends AbstractPlayerGroup looter.addItem(spoil ? "Sweeper Party" : "Party", itemId, itemCount, target, true); // Send messages to other party members about reward - if (itemCount > 1) + if (itemCount > 0) { - SystemMessage msg = spoil ? SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2_S_BY_USING_SWEEPER) : SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2); - msg.addString(looter.getName()); - msg.addItemName(itemId); - msg.addLong(itemCount); - broadcastToPartyMembers(looter, msg); - } - else - { - SystemMessage msg = spoil ? SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2_BY_USING_SWEEPER) : SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2); - msg.addString(looter.getName()); - msg.addItemName(itemId); - broadcastToPartyMembers(looter, msg); + if (itemCount > 1) + { + SystemMessage msg = spoil ? SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2_S_BY_USING_SWEEPER) : SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2); + msg.addString(looter.getName()); + msg.addItemName(itemId); + msg.addLong(itemCount); + broadcastToPartyMembers(looter, msg); + } + else + { + SystemMessage msg = spoil ? SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2_BY_USING_SWEEPER) : SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2); + msg.addString(looter.getName()); + msg.addItemName(itemId); + broadcastToPartyMembers(looter, msg); + } } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java b/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java index b251748cd4..1c830e8a8a 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java @@ -1022,7 +1022,7 @@ public class L2Attackable extends L2Npc } // Broadcast message if RaidBoss was defeated - if (isRaid() && !isRaidMinion()) + if (isRaid() && !isRaidMinion() && (drop.getCount() > 0)) { final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_DIED_AND_DROPPED_S3_S2_S); sm.addCharName(this); diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java index 063d999041..be247b8e0d 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java @@ -19,10 +19,10 @@ package com.l2jserver.gameserver.model.actor.instance; import java.sql.Connection; -import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -666,7 +666,7 @@ public final class L2PcInstance extends L2Playable // charges private final AtomicInteger _charges = new AtomicInteger(); - private ScheduledFuture _chargeTask = null; + private volatile ScheduledFuture _chargeTask = null; // Absorbed Souls private int _souls = 0; @@ -4524,7 +4524,7 @@ public final class L2PcInstance extends L2Playable getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); // Check if the L2Object to pick up is a L2ItemInstance - if (!(object instanceof L2ItemInstance)) + if (!(object.isItem())) { // dont try to pickup anything that is not an item :) _log.warning(this + " trying to pickup wrong target." + getTarget()); @@ -4533,12 +4533,7 @@ public final class L2PcInstance extends L2Playable L2ItemInstance target = (L2ItemInstance) object; - // Send a Server->Client packet ActionFailed to this L2PcInstance - sendPacket(ActionFailed.STATIC_PACKET); - - // Send a Server->Client packet StopMove to this L2PcInstance - StopMove sm = new StopMove(this); - sendPacket(sm); + sendPacket(new StopMove(this)); SystemMessage smsg = null; synchronized (target) @@ -4567,12 +4562,8 @@ public final class L2PcInstance extends L2Playable return; } - if (isInvul() && !canOverrideCond(PcCondOverride.ITEM_CONDITIONS)) + if (isInvisible() && !canOverrideCond(PcCondOverride.ITEM_CONDITIONS)) { - sendPacket(ActionFailed.STATIC_PACKET); - smsg = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_FAILED_TO_PICK_UP_S1); - smsg.addItemName(target); - sendPacket(smsg); return; } @@ -6986,7 +6977,7 @@ public final class L2PcInstance extends L2Playable statement.setInt(34, getBaseClass()); statement.setInt(35, isNoble() ? 1 : 0); statement.setLong(36, 0); - statement.setDate(37, new Date(getCreateDate().getTimeInMillis())); + statement.setTimestamp(37, new Timestamp(getCreateDate().getTimeInMillis())); statement.executeUpdate(); } catch (Exception e) @@ -7182,7 +7173,7 @@ public final class L2PcInstance extends L2Playable player.setPcBangPoints(rset.getInt("pccafe_points")); // character creation Time - player.getCreateDate().setTime(rset.getDate("createDate")); + player.getCreateDate().setTimeInMillis(rset.getTimestamp("createDate").getTime()); // Language player.setLang(rset.getString("language")); @@ -7841,13 +7832,25 @@ public final class L2PcInstance extends L2Playable public int isOnlineInt() { - if (_isOnline && (getClient() != null)) + if (_isOnline && (_client != null)) { - return getClient().isDetached() ? 2 : 1; + return _client.isDetached() ? 2 : 1; } return 0; } + /** + * Verifies if the player is in offline mode.
+ * The offline mode may happen for different reasons:
+ * Abnormally: Player gets abrouptaly disconnected from server.
+ * Normally: The player gets into offline shop mode, only avaiable by enabling the offline shop mod. + * @return {@code true} if the player is in offline mode, {@code false} otherwise + */ + public boolean isInOfflineMode() + { + return (_client == null) || _client.isDetached(); + } + @Override public Skill addSkill(Skill newSkill) { @@ -10703,6 +10706,16 @@ public final class L2PcInstance extends L2Playable sendPacket(new SkillCoolTime(this)); sendPacket(new ExStorageMaxCount(this)); + // TODO: Fix with Support for Ertheia race. + // if (Config.ALTERNATE_CLASS_MASTER) + // { + // if (Config.CLASS_MASTER_SETTINGS.isAllowed(getClassId().level() + 1) && Config.ALTERNATE_CLASS_MASTER && (((this.getClassId().level() == 1) && (this.getLevel() >= 40)) || ((this.getClassId().level() == 2) && (this.getLevel() >= 76)) || ((this.getClassId().level() == 3) && + // (this.getLevel() >= 85)))) + // { + // L2ClassMasterInstance.showQuestionMark(this); + // } + // } + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); return true; } @@ -12932,7 +12945,7 @@ public final class L2PcInstance extends L2Playable { if (_transformSkills == null) { - _transformSkills = new HashMap<>(); + _transformSkills = new ConcurrentHashMap<>(); } } } @@ -12941,15 +12954,23 @@ public final class L2PcInstance extends L2Playable public Skill getTransformSkill(int id) { + if (_transformSkills == null) + { + return null; + } return _transformSkills.get(id); } public boolean hasTransformSkill(int id) { + if (_transformSkills == null) + { + return false; + } return _transformSkills.containsKey(id); } - public synchronized void removeAllTransformSkills() + public void removeAllTransformSkills() { _transformSkills = null; } @@ -13194,8 +13215,13 @@ public final class L2PcInstance extends L2Playable { if (_chargeTask != null) { - _chargeTask.cancel(false); - _chargeTask = null; + synchronized (this) + { + if (_chargeTask != null) + { + _chargeTask.cancel(false); + } + } } _chargeTask = ThreadPoolManager.getInstance().scheduleGeneral(new ResetChargesTask(this), 600000); } @@ -14161,9 +14187,9 @@ public final class L2PcInstance extends L2Playable { try { - for (L2BossZone _zone : GrandBossManager.getInstance().getZones()) + for (L2BossZone zone : GrandBossManager.getInstance().getZones().values()) { - _zone.removePlayer(this); + zone.removePlayer(this); } } catch (Exception e) @@ -14177,10 +14203,9 @@ public final class L2PcInstance extends L2Playable */ public void checkPlayerSkills() { - L2SkillLearn learn; for (Entry e : getSkills().entrySet()) { - learn = SkillTreesData.getInstance().getClassSkill(e.getKey(), e.getValue().getLevel() % 100, getClassId()); + final L2SkillLearn learn = SkillTreesData.getInstance().getClassSkill(e.getKey(), e.getValue().getLevel() % 100, getClassId()); if (learn != null) { int lvlDiff = e.getKey() == CommonSkill.EXPERTISE.getId() ? 0 : 9; diff --git a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IAmountMultiplierStrategy.java b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IAmountMultiplierStrategy.java index 82aa810c83..6e3f8ddf6f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IAmountMultiplierStrategy.java +++ b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IAmountMultiplierStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2014 L2J Server + * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * diff --git a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IChanceMultiplierStrategy.java b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IChanceMultiplierStrategy.java index 37a74d21f1..8e33999cc2 100644 --- a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IChanceMultiplierStrategy.java +++ b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IChanceMultiplierStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2014 L2J Server + * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * diff --git a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IDropCalculationStrategy.java b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IDropCalculationStrategy.java index 878286f4f2..4edb8d5987 100644 --- a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IDropCalculationStrategy.java +++ b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IDropCalculationStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2014 L2J Server + * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * diff --git a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IGroupedItemDropCalculationStrategy.java b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IGroupedItemDropCalculationStrategy.java index a0460bde74..b27b276762 100644 --- a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IGroupedItemDropCalculationStrategy.java +++ b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IGroupedItemDropCalculationStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2014 L2J Server + * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * diff --git a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IKillerChanceModifierStrategy.java b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IKillerChanceModifierStrategy.java index 023e46245f..b035bfdee4 100644 --- a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IKillerChanceModifierStrategy.java +++ b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IKillerChanceModifierStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2014 L2J Server + * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * diff --git a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/INonGroupedKillerChanceModifierStrategy.java b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/INonGroupedKillerChanceModifierStrategy.java index a84fd5a06b..a4b04c98d5 100644 --- a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/INonGroupedKillerChanceModifierStrategy.java +++ b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/INonGroupedKillerChanceModifierStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2014 L2J Server + * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * diff --git a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IPreciseDeterminationStrategy.java b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IPreciseDeterminationStrategy.java index 57599c9c91..a9c40d2436 100644 --- a/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IPreciseDeterminationStrategy.java +++ b/trunk/java/com/l2jserver/gameserver/model/drops/strategy/IPreciseDeterminationStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2014 L2J Server + * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncAtkEvasion.java b/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncAtkEvasion.java index 163264acaf..1382c6e618 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncAtkEvasion.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncAtkEvasion.java @@ -83,6 +83,6 @@ public class FuncAtkEvasion extends AbstractFunction value += (level - 69) + 2; } } - return value; + return (int) value; } } \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java index fe8bee31cd..65de9e35ad 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java @@ -63,6 +63,7 @@ import com.l2jserver.gameserver.model.quest.State; import com.l2jserver.gameserver.model.zone.ZoneId; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList; +import com.l2jserver.gameserver.network.serverpackets.ActionFailed; import com.l2jserver.gameserver.network.serverpackets.AllyCrest; import com.l2jserver.gameserver.network.serverpackets.Die; import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate; @@ -659,11 +660,11 @@ public class EnterWorld extends L2GameClientPacket activeChar.sendPacket(new ExAcquireAPSkillList(activeChar)); activeChar.sendPacket(new ExWorldChatCnt(activeChar)); + + // Unstuck players that had client open when server crashed. + activeChar.sendPacket(ActionFailed.STATIC_PACKET); } - /** - * @param cha - */ private void engage(L2PcInstance cha) { int chaId = cha.getObjectId(); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAnswerJoinPledge.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAnswerJoinPledge.java index c42619bf53..c50ad88bf3 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAnswerJoinPledge.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAnswerJoinPledge.java @@ -87,7 +87,7 @@ public final class RequestAnswerJoinPledge extends L2GameClientPacket activeChar.setPledgeType(requestPacket.getPledgeType()); if (requestPacket.getPledgeType() == L2Clan.SUBUNIT_ACADEMY) { - activeChar.setPowerGrade(9); // adademy + activeChar.setPowerGrade(9); // Academy activeChar.setLvlJoinedAcademy(activeChar.getLevel()); } else diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestOustPledgeMember.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestOustPledgeMember.java index 206e8b4188..9ba835a293 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestOustPledgeMember.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestOustPledgeMember.java @@ -18,6 +18,8 @@ */ package com.l2jserver.gameserver.network.clientpackets; +import java.util.concurrent.TimeUnit; + import com.l2jserver.Config; import com.l2jserver.gameserver.model.ClanPrivilege; import com.l2jserver.gameserver.model.L2Clan; @@ -83,8 +85,8 @@ public final class RequestOustPledgeMember extends L2GameClientPacket } // this also updates the database - clan.removeClanMember(member.getObjectId(), System.currentTimeMillis() + (Config.ALT_CLAN_JOIN_DAYS * 86400000L)); // 24*60*60*1000 = 86400000 - clan.setCharPenaltyExpiryTime(System.currentTimeMillis() + (Config.ALT_CLAN_JOIN_DAYS * 86400000L)); // 24*60*60*1000 = 86400000 + clan.removeClanMember(member.getObjectId(), System.currentTimeMillis() + TimeUnit.DAYS.toMillis(Config.ALT_CLAN_JOIN_DAYS)); + clan.setCharPenaltyExpiryTime(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(Config.ALT_CLAN_JOIN_DAYS)); clan.updateClanInDB(); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CLAN_MEMBER_S1_HAS_BEEN_EXPELLED); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestWithdrawalPledge.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestWithdrawalPledge.java index 4145311e19..94cb4ba6b5 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestWithdrawalPledge.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestWithdrawalPledge.java @@ -18,6 +18,8 @@ */ package com.l2jserver.gameserver.network.clientpackets; +import java.util.concurrent.TimeUnit; + import com.l2jserver.Config; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -66,7 +68,7 @@ public final class RequestWithdrawalPledge extends L2GameClientPacket L2Clan clan = activeChar.getClan(); - clan.removeClanMember(activeChar.getObjectId(), System.currentTimeMillis() + (Config.ALT_CLAN_JOIN_DAYS * 86400000L)); // 24*60*60*1000 = 86400000 + clan.removeClanMember(activeChar.getObjectId(), System.currentTimeMillis() + TimeUnit.DAYS.toMillis(Config.ALT_CLAN_JOIN_DAYS)); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_WITHDRAWN_FROM_THE_CLAN); sm.addString(activeChar.getName()); diff --git a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java index 300db55a83..96b1b4f63a 100644 --- a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java +++ b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java @@ -22,32 +22,28 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.logging.Level; +import java.util.concurrent.TimeUnit; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.enums.MailType; import com.l2jserver.gameserver.instancemanager.MailManager; import com.l2jserver.gameserver.model.entity.Message; -import com.l2jserver.gameserver.model.itemcontainer.Mail; import com.l2jserver.gameserver.taskmanager.Task; import com.l2jserver.gameserver.taskmanager.TaskManager; import com.l2jserver.gameserver.taskmanager.TaskManager.ExecutedTask; import com.l2jserver.gameserver.taskmanager.TaskTypes; -import com.l2jserver.gameserver.util.Util; /** - * @author Nyaran + * Birthday Gift task. + * @author Zoey76 */ public class TaskBirthday extends Task { private static final String NAME = "birthday"; - private static final String QUERY = "SELECT charId, createDate FROM characters WHERE createDate LIKE ?"; - private static final Calendar _today = Calendar.getInstance(); - private int _count = 0; + /** Get all players that have had a birthday since last check. */ + private static final String SELECT_PENDING_BIRTHDAY_GIFTS = "SELECT charId, char_name, createDate, (YEAR(NOW()) - YEAR(createDate)) AS age " // + + "FROM characters WHERE (YEAR(NOW()) - YEAR(createDate) > 0) AND (DATE_FORMAT(createDate, '%m-%d') > DATE_FORMAT(FROM_UNIXTIME(?), '%m-%d'))"; @Override public String getName() @@ -58,85 +54,39 @@ public class TaskBirthday extends Task @Override public void onTimeElapsed(ExecutedTask task) { - Calendar lastExecDate = Calendar.getInstance(); - long lastActivation = task.getLastActivation(); + // TODO(Zoey76): Fix first run. + final int birthdayGiftCount = giveBirthdayGifts(task.getLastActivation()); - if (lastActivation > 0) - { - lastExecDate.setTimeInMillis(lastActivation); - } - - String rangeDate = "[" + Util.getDateString(lastExecDate.getTime()) + "] - [" + Util.getDateString(_today.getTime()) + "]"; - - for (; !_today.before(lastExecDate); lastExecDate.add(Calendar.DATE, 1)) - { - checkBirthday(lastExecDate.get(Calendar.YEAR), lastExecDate.get(Calendar.MONTH), lastExecDate.get(Calendar.DATE)); - } - - _log.info("BirthdayManager: " + _count + " gifts sent. " + rangeDate); + _log.info("BirthdayManager: " + birthdayGiftCount + " gifts sent."); } - private void checkBirthday(int year, int month, int day) + private int giveBirthdayGifts(long lastActivation) { + int birthdayGiftCount = 0; try (Connection con = L2DatabaseFactory.getInstance().getConnection(); - PreparedStatement statement = con.prepareStatement(QUERY)) + PreparedStatement ps = con.prepareStatement(SELECT_PENDING_BIRTHDAY_GIFTS)) { - statement.setString(1, "%-" + getNum(month + 1) + "-" + getNum(day)); - try (ResultSet rset = statement.executeQuery()) + ps.setLong(1, TimeUnit.SECONDS.convert(lastActivation, TimeUnit.MILLISECONDS)); + try (ResultSet rs = ps.executeQuery()) { - while (rset.next()) + while (rs.next()) { - int playerId = rset.getInt("charId"); - Calendar createDate = Calendar.getInstance(); - createDate.setTime(rset.getDate("createDate")); - - int age = year - createDate.get(Calendar.YEAR); - if (age <= 0) - { - continue; - } - String text = Config.ALT_BIRTHDAY_MAIL_TEXT; + text = text.replaceAll("$c1", rs.getString("char_name")); + text = text.replaceAll("$s1", Integer.toString(rs.getInt("age"))); - if (text.contains("$c1")) - { - text = text.replace("$c1", CharNameTable.getInstance().getNameById(playerId)); - } - if (text.contains("$s1")) - { - text = text.replace("$s1", String.valueOf(age)); - } - - Message msg = new Message(playerId, Config.ALT_BIRTHDAY_MAIL_SUBJECT, text, MailType.BIRTHDAY); - - Mail attachments = msg.createAttachments(); - attachments.addItem("Birthday", Config.ALT_BIRTHDAY_GIFT, 1, null, null); - + final Message msg = new Message(rs.getInt("charId"), Config.ALT_BIRTHDAY_MAIL_SUBJECT, text, MailType.BIRTHDAY); + msg.createAttachments().addItem("Birthday", Config.ALT_BIRTHDAY_GIFT, 1, null, null); MailManager.getInstance().sendMessage(msg); - _count++; + birthdayGiftCount++; } } } catch (SQLException e) { - _log.log(Level.WARNING, "Error checking birthdays. ", e); + _log.warning("Error checking birthdays: " + e.getMessage()); } - - // If character birthday is 29-Feb and year isn't leap, send gift on 28-feb - GregorianCalendar calendar = new GregorianCalendar(); - if ((month == Calendar.FEBRUARY) && (day == 28) && !calendar.isLeapYear(_today.get(Calendar.YEAR))) - { - checkBirthday(year, Calendar.FEBRUARY, 29); - } - } - - /** - * @param num the number to format. - * @return the formatted number starting with a 0 if it is lower or equal than 10. - */ - private String getNum(int num) - { - return (num <= 9) ? "0" + num : String.valueOf(num); + return birthdayGiftCount; } @Override