Sync with L2jServer HighFive Jul 14th 2015.

This commit is contained in:
MobiusDev 2015-07-14 19:55:19 +00:00
parent 54754b81b2
commit b07f46dc5c
29 changed files with 247 additions and 361 deletions

View File

@ -18,12 +18,12 @@
*/ */
package custom.events.Elpies; package custom.events.Elpies;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import com.l2jserver.Config; import com.l2jserver.Config;
import com.l2jserver.gameserver.ThreadPoolManager; 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.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2EventMonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2EventMonsterInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@ -64,8 +64,8 @@ public final class Elpies extends Event
// @formatter:on // @formatter:on
// Non-final variables // Non-final variables
private static boolean EVENT_ACTIVE = false; private static boolean EVENT_ACTIVE = false;
private static int CURRENT_ELPY_COUNT = 0;
private ScheduledFuture<?> _eventTask = null; private ScheduledFuture<?> _eventTask = null;
private final Set<L2Npc> _elpies = ConcurrentHashMap.newKeySet(ELPY_AMOUNT);
private Elpies() private Elpies()
{ {
@ -101,13 +101,11 @@ public final class Elpies extends Event
EventLocation[] locations = EventLocation.values(); EventLocation[] locations = EventLocation.values();
EventLocation randomLoc = locations[getRandom(locations.length)]; EventLocation randomLoc = locations[getRandom(locations.length)];
CURRENT_ELPY_COUNT = 0;
long despawnDelay = EVENT_DURATION_MINUTES * 60000; long despawnDelay = EVENT_DURATION_MINUTES * 60000;
for (int i = 0; i < ELPY_AMOUNT; i++) for (int i = 0; i < ELPY_AMOUNT; i++)
{ {
addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay); _elpies.add(addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay));
CURRENT_ELPY_COUNT++;
} }
Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
@ -139,14 +137,11 @@ public final class Elpies extends Event
_eventTask = null; _eventTask = null;
} }
for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY)) for (L2Npc npc : _elpies)
{ {
L2Npc npc = spawn.getLastSpawn(); npc.deleteMe();
if (npc != null)
{
npc.deleteMe();
}
} }
_elpies.clear();
Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
Broadcast.toAllOnlinePlayers("Elpy Event finished!"); Broadcast.toAllOnlinePlayers("Elpy Event finished!");
@ -158,11 +153,12 @@ public final class Elpies extends Event
{ {
if (EVENT_ACTIVE) if (EVENT_ACTIVE)
{ {
_elpies.remove(npc);
dropItem(npc, killer, DROPLIST_CONSUMABLES); dropItem(npc, killer, DROPLIST_CONSUMABLES);
dropItem(npc, killer, DROPLIST_CRYSTALS); dropItem(npc, killer, DROPLIST_CRYSTALS);
CURRENT_ELPY_COUNT--;
if (CURRENT_ELPY_COUNT <= 0) if (_elpies.isEmpty())
{ {
Broadcast.toAllOnlinePlayers("All elpies have been killed!"); Broadcast.toAllOnlinePlayers("All elpies have been killed!");
eventStop(); eventStop();

View File

@ -20,7 +20,8 @@ package custom.events.Rabbits;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.Config;
import com.l2jserver.gameserver.model.L2Object; 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 EVENT_TIME = 10;
private static final int TOTAL_CHEST_COUNT = 75; private static final int TOTAL_CHEST_COUNT = 75;
private static final int TRANSFORMATION_ID = 105; private static final int TRANSFORMATION_ID = 105;
private final List<L2Npc> _npcs = new CopyOnWriteArrayList<>(); private final Set<L2Npc> _npcs = ConcurrentHashMap.newKeySet(TOTAL_CHEST_COUNT + 1);
private final List<L2PcInstance> _players = new ArrayList<>(); private final List<L2PcInstance> _players = new ArrayList<>();
private boolean _isActive = false; private boolean _isActive = false;
@ -142,16 +143,13 @@ public final class Rabbits extends Event
// Despawn NPCs // Despawn NPCs
for (L2Npc npc : _npcs) for (L2Npc npc : _npcs)
{ {
if (npc != null) npc.deleteMe();
{
npc.deleteMe();
}
} }
_npcs.clear(); _npcs.clear();
for (L2PcInstance player : _players) for (L2PcInstance player : _players)
{ {
if ((player != null) && (player.getTransformationId() == TRANSFORMATION_ID)) if (player.getTransformationId() == TRANSFORMATION_ID)
{ {
player.untransform(); player.untransform();
} }
@ -213,7 +211,7 @@ public final class Rabbits extends Event
npc.deleteMe(); npc.deleteMe();
_npcs.remove(npc); _npcs.remove(npc);
if (_npcs.size() <= 1) if (_npcs.isEmpty())
{ {
Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests..."); Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests...");
eventStop(); eventStop();
@ -253,7 +251,7 @@ public final class Rabbits extends Event
} }
} }
private static void recordSpawn(List<L2Npc> npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) private static void recordSpawn(Set<L2Npc> 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); final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay);
if (npc.getId() == CHEST) if (npc.getId() == CHEST)

View File

@ -18,9 +18,8 @@
*/ */
package custom.events.Race; package custom.events.Race;
import java.util.ArrayList; import java.util.Set;
import java.util.List; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import com.l2jserver.Config; import com.l2jserver.Config;
@ -43,11 +42,11 @@ import com.l2jserver.gameserver.util.Broadcast;
public final class Race extends Event public final class Race extends Event
{ {
// Event NPC's list // Event NPC's list
private List<L2Npc> _npclist; private final Set<L2Npc> _npcs = ConcurrentHashMap.newKeySet();
// Npc // Npc
private L2Npc _npc; private L2Npc _npc;
// Player list // Player list
private List<L2PcInstance> _players; private final Set<L2PcInstance> _players = ConcurrentHashMap.newKeySet();
// Event Task // Event Task
ScheduledFuture<?> _eventTask = null; ScheduledFuture<?> _eventTask = null;
// Event state // Event state
@ -121,6 +120,7 @@ public final class Race extends Event
{ {
return false; return false;
} }
// Check Custom Table - we use custom NPC's // Check Custom Table - we use custom NPC's
if (!Config.CUSTOM_NPC_DATA) 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!"); eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!");
return false; return false;
} }
// Initialize list
_npclist = new ArrayList<>();
_players = new CopyOnWriteArrayList<>();
// Set Event active // Set Event active
_isactive = true; _isactive = true;
// Spawn Manager // Spawn Manager
@ -168,7 +166,7 @@ public final class Race extends Event
// Transform players and send message // Transform players and send message
for (L2PcInstance player : _players) for (L2PcInstance player : _players)
{ {
if ((player != null) && player.isOnline()) if (player.isOnline())
{ {
if (player.isInsideRadius(_npc, 500, false, false)) if (player.isInsideRadius(_npc, 500, false, false))
{ {
@ -210,22 +208,19 @@ public final class Race extends Event
// Teleport to event start point // Teleport to event start point
for (L2PcInstance player : _players) for (L2PcInstance player : _players)
{ {
if ((player != null) && player.isOnline()) if (player.isOnline())
{ {
player.untransform(); player.untransform();
player.teleToLocation(_npc.getX(), _npc.getY(), _npc.getZ(), true); player.teleToLocation(_npc.getX(), _npc.getY(), _npc.getZ(), true);
} }
} }
// Despawn NPCs
for (L2Npc _npc : _npclist)
{
if (_npc != null)
{
_npc.deleteMe();
}
}
_npclist.clear();
_players.clear(); _players.clear();
// Despawn NPCs
for (L2Npc _npc : _npcs)
{
_npc.deleteMe();
}
_npcs.clear();
// Announce event end // Announce event end
Broadcast.toAllOnlinePlayers("* Race Event finished *"); 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) 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); final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay);
if (npc != null) _npcs.add(npc);
{
_npclist.add(npc);
}
return npc; return npc;
} }

View File

@ -89,6 +89,15 @@ public final class Q00421_LittleWingsBigAdventure extends Quest
@Override @Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) 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); final QuestState qs = getQuestState(player, false);
String htmltext = null; String htmltext = null;
if (qs == null) if (qs == null)
@ -172,14 +181,6 @@ public final class Q00421_LittleWingsBigAdventure extends Quest
htmltext = event; htmltext = event;
break; break;
} }
case "DESPAWN_GUARDIAN":
{
if (npc != null)
{
npc.deleteMe();
}
break;
}
} }
return htmltext; return htmltext;
} }

View File

@ -18,12 +18,12 @@
*/ */
package custom.events.Elpies; package custom.events.Elpies;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import com.l2jserver.Config; import com.l2jserver.Config;
import com.l2jserver.gameserver.ThreadPoolManager; 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.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2EventMonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2EventMonsterInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@ -64,8 +64,8 @@ public final class Elpies extends Event
// @formatter:on // @formatter:on
// Non-final variables // Non-final variables
private static boolean EVENT_ACTIVE = false; private static boolean EVENT_ACTIVE = false;
private static int CURRENT_ELPY_COUNT = 0;
private ScheduledFuture<?> _eventTask = null; private ScheduledFuture<?> _eventTask = null;
private final Set<L2Npc> _elpies = ConcurrentHashMap.newKeySet(ELPY_AMOUNT);
private Elpies() private Elpies()
{ {
@ -101,13 +101,11 @@ public final class Elpies extends Event
EventLocation[] locations = EventLocation.values(); EventLocation[] locations = EventLocation.values();
EventLocation randomLoc = locations[getRandom(locations.length)]; EventLocation randomLoc = locations[getRandom(locations.length)];
CURRENT_ELPY_COUNT = 0;
long despawnDelay = EVENT_DURATION_MINUTES * 60000; long despawnDelay = EVENT_DURATION_MINUTES * 60000;
for (int i = 0; i < ELPY_AMOUNT; i++) for (int i = 0; i < ELPY_AMOUNT; i++)
{ {
addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay); _elpies.add(addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay));
CURRENT_ELPY_COUNT++;
} }
Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
@ -139,14 +137,11 @@ public final class Elpies extends Event
_eventTask = null; _eventTask = null;
} }
for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY)) for (L2Npc npc : _elpies)
{ {
L2Npc npc = spawn.getLastSpawn(); npc.deleteMe();
if (npc != null)
{
npc.deleteMe();
}
} }
_elpies.clear();
Broadcast.toAllOnlinePlayers("*Squeak Squeak*"); Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
Broadcast.toAllOnlinePlayers("Elpy Event finished!"); Broadcast.toAllOnlinePlayers("Elpy Event finished!");
@ -158,11 +153,12 @@ public final class Elpies extends Event
{ {
if (EVENT_ACTIVE) if (EVENT_ACTIVE)
{ {
_elpies.remove(npc);
dropItem(npc, killer, DROPLIST_CONSUMABLES); dropItem(npc, killer, DROPLIST_CONSUMABLES);
dropItem(npc, killer, DROPLIST_CRYSTALS); dropItem(npc, killer, DROPLIST_CRYSTALS);
CURRENT_ELPY_COUNT--;
if (CURRENT_ELPY_COUNT <= 0) if (_elpies.isEmpty())
{ {
Broadcast.toAllOnlinePlayers("All elpies have been killed!"); Broadcast.toAllOnlinePlayers("All elpies have been killed!");
eventStop(); eventStop();

View File

@ -20,7 +20,8 @@ package custom.events.Rabbits;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.Config;
import com.l2jserver.gameserver.model.L2Object; 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 EVENT_TIME = 10;
private static final int TOTAL_CHEST_COUNT = 75; private static final int TOTAL_CHEST_COUNT = 75;
private static final int TRANSFORMATION_ID = 105; private static final int TRANSFORMATION_ID = 105;
private final List<L2Npc> _npcs = new CopyOnWriteArrayList<>(); private final Set<L2Npc> _npcs = ConcurrentHashMap.newKeySet(TOTAL_CHEST_COUNT + 1);
private final List<L2PcInstance> _players = new ArrayList<>(); private final List<L2PcInstance> _players = new ArrayList<>();
private boolean _isActive = false; private boolean _isActive = false;
@ -142,16 +143,13 @@ public final class Rabbits extends Event
// Despawn NPCs // Despawn NPCs
for (L2Npc npc : _npcs) for (L2Npc npc : _npcs)
{ {
if (npc != null) npc.deleteMe();
{
npc.deleteMe();
}
} }
_npcs.clear(); _npcs.clear();
for (L2PcInstance player : _players) for (L2PcInstance player : _players)
{ {
if ((player != null) && (player.getTransformationId() == TRANSFORMATION_ID)) if (player.getTransformationId() == TRANSFORMATION_ID)
{ {
player.untransform(); player.untransform();
} }
@ -213,7 +211,7 @@ public final class Rabbits extends Event
npc.deleteMe(); npc.deleteMe();
_npcs.remove(npc); _npcs.remove(npc);
if (_npcs.size() <= 1) if (_npcs.isEmpty())
{ {
Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests..."); Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests...");
eventStop(); eventStop();
@ -253,7 +251,7 @@ public final class Rabbits extends Event
} }
} }
private static void recordSpawn(List<L2Npc> npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay) private static void recordSpawn(Set<L2Npc> 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); final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay);
if (npc.getId() == CHEST) if (npc.getId() == CHEST)

View File

@ -18,15 +18,13 @@
*/ */
package custom.events.Race; package custom.events.Race;
import java.util.ArrayList; import java.util.Set;
import java.util.List; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import com.l2jserver.Config; import com.l2jserver.Config;
import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.datatables.SkillData; 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.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.quest.Event; import com.l2jserver.gameserver.model.quest.Event;
@ -43,11 +41,11 @@ import com.l2jserver.gameserver.util.Broadcast;
public final class Race extends Event public final class Race extends Event
{ {
// Event NPC's list // Event NPC's list
private List<L2Npc> _npclist; private final Set<L2Npc> _npcs = ConcurrentHashMap.newKeySet();
// Npc // Npc
private L2Npc _npc; private L2Npc _npc;
// Player list // Player list
private List<L2PcInstance> _players; private final Set<L2PcInstance> _players = ConcurrentHashMap.newKeySet();
// Event Task // Event Task
ScheduledFuture<?> _eventTask = null; ScheduledFuture<?> _eventTask = null;
// Event state // Event state
@ -121,6 +119,7 @@ public final class Race extends Event
{ {
return false; return false;
} }
// Check Custom Table - we use custom NPC's // Check Custom Table - we use custom NPC's
if (!Config.CUSTOM_NPC_DATA) 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!"); eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!");
return false; return false;
} }
// Initialize list
_npclist = new ArrayList<>();
_players = new CopyOnWriteArrayList<>();
// Set Event active // Set Event active
_isactive = true; _isactive = true;
// Spawn Manager // Spawn Manager
@ -168,7 +165,7 @@ public final class Race extends Event
// Transform players and send message // Transform players and send message
for (L2PcInstance player : _players) for (L2PcInstance player : _players)
{ {
if ((player != null) && player.isOnline()) if (player.isOnline())
{ {
if (player.isInsideRadius(_npc, 500, false, false)) if (player.isInsideRadius(_npc, 500, false, false))
{ {
@ -210,22 +207,19 @@ public final class Race extends Event
// Teleport to event start point // Teleport to event start point
for (L2PcInstance player : _players) for (L2PcInstance player : _players)
{ {
if ((player != null) && player.isOnline()) if (player.isOnline())
{ {
player.untransform(); player.untransform();
player.teleToLocation(_npc.getX(), _npc.getY(), _npc.getZ(), true); player.teleToLocation(_npc.getX(), _npc.getY(), _npc.getZ(), true);
} }
} }
// Despawn NPCs
for (L2Npc _npc : _npclist)
{
if (_npc != null)
{
_npc.deleteMe();
}
}
_npclist.clear();
_players.clear(); _players.clear();
// Despawn NPCs
for (L2Npc _npc : _npcs)
{
_npc.deleteMe();
}
_npcs.clear();
// Announce event end // Announce event end
Broadcast.toAllOnlinePlayers("* Race Event finished *"); 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) 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); final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay);
if (npc != null) _npcs.add(npc);
{
_npclist.add(npc);
}
return npc; return npc;
} }

View File

@ -54,7 +54,7 @@ CREATE TABLE IF NOT EXISTS `characters` (
`bookmarkslot` SMALLINT UNSIGNED NOT NULL DEFAULT 0, `bookmarkslot` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
`vitality_points` int(10) NOT NULL DEFAULT '140000', `vitality_points` int(10) NOT NULL DEFAULT '140000',
`pccafe_points` int(6) DEFAULT NULL, `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, `language` VARCHAR(2) DEFAULT NULL,
`faction` TINYINT UNSIGNED NOT NULL DEFAULT 0, `faction` TINYINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`charId`), PRIMARY KEY (`charId`),

View File

@ -67,7 +67,7 @@ public class OfflineTradersTable
{ {
try 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.setInt(1, pc.getObjectId()); // Char Id
stm3.setLong(2, pc.getOfflineStartTime()); stm3.setLong(2, pc.getOfflineStartTime());

View File

@ -976,7 +976,7 @@ public final class SkillTreesData implements IXmlReader
final Skill oldSkill = clan.getSkills().get(skill.getSkillId()); final Skill oldSkill = clan.getSkills().get(skill.getSkillId());
if (oldSkill != null) if (oldSkill != null)
{ {
if (oldSkill.getLevel() < skill.getSkillLevel()) if ((oldSkill.getLevel() + 1) == skill.getSkillLevel())
{ {
result.add(skill); result.add(skill);
} }

View File

@ -30,7 +30,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -65,9 +64,9 @@ public final class GrandBossManager implements IStorable
protected static Map<Integer, StatsSet> _storedInfo = new HashMap<>(); protected static Map<Integer, StatsSet> _storedInfo = new HashMap<>();
private final Map<Integer, Integer> _bossStatus = new HashMap<>(); private final Map<Integer, Integer> _bossStatus = new ConcurrentHashMap<>();
private final List<L2BossZone> _zones = new CopyOnWriteArrayList<>(); private final Map<Integer, L2BossZone> _zones = new ConcurrentHashMap<>();
protected GrandBossManager() protected GrandBossManager()
{ {
@ -124,21 +123,10 @@ public final class GrandBossManager implements IStorable
*/ */
public void initZones() public void initZones()
{ {
Map<Integer, List<Integer>> zones = new HashMap<>(); final Map<Integer, List<Integer>> zones = new HashMap<>();
for (Integer zoneId : _zones.keySet())
if (_zones == null)
{ {
_log.warning(getClass().getSimpleName() + ": Could not read Grand Boss zone data"); zones.put(zoneId, new ArrayList<>());
return;
}
for (L2BossZone zone : _zones)
{
if (zone == null)
{
continue;
}
zones.put(zone.getId(), new ArrayList<>());
} }
try (Connection con = L2DatabaseFactory.getInstance().getConnection(); try (Connection con = L2DatabaseFactory.getInstance().getConnection();
@ -148,8 +136,8 @@ public final class GrandBossManager implements IStorable
while (rs.next()) while (rs.next())
{ {
int id = rs.getInt("player_id"); int id = rs.getInt("player_id");
int zone_id = rs.getInt("zone"); int zoneId = rs.getInt("zone");
zones.get(zone_id).add(id); zones.get(zoneId).add(id);
} }
_log.info(getClass().getSimpleName() + ": Initialized " + _zones.size() + " Grand Boss Zones"); _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); _log.log(Level.WARNING, "Error while initializing GrandBoss zones: " + e.getMessage(), e);
} }
for (L2BossZone zone : _zones) for (Entry<Integer, L2BossZone> e : _zones.entrySet())
{ {
if (zone == null) e.getValue().setAllowedPlayers(zones.get(e.getKey()));
{
continue;
}
zone.setAllowedPlayers(zones.get(zone.getId()));
} }
zones.clear(); zones.clear();
@ -176,86 +160,38 @@ public final class GrandBossManager implements IStorable
public void addZone(L2BossZone zone) public void addZone(L2BossZone zone)
{ {
if (_zones != null) _zones.put(zone.getId(), zone);
{
_zones.add(zone);
}
} }
public final L2BossZone getZone(int zoneId) public L2BossZone getZone(int zoneId)
{ {
if (_zones != null) return _zones.get(zoneId);
{
for (L2BossZone temp : _zones)
{
if (temp.getId() == zoneId)
{
return temp;
}
}
}
return null;
} }
public final L2BossZone getZone(L2Character character) public L2BossZone getZone(L2Character character)
{ {
if (_zones != null) return _zones.values().stream().filter(z -> z.isCharacterInZone(character)).findFirst().orElse(null);
{
for (L2BossZone temp : _zones)
{
if (temp.isCharacterInZone(character))
{
return temp;
}
}
}
return null;
} }
public final L2BossZone getZone(Location loc) public L2BossZone getZone(Location loc)
{ {
return getZone(loc.getX(), loc.getY(), loc.getZ()); 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) return _zones.values().stream().filter(zone -> zone.isInsideZone(x, y, z)).findFirst().orElse(null);
{
for (L2BossZone temp : _zones)
{
if (temp.isInsideZone(x, y, z))
{
return temp;
}
}
}
return null;
} }
public boolean checkIfInZone(String zoneType, L2Object obj) public boolean checkIfInZone(String zoneType, L2Object obj)
{ {
L2BossZone temp = getZone(obj.getX(), obj.getY(), obj.getZ()); final L2BossZone temp = getZone(obj.getX(), obj.getY(), obj.getZ());
if (temp == null) return (temp != null) && temp.getName().equalsIgnoreCase(zoneType);
{
return false;
}
return temp.getName().equalsIgnoreCase(zoneType);
} }
public boolean checkIfInZone(L2PcInstance player) public boolean checkIfInZone(L2PcInstance player)
{ {
if (player == null) return (player != null) && (getZone(player.getX(), player.getY(), player.getZ()) != null);
{
return false;
}
L2BossZone temp = getZone(player.getX(), player.getY(), player.getZ());
if (temp == null)
{
return false;
}
return true;
} }
public int getBossStatus(int bossId) public int getBossStatus(int bossId)
@ -308,14 +244,9 @@ public final class GrandBossManager implements IStorable
try (PreparedStatement insert = con.prepareStatement(INSERT_GRAND_BOSS_LIST)) try (PreparedStatement insert = con.prepareStatement(INSERT_GRAND_BOSS_LIST))
{ {
for (L2BossZone zone : _zones) for (Entry<Integer, L2BossZone> e : _zones.entrySet())
{ {
if (zone == null) List<Integer> list = e.getValue().getAllowedPlayers();
{
continue;
}
Integer id = zone.getId();
List<Integer> list = zone.getAllowedPlayers();
if ((list == null) || list.isEmpty()) if ((list == null) || list.isEmpty())
{ {
continue; continue;
@ -323,7 +254,7 @@ public final class GrandBossManager implements IStorable
for (Integer player : list) for (Integer player : list)
{ {
insert.setInt(1, player); insert.setInt(1, player);
insert.setInt(2, id); insert.setInt(2, e.getKey());
insert.executeUpdate(); insert.executeUpdate();
insert.clearParameters(); insert.clearParameters();
} }
@ -436,7 +367,7 @@ public final class GrandBossManager implements IStorable
_zones.clear(); _zones.clear();
} }
public List<L2BossZone> getZones() public Map<Integer, L2BossZone> getZones()
{ {
return _zones; return _zones;
} }

View File

@ -30,6 +30,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -353,13 +354,14 @@ public class L2Clan implements IIdentifiable, INamable
public void addClanMember(L2PcInstance player) public void addClanMember(L2PcInstance player)
{ {
final L2ClanMember member = new L2ClanMember(this, player); final L2ClanMember member = new L2ClanMember(this, player);
// store in memory
addClanMember(member);
member.setPlayerInstance(player); member.setPlayerInstance(player);
addClanMember(member);
player.setClan(this); player.setClan(this);
player.setPledgeClass(L2ClanMember.calculatePledgeClass(player)); player.setPledgeClass(L2ClanMember.calculatePledgeClass(player));
player.sendPacket(new PledgeShowMemberListUpdate(player)); player.sendPacket(new PledgeShowMemberListUpdate(player));
player.sendPacket(new PledgeSkillList(this)); player.sendPacket(new PledgeSkillList(this));
addSkillEffects(player); addSkillEffects(player);
// Notify to scripts // Notify to scripts
@ -466,9 +468,10 @@ public class L2Clan implements IIdentifiable, INamable
{ {
CastleManager.getInstance().removeCirclet(exMember, getCastleId()); CastleManager.getInstance().removeCirclet(exMember, getCastleId());
} }
if (exMember.isOnline())
final L2PcInstance player = exMember.getPlayerInstance();
if (player != null)
{ {
L2PcInstance player = exMember.getPlayerInstance();
if (!player.isNoble()) if (!player.isNoble())
{ {
player.setTitle(""); player.setTitle("");
@ -479,7 +482,7 @@ public class L2Clan implements IIdentifiable, INamable
if (player.isClanLeader()) if (player.isClanLeader())
{ {
SiegeManager.getInstance().removeSiegeSkills(player); 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 // remove Clan skills from Player
removeSkillEffects(player); removeSkillEffects(player);
@ -510,7 +513,7 @@ public class L2Clan implements IIdentifiable, INamable
} }
else 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 // Notify to scripts
@ -1001,31 +1004,29 @@ public class L2Clan implements IIdentifiable, INamable
} }
/** /**
* @param member the clan member to be removed. * Removes a clan member from this clan.
* @param clanJoinExpiryTime * @param playerId the clan member object ID to be removed
* @param clanCreateExpiryTime * @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(); 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 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 ps2 = con.prepareStatement("UPDATE characters SET apprentice=0 WHERE apprentice=?");
PreparedStatement ps3 = con.prepareStatement("UPDATE characters SET sponsor=0 WHERE sponsor=?")) PreparedStatement ps3 = con.prepareStatement("UPDATE characters SET sponsor=0 WHERE sponsor=?"))
{ {
// Remove clan member.
ps1.setString(1, ""); ps1.setString(1, "");
ps1.setLong(2, clanJoinExpiryTime); ps1.setLong(2, clanJoinExpiryTime);
ps1.setLong(3, clanCreateExpiryTime); ps1.setLong(3, clanCreateExpiryTime);
ps1.setInt(4, member.getObjectId()); ps1.setInt(4, playerId);
ps1.execute(); ps1.execute();
if (Config.DEBUG)
{
_log.fine("clan member removed in db: " + getId());
}
// Remove apprentice. // Remove apprentice.
ps2.setInt(1, member.getObjectId()); ps2.setInt(1, playerId);
ps2.execute(); ps2.execute();
// Remove sponsor. // Remove sponsor.
ps3.setInt(1, member.getObjectId()); ps3.setInt(1, playerId);
ps3.execute(); ps3.execute();
} }
catch (Exception e) catch (Exception e)

View File

@ -149,8 +149,8 @@ public class L2ClanMember
} }
/** /**
* Checks if is online. * Verifies if the clan member is online.
* @return true, if is online * @return {@code true} if is online
*/ */
public boolean isOnline() public boolean isOnline()
{ {
@ -158,11 +158,7 @@ public class L2ClanMember
{ {
return false; return false;
} }
if (_player.getClient() == null) if (_player.isInOfflineMode())
{
return false;
}
if (_player.getClient().isDetached())
{ {
return false; return false;
} }

View File

@ -692,20 +692,23 @@ public class L2Party extends AbstractPlayerGroup
target.addItem("Party", item, player, true); target.addItem("Party", item, player, true);
// Send messages to other party members about reward // 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); if (item.getCount() > 1)
msg.addString(target.getName()); {
msg.addItemName(item); SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2);
msg.addLong(item.getCount()); msg.addString(target.getName());
broadcastToPartyMembers(target, msg); msg.addItemName(item);
} msg.addLong(item.getCount());
else broadcastToPartyMembers(target, msg);
{ }
SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2); else
msg.addString(target.getName()); {
msg.addItemName(item); SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2);
broadcastToPartyMembers(target, msg); 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); looter.addItem(spoil ? "Sweeper Party" : "Party", itemId, itemCount, target, true);
// Send messages to other party members about reward // 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); if (itemCount > 1)
msg.addString(looter.getName()); {
msg.addItemName(itemId); SystemMessage msg = spoil ? SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2_S_BY_USING_SWEEPER) : SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S3_S2);
msg.addLong(itemCount); msg.addString(looter.getName());
broadcastToPartyMembers(looter, msg); msg.addItemName(itemId);
} msg.addLong(itemCount);
else broadcastToPartyMembers(looter, msg);
{ }
SystemMessage msg = spoil ? SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2_BY_USING_SWEEPER) : SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2); else
msg.addString(looter.getName()); {
msg.addItemName(itemId); SystemMessage msg = spoil ? SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2_BY_USING_SWEEPER) : SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_OBTAINED_S2);
broadcastToPartyMembers(looter, msg); msg.addString(looter.getName());
msg.addItemName(itemId);
broadcastToPartyMembers(looter, msg);
}
} }
} }

View File

@ -1022,7 +1022,7 @@ public class L2Attackable extends L2Npc
} }
// Broadcast message if RaidBoss was defeated // 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); final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_DIED_AND_DROPPED_S3_S2_S);
sm.addCharName(this); sm.addCharName(this);

View File

@ -19,10 +19,10 @@
package com.l2jserver.gameserver.model.actor.instance; package com.l2jserver.gameserver.model.actor.instance;
import java.sql.Connection; import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
@ -666,7 +666,7 @@ public final class L2PcInstance extends L2Playable
// charges // charges
private final AtomicInteger _charges = new AtomicInteger(); private final AtomicInteger _charges = new AtomicInteger();
private ScheduledFuture<?> _chargeTask = null; private volatile ScheduledFuture<?> _chargeTask = null;
// Absorbed Souls // Absorbed Souls
private int _souls = 0; private int _souls = 0;
@ -4524,7 +4524,7 @@ public final class L2PcInstance extends L2Playable
getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
// Check if the L2Object to pick up is a L2ItemInstance // 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 :) // dont try to pickup anything that is not an item :)
_log.warning(this + " trying to pickup wrong target." + getTarget()); _log.warning(this + " trying to pickup wrong target." + getTarget());
@ -4533,12 +4533,7 @@ public final class L2PcInstance extends L2Playable
L2ItemInstance target = (L2ItemInstance) object; L2ItemInstance target = (L2ItemInstance) object;
// Send a Server->Client packet ActionFailed to this L2PcInstance sendPacket(new StopMove(this));
sendPacket(ActionFailed.STATIC_PACKET);
// Send a Server->Client packet StopMove to this L2PcInstance
StopMove sm = new StopMove(this);
sendPacket(sm);
SystemMessage smsg = null; SystemMessage smsg = null;
synchronized (target) synchronized (target)
@ -4567,12 +4562,8 @@ public final class L2PcInstance extends L2Playable
return; 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; return;
} }
@ -6986,7 +6977,7 @@ public final class L2PcInstance extends L2Playable
statement.setInt(34, getBaseClass()); statement.setInt(34, getBaseClass());
statement.setInt(35, isNoble() ? 1 : 0); statement.setInt(35, isNoble() ? 1 : 0);
statement.setLong(36, 0); statement.setLong(36, 0);
statement.setDate(37, new Date(getCreateDate().getTimeInMillis())); statement.setTimestamp(37, new Timestamp(getCreateDate().getTimeInMillis()));
statement.executeUpdate(); statement.executeUpdate();
} }
catch (Exception e) catch (Exception e)
@ -7182,7 +7173,7 @@ public final class L2PcInstance extends L2Playable
player.setPcBangPoints(rset.getInt("pccafe_points")); player.setPcBangPoints(rset.getInt("pccafe_points"));
// character creation Time // character creation Time
player.getCreateDate().setTime(rset.getDate("createDate")); player.getCreateDate().setTimeInMillis(rset.getTimestamp("createDate").getTime());
// Language // Language
player.setLang(rset.getString("language")); player.setLang(rset.getString("language"));
@ -7841,13 +7832,25 @@ public final class L2PcInstance extends L2Playable
public int isOnlineInt() public int isOnlineInt()
{ {
if (_isOnline && (getClient() != null)) if (_isOnline && (_client != null))
{ {
return getClient().isDetached() ? 2 : 1; return _client.isDetached() ? 2 : 1;
} }
return 0; return 0;
} }
/**
* Verifies if the player is in offline mode.<br>
* The offline mode may happen for different reasons:<br>
* Abnormally: Player gets abrouptaly disconnected from server.<br>
* 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 @Override
public Skill addSkill(Skill newSkill) public Skill addSkill(Skill newSkill)
{ {
@ -10703,6 +10706,16 @@ public final class L2PcInstance extends L2Playable
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(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); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
return true; return true;
} }
@ -12932,7 +12945,7 @@ public final class L2PcInstance extends L2Playable
{ {
if (_transformSkills == null) if (_transformSkills == null)
{ {
_transformSkills = new HashMap<>(); _transformSkills = new ConcurrentHashMap<>();
} }
} }
} }
@ -12941,15 +12954,23 @@ public final class L2PcInstance extends L2Playable
public Skill getTransformSkill(int id) public Skill getTransformSkill(int id)
{ {
if (_transformSkills == null)
{
return null;
}
return _transformSkills.get(id); return _transformSkills.get(id);
} }
public boolean hasTransformSkill(int id) public boolean hasTransformSkill(int id)
{ {
if (_transformSkills == null)
{
return false;
}
return _transformSkills.containsKey(id); return _transformSkills.containsKey(id);
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills = null;
} }
@ -13194,8 +13215,13 @@ public final class L2PcInstance extends L2Playable
{ {
if (_chargeTask != null) if (_chargeTask != null)
{ {
_chargeTask.cancel(false); synchronized (this)
_chargeTask = null; {
if (_chargeTask != null)
{
_chargeTask.cancel(false);
}
}
} }
_chargeTask = ThreadPoolManager.getInstance().scheduleGeneral(new ResetChargesTask(this), 600000); _chargeTask = ThreadPoolManager.getInstance().scheduleGeneral(new ResetChargesTask(this), 600000);
} }
@ -14161,9 +14187,9 @@ public final class L2PcInstance extends L2Playable
{ {
try try
{ {
for (L2BossZone _zone : GrandBossManager.getInstance().getZones()) for (L2BossZone zone : GrandBossManager.getInstance().getZones().values())
{ {
_zone.removePlayer(this); zone.removePlayer(this);
} }
} }
catch (Exception e) catch (Exception e)
@ -14177,10 +14203,9 @@ public final class L2PcInstance extends L2Playable
*/ */
public void checkPlayerSkills() public void checkPlayerSkills()
{ {
L2SkillLearn learn;
for (Entry<Integer, Skill> e : getSkills().entrySet()) for (Entry<Integer, Skill> 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) if (learn != null)
{ {
int lvlDiff = e.getKey() == CommonSkill.EXPERTISE.getId() ? 0 : 9; int lvlDiff = e.getKey() == CommonSkill.EXPERTISE.getId() ? 0 : 9;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2004-2014 L2J Server * Copyright (C) 2004-2015 L2J Server
* *
* This file is part of L2J Server. * This file is part of L2J Server.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2004-2014 L2J Server * Copyright (C) 2004-2015 L2J Server
* *
* This file is part of L2J Server. * This file is part of L2J Server.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2004-2014 L2J Server * Copyright (C) 2004-2015 L2J Server
* *
* This file is part of L2J Server. * This file is part of L2J Server.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2004-2014 L2J Server * Copyright (C) 2004-2015 L2J Server
* *
* This file is part of L2J Server. * This file is part of L2J Server.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2004-2014 L2J Server * Copyright (C) 2004-2015 L2J Server
* *
* This file is part of L2J Server. * This file is part of L2J Server.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2004-2014 L2J Server * Copyright (C) 2004-2015 L2J Server
* *
* This file is part of L2J Server. * This file is part of L2J Server.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2004-2014 L2J Server * Copyright (C) 2004-2015 L2J Server
* *
* This file is part of L2J Server. * This file is part of L2J Server.
* *

View File

@ -83,6 +83,6 @@ public class FuncAtkEvasion extends AbstractFunction
value += (level - 69) + 2; value += (level - 69) + 2;
} }
} }
return value; return (int) value;
} }
} }

View File

@ -63,6 +63,7 @@ import com.l2jserver.gameserver.model.quest.State;
import com.l2jserver.gameserver.model.zone.ZoneId; import com.l2jserver.gameserver.model.zone.ZoneId;
import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList; 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.AllyCrest;
import com.l2jserver.gameserver.network.serverpackets.Die; import com.l2jserver.gameserver.network.serverpackets.Die;
import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate; import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate;
@ -659,11 +660,11 @@ public class EnterWorld extends L2GameClientPacket
activeChar.sendPacket(new ExAcquireAPSkillList(activeChar)); activeChar.sendPacket(new ExAcquireAPSkillList(activeChar));
activeChar.sendPacket(new ExWorldChatCnt(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) private void engage(L2PcInstance cha)
{ {
int chaId = cha.getObjectId(); int chaId = cha.getObjectId();

View File

@ -87,7 +87,7 @@ public final class RequestAnswerJoinPledge extends L2GameClientPacket
activeChar.setPledgeType(requestPacket.getPledgeType()); activeChar.setPledgeType(requestPacket.getPledgeType());
if (requestPacket.getPledgeType() == L2Clan.SUBUNIT_ACADEMY) if (requestPacket.getPledgeType() == L2Clan.SUBUNIT_ACADEMY)
{ {
activeChar.setPowerGrade(9); // adademy activeChar.setPowerGrade(9); // Academy
activeChar.setLvlJoinedAcademy(activeChar.getLevel()); activeChar.setLvlJoinedAcademy(activeChar.getLevel());
} }
else else

View File

@ -18,6 +18,8 @@
*/ */
package com.l2jserver.gameserver.network.clientpackets; package com.l2jserver.gameserver.network.clientpackets;
import java.util.concurrent.TimeUnit;
import com.l2jserver.Config; import com.l2jserver.Config;
import com.l2jserver.gameserver.model.ClanPrivilege; import com.l2jserver.gameserver.model.ClanPrivilege;
import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Clan;
@ -83,8 +85,8 @@ public final class RequestOustPledgeMember extends L2GameClientPacket
} }
// this also updates the database // this also updates the database
clan.removeClanMember(member.getObjectId(), 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() + (Config.ALT_CLAN_JOIN_DAYS * 86400000L)); // 24*60*60*1000 = 86400000 clan.setCharPenaltyExpiryTime(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(Config.ALT_CLAN_JOIN_DAYS));
clan.updateClanInDB(); clan.updateClanInDB();
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CLAN_MEMBER_S1_HAS_BEEN_EXPELLED); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CLAN_MEMBER_S1_HAS_BEEN_EXPELLED);

View File

@ -18,6 +18,8 @@
*/ */
package com.l2jserver.gameserver.network.clientpackets; package com.l2jserver.gameserver.network.clientpackets;
import java.util.concurrent.TimeUnit;
import com.l2jserver.Config; import com.l2jserver.Config;
import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@ -66,7 +68,7 @@ public final class RequestWithdrawalPledge extends L2GameClientPacket
L2Clan clan = activeChar.getClan(); 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); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_WITHDRAWN_FROM_THE_CLAN);
sm.addString(activeChar.getName()); sm.addString(activeChar.getName());

View File

@ -22,32 +22,28 @@ import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Calendar; import java.util.concurrent.TimeUnit;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import com.l2jserver.Config; import com.l2jserver.Config;
import com.l2jserver.L2DatabaseFactory; import com.l2jserver.L2DatabaseFactory;
import com.l2jserver.gameserver.data.sql.impl.CharNameTable;
import com.l2jserver.gameserver.enums.MailType; import com.l2jserver.gameserver.enums.MailType;
import com.l2jserver.gameserver.instancemanager.MailManager; import com.l2jserver.gameserver.instancemanager.MailManager;
import com.l2jserver.gameserver.model.entity.Message; 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.Task;
import com.l2jserver.gameserver.taskmanager.TaskManager; import com.l2jserver.gameserver.taskmanager.TaskManager;
import com.l2jserver.gameserver.taskmanager.TaskManager.ExecutedTask; import com.l2jserver.gameserver.taskmanager.TaskManager.ExecutedTask;
import com.l2jserver.gameserver.taskmanager.TaskTypes; import com.l2jserver.gameserver.taskmanager.TaskTypes;
import com.l2jserver.gameserver.util.Util;
/** /**
* @author Nyaran * Birthday Gift task.
* @author Zoey76
*/ */
public class TaskBirthday extends Task public class TaskBirthday extends Task
{ {
private static final String NAME = "birthday"; private static final String NAME = "birthday";
private static final String QUERY = "SELECT charId, createDate FROM characters WHERE createDate LIKE ?"; /** Get all players that have had a birthday since last check. */
private static final Calendar _today = Calendar.getInstance(); private static final String SELECT_PENDING_BIRTHDAY_GIFTS = "SELECT charId, char_name, createDate, (YEAR(NOW()) - YEAR(createDate)) AS age " //
private int _count = 0; + "FROM characters WHERE (YEAR(NOW()) - YEAR(createDate) > 0) AND (DATE_FORMAT(createDate, '%m-%d') > DATE_FORMAT(FROM_UNIXTIME(?), '%m-%d'))";
@Override @Override
public String getName() public String getName()
@ -58,85 +54,39 @@ public class TaskBirthday extends Task
@Override @Override
public void onTimeElapsed(ExecutedTask task) public void onTimeElapsed(ExecutedTask task)
{ {
Calendar lastExecDate = Calendar.getInstance(); // TODO(Zoey76): Fix first run.
long lastActivation = task.getLastActivation(); final int birthdayGiftCount = giveBirthdayGifts(task.getLastActivation());
if (lastActivation > 0) _log.info("BirthdayManager: " + birthdayGiftCount + " gifts sent.");
{
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);
} }
private void checkBirthday(int year, int month, int day) private int giveBirthdayGifts(long lastActivation)
{ {
int birthdayGiftCount = 0;
try (Connection con = L2DatabaseFactory.getInstance().getConnection(); 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)); ps.setLong(1, TimeUnit.SECONDS.convert(lastActivation, TimeUnit.MILLISECONDS));
try (ResultSet rset = statement.executeQuery()) 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; 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")) 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);
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);
MailManager.getInstance().sendMessage(msg); MailManager.getInstance().sendMessage(msg);
_count++; birthdayGiftCount++;
} }
} }
} }
catch (SQLException e) catch (SQLException e)
{ {
_log.log(Level.WARNING, "Error checking birthdays. ", e); _log.warning("Error checking birthdays: " + e.getMessage());
} }
return birthdayGiftCount;
// 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);
} }
@Override @Override