Sync with L2jServer HighFive Jul 14th 2015.
This commit is contained in:
		| @@ -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(); | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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<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 | ||||
| @@ -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; | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
| @@ -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; | ||||
| 	} | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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<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 | ||||
| @@ -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; | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
							
								
								
									
										2
									
								
								trunk/dist/tools/sql/game/characters.sql
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								trunk/dist/tools/sql/game/characters.sql
									
									
									
									
										vendored
									
									
								
							| @@ -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`), | ||||
|   | ||||
| @@ -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()); | ||||
|   | ||||
| @@ -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); | ||||
| 					} | ||||
|   | ||||
| @@ -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<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() | ||||
| 	{ | ||||
| @@ -124,21 +123,10 @@ public final class GrandBossManager implements IStorable | ||||
| 	 */ | ||||
| 	public void initZones() | ||||
| 	{ | ||||
| 		Map<Integer, List<Integer>> zones = new HashMap<>(); | ||||
| 		 | ||||
| 		if (_zones == null) | ||||
| 		final Map<Integer, List<Integer>> 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<Integer, L2BossZone> 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<Integer, L2BossZone> e : _zones.entrySet()) | ||||
| 				{ | ||||
| 					if (zone == null) | ||||
| 					{ | ||||
| 						continue; | ||||
| 					} | ||||
| 					Integer id = zone.getId(); | ||||
| 					List<Integer> list = zone.getAllowedPlayers(); | ||||
| 					List<Integer> 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<L2BossZone> getZones() | ||||
| 	public Map<Integer, L2BossZone> getZones() | ||||
| 	{ | ||||
| 		return _zones; | ||||
| 	} | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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; | ||||
| 		} | ||||
|   | ||||
| @@ -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); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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.<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 | ||||
| 	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<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) | ||||
| 			{ | ||||
| 				int lvlDiff = e.getKey() == CommonSkill.EXPERTISE.getId() ? 0 : 9; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (C) 2004-2014 L2J Server | ||||
|  * Copyright (C) 2004-2015 L2J Server | ||||
|  *  | ||||
|  * This file is part of L2J Server. | ||||
|  *  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (C) 2004-2014 L2J Server | ||||
|  * Copyright (C) 2004-2015 L2J Server | ||||
|  *  | ||||
|  * This file is part of L2J Server. | ||||
|  *  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (C) 2004-2014 L2J Server | ||||
|  * Copyright (C) 2004-2015 L2J Server | ||||
|  *  | ||||
|  * This file is part of L2J Server. | ||||
|  *  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (C) 2004-2014 L2J Server | ||||
|  * Copyright (C) 2004-2015 L2J Server | ||||
|  * | ||||
|  * This file is part of L2J Server. | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (C) 2004-2014 L2J Server | ||||
|  * Copyright (C) 2004-2015 L2J Server | ||||
|  * | ||||
|  * This file is part of L2J Server. | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (C) 2004-2014 L2J Server | ||||
|  * Copyright (C) 2004-2015 L2J Server | ||||
|  *  | ||||
|  * This file is part of L2J Server. | ||||
|  *  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (C) 2004-2014 L2J Server | ||||
|  * Copyright (C) 2004-2015 L2J Server | ||||
|  *  | ||||
|  * This file is part of L2J Server. | ||||
|  *  | ||||
|   | ||||
| @@ -83,6 +83,6 @@ public class FuncAtkEvasion extends AbstractFunction | ||||
| 				value += (level - 69) + 2; | ||||
| 			} | ||||
| 		} | ||||
| 		return value; | ||||
| 		return (int) value; | ||||
| 	} | ||||
| } | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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()); | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 MobiusDev
					MobiusDev