diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/Baium/Baium.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/Baium/Baium.java index b3331294e483d300231baee3cae692d47d18c6f3..5ef71d3e0df5689ed3519aadc63201e50864d7b2 100644 --- a/L2J_DataPack/dist/game/data/scripts/ai/individual/Baium/Baium.java +++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/Baium/Baium.java @@ -100,7 +100,6 @@ public final class Baium extends AbstractNpcAI // Misc private L2GrandBossInstance _baium = null; private static long _lastAttack = 0; - private static L2PcInstance _standbyPlayer = null; private Baium() { @@ -213,6 +212,7 @@ public final class Baium extends AbstractNpcAI _lastAttack = System.currentTimeMillis(); startQuestTimer("WAKEUP_ACTION", 50, _baium, null); startQuestTimer("MANAGE_EARTHQUAKE", 2000, _baium, null); + startQuestTimer("SOCIAL_ACTION", 10000, _baium, player); startQuestTimer("CHECK_ATTACK", 60000, _baium, null); } break; @@ -231,7 +231,6 @@ public final class Baium extends AbstractNpcAI { zone.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 10)); zone.broadcastPacket(new PlaySound("BS02_A")); - startQuestTimer("SOCIAL_ACTION", 8000, npc, player); } break; } @@ -253,10 +252,18 @@ public final class Baium extends AbstractNpcAI player.teleToLocation(BAIUM_GIFT_LOC); startQuestTimer("PLAYER_KILL", 3000, npc, player); } - else if ((_standbyPlayer != null) && _standbyPlayer.isInsideRadius(npc, 16000, true, false)) + else { - _standbyPlayer.teleToLocation(BAIUM_GIFT_LOC); - startQuestTimer("PLAYER_KILL", 3000, npc, _standbyPlayer); + L2PcInstance randomPlayer = getRandomPlayer(npc); + if (randomPlayer != null) + { + randomPlayer.teleToLocation(BAIUM_GIFT_LOC); + startQuestTimer("PLAYER_KILL", 3000, npc, randomPlayer); + } + else + { + startQuestTimer("PLAYER_KILL", 3000, npc, null); + } } } break; @@ -266,20 +273,20 @@ public final class Baium extends AbstractNpcAI if ((player != null) && player.isInsideRadius(npc, 16000, true, false)) { zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1)); - broadcastNpcSay(npc, Say2.NPC_ALL, player.getName() + ", How dare you wake me! Now you shall die!"); // TODO: replace with NpcStringId when are done core support + broadcastNpcSay(npc, Say2.NPC_ALL, NpcStringId.HOW_DARE_YOU_WAKE_ME_NOW_YOU_SHALL_DIE, player.getName()); npc.setTarget(player); npc.doCast(BAIUM_PRESENT.getSkill()); } - for (L2PcInstance players : zone.getPlayersInside()) + for (L2PcInstance insidePlayer : zone.getPlayersInside()) { - if (players.isHero()) + if (insidePlayer.isHero()) { - zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.NOT_EVEN_THE_GODS_THEMSELVES_COULD_TOUCH_ME_BUT_YOU_S1_YOU_DARE_CHALLENGE_ME_IGNORANT_MORTAL, 2, 4000, players.getName())); + zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.NOT_EVEN_THE_GODS_THEMSELVES_COULD_TOUCH_ME_BUT_YOU_S1_YOU_DARE_CHALLENGE_ME_IGNORANT_MORTAL, 2, 4000, insidePlayer.getName())); break; } } - startQuestTimer("SPAWN_ARCHANGEL", 8000, npc, null); + startQuestTimer("SPAWN_ARCHANGEL", 8000, npc, player); break; } case "SPAWN_ARCHANGEL": @@ -296,19 +303,12 @@ public final class Baium extends AbstractNpcAI { addAttackPlayerDesire(npc, player); } - else if ((_standbyPlayer != null) && !_standbyPlayer.isDead()) - { - addAttackPlayerDesire(npc, _standbyPlayer); - } else { - for (L2Character creature : npc.getKnownList().getKnownCharactersInRadius(2000)) + L2PcInstance randomPlayer = getRandomPlayer(npc); + if (randomPlayer != null) { - if ((creature != null) && creature.isPlayer() && zone.isInsideZone(creature) && !creature.isDead()) - { - addAttackPlayerDesire(npc, (L2Playable) creature); - break; - } + addAttackPlayerDesire(npc, randomPlayer); } } break; @@ -377,6 +377,7 @@ public final class Baium extends AbstractNpcAI { if ((npc != null) && ((_lastAttack + 1800000) < System.currentTimeMillis())) { + cancelQuestTimers("SELECT_TARGET"); notifyEvent("CLEAR_ZONE", null, null); addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0); setStatus(ALIVE); @@ -560,6 +561,7 @@ public final class Baium extends AbstractNpcAI startQuestTimer("CLEAR_STATUS", respawnTime, null, null); startQuestTimer("CLEAR_ZONE", 900000, null, null); cancelQuestTimer("CHECK_ATTACK", npc, null); + cancelQuestTimers("SELECT_TARGET"); } return super.onKill(npc, killer, isSummon); } @@ -572,11 +574,6 @@ public final class Baium extends AbstractNpcAI return super.onSeeCreature(npc, creature, isSummon); } - if (creature.isPlayer() && !creature.isDead() && (_standbyPlayer == null)) - { - _standbyPlayer = (L2PcInstance) creature; - } - if (creature.isInCategory(CategoryType.CLERIC_GROUP)) { if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25)) @@ -785,6 +782,18 @@ public final class Baium extends AbstractNpcAI } } + private L2PcInstance getRandomPlayer(L2Npc npc) + { + for (L2Character creature : npc.getKnownList().getKnownCharactersInRadius(2000)) + { + if ((creature != null) && creature.isPlayer() && zone.isInsideZone(creature) && !creature.isDead()) + { + return (L2PcInstance) creature; + } + } + return null; + } + public static void main(String[] args) { new Baium(); diff --git a/L2J_DataPack/dist/game/data/scripts/custom/events/Elpies/Elpies.java b/L2J_DataPack/dist/game/data/scripts/custom/events/Elpies/Elpies.java index b8d9b25d84414eb1672ff19309387ddc7b2eb325..8f9fe6935df32acefbd846daa21a7b02ef16c3ef 100644 --- a/L2J_DataPack/dist/game/data/scripts/custom/events/Elpies/Elpies.java +++ b/L2J_DataPack/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<L2Npc> _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/L2J_DataPack/dist/game/data/scripts/custom/events/Rabbits/Rabbits.java b/L2J_DataPack/dist/game/data/scripts/custom/events/Rabbits/Rabbits.java index 2ca12435e9521b720de8cc48d50e897c897dd3a6..8232152b3162ba51d363840321965b61927cad78 100644 --- a/L2J_DataPack/dist/game/data/scripts/custom/events/Rabbits/Rabbits.java +++ b/L2J_DataPack/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<L2Npc> _npcs = new CopyOnWriteArrayList<>(); + private final Set<L2Npc> _npcs = ConcurrentHashMap.newKeySet(TOTAL_CHEST_COUNT + 1); private final List<L2PcInstance> _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<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); if (npc.getId() == CHEST) diff --git a/L2J_DataPack/dist/game/data/scripts/custom/events/Race/Race.java b/L2J_DataPack/dist/game/data/scripts/custom/events/Race/Race.java index 5741066e7632135e55a5ed270727007c8b4243d8..4ffeab49b2b506f3e396d4fadce622760eb4474e 100644 --- a/L2J_DataPack/dist/game/data/scripts/custom/events/Race/Race.java +++ b/L2J_DataPack/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; @@ -42,11 +41,11 @@ import com.l2jserver.gameserver.util.Broadcast; public final class Race extends Event { // Event NPC's list - private List<L2Npc> _npclist; + private final Set<L2Npc> _npcs = ConcurrentHashMap.newKeySet(); // Npc private L2Npc _npc; // Player list - private List<L2PcInstance> _players; + private final Set<L2PcInstance> _players = ConcurrentHashMap.newKeySet(); // Event Task ScheduledFuture<?> _eventTask = null; // Event state @@ -120,6 +119,7 @@ public final class Race extends Event { return false; } + // Check Custom Table - we use custom NPC's if (!Config.CUSTOM_NPC_DATA) { @@ -127,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 @@ -167,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)) { @@ -209,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); } } + _players.clear(); // Despawn NPCs - for (L2Npc _npc : _npclist) + for (L2Npc _npc : _npcs) { - if (_npc != null) - { - _npc.deleteMe(); - } + _npc.deleteMe(); } - _npclist.clear(); - _players.clear(); + _npcs.clear(); // Announce event end Broadcast.toAllOnlinePlayers("* Race Event finished *"); @@ -355,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/L2J_DataPack/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java b/L2J_DataPack/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java index df7cb0832cffd1eb002143020d84a033d9a9c9ca..91dfdfc649b055d4c7e2ce7d3d73a59e9fc5c3c6 100644 --- a/L2J_DataPack/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java +++ b/L2J_DataPack/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/L2J_DataPack/dist/sql/game/characters.sql b/L2J_DataPack/dist/sql/game/characters.sql index 86ab28d199fe867dd14745ab8fcad04dec6c6eaf..f84c9c6cb48c701f75652ffafc6a9ed5752e9de0 100644 --- a/L2J_DataPack/dist/sql/game/characters.sql +++ b/L2J_DataPack/dist/sql/game/characters.sql @@ -53,7 +53,7 @@ CREATE TABLE IF NOT EXISTS `characters` ( `death_penalty_level` SMALLINT UNSIGNED NOT NULL DEFAULT 0, `bookmarkslot` SMALLINT UNSIGNED NOT NULL DEFAULT 0, `vitality_points` SMALLINT UNSIGNED NOT NULL DEFAULT 0, - `createDate` date NOT NULL DEFAULT '0000-00-00', + `createDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `language` VARCHAR(2) DEFAULT NULL, PRIMARY KEY (`charId`), KEY `account_name` (`account_name`), diff --git a/L2J_DataPack/dist/sql/game/updates/20150705update.sql b/L2J_DataPack/dist/sql/game/updates/20150705update.sql new file mode 100644 index 0000000000000000000000000000000000000000..b8a6825f92e2113c53ddd4ae588af4aad74142a2 --- /dev/null +++ b/L2J_DataPack/dist/sql/game/updates/20150705update.sql @@ -0,0 +1 @@ +ALTER TABLE `characters` CHANGE COLUMN `createDate` `createDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `vitality_points`; \ No newline at end of file