From ab38e7d5ba536ef07999837c7aa174d8df066666 Mon Sep 17 00:00:00 2001 From: Rogiel Date: Sat, 21 May 2011 20:19:13 -0300 Subject: [PATCH] Several improvements Signed-off-by: Rogiel --- .../java/com/l2jserver/L2JGameServerMain.java | 10 +- .../client/CharacterAttackRequestPacket.java | 7 +- .../game/net/packet/client/EnterWorld.java | 11 +- .../l2jserver/model/template/NPCTemplate.java | 35 ++-- .../npc/AbstractVillageMasterNPCTemplate.java | 38 ++++ .../template/npc/AdventurerNPCTemplate.java | 1 - .../template/npc/ArtefactNPCTemplate.java | 1 - .../template/npc/AuctioneerNPCTemplate.java | 1 - .../template/npc/BabyPetNPCTemplate.java | 1 - .../model/template/npc/BlockNPCTemplate.java | 1 - .../template/npc/CabaleBufferNPCTemplate.java | 1 - .../npc/CastleBlacksmithNPCTemplate.java | 1 - .../npc/CastleChamberlainNPCTemplate.java | 1 - .../npc/CastleDoormenNPCTemplate.java | 1 - .../npc/CastleMagicianNPCTemplate.java | 1 - .../npc/CastleWyvernManagerNPCTemplate.java | 1 - .../model/template/npc/ChestNPCTemplate.java | 1 - .../npc/ChristmasTreeNPCTemplate.java | 1 - .../template/npc/ClanTraderNPCTemplate.java | 1 - .../npc/ClanhallDoormenNPCTemplate.java | 1 - .../npc/ClanhallManagerNPCTemplate.java | 1 - .../template/npc/ClassMasterNPCTemplate.java | 1 - .../template/npc/ControlTowerNPCTemplate.java | 1 - .../npc/DarkElfVillageMasterNPCTemplate.java | 4 +- .../template/npc/DawnPriestNPCTemplate.java | 1 - .../model/template/npc/DecoyNPCTemplate.java | 1 - .../template/npc/DefenderNPCTemplate.java | 1 - .../template/npc/DoormenNPCTemplate.java | 1 - .../npc/DungeonGatekeeperNPCTemplate.java | 1 - .../template/npc/DuskPriestNPCTemplate.java | 1 - .../npc/DwarfVillageMasterNPCTemplate.java | 3 +- .../template/npc/EffectPointNPCTemplate.java | 1 - .../template/npc/EventChestNPCTemplate.java | 1 - .../template/npc/FameManagerNPCTemplate.java | 1 - .../npc/FeedableBeastNPCTemplate.java | 1 - .../npc/FestivalGuideNPCTemplate.java | 1 - .../npc/FestivalMonsterNPCTemplate.java | 1 - .../npc/FightherVillageMasterNPCTemplate.java | 4 +- .../template/npc/FishermanNPCTemplate.java | 1 - .../template/npc/FlameTowerNPCTemplate.java | 1 - .../template/npc/FlyMonsterNPCTemplate.java | 4 +- .../model/template/npc/FlyNPCTemplate.java | 1 - .../template/npc/FlyRaidBossNPCTemplate.java | 1 - .../npc/FlyTerrainObjectNPCTemplate.java | 1 - .../template/npc/FortBallistaNPCTemplate.java | 1 - .../npc/FortCommanderNPCTemplate.java | 1 - .../template/npc/FortDoormenNPCTemplate.java | 1 - .../template/npc/FortEnvoyNPCTemplate.java | 1 - .../npc/FortLogisticsNPCTemplate.java | 1 - .../template/npc/FortManagerNPCTemplate.java | 1 - .../template/npc/FortSiegeNPCTemplate.java | 1 - .../npc/FortSupportCaptainNPCTemplate.java | 1 - .../npc/FortWyvernManagerNPCTemplate.java | 1 - .../npc/FriendlyMonsterNPCTemplate.java | 4 +- .../template/npc/GrandeBossNPCTemplate.java | 1 - .../model/template/npc/GuardNPCTemplate.java | 1 - .../npc/KamaelVillageMasterNPCTemplate.java | 3 +- .../template/npc/ManorManagerNPCTemplate.java | 1 - .../template/npc/MercManagerNPCTemplate.java | 1 - .../npc/MercenaryManagerNPCTemplate.java | 1 - .../template/npc/MerchantNPCTemplate.java | 1 - .../npc/MerchantSummonNPCTemplate.java | 1 - .../template/npc/MonsterNPCTemplate.java | 18 -- .../template/npc/ObservationNPCTemplate.java | 1 - .../npc/OlympiadManagerNPCTemplate.java | 1 - .../npc/OrcVillageMasterNPCTemplate.java | 3 +- .../template/npc/PenaltyNPCTemplate.java | 1 - .../template/npc/PetManagerNPCTemplate.java | 1 - .../npc/PriestVillageMasterNPCTemplate.java | 4 +- .../template/npc/RaidBossNPCTemplate.java | 1 - .../template/npc/RiftInvaderNPCTemplate.java | 1 - .../npc/SepulcherMonsterNPCTemplate.java | 1 - .../model/template/npc/SiegeNPCTemplate.java | 1 - .../template/npc/SiegeSummonNPCTemplate.java | 1 - .../template/npc/SignsPriestsNPCTemplate.java | 1 - .../template/npc/SymbolMakerNPCTemplate.java | 1 - .../template/npc/TamedBeastNPCTemplate.java | 1 - .../template/npc/TeleporterNPCTemplate.java | 1 - .../npc/TerrainObjectNPCTemplate.java | 1 - .../npc/TerritoryWardNPCTemplate.java | 1 - .../template/npc/TownPetNPCTemplate.java | 1 - .../template/npc/TrainerNPCTemplate.java | 1 - .../npc/TransformManagerNPCTemplate.java | 1 - .../model/template/npc/WalkerNPCTemplate.java | 1 - .../template/npc/WarehouseNPCTemplate.java | 1 - .../java/com/l2jserver/model/world/NPC.java | 13 +- .../com/l2jserver/service/ServiceManager.java | 2 +- .../com/l2jserver/service/ServiceModule.java | 4 +- .../service/cache/EhCacheService.java | 10 + .../ProxyConfigurationService.java | 12 +- .../service/core/ExceptionService.java | 46 +++++ .../Log4JLoggingService.java | 8 +- .../{logging => core}/LoggingService.java | 2 +- .../service/core/threading/AsyncFuture.java | 73 +++++++ .../service/core/threading/ThreadService.java | 58 ++++++ .../core/threading/ThreadServiceImpl.java | 187 ++++++++++++++++++ .../database/MySQLDatabaseService.java | 13 +- .../service/game/CharacterService.java | 79 +++++++- .../service/game/CharacterServiceImpl.java | 95 ++++++--- .../service/game/GameTimeService.java | 5 + .../service/game/GameTimeServiceImpl.java | 3 +- .../MonsterService.java} | 19 +- .../l2jserver/service/game/SpawnService.java | 50 ++++- .../service/game/SpawnServiceImpl.java | 13 +- .../service/game/ai/AIServiceImpl.java | 2 +- .../game/chat/ChatMessageDestination.java | 19 +- .../service/game/chat/ChatService.java | 16 ++ .../service/game/chat/SimpleChatService.java | 21 +- .../game/chat/channel/ChatChannel.java | 6 +- .../game/scripting/ScriptingServiceImpl.java | 10 +- .../game/template/ScriptTemplateService.java | 7 +- .../game/world/CachedWorldIDService.java | 5 + .../service/game/world/WorldServiceImpl.java | 17 +- .../world/event/FilteredWorldListener.java | 2 + .../game/world/event/TypedWorldListener.java | 3 + .../world/event/WorldEventDispatcherImpl.java | 23 ++- .../game/world/filter/impl/IDFilter.java | 2 + .../world/filter/impl/InstanceFilter.java | 2 + .../game/world/filter/impl/RangeFilter.java | 3 + .../service/network/NettyNetworkService.java | 13 +- .../service/network/NetworkService.java | 9 + .../network/keygen/BlowfishKeygenService.java | 14 ++ .../PseudoRandomBlowfishKeygenService.java | 9 + .../L2CharacterServiceException.java | 40 ++++ .../exception/L2SpawnServiceException.java | 40 ++++ 125 files changed, 969 insertions(+), 205 deletions(-) create mode 100644 src/main/java/com/l2jserver/model/template/npc/AbstractVillageMasterNPCTemplate.java create mode 100644 src/main/java/com/l2jserver/service/core/ExceptionService.java rename src/main/java/com/l2jserver/service/{logging => core}/Log4JLoggingService.java (85%) rename src/main/java/com/l2jserver/service/{logging => core}/LoggingService.java (96%) create mode 100644 src/main/java/com/l2jserver/service/core/threading/AsyncFuture.java create mode 100644 src/main/java/com/l2jserver/service/core/threading/ThreadService.java create mode 100644 src/main/java/com/l2jserver/service/core/threading/ThreadServiceImpl.java rename src/main/java/com/l2jserver/service/{threading/ThreadService.java => game/MonsterService.java} (65%) create mode 100644 src/main/java/com/l2jserver/util/exception/L2CharacterServiceException.java create mode 100644 src/main/java/com/l2jserver/util/exception/L2SpawnServiceException.java diff --git a/src/main/java/com/l2jserver/L2JGameServerMain.java b/src/main/java/com/l2jserver/L2JGameServerMain.java index 7e70f2db0..6738461bc 100644 --- a/src/main/java/com/l2jserver/L2JGameServerMain.java +++ b/src/main/java/com/l2jserver/L2JGameServerMain.java @@ -27,6 +27,8 @@ import com.l2jserver.service.configuration.ConfigurationService; import com.l2jserver.service.database.DatabaseService; import com.l2jserver.service.game.CharacterService; import com.l2jserver.service.game.SpawnService; +import com.l2jserver.service.game.SpawnService.AlreadySpawnedServiceException; +import com.l2jserver.service.game.SpawnService.SpawnPointNotFoundServiceException; import com.l2jserver.service.game.chat.ChatService; import com.l2jserver.service.game.pathing.PathingService; import com.l2jserver.service.game.scripting.ScriptingService; @@ -67,6 +69,7 @@ public class L2JGameServerMain { } catch (Exception e) { System.out.println("GameServer could not be started!"); e.printStackTrace(); + System.exit(0); } // Thread.sleep(60 * 60 * 1000); @@ -74,8 +77,13 @@ public class L2JGameServerMain { /** * This method does an static spawn for an object + * + * @throws AlreadySpawnedServiceException + * @throws SpawnPointNotFoundServiceException */ - private static void staticSpawn(Injector injector) { + private static void staticSpawn(Injector injector) + throws SpawnPointNotFoundServiceException, + AlreadySpawnedServiceException { final NPCTemplateIDProvider templateProvider = injector .getInstance(NPCTemplateIDProvider.class); final NPCIDProvider provider = injector diff --git a/src/main/java/com/l2jserver/game/net/packet/client/CharacterAttackRequestPacket.java b/src/main/java/com/l2jserver/game/net/packet/client/CharacterAttackRequestPacket.java index 1c0c6b07f..0a5c25b1c 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/CharacterAttackRequestPacket.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/CharacterAttackRequestPacket.java @@ -30,6 +30,7 @@ import com.l2jserver.model.id.object.provider.ObjectIDResolver; import com.l2jserver.model.world.L2Character; import com.l2jserver.model.world.capability.Actor; import com.l2jserver.service.game.CharacterService; +import com.l2jserver.service.game.CharacterService.CannotSetTargetServiceException; import com.l2jserver.util.dimensional.Coordinate; /** @@ -124,6 +125,10 @@ public class CharacterAttackRequestPacket extends AbstractClientPacket { return; } final Actor actor = id.getObject(); - charService.attack(character, actor); + try { + charService.attack(character, actor); + } catch (CannotSetTargetServiceException e) { + conn.sendActionFailed(); + } } } diff --git a/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java b/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java index fc7e65637..6841e0b86 100644 --- a/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java +++ b/src/main/java/com/l2jserver/game/net/packet/client/EnterWorld.java @@ -25,6 +25,8 @@ import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.packet.AbstractClientPacket; import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.service.game.CharacterService; +import com.l2jserver.service.game.SpawnService.AlreadySpawnedServiceException; +import com.l2jserver.service.game.SpawnService.SpawnPointNotFoundServiceException; /** * The client is requesting a logout. Currently, when this packet is received @@ -75,6 +77,13 @@ public class EnterWorld extends AbstractClientPacket { conn.close(); return; } - characterService.enterWorld(id.getObject()); + // TODO send fail message + try { + characterService.enterWorld(id.getObject()); + } catch (SpawnPointNotFoundServiceException e) { + + } catch (AlreadySpawnedServiceException e) { + + } } } diff --git a/src/main/java/com/l2jserver/model/template/NPCTemplate.java b/src/main/java/com/l2jserver/model/template/NPCTemplate.java index b0937dced..49d3940db 100644 --- a/src/main/java/com/l2jserver/model/template/NPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/NPCTemplate.java @@ -28,6 +28,7 @@ import com.l2jserver.model.world.L2Character; import com.l2jserver.model.world.NPC; import com.l2jserver.model.world.capability.Actor; import com.l2jserver.service.game.CharacterService; +import com.l2jserver.service.game.CharacterService.CannotSetTargetServiceException; import com.l2jserver.service.network.NetworkService; import com.l2jserver.util.calculator.Calculator; import com.l2jserver.util.html.markup.HtmlTemplate; @@ -107,21 +108,25 @@ public abstract class NPCTemplate extends ActorTemplate { if (conn == null) return; - throw new RuntimeException("Testing..."); -// // target this npc -// charService.target(character, npc); -// -// // generate not implemented message -// final HtmlTemplate template = new HtmlTemplate(name) { -// @Override -// public void build(MarkupTag body) { -// body.text("The NPC ${name} is not yet implemented!", "ff0000") -// .p(); -// body.addLink("Click me!", "test"); -// } -// }; -// template.register("name", name); -// conn.write(new NPCHtmlMessagePacket(npc, template)); + // target this npc + try { + charService.target(character, npc); + } catch (CannotSetTargetServiceException e) { + conn.sendActionFailed(); + return; + } + + // generate not implemented message + final HtmlTemplate template = new HtmlTemplate(name) { + @Override + public void build(MarkupTag body) { + body.text("The NPC ${name} is not yet implemented!", "ff0000") + .p().p(); + body.addLink("Click me!", "test"); + } + }; + template.register("name", name); + conn.write(new NPCHtmlMessagePacket(npc, template)); } /** diff --git a/src/main/java/com/l2jserver/model/template/npc/AbstractVillageMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/AbstractVillageMasterNPCTemplate.java new file mode 100644 index 000000000..fdb52b0f3 --- /dev/null +++ b/src/main/java/com/l2jserver/model/template/npc/AbstractVillageMasterNPCTemplate.java @@ -0,0 +1,38 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.model.template.npc; + +import com.l2jserver.model.id.template.NPCTemplateID; +import com.l2jserver.model.template.NPCTemplate; + +/** + * @author Rogiel + * + */ +public abstract class AbstractVillageMasterNPCTemplate extends NPCTemplate { + /** + * Creates a new instance of this template + * + * @param id + * the template id + * @param race + * the npc race + */ + protected AbstractVillageMasterNPCTemplate(NPCTemplateID id) { + super(id); + } +} diff --git a/src/main/java/com/l2jserver/model/template/npc/AdventurerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/AdventurerNPCTemplate.java index db6f5f243..b2deb1cc4 100644 --- a/src/main/java/com/l2jserver/model/template/npc/AdventurerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/AdventurerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ArtefactNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ArtefactNPCTemplate.java index 3f4c080ae..774d3fd43 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ArtefactNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ArtefactNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/AuctioneerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/AuctioneerNPCTemplate.java index a2f624a3f..e4770b07a 100644 --- a/src/main/java/com/l2jserver/model/template/npc/AuctioneerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/AuctioneerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/BabyPetNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/BabyPetNPCTemplate.java index c848b6f41..c5b8402a0 100644 --- a/src/main/java/com/l2jserver/model/template/npc/BabyPetNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/BabyPetNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/BlockNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/BlockNPCTemplate.java index 217a33910..42afdc87c 100644 --- a/src/main/java/com/l2jserver/model/template/npc/BlockNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/BlockNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/CabaleBufferNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/CabaleBufferNPCTemplate.java index 5578e2c4e..27fff5588 100644 --- a/src/main/java/com/l2jserver/model/template/npc/CabaleBufferNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/CabaleBufferNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/CastleBlacksmithNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/CastleBlacksmithNPCTemplate.java index b1f51e34b..ccd0f17a5 100644 --- a/src/main/java/com/l2jserver/model/template/npc/CastleBlacksmithNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/CastleBlacksmithNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/CastleChamberlainNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/CastleChamberlainNPCTemplate.java index 6255364ea..d34b6d564 100644 --- a/src/main/java/com/l2jserver/model/template/npc/CastleChamberlainNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/CastleChamberlainNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/CastleDoormenNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/CastleDoormenNPCTemplate.java index 121d434ad..743b1019c 100644 --- a/src/main/java/com/l2jserver/model/template/npc/CastleDoormenNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/CastleDoormenNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/CastleMagicianNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/CastleMagicianNPCTemplate.java index 855fbb94c..4c6c27f35 100644 --- a/src/main/java/com/l2jserver/model/template/npc/CastleMagicianNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/CastleMagicianNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/CastleWyvernManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/CastleWyvernManagerNPCTemplate.java index 1a568cab4..aad435a24 100644 --- a/src/main/java/com/l2jserver/model/template/npc/CastleWyvernManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/CastleWyvernManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ChestNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ChestNPCTemplate.java index 32034f2ff..e63abd2fa 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ChestNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ChestNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ChristmasTreeNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ChristmasTreeNPCTemplate.java index 14597a777..ff09de7e6 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ChristmasTreeNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ChristmasTreeNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ClanTraderNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ClanTraderNPCTemplate.java index 6ea6f6564..dae039b89 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ClanTraderNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ClanTraderNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ClanhallDoormenNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ClanhallDoormenNPCTemplate.java index c15c7cb97..52d05c225 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ClanhallDoormenNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ClanhallDoormenNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ClanhallManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ClanhallManagerNPCTemplate.java index b75b8b15f..e3d5e24b7 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ClanhallManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ClanhallManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ClassMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ClassMasterNPCTemplate.java index db907a37a..43c9173bd 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ClassMasterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ClassMasterNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/ControlTowerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ControlTowerNPCTemplate.java index 3a98788f1..9de0ad958 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ControlTowerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ControlTowerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/DarkElfVillageMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DarkElfVillageMasterNPCTemplate.java index 22f5a6faa..718ad544a 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DarkElfVillageMasterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DarkElfVillageMasterNPCTemplate.java @@ -17,14 +17,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; -import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class DarkElfVillageMasterNPCTemplate extends NPCTemplate { +public class DarkElfVillageMasterNPCTemplate extends AbstractVillageMasterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/DawnPriestNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DawnPriestNPCTemplate.java index e2c111107..60cf9519a 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DawnPriestNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DawnPriestNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/DecoyNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DecoyNPCTemplate.java index cdc272879..a06274efa 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DecoyNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DecoyNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/DefenderNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DefenderNPCTemplate.java index f09b04f3d..0edbccd01 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DefenderNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DefenderNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/DoormenNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DoormenNPCTemplate.java index f2bff1b88..642a91229 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DoormenNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DoormenNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/DungeonGatekeeperNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DungeonGatekeeperNPCTemplate.java index 7660cb407..782c9e5a5 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DungeonGatekeeperNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DungeonGatekeeperNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/DuskPriestNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DuskPriestNPCTemplate.java index 8d18cbca2..5eb305b0a 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DuskPriestNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DuskPriestNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/DwarfVillageMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/DwarfVillageMasterNPCTemplate.java index d30695cc1..680d0431c 100644 --- a/src/main/java/com/l2jserver/model/template/npc/DwarfVillageMasterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/DwarfVillageMasterNPCTemplate.java @@ -18,13 +18,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class DwarfVillageMasterNPCTemplate extends NPCTemplate { +public class DwarfVillageMasterNPCTemplate extends AbstractVillageMasterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/EffectPointNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/EffectPointNPCTemplate.java index 5e0efc6b3..dec1bacaf 100644 --- a/src/main/java/com/l2jserver/model/template/npc/EffectPointNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/EffectPointNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/EventChestNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/EventChestNPCTemplate.java index 67b536226..384f6eb85 100644 --- a/src/main/java/com/l2jserver/model/template/npc/EventChestNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/EventChestNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FameManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FameManagerNPCTemplate.java index c40402ee7..dbe106c57 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FameManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FameManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FeedableBeastNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FeedableBeastNPCTemplate.java index 078b55e2c..16c841729 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FeedableBeastNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FeedableBeastNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FestivalGuideNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FestivalGuideNPCTemplate.java index 1e215eb4e..b9e8e6ac8 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FestivalGuideNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FestivalGuideNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FestivalMonsterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FestivalMonsterNPCTemplate.java index 4abb14198..9b332458d 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FestivalMonsterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FestivalMonsterNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FightherVillageMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FightherVillageMasterNPCTemplate.java index 929386422..92b3e1eea 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FightherVillageMasterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FightherVillageMasterNPCTemplate.java @@ -17,14 +17,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; -import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class FightherVillageMasterNPCTemplate extends NPCTemplate { +public class FightherVillageMasterNPCTemplate extends AbstractVillageMasterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/FishermanNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FishermanNPCTemplate.java index 4ed02ff5c..69afe562e 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FishermanNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FishermanNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FlameTowerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FlameTowerNPCTemplate.java index d2b633d3c..814d8ad45 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FlameTowerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FlameTowerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FlyMonsterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FlyMonsterNPCTemplate.java index 227552576..68be7199b 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FlyMonsterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FlyMonsterNPCTemplate.java @@ -17,14 +17,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; -import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class FlyMonsterNPCTemplate extends NPCTemplate { +public class FlyMonsterNPCTemplate extends MonsterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/FlyNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FlyNPCTemplate.java index e5a231a29..78dc5a6a5 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FlyNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FlyNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FlyRaidBossNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FlyRaidBossNPCTemplate.java index 4f54326bf..7b6e5eb88 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FlyRaidBossNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FlyRaidBossNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FlyTerrainObjectNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FlyTerrainObjectNPCTemplate.java index 021a1e193..f8216e099 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FlyTerrainObjectNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FlyTerrainObjectNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortBallistaNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortBallistaNPCTemplate.java index a02e87714..f101b2cb1 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortBallistaNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortBallistaNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortCommanderNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortCommanderNPCTemplate.java index 4a8f83988..53b98e23e 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortCommanderNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortCommanderNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortDoormenNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortDoormenNPCTemplate.java index fc54236ce..36946911d 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortDoormenNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortDoormenNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortEnvoyNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortEnvoyNPCTemplate.java index 6035f4ff3..24e5cbc6f 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortEnvoyNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortEnvoyNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortLogisticsNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortLogisticsNPCTemplate.java index 355070ee9..91adc7043 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortLogisticsNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortLogisticsNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortManagerNPCTemplate.java index 0969dacd9..9ef67d918 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortSiegeNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortSiegeNPCTemplate.java index e1f8f1706..cb7d6fcb3 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortSiegeNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortSiegeNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortSupportCaptainNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortSupportCaptainNPCTemplate.java index 56e4d87fa..030d7822b 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortSupportCaptainNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortSupportCaptainNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FortWyvernManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FortWyvernManagerNPCTemplate.java index 5308a59e1..446119773 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FortWyvernManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FortWyvernManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/FriendlyMonsterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/FriendlyMonsterNPCTemplate.java index 6dcbfb135..f023593a3 100644 --- a/src/main/java/com/l2jserver/model/template/npc/FriendlyMonsterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/FriendlyMonsterNPCTemplate.java @@ -17,14 +17,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; -import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class FriendlyMonsterNPCTemplate extends NPCTemplate { +public class FriendlyMonsterNPCTemplate extends MonsterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/GrandeBossNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/GrandeBossNPCTemplate.java index deda403f0..7468d7b98 100644 --- a/src/main/java/com/l2jserver/model/template/npc/GrandeBossNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/GrandeBossNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/GuardNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/GuardNPCTemplate.java index 8649cb4a2..24f9a2c6f 100644 --- a/src/main/java/com/l2jserver/model/template/npc/GuardNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/GuardNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/KamaelVillageMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/KamaelVillageMasterNPCTemplate.java index 3d0c8515f..80bcd1f1b 100644 --- a/src/main/java/com/l2jserver/model/template/npc/KamaelVillageMasterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/KamaelVillageMasterNPCTemplate.java @@ -18,13 +18,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class KamaelVillageMasterNPCTemplate extends NPCTemplate { +public class KamaelVillageMasterNPCTemplate extends AbstractVillageMasterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/ManorManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ManorManagerNPCTemplate.java index 517cb73ee..0f636a2e0 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ManorManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ManorManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/MercManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/MercManagerNPCTemplate.java index 829961fca..4b3f6dcff 100644 --- a/src/main/java/com/l2jserver/model/template/npc/MercManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/MercManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/MercenaryManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/MercenaryManagerNPCTemplate.java index 54afb8f97..1d1757431 100644 --- a/src/main/java/com/l2jserver/model/template/npc/MercenaryManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/MercenaryManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/MerchantNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/MerchantNPCTemplate.java index c89ff4115..553ec291d 100644 --- a/src/main/java/com/l2jserver/model/template/npc/MerchantNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/MerchantNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/MerchantSummonNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/MerchantSummonNPCTemplate.java index 696128ef3..23f2f2df0 100644 --- a/src/main/java/com/l2jserver/model/template/npc/MerchantSummonNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/MerchantSummonNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/MonsterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/MonsterNPCTemplate.java index 27d7029d3..0ee11feec 100644 --- a/src/main/java/com/l2jserver/model/template/npc/MonsterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/MonsterNPCTemplate.java @@ -16,11 +16,8 @@ */ package com.l2jserver.model.template.npc; -import com.l2jserver.game.net.packet.client.CharacterActionPacket.CharacterAction; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.L2Character; -import com.l2jserver.model.world.NPC; /** * @author Rogiel @@ -38,19 +35,4 @@ public class MonsterNPCTemplate extends NPCTemplate { protected MonsterNPCTemplate(NPCTemplateID id) { super(id); } - - @Override - public void action(NPC npc, L2Character character, CharacterAction action) { - super.action(npc, character, action); - } - - /** - * Called when an character is executing an attack action - * - * @param attacker - * the attacking character - */ - public void attack(L2Character attacker) { - - } } diff --git a/src/main/java/com/l2jserver/model/template/npc/ObservationNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/ObservationNPCTemplate.java index ee6ee6075..f1242a037 100644 --- a/src/main/java/com/l2jserver/model/template/npc/ObservationNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/ObservationNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/OlympiadManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/OlympiadManagerNPCTemplate.java index 4eb73badd..b859e5c08 100644 --- a/src/main/java/com/l2jserver/model/template/npc/OlympiadManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/OlympiadManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/OrcVillageMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/OrcVillageMasterNPCTemplate.java index f7694be5f..a2ae34b89 100644 --- a/src/main/java/com/l2jserver/model/template/npc/OrcVillageMasterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/OrcVillageMasterNPCTemplate.java @@ -18,13 +18,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class OrcVillageMasterNPCTemplate extends NPCTemplate { +public class OrcVillageMasterNPCTemplate extends AbstractVillageMasterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/PenaltyNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/PenaltyNPCTemplate.java index a01666ba3..5ef4c5db5 100644 --- a/src/main/java/com/l2jserver/model/template/npc/PenaltyNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/PenaltyNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/PetManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/PetManagerNPCTemplate.java index 310675a89..7fa0cb5b5 100644 --- a/src/main/java/com/l2jserver/model/template/npc/PetManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/PetManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/PriestVillageMasterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/PriestVillageMasterNPCTemplate.java index 0657ff40e..33d8c3fc9 100644 --- a/src/main/java/com/l2jserver/model/template/npc/PriestVillageMasterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/PriestVillageMasterNPCTemplate.java @@ -17,14 +17,12 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; -import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel * */ -public class PriestVillageMasterNPCTemplate extends NPCTemplate { +public class PriestVillageMasterNPCTemplate extends AbstractVillageMasterNPCTemplate { /** * Creates a new instance of this template * diff --git a/src/main/java/com/l2jserver/model/template/npc/RaidBossNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/RaidBossNPCTemplate.java index db3ccb9cf..c5cebe838 100644 --- a/src/main/java/com/l2jserver/model/template/npc/RaidBossNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/RaidBossNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/RiftInvaderNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/RiftInvaderNPCTemplate.java index 9b8812927..9c22d906f 100644 --- a/src/main/java/com/l2jserver/model/template/npc/RiftInvaderNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/RiftInvaderNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/SepulcherMonsterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/SepulcherMonsterNPCTemplate.java index b22f1ec5d..97220ae21 100644 --- a/src/main/java/com/l2jserver/model/template/npc/SepulcherMonsterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/SepulcherMonsterNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/SiegeNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/SiegeNPCTemplate.java index 090c9dd11..335c0e18f 100644 --- a/src/main/java/com/l2jserver/model/template/npc/SiegeNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/SiegeNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/SiegeSummonNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/SiegeSummonNPCTemplate.java index 63529bca3..79eaa1b47 100644 --- a/src/main/java/com/l2jserver/model/template/npc/SiegeSummonNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/SiegeSummonNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/SignsPriestsNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/SignsPriestsNPCTemplate.java index 2b0452b58..300e435fb 100644 --- a/src/main/java/com/l2jserver/model/template/npc/SignsPriestsNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/SignsPriestsNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/SymbolMakerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/SymbolMakerNPCTemplate.java index 735a8b57e..2ac193bfa 100644 --- a/src/main/java/com/l2jserver/model/template/npc/SymbolMakerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/SymbolMakerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/TamedBeastNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/TamedBeastNPCTemplate.java index 1667db07a..fd1173ccf 100644 --- a/src/main/java/com/l2jserver/model/template/npc/TamedBeastNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/TamedBeastNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/TeleporterNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/TeleporterNPCTemplate.java index 6d7b53695..7fda0a0fb 100644 --- a/src/main/java/com/l2jserver/model/template/npc/TeleporterNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/TeleporterNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/TerrainObjectNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/TerrainObjectNPCTemplate.java index 20bafbf7b..161fb3854 100644 --- a/src/main/java/com/l2jserver/model/template/npc/TerrainObjectNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/TerrainObjectNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/TerritoryWardNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/TerritoryWardNPCTemplate.java index 53a28f7f7..aef7e59dc 100644 --- a/src/main/java/com/l2jserver/model/template/npc/TerritoryWardNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/TerritoryWardNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/TownPetNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/TownPetNPCTemplate.java index d23a4e750..bc00620fe 100644 --- a/src/main/java/com/l2jserver/model/template/npc/TownPetNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/TownPetNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/TrainerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/TrainerNPCTemplate.java index 6edf5ab54..ed976e13e 100644 --- a/src/main/java/com/l2jserver/model/template/npc/TrainerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/TrainerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/TransformManagerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/TransformManagerNPCTemplate.java index 2ef93d765..e718c2639 100644 --- a/src/main/java/com/l2jserver/model/template/npc/TransformManagerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/TransformManagerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/WalkerNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/WalkerNPCTemplate.java index 72f31e912..6adc8b28e 100644 --- a/src/main/java/com/l2jserver/model/template/npc/WalkerNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/WalkerNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/template/npc/WarehouseNPCTemplate.java b/src/main/java/com/l2jserver/model/template/npc/WarehouseNPCTemplate.java index e4aa820fc..fb32f05b3 100644 --- a/src/main/java/com/l2jserver/model/template/npc/WarehouseNPCTemplate.java +++ b/src/main/java/com/l2jserver/model/template/npc/WarehouseNPCTemplate.java @@ -18,7 +18,6 @@ package com.l2jserver.model.template.npc; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; -import com.l2jserver.model.world.NPC; /** * @author Rogiel diff --git a/src/main/java/com/l2jserver/model/world/NPC.java b/src/main/java/com/l2jserver/model/world/NPC.java index 1350bce62..84df8a3c2 100644 --- a/src/main/java/com/l2jserver/model/world/NPC.java +++ b/src/main/java/com/l2jserver/model/world/NPC.java @@ -17,15 +17,20 @@ package com.l2jserver.model.world; import com.l2jserver.game.net.packet.client.CharacterActionPacket.CharacterAction; +import com.l2jserver.model.id.TemplateID; import com.l2jserver.model.id.object.NPCID; import com.l2jserver.model.id.template.NPCTemplateID; import com.l2jserver.model.template.NPCTemplate; import com.l2jserver.model.world.capability.Actor; +import com.l2jserver.service.game.ai.AIScript; import com.l2jserver.util.calculator.Calculator; /** - * @author Rogiel + * NPC stand for "Not Playable Character" and is an character that not player + * has control over it. In most cases they are controlled by an {@link AIScript} + * . * + * @author Rogiel */ public class NPC extends AbstractActor { /** @@ -33,6 +38,12 @@ public class NPC extends AbstractActor { */ private final NPCTemplateID templateID; + /** + * Creates a new instance + * + * @param templateID + * the {@link NPC} {@link TemplateID} + */ public NPC(NPCTemplateID templateID) { this.templateID = templateID; } diff --git a/src/main/java/com/l2jserver/service/ServiceManager.java b/src/main/java/com/l2jserver/service/ServiceManager.java index afa1344ee..2cb7a6597 100644 --- a/src/main/java/com/l2jserver/service/ServiceManager.java +++ b/src/main/java/com/l2jserver/service/ServiceManager.java @@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.Injector; -import com.l2jserver.service.logging.LoggingService; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.util.ClassUtils; import com.l2jserver.util.factory.CollectionFactory; diff --git a/src/main/java/com/l2jserver/service/ServiceModule.java b/src/main/java/com/l2jserver/service/ServiceModule.java index 541fc027f..5931c2ab1 100644 --- a/src/main/java/com/l2jserver/service/ServiceModule.java +++ b/src/main/java/com/l2jserver/service/ServiceModule.java @@ -23,6 +23,8 @@ import com.l2jserver.service.cache.CacheService; import com.l2jserver.service.cache.EhCacheService; import com.l2jserver.service.configuration.ConfigurationService; import com.l2jserver.service.configuration.ProxyConfigurationService; +import com.l2jserver.service.core.Log4JLoggingService; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.service.database.DatabaseService; import com.l2jserver.service.database.MySQLDatabaseService; import com.l2jserver.service.game.CharacterService; @@ -43,8 +45,6 @@ import com.l2jserver.service.game.world.WorldService; import com.l2jserver.service.game.world.WorldServiceImpl; import com.l2jserver.service.game.world.event.WorldEventDispatcher; import com.l2jserver.service.game.world.event.WorldEventDispatcherImpl; -import com.l2jserver.service.logging.Log4JLoggingService; -import com.l2jserver.service.logging.LoggingService; import com.l2jserver.service.network.NettyNetworkService; import com.l2jserver.service.network.NetworkService; import com.l2jserver.service.network.keygen.BlowfishKeygenService; diff --git a/src/main/java/com/l2jserver/service/cache/EhCacheService.java b/src/main/java/com/l2jserver/service/cache/EhCacheService.java index d28e77044..8f871a5cb 100644 --- a/src/main/java/com/l2jserver/service/cache/EhCacheService.java +++ b/src/main/java/com/l2jserver/service/cache/EhCacheService.java @@ -29,6 +29,7 @@ import net.sf.ehcache.config.Configuration; import net.sf.ehcache.config.DiskStoreConfiguration; import net.sf.ehcache.store.MemoryStoreEvictionPolicy; +import com.google.common.base.Preconditions; import com.l2jserver.service.AbstractService; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; @@ -58,6 +59,9 @@ public class EhCacheService extends AbstractService implements CacheService { @Override public T decorate(final Class interfaceType, final T instance) { + Preconditions.checkNotNull(interfaceType, "interfaceType"); + Preconditions.checkNotNull(instance, "instance"); + if (!interfaceType.isInterface()) return null; @SuppressWarnings("unchecked") @@ -85,6 +89,9 @@ public class EhCacheService extends AbstractService implements CacheService { @Override public Cache createCache(String name, int size) { + Preconditions.checkNotNull(name, "name"); + Preconditions.checkArgument(size > 0, "size <= 0"); + Cache cache = new Cache(new CacheConfiguration(name, size) .memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU) .overflowToDisk(true).eternal(false).timeToLiveSeconds(60) @@ -96,16 +103,19 @@ public class EhCacheService extends AbstractService implements CacheService { @Override public Cache createCache(String name) { + Preconditions.checkNotNull(name, "name"); return createCache(name, 200); } @Override public void register(Cache cache) { + Preconditions.checkNotNull(cache, "cache"); manager.addCache(cache); } @Override public void unregister(Cache cache) { + Preconditions.checkNotNull(cache, "cache"); manager.removeCache(cache.getName()); } diff --git a/src/main/java/com/l2jserver/service/configuration/ProxyConfigurationService.java b/src/main/java/com/l2jserver/service/configuration/ProxyConfigurationService.java index de0e1865c..f7339a3ee 100644 --- a/src/main/java/com/l2jserver/service/configuration/ProxyConfigurationService.java +++ b/src/main/java/com/l2jserver/service/configuration/ProxyConfigurationService.java @@ -26,11 +26,11 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Map; import java.util.Properties; -import java.util.WeakHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.l2jserver.service.AbstractService; import com.l2jserver.service.AbstractService.Depends; import com.l2jserver.service.ServiceStartException; @@ -38,7 +38,7 @@ import com.l2jserver.service.cache.CacheService; import com.l2jserver.service.configuration.Configuration.ConfigurationName; import com.l2jserver.service.configuration.Configuration.ConfigurationPropertyGetter; import com.l2jserver.service.configuration.Configuration.ConfigurationPropertySetter; -import com.l2jserver.service.logging.LoggingService; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.util.factory.CollectionFactory; import com.l2jserver.util.transformer.Transformer; import com.l2jserver.util.transformer.TransformerFactory; @@ -77,6 +77,8 @@ public class ProxyConfigurationService extends AbstractService implements @Override @SuppressWarnings("unchecked") public C get(Class config) { + Preconditions.checkNotNull(config, "config"); + if (cache.containsKey(config)) return (C) cache.get(config); logger.info("Trying to create {} proxy", config); @@ -242,6 +244,8 @@ public class ProxyConfigurationService extends AbstractService implements * if any i/o error occur */ private Properties findProperties(Class clazz) throws IOException { + Preconditions.checkNotNull(clazz, "clazz"); + ConfigurationName config = findAnnotation(ConfigurationName.class, clazz); if (config == null) @@ -270,6 +274,9 @@ public class ProxyConfigurationService extends AbstractService implements */ private T findAnnotation(Class annotationClass, Class clazz) { + Preconditions.checkNotNull(annotationClass, "annotationClass"); + Preconditions.checkNotNull(clazz, "clazz"); + T ann = clazz.getAnnotation(annotationClass); if (ann != null) return ann; @@ -298,6 +305,7 @@ public class ProxyConfigurationService extends AbstractService implements * the directory */ public void setDirectory(File directory) { + Preconditions.checkNotNull(directory, "directory"); this.directory = directory; } } diff --git a/src/main/java/com/l2jserver/service/core/ExceptionService.java b/src/main/java/com/l2jserver/service/core/ExceptionService.java new file mode 100644 index 000000000..19784dbe2 --- /dev/null +++ b/src/main/java/com/l2jserver/service/core/ExceptionService.java @@ -0,0 +1,46 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.service.core; + +import com.l2jserver.service.Service; + +/** + * Service used to manage unhandled exceptions + * + * @author Rogiel + */ +public interface ExceptionService extends Service { + /** + * Handles an unhandled exception + * + * @param t + * the exception + */ + void thrown(Throwable t); + + /** + * Handles an unhandled exception and rethrows it again + * + * @param + * the exception type + * @param t + * the exception + * @throws T + * same exception in t + */ + void rethrown(T t) throws T; +} diff --git a/src/main/java/com/l2jserver/service/logging/Log4JLoggingService.java b/src/main/java/com/l2jserver/service/core/Log4JLoggingService.java similarity index 85% rename from src/main/java/com/l2jserver/service/logging/Log4JLoggingService.java rename to src/main/java/com/l2jserver/service/core/Log4JLoggingService.java index 8cb1d99d2..4398a7c30 100644 --- a/src/main/java/com/l2jserver/service/logging/Log4JLoggingService.java +++ b/src/main/java/com/l2jserver/service/core/Log4JLoggingService.java @@ -14,12 +14,13 @@ * You should have received a copy of the GNU General Public License * along with l2jserver. If not, see . */ -package com.l2jserver.service.logging; +package com.l2jserver.service.core; import org.apache.log4j.BasicConfigurator; import com.l2jserver.service.AbstractService; import com.l2jserver.service.ServiceStartException; +import com.l2jserver.service.ServiceStopException; /** * Logging service implementation for Log4J @@ -32,4 +33,9 @@ public class Log4JLoggingService extends AbstractService implements protected void doStart() throws ServiceStartException { BasicConfigurator.configure(); } + + @Override + protected void doStop() throws ServiceStopException { + BasicConfigurator.resetConfiguration(); + } } diff --git a/src/main/java/com/l2jserver/service/logging/LoggingService.java b/src/main/java/com/l2jserver/service/core/LoggingService.java similarity index 96% rename from src/main/java/com/l2jserver/service/logging/LoggingService.java rename to src/main/java/com/l2jserver/service/core/LoggingService.java index 64273005b..ab5e111b3 100644 --- a/src/main/java/com/l2jserver/service/logging/LoggingService.java +++ b/src/main/java/com/l2jserver/service/core/LoggingService.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with l2jserver. If not, see . */ -package com.l2jserver.service.logging; +package com.l2jserver.service.core; import org.slf4j.Logger; diff --git a/src/main/java/com/l2jserver/service/core/threading/AsyncFuture.java b/src/main/java/com/l2jserver/service/core/threading/AsyncFuture.java new file mode 100644 index 000000000..81e7a835d --- /dev/null +++ b/src/main/java/com/l2jserver/service/core/threading/AsyncFuture.java @@ -0,0 +1,73 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.service.core.threading; + +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +/** + * This future instance extends {@link Future} but also adds some additional + * features, such as waiting for an given task to finish. + * + * @author Rogiel + */ +public interface AsyncFuture extends Future { + /** + * Waits until the task is executed + * + * @throws InterruptedException + * if the thread has been interrupted while waiting + */ + void await() throws InterruptedException; + + /** + * Waits until the task is executed + * + * @param timeout + * the timeout + * @param unit + * the timeout unit + * + * @throws InterruptedException + * if the thread has been interrupted while waiting + * @throws TimeoutException + * if timeout was exceeded + */ + void await(long timeout, TimeUnit unit) throws InterruptedException, + TimeoutException; + + /** + * Waits until the task is executed + * + * @return true if execution ended with no error, false otherwise + */ + boolean awaitUninterruptibly(); + + /** + * Waits until the task is executed + * + * @param timeout + * the timeout + * @param unit + * the timeout unit + * + * @return true if execution ended with no error, false otherwise. Please + * note that false will be returned if the timeout has expired too! + */ + boolean awaitUninterruptibly(long timeout, TimeUnit unit); +} diff --git a/src/main/java/com/l2jserver/service/core/threading/ThreadService.java b/src/main/java/com/l2jserver/service/core/threading/ThreadService.java new file mode 100644 index 000000000..69a922182 --- /dev/null +++ b/src/main/java/com/l2jserver/service/core/threading/ThreadService.java @@ -0,0 +1,58 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.service.core.threading; + +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +import com.l2jserver.service.Service; + +/** + * This service is responsible for scheduling tasks and executing them in + * parallel. + * + * @author Rogiel + */ +public interface ThreadService extends Service { + /** + * Executes an asynchronous tasks. + * + * @param + * the task return type + * @param callable + * the callable instance + * @return the {@link AsyncFuture} notified once the task has completed + */ + AsyncFuture async(Callable callable); + + /** + * Executes an asynchronous tasks at an scheduled time. Please note that + * resources in scheduled thread pool are limited and tasks should be + * performed fast. + * + * @param + * the task return type + * @param callable + * the callable instance + * @param delay + * the initial delay to wait before the task is executed + * @param unit + * the time unit of delay + * @return the {@link AsyncFuture} notified once the task has completed + */ + AsyncFuture async(long delay, TimeUnit unit, Callable callable); +} diff --git a/src/main/java/com/l2jserver/service/core/threading/ThreadServiceImpl.java b/src/main/java/com/l2jserver/service/core/threading/ThreadServiceImpl.java new file mode 100644 index 000000000..4bb3c36bf --- /dev/null +++ b/src/main/java/com/l2jserver/service/core/threading/ThreadServiceImpl.java @@ -0,0 +1,187 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.service.core.threading; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Preconditions; +import com.l2jserver.service.AbstractService; +import com.l2jserver.service.ServiceStartException; +import com.l2jserver.service.ServiceStopException; + +/** + * The default implementation for {@link ThreadService} + * + * @author Rogiel + */ +public class ThreadServiceImpl extends AbstractService implements ThreadService { + /** + * The logger + */ + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + /** + * The scheduler Thread pool + */ + private ScheduledExecutorService scheduler; + /** + * The asynchronous Thread pool + */ + private ExecutorService async; + + @Override + protected void doStart() throws ServiceStartException { + scheduler = Executors.newScheduledThreadPool(10); + async = Executors.newCachedThreadPool(); + } + + @Override + public AsyncFuture async(Callable callable) { + Preconditions.checkNotNull(callable, "callable"); + return new AsyncFutureImpl(async.submit(callable)); + } + + @Override + public AsyncFuture async(long delay, TimeUnit unit, + Callable callable) { + Preconditions.checkArgument(delay >= 0, "delay < 0"); + Preconditions.checkNotNull(unit, "unit"); + Preconditions.checkNotNull(callable, "callable"); + return new AsyncFutureImpl(scheduler.schedule(callable, delay, unit)); + } + + @Override + protected void doStop() throws ServiceStopException { + scheduler.shutdown(); + async.shutdown(); + try { + scheduler.awaitTermination(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { + log.warn("Scheduler thread did not stop in 60 seconds", e); + } + try { + async.awaitTermination(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { + log.warn("Asynchronous thread did not stop in 60 seconds", e); + } + scheduler = null; + async = null; + } + + /** + * Simple delegated implementation for {@link AsyncFuture} + * + * @author Rogiel + * @param + * the return type + */ + public static class AsyncFutureImpl implements AsyncFuture { + /** + * The future that is delegated in this implementation + */ + private final Future future; + + /** + * Creates a new instance + * + * @param future + * the future + */ + private AsyncFutureImpl(Future future) { + this.future = future; + } + + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return future.cancel(mayInterruptIfRunning); + } + + @Override + public boolean isCancelled() { + return future.isCancelled(); + } + + @Override + public boolean isDone() { + return future.isDone(); + } + + @Override + public T get() throws InterruptedException, ExecutionException { + return future.get(); + } + + @Override + public T get(long timeout, TimeUnit unit) throws InterruptedException, + ExecutionException, TimeoutException { + return future.get(timeout, unit); + } + + @Override + public void await() throws InterruptedException { + try { + this.get(); + } catch (ExecutionException e) { + } + } + + @Override + public void await(long timeout, TimeUnit unit) + throws InterruptedException, TimeoutException { + try { + this.get(timeout, unit); + } catch (ExecutionException e) { + } + } + + @Override + public boolean awaitUninterruptibly() { + try { + this.get(); + return true; + } catch (InterruptedException e) { + return false; + } catch (ExecutionException e) { + return false; + } + } + + @Override + public boolean awaitUninterruptibly(long timeout, TimeUnit unit) { + try { + this.get(timeout, unit); + return true; + } catch (InterruptedException e) { + return false; + } catch (ExecutionException e) { + return false; + } catch (TimeoutException e) { + return false; + } + } + } +} diff --git a/src/main/java/com/l2jserver/service/database/MySQLDatabaseService.java b/src/main/java/com/l2jserver/service/database/MySQLDatabaseService.java index c07322632..920c0ed51 100644 --- a/src/main/java/com/l2jserver/service/database/MySQLDatabaseService.java +++ b/src/main/java/com/l2jserver/service/database/MySQLDatabaseService.java @@ -39,6 +39,7 @@ import org.apache.commons.pool.impl.GenericObjectPool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.l2jserver.model.id.ObjectID; import com.l2jserver.model.id.object.allocator.IDAllocator; @@ -49,8 +50,8 @@ import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; import com.l2jserver.service.cache.CacheService; import com.l2jserver.service.configuration.ConfigurationService; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.service.game.template.TemplateService; -import com.l2jserver.service.logging.LoggingService; import com.l2jserver.util.ArrayIterator; import com.l2jserver.util.factory.CollectionFactory; @@ -137,6 +138,7 @@ public class MySQLDatabaseService extends AbstractService implements * @return an instance of T */ public T query(Query query) { + Preconditions.checkNotNull(query, "query"); try { final Connection conn = dataSource.getConnection(); try { @@ -155,6 +157,7 @@ public class MySQLDatabaseService extends AbstractService implements @Override public Object getCachedObject(Object id) { + Preconditions.checkNotNull(id, "id"); final Element element = objectCache.get(id); if (element == null) return null; @@ -163,16 +166,20 @@ public class MySQLDatabaseService extends AbstractService implements @Override public boolean hasCachedObject(Object id) { + Preconditions.checkNotNull(id, "id"); return objectCache.get(id) != null; } @Override public void updateCache(Object key, Object value) { + Preconditions.checkNotNull(key, "key"); + Preconditions.checkNotNull(value, "value"); objectCache.put(new Element(key, value)); } @Override public void removeCache(Object key) { + Preconditions.checkNotNull(key, "key"); objectCache.remove(key); } @@ -254,6 +261,7 @@ public class MySQLDatabaseService extends AbstractService implements @Override public Integer query(Connection conn) throws SQLException { + Preconditions.checkNotNull(conn, "conn"); int rows = 0; while (iterator.hasNext()) { final T object = iterator.next(); @@ -314,6 +322,7 @@ public class MySQLDatabaseService extends AbstractService implements public static abstract class SelectListQuery implements Query> { @Override public List query(Connection conn) throws SQLException { + Preconditions.checkNotNull(conn, "conn"); final PreparedStatement st = conn.prepareStatement(query()); parametize(st); st.execute(); @@ -368,6 +377,7 @@ public class MySQLDatabaseService extends AbstractService implements public static abstract class SelectSingleQuery implements Query { @Override public T query(Connection conn) throws SQLException { + Preconditions.checkNotNull(conn, "conn"); final PreparedStatement st = conn.prepareStatement(query()); parametize(st); st.execute(); @@ -465,6 +475,7 @@ public class MySQLDatabaseService extends AbstractService implements @SuppressWarnings("unchecked") public final T map(ResultSet rs) throws SQLException { final I id = createID(rs); + Preconditions.checkNotNull(id, "id"); if (database.hasCachedObject(id)) return (T) database.getCachedObject(id); diff --git a/src/main/java/com/l2jserver/service/game/CharacterService.java b/src/main/java/com/l2jserver/service/game/CharacterService.java index 23c2e49fd..b1b409b0f 100644 --- a/src/main/java/com/l2jserver/service/game/CharacterService.java +++ b/src/main/java/com/l2jserver/service/game/CharacterService.java @@ -19,8 +19,12 @@ package com.l2jserver.service.game; import com.l2jserver.model.world.L2Character; import com.l2jserver.model.world.capability.Actor; import com.l2jserver.service.Service; +import com.l2jserver.service.game.SpawnService.AlreadySpawnedServiceException; +import com.l2jserver.service.game.SpawnService.NotSpawnedServiceException; +import com.l2jserver.service.game.SpawnService.SpawnPointNotFoundServiceException; import com.l2jserver.util.dimensional.Coordinate; import com.l2jserver.util.dimensional.Point; +import com.l2jserver.util.exception.L2ChatServiceException; /** * This service manages {@link L2Character} instances @@ -33,16 +37,24 @@ public interface CharacterService extends Service { * * @param character * the character + * @throws SpawnPointNotFoundServiceException + * if the character does not have an spawn point defined + * @throws AlreadySpawnedServiceException + * if the character is already spawned in the world */ - void enterWorld(L2Character character); + void enterWorld(L2Character character) + throws SpawnPointNotFoundServiceException, + AlreadySpawnedServiceException; /** * Perform all operations required to this character leave the world * * @param character * the character + * @throws NotSpawnedServiceException + * if the object is not spawned in the world */ - void leaveWorld(L2Character character); + void leaveWorld(L2Character character) throws NotSpawnedServiceException; /** * Set the target of this character @@ -51,8 +63,11 @@ public interface CharacterService extends Service { * the character * @param actor * the targeted actor + * @throws CannotSetTargetServiceException + * if target cannot be set */ - void target(L2Character character, Actor actor); + void target(L2Character character, Actor actor) + throws CannotSetTargetServiceException; /** * Attacks with the given character the target @@ -61,8 +76,36 @@ public interface CharacterService extends Service { * the character * @param target * the target + * @throws CannotSetTargetServiceException + * if target cannot be set */ - void attack(L2Character character, Actor target); + void attack(L2Character character, Actor target) + throws CannotSetTargetServiceException; + + /** + * Jails the given character for time seconds. + * + * @param character + * the character + * @param time + * the jail time, in seconds + * @param reason + * the jail reason + * @throws CharacterInJailServiceException + * if the character is already in jail + */ + void jail(L2Character character, long time, String reason) + throws CharacterInJailServiceException; + + /** + * Unjails the given character + * + * @param character + * the character to be unjailed + * @throws CharacterNotInJailServiceException + * if character is not in jail + */ + void unjail(L2Character character) throws CharacterNotInJailServiceException; /** * Moves the given character to coordinate @@ -109,4 +152,32 @@ public interface CharacterService extends Service { * the character */ void run(L2Character character); + + /** + * Exception thrown when the target cannot be set + * + * @author Rogiel + */ + public class CannotSetTargetServiceException extends L2ChatServiceException { + private static final long serialVersionUID = 1L; + } + + /** + * Exception thrown when the character is in jail + * + * @author Rogiel + */ + public class CharacterInJailServiceException extends L2ChatServiceException { + private static final long serialVersionUID = 1L; + } + + /** + * Exception thrown when the character is not in jail + * + * @author Rogiel + */ + public class CharacterNotInJailServiceException extends + L2ChatServiceException { + private static final long serialVersionUID = 1L; + } } diff --git a/src/main/java/com/l2jserver/service/game/CharacterServiceImpl.java b/src/main/java/com/l2jserver/service/game/CharacterServiceImpl.java index 5dbe42524..f1c77f849 100644 --- a/src/main/java/com/l2jserver/service/game/CharacterServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/CharacterServiceImpl.java @@ -16,6 +16,7 @@ */ package com.l2jserver.service.game; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.l2jserver.db.dao.ItemDAO; import com.l2jserver.game.net.Lineage2Connection; @@ -47,6 +48,9 @@ import com.l2jserver.model.world.character.event.CharacterTargetSelectedEvent; import com.l2jserver.model.world.npc.event.NPCSpawnEvent; import com.l2jserver.service.AbstractService; import com.l2jserver.service.AbstractService.Depends; +import com.l2jserver.service.game.SpawnService.AlreadySpawnedServiceException; +import com.l2jserver.service.game.SpawnService.NotSpawnedServiceException; +import com.l2jserver.service.game.SpawnService.SpawnPointNotFoundServiceException; import com.l2jserver.service.game.chat.ChatMessageDestination; import com.l2jserver.service.game.chat.ChatService; import com.l2jserver.service.game.chat.channel.ChatChannel; @@ -114,15 +118,14 @@ public class CharacterServiceImpl extends AbstractService implements } @Override - public void enterWorld(final L2Character character) { + public void enterWorld(final L2Character character) + throws SpawnPointNotFoundServiceException, + AlreadySpawnedServiceException { + Preconditions.checkNotNull(character, "character"); final CharacterID id = character.getID(); final Lineage2Connection conn = networkService.discover(id); if (conn == null) return; - if (!worldService.add(character)) - // TODO this should throw an exception - // character is already in the world! - return; itemDao.loadInventory(character); @@ -224,34 +227,23 @@ public class CharacterServiceImpl extends AbstractService implements eventDispatcher.dispatch(new CharacterEnterWorldEvent(character)); // spawn the player -- this will also dispatch a spawn event + // here the object is registered in the world spawnService.spawn(character, null); } @Override - public void move(L2Character character, Coordinate coordinate) { - final CharacterID id = character.getID(); - final Lineage2Connection conn = networkService.discover(id); - // we don't set the character coordinate here, this will be done by - // validation packets, sent by client - - // for now, let's just write the packet, we don't have much validation - // to be done yet. With character validation packet, another packet of - // these will be broadcasted. - conn.write(new ActorMovementPacket(character, coordinate)); - // we don't dispatch events here, they will be dispatched by - // with the same packet referred up here. - } - - @Override - public void leaveWorld(L2Character character) { - if (!worldService.remove(character)) - return; + public void leaveWorld(L2Character character) + throws NotSpawnedServiceException { + Preconditions.checkNotNull(character, "character"); spawnService.unspawn(character); eventDispatcher.dispatch(new CharacterLeaveWorldEvent(character)); } @Override - public void target(L2Character character, Actor target) { + public void target(L2Character character, Actor target) + throws CannotSetTargetServiceException { + Preconditions.checkNotNull(character, "character"); + Preconditions.checkNotNull(target, "target"); final CharacterID id = character.getID(); final Lineage2Connection conn = networkService.discover(id); @@ -277,17 +269,19 @@ public class CharacterServiceImpl extends AbstractService implements character, target)); conn.write(new CharacterTargetSelectedPacket(target)); } else { - // this indicates an inconsistency, send an action failed and reset - // target, i.e. deselect with no target - // TODO instead of sending action failed, we should throw an - // exception here - conn.sendActionFailed(); + // this indicates an inconsistency: reset target and throws an + // exception + // this happens if tried deselect with no target character.setTargetID(null); + throw new CannotSetTargetServiceException(); } } @Override - public void attack(L2Character character, Actor target) { + public void attack(L2Character character, Actor target) + throws CannotSetTargetServiceException { + Preconditions.checkNotNull(character, "character"); + Preconditions.checkNotNull(target, "target"); final CharacterID id = character.getID(); final Lineage2Connection conn = networkService.discover(id); // check if this Actor can be attacked @@ -305,19 +299,59 @@ public class CharacterServiceImpl extends AbstractService implements } } + @Override + public void jail(L2Character character, long time, String reason) + throws CharacterInJailServiceException { + Preconditions.checkNotNull(character, "character"); + Preconditions.checkArgument(time > 0, "time <= 0"); + Preconditions.checkNotNull(reason, "reason"); + // TODO implement jailing + throw new CharacterInJailServiceException(); + } + + @Override + public void unjail(L2Character character) + throws CharacterNotInJailServiceException { + Preconditions.checkNotNull(character, "character"); + // TODO implement jailing + throw new CharacterNotInJailServiceException(); + } + + @Override + public void move(L2Character character, Coordinate coordinate) { + Preconditions.checkNotNull(character, "character"); + Preconditions.checkNotNull(coordinate, "coordinate"); + final CharacterID id = character.getID(); + final Lineage2Connection conn = networkService.discover(id); + // we don't set the character coordinate here, this will be done by + // validation packets, sent by client + + // for now, let's just write the packet, we don't have much validation + // to be done yet. With character validation packet, another packet of + // these will be broadcasted. + conn.write(new ActorMovementPacket(character, coordinate)); + // we don't dispatch events here, they will be dispatched by + // with the same packet referred up here. + } + @Override public void validate(L2Character character, Point point) { + Preconditions.checkNotNull(character, "character"); + Preconditions.checkNotNull(point, "point"); // TODO implement position validation } @Override public void receivedValidation(L2Character character, Point point) { + Preconditions.checkNotNull(character, "character"); + Preconditions.checkNotNull(point, "point"); character.setPoint(point); eventDispatcher.dispatch(new CharacterMoveEvent(character, point)); } @Override public void walk(L2Character character) { + Preconditions.checkNotNull(character, "character"); final CharacterID id = character.getID(); final Lineage2Connection conn = networkService.discover(id); // test if character is running @@ -332,6 +366,7 @@ public class CharacterServiceImpl extends AbstractService implements @Override public void run(L2Character character) { + Preconditions.checkNotNull(character, "character"); final CharacterID id = character.getID(); final Lineage2Connection conn = networkService.discover(id); // test if character is walking diff --git a/src/main/java/com/l2jserver/service/game/GameTimeService.java b/src/main/java/com/l2jserver/service/game/GameTimeService.java index e58cb8309..5b1770b33 100644 --- a/src/main/java/com/l2jserver/service/game/GameTimeService.java +++ b/src/main/java/com/l2jserver/service/game/GameTimeService.java @@ -24,6 +24,11 @@ import com.l2jserver.service.Service; * @author Rogiel */ public interface GameTimeService extends Service { + /** + * The real time length of a day in-game in milliseconds. + */ + public static final int GAME_DAY = 120 * 60 * 1000; + /** * Returns the in-game time * diff --git a/src/main/java/com/l2jserver/service/game/GameTimeServiceImpl.java b/src/main/java/com/l2jserver/service/game/GameTimeServiceImpl.java index 54e510778..5922b5471 100644 --- a/src/main/java/com/l2jserver/service/game/GameTimeServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/GameTimeServiceImpl.java @@ -27,7 +27,6 @@ public class GameTimeServiceImpl extends AbstractService implements GameTimeService { @Override public int getGameTime() { - // TODO implement this! - return (int) (System.currentTimeMillis() / 1000); + return (int) (System.currentTimeMillis() % GAME_DAY) / 1000; } } diff --git a/src/main/java/com/l2jserver/service/threading/ThreadService.java b/src/main/java/com/l2jserver/service/game/MonsterService.java similarity index 65% rename from src/main/java/com/l2jserver/service/threading/ThreadService.java rename to src/main/java/com/l2jserver/service/game/MonsterService.java index e01013c41..23b23ba02 100644 --- a/src/main/java/com/l2jserver/service/threading/ThreadService.java +++ b/src/main/java/com/l2jserver/service/game/MonsterService.java @@ -14,16 +14,25 @@ * You should have received a copy of the GNU General Public License * along with l2jserver. If not, see . */ -package com.l2jserver.service.threading; +package com.l2jserver.service.game; +import com.l2jserver.model.world.L2Character; +import com.l2jserver.model.world.NPC; import com.l2jserver.service.Service; /** - * This service is responsible for scheduling tasks and executing them in - * parallel. + * This service controls {@link NPC}s * * @author Rogiel */ -public interface ThreadService extends Service { - +public interface MonsterService extends Service { + /** + * Interacts the given player with the given npc + * + * @param npc + * the npc + * @param character + * the character + */ + void interact(NPC npc, L2Character character); } diff --git a/src/main/java/com/l2jserver/service/game/SpawnService.java b/src/main/java/com/l2jserver/service/game/SpawnService.java index e80a938c4..c832e7fb0 100644 --- a/src/main/java/com/l2jserver/service/game/SpawnService.java +++ b/src/main/java/com/l2jserver/service/game/SpawnService.java @@ -23,6 +23,7 @@ import com.l2jserver.model.world.player.event.PlayerTeleportEvent; import com.l2jserver.service.Service; import com.l2jserver.util.dimensional.Coordinate; import com.l2jserver.util.dimensional.Point; +import com.l2jserver.util.exception.L2SpawnServiceException; /** * This service is responsible for spawning monsters, npcs and players. @@ -41,8 +42,15 @@ public interface SpawnService extends Service { * @param point * the spawning point. If null, will try to use * {@link Spawnable#getPoint()}. + * @throws SpawnPointNotFoundServiceException + * if could not find an spawn point (i.e point and + * {@link Spawnable#getPoint()} are null) + * @throws AlreadySpawnedServiceException + * if the object is already spawned in the world */ - void spawn(Spawnable spawnable, Point point); + void spawn(Spawnable spawnable, Point point) + throws SpawnPointNotFoundServiceException, + AlreadySpawnedServiceException; /** * Teleports the object to the given point. @@ -54,11 +62,16 @@ public interface SpawnService extends Service { * the player object * @param coordinate * the teleportation coordinate + * @throws NotSpawnedServiceException + * if the object to be teleported is not spawned */ - void teleport(Player player, Coordinate coordinate); + void teleport(Player player, Coordinate coordinate) + throws NotSpawnedServiceException; /** * Schedules an {@link Spawnable} object to be respawn in a certain time. + *

+ * TODO this is not complete * * @param spawnable * the spawnable object @@ -70,6 +83,37 @@ public interface SpawnService extends Service { * * @param spawnable * the spawnable object + * @throws NotSpawnedServiceException + * if the object is not spawned */ - void unspawn(Spawnable spawnable); + void unspawn(Spawnable spawnable) throws NotSpawnedServiceException; + + /** + * Exception thrown when the object is already spawned and registered in the + * world + * + * @author Rogiel + */ + public class AlreadySpawnedServiceException extends L2SpawnServiceException { + private static final long serialVersionUID = 1L; + } + + /** + * Exception thrown when the target spawn point is not found + * + * @author Rogiel + */ + public class SpawnPointNotFoundServiceException extends + L2SpawnServiceException { + private static final long serialVersionUID = 1L; + } + + /** + * Exception thrown when trying to unspawn an object that is not spawned + * + * @author Rogiel + */ + public class NotSpawnedServiceException extends L2SpawnServiceException { + private static final long serialVersionUID = 1L; + } } diff --git a/src/main/java/com/l2jserver/service/game/SpawnServiceImpl.java b/src/main/java/com/l2jserver/service/game/SpawnServiceImpl.java index 87a2da15a..2db927c44 100644 --- a/src/main/java/com/l2jserver/service/game/SpawnServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/SpawnServiceImpl.java @@ -19,6 +19,7 @@ package com.l2jserver.service.game; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.packet.server.CharacterTeleportPacket; @@ -72,16 +73,16 @@ public class SpawnServiceImpl extends AbstractService implements SpawnService { } @Override - public void spawn(Spawnable spawnable, Point point) { + public void spawn(Spawnable spawnable, Point point) + throws SpawnPointNotFoundServiceException { + Preconditions.checkNotNull(spawnable, "spawnable"); // sanitize if (point == null) // retrieving stored point point = spawnable.getPoint(); if (point == null) { // not point send and no point stored, aborting - // TODO this should throw an exception - log.warn("Trying to spawn {} to a null point", spawnable); - return; + throw new SpawnPointNotFoundServiceException(); } // set the spawning point @@ -110,6 +111,8 @@ public class SpawnServiceImpl extends AbstractService implements SpawnService { @Override public void teleport(Player player, Coordinate coordinate) { + Preconditions.checkNotNull(player, "player"); + Preconditions.checkNotNull(coordinate, "coordinate"); player.setPosition(coordinate); if (player instanceof L2Character) { final Lineage2Connection conn = networkService @@ -127,12 +130,14 @@ public class SpawnServiceImpl extends AbstractService implements SpawnService { @Override public void scheduleRespawn(Spawnable spawnable) { + Preconditions.checkNotNull(spawnable, "spawnable"); // TODO Auto-generated method stub } @Override public void unspawn(Spawnable spawnable) { + Preconditions.checkNotNull(spawnable, "spawnable"); // TODO Auto-generated method stub } diff --git a/src/main/java/com/l2jserver/service/game/ai/AIServiceImpl.java b/src/main/java/com/l2jserver/service/game/ai/AIServiceImpl.java index f48ff322c..56339700d 100644 --- a/src/main/java/com/l2jserver/service/game/ai/AIServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/ai/AIServiceImpl.java @@ -22,11 +22,11 @@ import com.l2jserver.service.AbstractService; import com.l2jserver.service.AbstractService.Depends; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; +import com.l2jserver.service.core.threading.ThreadService; import com.l2jserver.service.game.template.TemplateService; import com.l2jserver.service.game.world.WorldService; import com.l2jserver.service.game.world.event.WorldEventDispatcher; import com.l2jserver.service.network.NetworkService; -import com.l2jserver.service.threading.ThreadService; import com.l2jserver.util.dimensional.Coordinate; /** diff --git a/src/main/java/com/l2jserver/service/game/chat/ChatMessageDestination.java b/src/main/java/com/l2jserver/service/game/chat/ChatMessageDestination.java index 470eac05b..24a093637 100644 --- a/src/main/java/com/l2jserver/service/game/chat/ChatMessageDestination.java +++ b/src/main/java/com/l2jserver/service/game/chat/ChatMessageDestination.java @@ -16,6 +16,11 @@ */ package com.l2jserver.service.game.chat; +/** + * Enumeration of all possible message destinations + * + * @author Rogiel + */ public enum ChatMessageDestination { /** * Everyone @@ -44,9 +49,17 @@ public enum ChatMessageDestination { /** * $ */ - ALLIANCE(9), ANNOUNCEMENT(10), BOAT(11), L2FRIEND(12), MSNCHAT(13), PARTYMATCH_ROOM( - 14), PARTYROOM_COMMANDER(15), PARTYROOM_ALL(16), HERO_VOICE(17), CRITICAL_ANNOUNCE( - 18), SCREEN_ANNOUNCE(19), BATTLEFIELD(20), MPCC_ROOM(21); + ALLIANCE(9), + /** + * Announcement + */ + ANNOUNCEMENT(10), + /** + * Boat + */ + BOAT(11), L2FRIEND(12), MSNCHAT(13), PARTYMATCH_ROOM(14), PARTYROOM_COMMANDER( + 15), PARTYROOM_ALL(16), HERO_VOICE(17), CRITICAL_ANNOUNCE(18), SCREEN_ANNOUNCE( + 19), BATTLEFIELD(20), MPCC_ROOM(21); public final int id; diff --git a/src/main/java/com/l2jserver/service/game/chat/ChatService.java b/src/main/java/com/l2jserver/service/game/chat/ChatService.java index e5cb90305..05d32af93 100644 --- a/src/main/java/com/l2jserver/service/game/chat/ChatService.java +++ b/src/main/java/com/l2jserver/service/game/chat/ChatService.java @@ -110,16 +110,32 @@ public interface ChatService extends Service { // TODO party chat + /** + * Exception thrown when the target of an private chat is not found + * + * @author Rogiel + */ public class TargetNotFoundChatServiceException extends L2ChatServiceException { private static final long serialVersionUID = 1L; } + /** + * Exception thrown if the player is trying to chat with itself. + * + * @author Rogiel + */ public class CannotChatToSelfChatServiceException extends L2ChatServiceException { private static final long serialVersionUID = 1L; } + /** + * Exception thrown if the player trying to send a message is currently + * banned. + * + * @author Rogiel + */ public class ChatBanActiveChatServiceException extends L2ChatServiceException { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java b/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java index 457a50b3f..981547d73 100644 --- a/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java +++ b/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java @@ -19,6 +19,7 @@ package com.l2jserver.service.game.chat; import java.util.Map; import java.util.Set; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.l2jserver.db.dao.CharacterDAO; import com.l2jserver.model.id.object.CharacterID; @@ -106,7 +107,12 @@ public class SimpleChatService extends AbstractService implements ChatService { public void send(CharacterID sender, ChatMessageDestination chat, String message, String extra) throws TargetNotFoundChatServiceException, - CannotChatToSelfChatServiceException { + CannotChatToSelfChatServiceException, + ChatBanActiveChatServiceException { + Preconditions.checkNotNull(sender, "sender"); + Preconditions.checkNotNull(message, "message"); + Preconditions.checkNotNull(extra, "extra"); + final ChatChannel channel; switch (chat) { case ALL: @@ -122,7 +128,7 @@ public class SimpleChatService extends AbstractService implements ChatService { final L2Character character = charDao.selectByName(extra); if (character == null) throw new TargetNotFoundChatServiceException(); - if (character.equals(sender)) + if (character.getID().equals(sender)) throw new CannotChatToSelfChatServiceException(); channel = getChannel(character.getID()); break; @@ -152,6 +158,7 @@ public class SimpleChatService extends AbstractService implements ChatService { @Override public PublicChatChannel getRegionChannel(L2Character character) { + Preconditions.checkNotNull(character, "character"); final Region region = regionService.getRegion(character); RegionChatChannelImpl channel = regionChannels.get(region); if (channel == null) { @@ -163,6 +170,7 @@ public class SimpleChatService extends AbstractService implements ChatService { @Override public PrivateChatChannel getChannel(CharacterID character) { + Preconditions.checkNotNull(character, "character"); if (character == null) return null; PrivateChatChannelImpl channel = privateChannels.get(character); @@ -175,6 +183,7 @@ public class SimpleChatService extends AbstractService implements ChatService { @Override public PublicChatChannel getChannel(ClanID clan) { + Preconditions.checkNotNull(clan, "clan"); if (clan == null) return null; ClanChatChannelImpl channel = clanChannels.get(clan); @@ -207,6 +216,9 @@ public class SimpleChatService extends AbstractService implements ChatService { @Override public void send(CharacterID sender, String message) { + Preconditions.checkNotNull(sender, "sender"); + Preconditions.checkNotNull(message, "message"); + // TODO throw exception if sender is banned from chat for (final ChatChannelListener listener : listeners) { listener.onMessage(this, sender, message); } @@ -214,11 +226,13 @@ public class SimpleChatService extends AbstractService implements ChatService { @Override public void addChatChannelListener(ChatChannelListener listener) { + Preconditions.checkNotNull(listener, "listener"); listeners.add(listener); } @Override public void removeChatChannelListener(ChatChannelListener listener) { + Preconditions.checkNotNull(listener, "listener"); listeners.remove(listener); } } @@ -233,6 +247,7 @@ public class SimpleChatService extends AbstractService implements ChatService { private final CharacterID character; public PrivateChatChannelImpl(CharacterID character) { + Preconditions.checkNotNull(character, "character"); this.character = character; } @@ -288,6 +303,7 @@ public class SimpleChatService extends AbstractService implements ChatService { * @param clanID */ public ClanChatChannelImpl(ClanID clanID) { + Preconditions.checkNotNull(clanID, "clanID"); this.clanID = clanID; } } @@ -311,6 +327,7 @@ public class SimpleChatService extends AbstractService implements ChatService { * @param clanID */ public RegionChatChannelImpl(Region region) { + Preconditions.checkNotNull(region, "region"); this.region = region; } } diff --git a/src/main/java/com/l2jserver/service/game/chat/channel/ChatChannel.java b/src/main/java/com/l2jserver/service/game/chat/channel/ChatChannel.java index f5ff1b742..de46c8d1c 100644 --- a/src/main/java/com/l2jserver/service/game/chat/channel/ChatChannel.java +++ b/src/main/java/com/l2jserver/service/game/chat/channel/ChatChannel.java @@ -17,6 +17,7 @@ package com.l2jserver.service.game.chat.channel; import com.l2jserver.model.id.object.CharacterID; +import com.l2jserver.service.game.chat.ChatService.ChatBanActiveChatServiceException; /** * The {@link ChatChannel} object is used to send messages to a channel. @@ -35,8 +36,11 @@ public interface ChatChannel { * the character sending the message * @param message * the message to be sent + * @throws ChatBanActiveChatServiceException + * if sender is banned from chatting */ - void send(CharacterID sender, String message); + void send(CharacterID sender, String message) + throws ChatBanActiveChatServiceException; /** * Adds a {@link ChatChannelListener} that will be notified once a message diff --git a/src/main/java/com/l2jserver/service/game/scripting/ScriptingServiceImpl.java b/src/main/java/com/l2jserver/service/game/scripting/ScriptingServiceImpl.java index 02de91ba4..0401edf14 100644 --- a/src/main/java/com/l2jserver/service/game/scripting/ScriptingServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/scripting/ScriptingServiceImpl.java @@ -28,16 +28,17 @@ import javax.xml.bind.Unmarshaller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.google.inject.Injector; import com.l2jserver.service.AbstractService; import com.l2jserver.service.AbstractService.Depends; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.service.game.scripting.impl.ScriptContextImpl; import com.l2jserver.service.game.scripting.scriptmanager.ScriptInfo; import com.l2jserver.service.game.scripting.scriptmanager.ScriptList; -import com.l2jserver.service.logging.LoggingService; import com.l2jserver.util.factory.CollectionFactory; /** @@ -84,6 +85,7 @@ public class ScriptingServiceImpl extends AbstractService implements @Override public synchronized List load(File scriptDescriptor) throws Exception { + Preconditions.checkNotNull(scriptDescriptor, "scriptDescriptor"); final JAXBContext c = JAXBContext.newInstance(ScriptInfo.class, ScriptList.class); final Unmarshaller u = c.createUnmarshaller(); @@ -115,6 +117,9 @@ public class ScriptingServiceImpl extends AbstractService implements */ private ScriptContext createContext(ScriptInfo si, ScriptContext parent) throws Exception { + Preconditions.checkNotNull(si, "si"); + Preconditions.checkNotNull(parent, "parent"); + ScriptContext context = getScriptContext(si.getRoot(), parent); context.setLibraries(si.getLibraries()); context.setCompilerClassName(si.getCompilerClass()); @@ -153,6 +158,9 @@ public class ScriptingServiceImpl extends AbstractService implements */ private ScriptContext getScriptContext(File root, ScriptContext parent) throws InstantiationException { + Preconditions.checkNotNull(root, "root"); + Preconditions.checkNotNull(parent, "parent"); + ScriptContextImpl ctx; if (parent == null) { ctx = new ScriptContextImpl(injector, root); diff --git a/src/main/java/com/l2jserver/service/game/template/ScriptTemplateService.java b/src/main/java/com/l2jserver/service/game/template/ScriptTemplateService.java index acbd36fbb..4bb78a20c 100644 --- a/src/main/java/com/l2jserver/service/game/template/ScriptTemplateService.java +++ b/src/main/java/com/l2jserver/service/game/template/ScriptTemplateService.java @@ -18,6 +18,7 @@ package com.l2jserver.service.game.template; import java.util.Map; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.google.inject.Injector; import com.l2jserver.model.id.TemplateID; @@ -27,9 +28,9 @@ import com.l2jserver.service.AbstractService.Depends; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; import com.l2jserver.service.configuration.ConfigurationService; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.service.game.scripting.ScriptContext; import com.l2jserver.service.game.scripting.ScriptingService; -import com.l2jserver.service.logging.LoggingService; import com.l2jserver.util.factory.CollectionFactory; @Depends({ LoggingService.class, ConfigurationService.class, @@ -73,10 +74,13 @@ public class ScriptTemplateService extends AbstractService implements @Override @SuppressWarnings("unchecked") public > T getTemplate(TemplateID id) { + Preconditions.checkNotNull(id, "id"); return (T) templates.get(id); } public void addTemplate(Class> t) { + Preconditions.checkNotNull(t, "t"); + final Template template = injector.getInstance(t); if (templates.containsKey(template.getID())) throw new TemplateException("Template with ID" + template.getID() @@ -88,6 +92,7 @@ public class ScriptTemplateService extends AbstractService implements } public void removeTemplate(Template t) { + Preconditions.checkNotNull(t, "t"); // TODO templates.remove(t); } diff --git a/src/main/java/com/l2jserver/service/game/world/CachedWorldIDService.java b/src/main/java/com/l2jserver/service/game/world/CachedWorldIDService.java index 9ff81ae84..9c5df2a19 100644 --- a/src/main/java/com/l2jserver/service/game/world/CachedWorldIDService.java +++ b/src/main/java/com/l2jserver/service/game/world/CachedWorldIDService.java @@ -23,6 +23,7 @@ import net.sf.ehcache.Element; import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.store.MemoryStoreEvictionPolicy; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.l2jserver.db.dao.CharacterDAO; import com.l2jserver.db.dao.ItemDAO; @@ -114,6 +115,7 @@ public class CachedWorldIDService extends AbstractService implements * an collection of ids */ private void load(Collection> ids) { + Preconditions.checkNotNull(ids, "ids"); for (final ObjectID id : ids) { allocator.allocate(id.getID()); add(id); @@ -123,6 +125,7 @@ public class CachedWorldIDService extends AbstractService implements @Override @SuppressWarnings("unchecked") public > I resolve(int id) { + Preconditions.checkNotNull(id, "id"); if (!loaded) { // ignore resolving before all IDs are loaded return null; @@ -136,6 +139,7 @@ public class CachedWorldIDService extends AbstractService implements @Override public > void add(I id) { + Preconditions.checkNotNull(id, "id"); if (id == null) return; cache.put(new Element(id.getID(), id)); @@ -143,6 +147,7 @@ public class CachedWorldIDService extends AbstractService implements @Override public > void remove(I id) { + Preconditions.checkNotNull(id, "id"); cache.remove(id.getID()); } diff --git a/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java b/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java index f26741104..93cad9eed 100644 --- a/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java +++ b/src/main/java/com/l2jserver/service/game/world/WorldServiceImpl.java @@ -23,6 +23,7 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.l2jserver.model.id.ObjectID; import com.l2jserver.model.world.WorldObject; @@ -31,6 +32,7 @@ import com.l2jserver.service.AbstractService; import com.l2jserver.service.AbstractService.Depends; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.service.database.DatabaseService; import com.l2jserver.service.game.scripting.ScriptingService; import com.l2jserver.service.game.template.TemplateService; @@ -41,7 +43,6 @@ import com.l2jserver.service.game.world.filter.WorldObjectFilter; import com.l2jserver.service.game.world.filter.impl.IDFilter; import com.l2jserver.service.game.world.filter.impl.InstanceFilter; import com.l2jserver.service.game.world.filter.impl.KnownListFilter; -import com.l2jserver.service.logging.LoggingService; import com.l2jserver.util.factory.CollectionFactory; /** @@ -87,12 +88,14 @@ public class WorldServiceImpl extends AbstractService implements WorldService { @Override public boolean add(WorldObject object) { + Preconditions.checkNotNull(object, "object"); log.debug("Adding object {} to world", object); return objects.add(object); } @Override public boolean remove(WorldObject object) { + Preconditions.checkNotNull(object, "object"); log.debug("Removing object {} from world", object); // we also need to remove all listeners for this object dispatcher.clear(object.getID()); @@ -101,12 +104,14 @@ public class WorldServiceImpl extends AbstractService implements WorldService { @Override public boolean contains(WorldObject object) { + Preconditions.checkNotNull(object, "object"); return objects.contains(object); } @Override @SuppressWarnings("unchecked") public T find(ObjectID id) { + Preconditions.checkNotNull(id, "id"); final IDFilter filter = new IDFilter(id); for (final WorldObject object : objects) { if (filter.accept(object)) @@ -118,10 +123,8 @@ public class WorldServiceImpl extends AbstractService implements WorldService { @Override public void knownlist(Positionable object, KnownListCallback callback) { - if (object == null) - return; - if (callback == null) - return; + Preconditions.checkNotNull(object, "object"); + Preconditions.checkNotNull(callback, "callback"); for (Positionable known : iterable(new KnownListFilter(object))) { callback.knownObject(known); } @@ -134,6 +137,7 @@ public class WorldServiceImpl extends AbstractService implements WorldService { @Override public List list(WorldObjectFilter filter) { + Preconditions.checkNotNull(filter, "filter"); log.debug("Listing objects with filter {}", filter); final List list = CollectionFactory.newList(); for (final T object : this.iterable(filter)) { @@ -144,6 +148,7 @@ public class WorldServiceImpl extends AbstractService implements WorldService { @Override public List list(Class type) { + Preconditions.checkNotNull(type, "type"); log.debug("Listing of type {}", type); return list(new InstanceFilter(type)); } @@ -156,12 +161,14 @@ public class WorldServiceImpl extends AbstractService implements WorldService { @Override public Iterator iterator( final WorldObjectFilter filter) { + Preconditions.checkNotNull(filter, "filter"); return new FilterIterator(filter, objects.iterator()); } @Override public Iterable iterable( final WorldObjectFilter filter) { + Preconditions.checkNotNull(filter, "filter"); return new Iterable() { @Override public Iterator iterator() { diff --git a/src/main/java/com/l2jserver/service/game/world/event/FilteredWorldListener.java b/src/main/java/com/l2jserver/service/game/world/event/FilteredWorldListener.java index 63ed3a6cc..29445c384 100644 --- a/src/main/java/com/l2jserver/service/game/world/event/FilteredWorldListener.java +++ b/src/main/java/com/l2jserver/service/game/world/event/FilteredWorldListener.java @@ -16,6 +16,7 @@ */ package com.l2jserver.service.game.world.event; +import com.google.common.base.Preconditions; import com.l2jserver.model.world.WorldObject; import com.l2jserver.service.game.world.filter.WorldObjectFilter; @@ -30,6 +31,7 @@ public abstract class FilteredWorldListener implements private final WorldObjectFilter filter; public FilteredWorldListener(WorldObjectFilter filter) { + Preconditions.checkNotNull(filter, "filter"); this.filter = filter; } diff --git a/src/main/java/com/l2jserver/service/game/world/event/TypedWorldListener.java b/src/main/java/com/l2jserver/service/game/world/event/TypedWorldListener.java index bf848f9c7..b23ab02ae 100644 --- a/src/main/java/com/l2jserver/service/game/world/event/TypedWorldListener.java +++ b/src/main/java/com/l2jserver/service/game/world/event/TypedWorldListener.java @@ -16,6 +16,8 @@ */ package com.l2jserver.service.game.world.event; +import com.google.common.base.Preconditions; + /** * This listener will filter to only dispatch an certain type events. * @@ -25,6 +27,7 @@ public abstract class TypedWorldListener implements WorldListener { private final Class type; public TypedWorldListener(Class type) { + Preconditions.checkNotNull(type, "type"); this.type = type; } diff --git a/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcherImpl.java b/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcherImpl.java index 63729d4e3..b74ed8229 100644 --- a/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcherImpl.java +++ b/src/main/java/com/l2jserver/service/game/world/event/WorldEventDispatcherImpl.java @@ -28,6 +28,7 @@ import java.util.concurrent.TimeoutException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.common.util.concurrent.AbstractFuture; import com.l2jserver.model.id.ObjectID; import com.l2jserver.model.world.WorldObject; @@ -92,6 +93,7 @@ public class WorldEventDispatcherImpl implements WorldEventDispatcher { @Override public WorldEventFuture dispatch(E event) { + Preconditions.checkNotNull(event, "event"); log.debug("Queing dispatch for event {}", event); final WorldEventFutureImpl future = new WorldEventFutureImpl(); events.add(new EventContainer(event, future)); @@ -119,10 +121,9 @@ public class WorldEventDispatcherImpl implements WorldEventDispatcher { if (!listener.dispatch(event.event)) // remove listener if return value is false listeners.remove(listener); - } catch (ClassCastException e) { - log.debug( - "Exception in Listener. This might indicate an implementation issue in {}", - listener.getClass()); + } catch (Throwable t) { + log.warn("Exception in listener", t); + // always remove any listener that throws an exception listeners.remove(listener); } } @@ -132,33 +133,43 @@ public class WorldEventDispatcherImpl implements WorldEventDispatcher { @Override public void addListener(WorldListener listener) { + Preconditions.checkNotNull(listener, "listener"); log.debug("Adding new listener global {}", listener); globalListeners.add(listener); } @Override public void addListener(WorldObject object, WorldListener listener) { + Preconditions.checkNotNull(object, "object"); + Preconditions.checkNotNull(listener, "listener"); addListener(object.getID(), listener); } @Override public void addListener(ObjectID id, WorldListener listener) { + Preconditions.checkNotNull(id, "id"); + Preconditions.checkNotNull(listener, "listener"); log.debug("Adding new listener {} to {}", listener, id); getListeners(id).add(listener); } @Override public void removeListener(WorldListener listener) { + Preconditions.checkNotNull(listener, "listener"); globalListeners.remove(listener); } @Override public void removeListener(WorldObject object, WorldListener listener) { + Preconditions.checkNotNull(object, "object"); + Preconditions.checkNotNull(listener, "listener"); removeListener(object.getID(), listener); } @Override public void removeListener(ObjectID id, WorldListener listener) { + Preconditions.checkNotNull(id, "id"); + Preconditions.checkNotNull(listener, "listener"); log.debug("Removing new listener {} from {}", listener, id); getListeners(id).remove(listener); } @@ -170,6 +181,7 @@ public class WorldEventDispatcherImpl implements WorldEventDispatcher { * the object id */ public void clear(ObjectID id) { + Preconditions.checkNotNull(id, "id"); listeners.remove(id); } @@ -182,6 +194,7 @@ public class WorldEventDispatcherImpl implements WorldEventDispatcher { * @return the {@link Set}. Never null. */ private Set getListeners(ObjectID id) { + Preconditions.checkNotNull(id, "id"); Set set = listeners.get(id); if (set == null) { set = CollectionFactory.newSet(); @@ -189,7 +202,7 @@ public class WorldEventDispatcherImpl implements WorldEventDispatcher { } return set; } - + public void stop() { timer.cancel(); timer = null; diff --git a/src/main/java/com/l2jserver/service/game/world/filter/impl/IDFilter.java b/src/main/java/com/l2jserver/service/game/world/filter/impl/IDFilter.java index 375c82f1d..e47c39938 100644 --- a/src/main/java/com/l2jserver/service/game/world/filter/impl/IDFilter.java +++ b/src/main/java/com/l2jserver/service/game/world/filter/impl/IDFilter.java @@ -16,6 +16,7 @@ */ package com.l2jserver.service.game.world.filter.impl; +import com.google.common.base.Preconditions; import com.l2jserver.model.id.ObjectID; import com.l2jserver.model.world.WorldObject; import com.l2jserver.service.game.world.filter.WorldObjectFilter; @@ -38,6 +39,7 @@ public class IDFilter implements WorldObjectFilter { * the desired object ID */ public IDFilter(final ObjectID id) { + Preconditions.checkNotNull(id, "id"); this.id = id; } diff --git a/src/main/java/com/l2jserver/service/game/world/filter/impl/InstanceFilter.java b/src/main/java/com/l2jserver/service/game/world/filter/impl/InstanceFilter.java index 6376601d2..697e1b7eb 100644 --- a/src/main/java/com/l2jserver/service/game/world/filter/impl/InstanceFilter.java +++ b/src/main/java/com/l2jserver/service/game/world/filter/impl/InstanceFilter.java @@ -16,6 +16,7 @@ */ package com.l2jserver.service.game.world.filter.impl; +import com.google.common.base.Preconditions; import com.l2jserver.model.world.WorldObject; import com.l2jserver.service.game.world.filter.WorldObjectFilter; @@ -40,6 +41,7 @@ public class InstanceFilter implements * the instance type */ public InstanceFilter(Class instance) { + Preconditions.checkNotNull(instance, "instance"); this.type = instance; } diff --git a/src/main/java/com/l2jserver/service/game/world/filter/impl/RangeFilter.java b/src/main/java/com/l2jserver/service/game/world/filter/impl/RangeFilter.java index 415e7b358..8b44e4993 100644 --- a/src/main/java/com/l2jserver/service/game/world/filter/impl/RangeFilter.java +++ b/src/main/java/com/l2jserver/service/game/world/filter/impl/RangeFilter.java @@ -16,6 +16,7 @@ */ package com.l2jserver.service.game.world.filter.impl; +import com.google.common.base.Preconditions; import com.l2jserver.model.world.capability.Positionable; import com.l2jserver.service.game.world.filter.WorldObjectFilter; @@ -43,6 +44,8 @@ public class RangeFilter implements WorldObjectFilter { * the desired maximum distance of the object */ public RangeFilter(final Positionable object, final int range) { + Preconditions.checkNotNull(object, "object"); + Preconditions.checkState(range >= 0, "range < 0"); this.object = object; this.range = range; } diff --git a/src/main/java/com/l2jserver/service/network/NettyNetworkService.java b/src/main/java/com/l2jserver/service/network/NettyNetworkService.java index da1d1806a..51ab2d5bd 100644 --- a/src/main/java/com/l2jserver/service/network/NettyNetworkService.java +++ b/src/main/java/com/l2jserver/service/network/NettyNetworkService.java @@ -27,16 +27,18 @@ import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.jboss.netty.logging.InternalLoggerFactory; import org.jboss.netty.logging.Slf4JLoggerFactory; +import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.google.inject.Injector; import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.Lineage2PipelineFactory; +import com.l2jserver.game.net.packet.ServerPacket; import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.service.AbstractService; import com.l2jserver.service.AbstractService.Depends; import com.l2jserver.service.configuration.ConfigurationService; +import com.l2jserver.service.core.LoggingService; import com.l2jserver.service.game.world.WorldService; -import com.l2jserver.service.logging.LoggingService; import com.l2jserver.service.network.keygen.BlowfishKeygenService; import com.l2jserver.util.factory.CollectionFactory; @@ -97,6 +99,7 @@ public class NettyNetworkService extends AbstractService implements @Override public void register(final Lineage2Connection client) { + Preconditions.checkNotNull(client, "client"); clients.add(client); client.getChannel().getCloseFuture() .addListener(new ChannelFutureListener() { @@ -110,11 +113,13 @@ public class NettyNetworkService extends AbstractService implements @Override public void unregister(Lineage2Connection client) { + Preconditions.checkNotNull(client, "client"); clients.remove(client); } @Override public Lineage2Connection discover(CharacterID character) { + Preconditions.checkNotNull(character, "character"); for (final Lineage2Connection client : clients) { if (character.equals(client.getCharacterID())) return client; @@ -122,6 +127,12 @@ public class NettyNetworkService extends AbstractService implements return null; } + @Override + public void broadcast(ServerPacket packet) { + Preconditions.checkNotNull(packet, "packet"); + channel.write(packet); + } + @Override public void cleanup() { // TODO diff --git a/src/main/java/com/l2jserver/service/network/NetworkService.java b/src/main/java/com/l2jserver/service/network/NetworkService.java index a891f23e8..270404898 100644 --- a/src/main/java/com/l2jserver/service/network/NetworkService.java +++ b/src/main/java/com/l2jserver/service/network/NetworkService.java @@ -17,6 +17,7 @@ package com.l2jserver.service.network; import com.l2jserver.game.net.Lineage2Connection; +import com.l2jserver.game.net.packet.ServerPacket; import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.service.Service; @@ -52,6 +53,14 @@ public interface NetworkService extends Service { */ Lineage2Connection discover(CharacterID character); + /** + * Broadcast an given packet to all clients connected + * + * @param packet + * the packet + */ + void broadcast(ServerPacket packet); + /** * Searches for idle connection and removes them */ diff --git a/src/main/java/com/l2jserver/service/network/keygen/BlowfishKeygenService.java b/src/main/java/com/l2jserver/service/network/keygen/BlowfishKeygenService.java index 6eb3ec9e5..b184e3a2e 100644 --- a/src/main/java/com/l2jserver/service/network/keygen/BlowfishKeygenService.java +++ b/src/main/java/com/l2jserver/service/network/keygen/BlowfishKeygenService.java @@ -18,6 +18,20 @@ package com.l2jserver.service.network.keygen; import com.l2jserver.service.Service; +/** + * This service generated cryptography keys used to encrypt and decrypt client + * or server packets. Implementations can use an fixed set of keys or generate a + * random one. Note that the generated key might not be cryptographically safe, + * and this is implementation specific. + * + * @author Rogiel + */ public interface BlowfishKeygenService extends Service { + /** + * Creates a new 128 bits key. Note that the key is not necessarily random + * and can be a fixed key. + * + * @return the 128 bits key + */ byte[] generate(); } diff --git a/src/main/java/com/l2jserver/service/network/keygen/PseudoRandomBlowfishKeygenService.java b/src/main/java/com/l2jserver/service/network/keygen/PseudoRandomBlowfishKeygenService.java index 0463c8919..aeb68d5ac 100644 --- a/src/main/java/com/l2jserver/service/network/keygen/PseudoRandomBlowfishKeygenService.java +++ b/src/main/java/com/l2jserver/service/network/keygen/PseudoRandomBlowfishKeygenService.java @@ -22,8 +22,17 @@ import com.l2jserver.service.AbstractService; import com.l2jserver.service.ServiceStartException; import com.l2jserver.service.ServiceStopException; +/** + * Generates a new random key using JDK {@link Random}. Keys generated by this + * implementation are not completely secure but are very fast to generate. + * + * @author Rogiel + */ public class PseudoRandomBlowfishKeygenService extends AbstractService implements BlowfishKeygenService { + /** + * The random number generator + */ private Random random; @Override diff --git a/src/main/java/com/l2jserver/util/exception/L2CharacterServiceException.java b/src/main/java/com/l2jserver/util/exception/L2CharacterServiceException.java new file mode 100644 index 000000000..0803b44bd --- /dev/null +++ b/src/main/java/com/l2jserver/util/exception/L2CharacterServiceException.java @@ -0,0 +1,40 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.util.exception; + +/** + * @author Rogiel + */ +public class L2CharacterServiceException extends L2ServiceException { + private static final long serialVersionUID = 1L; + + public L2CharacterServiceException() { + super(); + } + + public L2CharacterServiceException(String message, Throwable cause) { + super(message, cause); + } + + public L2CharacterServiceException(String message) { + super(message); + } + + public L2CharacterServiceException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/l2jserver/util/exception/L2SpawnServiceException.java b/src/main/java/com/l2jserver/util/exception/L2SpawnServiceException.java new file mode 100644 index 000000000..b96a7d4ed --- /dev/null +++ b/src/main/java/com/l2jserver/util/exception/L2SpawnServiceException.java @@ -0,0 +1,40 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.util.exception; + +/** + * @author Rogiel + */ +public class L2SpawnServiceException extends L2ServiceException { + private static final long serialVersionUID = 1L; + + public L2SpawnServiceException() { + super(); + } + + public L2SpawnServiceException(String message, Throwable cause) { + super(message, cause); + } + + public L2SpawnServiceException(String message) { + super(message); + } + + public L2SpawnServiceException(Throwable cause) { + super(cause); + } +}