L2Object.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. /*
  2. * Copyright (C) 2004-2013 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J Server is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package com.l2jserver.gameserver.model;
  20. import java.util.Map;
  21. import javolution.util.FastMap;
  22. import com.l2jserver.gameserver.handler.ActionHandler;
  23. import com.l2jserver.gameserver.handler.ActionShiftHandler;
  24. import com.l2jserver.gameserver.handler.IActionHandler;
  25. import com.l2jserver.gameserver.idfactory.IdFactory;
  26. import com.l2jserver.gameserver.instancemanager.InstanceManager;
  27. import com.l2jserver.gameserver.model.actor.L2Character;
  28. import com.l2jserver.gameserver.model.actor.L2Npc;
  29. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  30. import com.l2jserver.gameserver.model.actor.knownlist.ObjectKnownList;
  31. import com.l2jserver.gameserver.model.actor.poly.ObjectPoly;
  32. import com.l2jserver.gameserver.model.actor.position.ObjectPosition;
  33. import com.l2jserver.gameserver.model.entity.Instance;
  34. import com.l2jserver.gameserver.model.zone.ZoneId;
  35. import com.l2jserver.gameserver.network.SystemMessageId;
  36. import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
  37. import com.l2jserver.gameserver.network.serverpackets.ExSendUIEvent;
  38. import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
  39. /**
  40. * Mother class of all objects in the world which ones is it possible to interact (PC, NPC, Item...)<BR>
  41. * <BR>
  42. * L2Object :<BR>
  43. * <BR>
  44. * <li>L2Character</li> <li>L2ItemInstance</li>
  45. */
  46. public abstract class L2Object
  47. {
  48. private boolean _isVisible; // Object visibility
  49. private ObjectKnownList _knownList;
  50. private String _name;
  51. private int _objectId; // Object identifier
  52. private ObjectPoly _poly;
  53. private ObjectPosition _position;
  54. private int _instanceId = 0;
  55. private InstanceType _instanceType = null;
  56. private volatile Map<String, Object> _scripts;
  57. public L2Object(int objectId)
  58. {
  59. setInstanceType(InstanceType.L2Object);
  60. _objectId = objectId;
  61. initKnownList();
  62. initPosition();
  63. }
  64. public static enum InstanceType
  65. {
  66. L2Object(null),
  67. L2ItemInstance(L2Object),
  68. L2Character(L2Object),
  69. L2Npc(L2Character),
  70. L2Playable(L2Character),
  71. L2Summon(L2Playable),
  72. L2Decoy(L2Character),
  73. L2PcInstance(L2Playable),
  74. L2NpcInstance(L2Npc),
  75. L2MerchantInstance(L2NpcInstance),
  76. L2WarehouseInstance(L2NpcInstance),
  77. L2StaticObjectInstance(L2Character),
  78. L2DoorInstance(L2Character),
  79. L2TerrainObjectInstance(L2Npc),
  80. L2EffectPointInstance(L2Npc),
  81. // Summons, Pets, Decoys and Traps
  82. L2ServitorInstance(L2Summon),
  83. L2SiegeSummonInstance(L2ServitorInstance),
  84. L2MerchantSummonInstance(L2ServitorInstance),
  85. L2PetInstance(L2Summon),
  86. L2BabyPetInstance(L2PetInstance),
  87. L2DecoyInstance(L2Decoy),
  88. L2TrapInstance(L2Npc),
  89. // Attackable
  90. L2Attackable(L2Npc),
  91. L2GuardInstance(L2Attackable),
  92. L2QuestGuardInstance(L2GuardInstance),
  93. L2MonsterInstance(L2Attackable),
  94. L2ChestInstance(L2MonsterInstance),
  95. L2ControllableMobInstance(L2MonsterInstance),
  96. L2FeedableBeastInstance(L2MonsterInstance),
  97. L2TamedBeastInstance(L2FeedableBeastInstance),
  98. L2FriendlyMobInstance(L2Attackable),
  99. L2RiftInvaderInstance(L2MonsterInstance),
  100. L2RaidBossInstance(L2MonsterInstance),
  101. L2GrandBossInstance(L2RaidBossInstance),
  102. // FlyMobs
  103. L2FlyNpcInstance(L2NpcInstance),
  104. L2FlyMonsterInstance(L2MonsterInstance),
  105. L2FlyRaidBossInstance(L2RaidBossInstance),
  106. L2FlyTerrainObjectInstance(L2Npc),
  107. // Sepulchers
  108. L2SepulcherNpcInstance(L2NpcInstance),
  109. L2SepulcherMonsterInstance(L2MonsterInstance),
  110. // Festival
  111. L2FestivalGiudeInstance(L2Npc),
  112. L2FestivalMonsterInstance(L2MonsterInstance),
  113. // Vehicles
  114. L2Vehicle(L2Character),
  115. L2BoatInstance(L2Vehicle),
  116. L2AirShipInstance(L2Vehicle),
  117. L2ControllableAirShipInstance(L2AirShipInstance),
  118. // Siege
  119. L2DefenderInstance(L2Attackable),
  120. L2ArtefactInstance(L2NpcInstance),
  121. L2ControlTowerInstance(L2Npc),
  122. L2FlameTowerInstance(L2Npc),
  123. L2SiegeFlagInstance(L2Npc),
  124. L2SiegeNpcInstance(L2Npc),
  125. // Fort Siege
  126. L2FortBallistaInstance(L2Npc),
  127. L2FortCommanderInstance(L2DefenderInstance),
  128. // Castle NPCs
  129. L2CastleMagicianInstance(L2NpcInstance),
  130. L2MercManagerInstance(L2MerchantInstance),
  131. // Fort NPCs
  132. L2FortEnvoyInstance(L2Npc),
  133. L2FortLogisticsInstance(L2MerchantInstance),
  134. L2FortManagerInstance(L2MerchantInstance),
  135. L2FortSiegeNpcInstance(L2Npc),
  136. L2FortSupportCaptainInstance(L2MerchantInstance),
  137. // Seven Signs
  138. L2SignsPriestInstance(L2Npc),
  139. L2DawnPriestInstance(L2SignsPriestInstance),
  140. L2DuskPriestInstance(L2SignsPriestInstance),
  141. L2DungeonGatekeeperInstance(L2Npc),
  142. // City NPCs
  143. L2AdventurerInstance(L2NpcInstance),
  144. L2AuctioneerInstance(L2Npc),
  145. L2ClanHallManagerInstance(L2MerchantInstance),
  146. L2FishermanInstance(L2MerchantInstance),
  147. L2ManorManagerInstance(L2MerchantInstance),
  148. L2ObservationInstance(L2Npc),
  149. L2OlympiadManagerInstance(L2Npc),
  150. L2PetManagerInstance(L2MerchantInstance),
  151. L2RaceManagerInstance(L2Npc),
  152. L2SymbolMakerInstance(L2Npc),
  153. L2TeleporterInstance(L2Npc),
  154. L2TrainerInstance(L2NpcInstance),
  155. L2VillageMasterInstance(L2NpcInstance),
  156. // Doormens
  157. L2DoormenInstance(L2NpcInstance),
  158. L2CastleDoormenInstance(L2DoormenInstance),
  159. L2FortDoormenInstance(L2DoormenInstance),
  160. L2ClanHallDoormenInstance(L2DoormenInstance),
  161. // Custom
  162. L2ClassMasterInstance(L2NpcInstance),
  163. L2NpcBufferInstance(L2Npc),
  164. L2TvTEventNpcInstance(L2Npc),
  165. L2WeddingManagerInstance(L2Npc),
  166. L2EventMobInstance(L2Npc);
  167. private final InstanceType _parent;
  168. private final long _typeL;
  169. private final long _typeH;
  170. private final long _maskL;
  171. private final long _maskH;
  172. private InstanceType(InstanceType parent)
  173. {
  174. _parent = parent;
  175. final int high = ordinal() - (Long.SIZE - 1);
  176. if (high < 0)
  177. {
  178. _typeL = 1L << ordinal();
  179. _typeH = 0;
  180. }
  181. else
  182. {
  183. _typeL = 0;
  184. _typeH = 1L << high;
  185. }
  186. if ((_typeL < 0) || (_typeH < 0))
  187. {
  188. throw new Error("Too many instance types, failed to load " + name());
  189. }
  190. if (parent != null)
  191. {
  192. _maskL = _typeL | parent._maskL;
  193. _maskH = _typeH | parent._maskH;
  194. }
  195. else
  196. {
  197. _maskL = _typeL;
  198. _maskH = _typeH;
  199. }
  200. }
  201. public final InstanceType getParent()
  202. {
  203. return _parent;
  204. }
  205. public final boolean isType(InstanceType it)
  206. {
  207. return ((_maskL & it._typeL) > 0) || ((_maskH & it._typeH) > 0);
  208. }
  209. public final boolean isTypes(InstanceType... it)
  210. {
  211. for (InstanceType i : it)
  212. {
  213. if (isType(i))
  214. {
  215. return true;
  216. }
  217. }
  218. return false;
  219. }
  220. }
  221. protected final void setInstanceType(InstanceType i)
  222. {
  223. _instanceType = i;
  224. }
  225. public final InstanceType getInstanceType()
  226. {
  227. return _instanceType;
  228. }
  229. public final boolean isInstanceType(InstanceType i)
  230. {
  231. return _instanceType.isType(i);
  232. }
  233. public final boolean isInstanceTypes(InstanceType... i)
  234. {
  235. return _instanceType.isTypes(i);
  236. }
  237. public final void onAction(L2PcInstance player)
  238. {
  239. onAction(player, true);
  240. }
  241. public void onAction(L2PcInstance player, boolean interact)
  242. {
  243. IActionHandler handler = ActionHandler.getInstance().getHandler(getInstanceType());
  244. if (handler != null)
  245. {
  246. handler.action(player, this, interact);
  247. }
  248. player.sendPacket(ActionFailed.STATIC_PACKET);
  249. }
  250. public void onActionShift(L2PcInstance player)
  251. {
  252. IActionHandler handler = ActionShiftHandler.getInstance().getHandler(getInstanceType());
  253. if (handler != null)
  254. {
  255. handler.action(player, this, true);
  256. }
  257. player.sendPacket(ActionFailed.STATIC_PACKET);
  258. }
  259. public void onForcedAttack(L2PcInstance player)
  260. {
  261. player.sendPacket(ActionFailed.STATIC_PACKET);
  262. }
  263. /**
  264. * Do Nothing.<BR>
  265. * <BR>
  266. * <B><U> Overridden in </U> :</B><BR>
  267. * <BR>
  268. * <li>L2GuardInstance : Set the home location of its L2GuardInstance</li> <li>L2Attackable : Reset the Spoiled flag</li><BR>
  269. * <BR>
  270. */
  271. public void onSpawn()
  272. {
  273. }
  274. // Position - Should remove to fully move to L2ObjectPosition
  275. public final void setXYZ(int x, int y, int z)
  276. {
  277. getPosition().setXYZ(x, y, z);
  278. }
  279. public final void setXYZInvisible(int x, int y, int z)
  280. {
  281. getPosition().setXYZInvisible(x, y, z);
  282. }
  283. public final int getX()
  284. {
  285. assert (getPosition().getWorldRegion() != null) || _isVisible;
  286. return getPosition().getX();
  287. }
  288. /**
  289. * @return The id of the instance zone the object is in - id 0 is global since everything like dropped items, mobs, players can be in a instanciated area, it must be in l2object
  290. */
  291. public int getInstanceId()
  292. {
  293. return _instanceId;
  294. }
  295. /**
  296. * UnAfraid: TODO: Add listener here.
  297. * @param instanceId The id of the instance zone the object is in - id 0 is global
  298. */
  299. public void setInstanceId(int instanceId)
  300. {
  301. if ((instanceId < 0) || (_instanceId == instanceId))
  302. {
  303. return;
  304. }
  305. Instance oldI = InstanceManager.getInstance().getInstance(_instanceId);
  306. Instance newI = InstanceManager.getInstance().getInstance(instanceId);
  307. if (newI == null)
  308. {
  309. return;
  310. }
  311. if (isPlayer())
  312. {
  313. L2PcInstance player = getActingPlayer();
  314. if ((_instanceId > 0) && (oldI != null))
  315. {
  316. oldI.removePlayer(getObjectId());
  317. if (oldI.isShowTimer())
  318. {
  319. int startTime = (int) ((System.currentTimeMillis() - oldI.getInstanceStartTime()) / 1000);
  320. int endTime = (int) ((oldI.getInstanceEndTime() - oldI.getInstanceStartTime()) / 1000);
  321. if (oldI.isTimerIncrease())
  322. {
  323. sendPacket(new ExSendUIEvent(getActingPlayer(), true, true, startTime, endTime, oldI.getTimerText()));
  324. }
  325. else
  326. {
  327. sendPacket(new ExSendUIEvent(getActingPlayer(), true, false, endTime - startTime, 0, oldI.getTimerText()));
  328. }
  329. }
  330. }
  331. if (instanceId > 0)
  332. {
  333. newI.addPlayer(getObjectId());
  334. if (newI.isShowTimer())
  335. {
  336. int startTime = (int) ((System.currentTimeMillis() - newI.getInstanceStartTime()) / 1000);
  337. int endTime = (int) ((newI.getInstanceEndTime() - newI.getInstanceStartTime()) / 1000);
  338. if (newI.isTimerIncrease())
  339. {
  340. sendPacket(new ExSendUIEvent(getActingPlayer(), false, true, startTime, endTime, newI.getTimerText()));
  341. }
  342. else
  343. {
  344. sendPacket(new ExSendUIEvent(getActingPlayer(), false, false, endTime - startTime, 0, newI.getTimerText()));
  345. }
  346. }
  347. }
  348. if (player.hasSummon())
  349. {
  350. player.getSummon().setInstanceId(instanceId);
  351. }
  352. }
  353. else if (isNpc())
  354. {
  355. L2Npc npc = (L2Npc) this;
  356. if ((_instanceId > 0) && (oldI != null))
  357. {
  358. oldI.removeNpc(npc);
  359. }
  360. if (instanceId > 0)
  361. {
  362. newI.addNpc(npc);
  363. }
  364. }
  365. _instanceId = instanceId;
  366. // If we change it for visible objects, me must clear & revalidates knownlists
  367. if (_isVisible && (_knownList != null))
  368. {
  369. if (isPlayer())
  370. {
  371. // We don't want some ugly looking disappear/appear effects, so don't update
  372. // the knownlist here, but players usually enter instancezones through teleporting
  373. // and the teleport will do the revalidation for us.
  374. }
  375. else
  376. {
  377. decayMe();
  378. spawnMe();
  379. }
  380. }
  381. }
  382. public final int getY()
  383. {
  384. assert (getPosition().getWorldRegion() != null) || _isVisible;
  385. return getPosition().getY();
  386. }
  387. public final int getZ()
  388. {
  389. assert (getPosition().getWorldRegion() != null) || _isVisible;
  390. return getPosition().getZ();
  391. }
  392. public int getHeading()
  393. {
  394. return 0;
  395. }
  396. /**
  397. * Remove a L2Object from the world.<BR>
  398. * <BR>
  399. * <B><U> Actions</U> :</B><BR>
  400. * <BR>
  401. * <li>Remove the L2Object from the world</li><BR>
  402. * <BR>
  403. * <FONT COLOR=#FF0000><B> <U>Caution</U> : This method DOESN'T REMOVE the object from _allObjects of L2World </B></FONT><BR>
  404. * <FONT COLOR=#FF0000><B> <U>Caution</U> : This method DOESN'T SEND Server->Client packets to players</B></FONT><BR>
  405. * <BR>
  406. * <B><U> Assert </U> :</B><BR>
  407. * <BR>
  408. * <li>_worldRegion != null <I>(L2Object is visible at the beginning)</I></li><BR>
  409. * <BR>
  410. * <B><U> Example of use </U> :</B><BR>
  411. * <BR>
  412. * <li>Delete NPC/PC or Unsummon</li><BR>
  413. * <BR>
  414. */
  415. public void decayMe()
  416. {
  417. assert getPosition().getWorldRegion() != null;
  418. L2WorldRegion reg = getPosition().getWorldRegion();
  419. synchronized (this)
  420. {
  421. _isVisible = false;
  422. getPosition().setWorldRegion(null);
  423. }
  424. // this can synchronize on others instances, so it's out of
  425. // synchronized, to avoid deadlocks
  426. // Remove the L2Object from the world
  427. L2World.getInstance().removeVisibleObject(this, reg);
  428. L2World.getInstance().removeObject(this);
  429. }
  430. public void refreshID()
  431. {
  432. L2World.getInstance().removeObject(this);
  433. IdFactory.getInstance().releaseId(getObjectId());
  434. _objectId = IdFactory.getInstance().getNextId();
  435. }
  436. /**
  437. * Init the position of a L2Object spawn and add it in the world as a visible object.<BR>
  438. * <BR>
  439. * <B><U> Actions</U> :</B><BR>
  440. * <BR>
  441. * <li>Set the x,y,z position of the L2Object spawn and update its _worldregion</li> <li>Add the L2Object spawn in the _allobjects of L2World</li> <li>Add the L2Object spawn to _visibleObjects of its L2WorldRegion</li> <li>Add the L2Object spawn in the world as a <B>visible</B> object</li><BR>
  442. * <BR>
  443. * <B><U> Assert </U> :</B><BR>
  444. * <BR>
  445. * <li>_worldRegion == null <I>(L2Object is invisible at the beginning)</I></li><BR>
  446. * <BR>
  447. * <B><U> Example of use </U> :</B><BR>
  448. * <BR>
  449. * <li>Create Door</li> <li>Spawn : Monster, Minion, CTs, Summon...</li><BR>
  450. */
  451. public final void spawnMe()
  452. {
  453. assert (getPosition().getWorldRegion() == null) && (getPosition().getWorldPosition().getX() != 0) && (getPosition().getWorldPosition().getY() != 0) && (getPosition().getWorldPosition().getZ() != 0);
  454. synchronized (this)
  455. {
  456. // Set the x,y,z position of the L2Object spawn and update its _worldregion
  457. _isVisible = true;
  458. getPosition().setWorldRegion(L2World.getInstance().getRegion(getPosition().getWorldPosition()));
  459. // Add the L2Object spawn in the _allobjects of L2World
  460. L2World.getInstance().storeObject(this);
  461. // Add the L2Object spawn to _visibleObjects and if necessary to _allplayers of its L2WorldRegion
  462. getPosition().getWorldRegion().addVisibleObject(this);
  463. }
  464. // this can synchronize on others instances, so it's out of
  465. // synchronized, to avoid deadlocks
  466. // Add the L2Object spawn in the world as a visible object
  467. L2World.getInstance().addVisibleObject(this, getPosition().getWorldRegion());
  468. onSpawn();
  469. }
  470. public final void spawnMe(int x, int y, int z)
  471. {
  472. assert getPosition().getWorldRegion() == null;
  473. synchronized (this)
  474. {
  475. // Set the x,y,z position of the L2Object spawn and update its _worldregion
  476. _isVisible = true;
  477. if (x > L2World.MAP_MAX_X)
  478. {
  479. x = L2World.MAP_MAX_X - 5000;
  480. }
  481. if (x < L2World.MAP_MIN_X)
  482. {
  483. x = L2World.MAP_MIN_X + 5000;
  484. }
  485. if (y > L2World.MAP_MAX_Y)
  486. {
  487. y = L2World.MAP_MAX_Y - 5000;
  488. }
  489. if (y < L2World.MAP_MIN_Y)
  490. {
  491. y = L2World.MAP_MIN_Y + 5000;
  492. }
  493. getPosition().setWorldPosition(x, y, z);
  494. getPosition().setWorldRegion(L2World.getInstance().getRegion(getPosition().getWorldPosition()));
  495. // Add the L2Object spawn in the _allobjects of L2World
  496. }
  497. L2World.getInstance().storeObject(this);
  498. // these can synchronize on others instances, so they're out of
  499. // synchronized, to avoid deadlocks
  500. // Add the L2Object spawn to _visibleObjects and if necessary to _allplayers of its L2WorldRegion
  501. getPosition().getWorldRegion().addVisibleObject(this);
  502. // Add the L2Object spawn in the world as a visible object
  503. L2World.getInstance().addVisibleObject(this, getPosition().getWorldRegion());
  504. onSpawn();
  505. }
  506. public void toggleVisible()
  507. {
  508. if (isVisible())
  509. {
  510. decayMe();
  511. }
  512. else
  513. {
  514. spawnMe();
  515. }
  516. }
  517. public boolean isAttackable()
  518. {
  519. return false;
  520. }
  521. public abstract boolean isAutoAttackable(L2Character attacker);
  522. public boolean isMarker()
  523. {
  524. return false;
  525. }
  526. /**
  527. * Return the visibility state of the L2Object. <B><U> Concept</U> :</B><BR>
  528. * <BR>
  529. * A L2Object is visible if <B>__IsVisible</B>=true and <B>_worldregion</B>!=null <BR>
  530. * <BR>
  531. * @return
  532. */
  533. public final boolean isVisible()
  534. {
  535. return getPosition().getWorldRegion() != null;
  536. }
  537. public final void setIsVisible(boolean value)
  538. {
  539. _isVisible = value;
  540. if (!_isVisible)
  541. {
  542. getPosition().setWorldRegion(null);
  543. }
  544. }
  545. public ObjectKnownList getKnownList()
  546. {
  547. return _knownList;
  548. }
  549. /**
  550. * Initializes the KnownList of the L2Object, is overwritten in classes that require a different knownlist Type. Removes the need for instanceof checks.
  551. */
  552. public void initKnownList()
  553. {
  554. _knownList = new ObjectKnownList(this);
  555. }
  556. public final void setKnownList(ObjectKnownList value)
  557. {
  558. _knownList = value;
  559. }
  560. public final String getName()
  561. {
  562. return _name;
  563. }
  564. public void setName(String value)
  565. {
  566. _name = value;
  567. }
  568. public final int getObjectId()
  569. {
  570. return _objectId;
  571. }
  572. public final ObjectPoly getPoly()
  573. {
  574. if (_poly == null)
  575. {
  576. _poly = new ObjectPoly(this);
  577. }
  578. return _poly;
  579. }
  580. public ObjectPosition getPosition()
  581. {
  582. return _position;
  583. }
  584. /**
  585. * Initializes the Position class of the L2Object, is overwritten in classes that require a different position Type. Removes the need for instanceof checks.
  586. */
  587. public void initPosition()
  588. {
  589. _position = new ObjectPosition(this);
  590. }
  591. public final void setObjectPosition(ObjectPosition value)
  592. {
  593. _position = value;
  594. }
  595. /**
  596. * @return reference to region this object is in.
  597. */
  598. public L2WorldRegion getWorldRegion()
  599. {
  600. return getPosition().getWorldRegion();
  601. }
  602. public L2PcInstance getActingPlayer()
  603. {
  604. return null;
  605. }
  606. /**
  607. * Sends the Server->Client info packet for the object.<br>
  608. * <br>
  609. * Is Overridden in: <li>L2AirShipInstance</li> <li>L2BoatInstance</li> <li>L2DoorInstance</li> <li>L2PcInstance</li> <li>L2StaticObjectInstance</li> <li>L2Decoy</li> <li>L2Npc</li> <li>L2Summon</li> <li>L2Trap</li> <li>L2ItemInstance</li>
  610. * @param activeChar
  611. */
  612. public void sendInfo(L2PcInstance activeChar)
  613. {
  614. }
  615. @Override
  616. public String toString()
  617. {
  618. return (getClass().getSimpleName() + ":" + getName() + "[" + getObjectId() + "]");
  619. }
  620. /**
  621. * Not Implemented.<BR>
  622. * <BR>
  623. * <B><U> Overridden in </U> :</B><BR>
  624. * <BR>
  625. * <li>L2PcInstance</li><BR>
  626. * <BR>
  627. * @param mov
  628. */
  629. public void sendPacket(L2GameServerPacket mov)
  630. {
  631. // default implementation
  632. }
  633. /**
  634. * Not Implemented.<BR>
  635. * <BR>
  636. * <B><U> Overridden in </U> :</B><BR>
  637. * <BR>
  638. * <li>L2PcInstance</li><BR>
  639. * <BR>
  640. * @param id
  641. */
  642. public void sendPacket(SystemMessageId id)
  643. {
  644. // default implementation
  645. }
  646. /**
  647. * @return {@code true} if object is instance of L2PcInstance
  648. */
  649. public boolean isPlayer()
  650. {
  651. return false;
  652. }
  653. /**
  654. * @return {@code true} if object is instance of L2Playable
  655. */
  656. public boolean isPlayable()
  657. {
  658. return false;
  659. }
  660. /**
  661. * @return {@code true} if object is instance of L2Summon
  662. */
  663. public boolean isSummon()
  664. {
  665. return false;
  666. }
  667. /**
  668. * @return {@code true} if object is instance of L2PetInstance
  669. */
  670. public boolean isPet()
  671. {
  672. return false;
  673. }
  674. /**
  675. * @return {@code true} if object is instance of L2ServitorInstance
  676. */
  677. public boolean isServitor()
  678. {
  679. return false;
  680. }
  681. /**
  682. * @return {@code true} if object is instance of L2DoorInstance
  683. */
  684. public boolean isDoor()
  685. {
  686. return false;
  687. }
  688. /**
  689. * @return {@code true} if object is instance of L2Npc
  690. */
  691. public boolean isNpc()
  692. {
  693. return false;
  694. }
  695. /**
  696. * @return {@code true} if object is instance of L2Attackable
  697. */
  698. public boolean isL2Attackable()
  699. {
  700. return false;
  701. }
  702. /**
  703. * @return {@code true} if object is instance of L2MonsterInstance
  704. */
  705. public boolean isMonster()
  706. {
  707. return false;
  708. }
  709. /**
  710. * @return {@code true} if object is instance of L2TrapInstance
  711. */
  712. public boolean isTrap()
  713. {
  714. return false;
  715. }
  716. /**
  717. * @return {@code true} if object is instance of L2ItemInstance
  718. */
  719. public boolean isItem()
  720. {
  721. return false;
  722. }
  723. /**
  724. * @return {@code true} if object Npc Walker or Vehicle
  725. */
  726. public boolean isWalker()
  727. {
  728. return false;
  729. }
  730. /**
  731. * @return {@code true} if object Can be targeted
  732. */
  733. public boolean isTargetable()
  734. {
  735. return true;
  736. }
  737. /**
  738. * Check if the object is in the given zone Id.
  739. * @param zone the zone Id to check
  740. * @return {@code true} if the object is in that zone Id
  741. */
  742. public boolean isInsideZone(ZoneId zone)
  743. {
  744. return false;
  745. }
  746. /**
  747. * Check if current object has charged shot.
  748. * @param type of the shot to be checked.
  749. * @return {@code true} if the object has charged shot
  750. */
  751. public boolean isChargedShot(ShotType type)
  752. {
  753. return false;
  754. }
  755. /**
  756. * Charging shot into the current object.
  757. * @param type of the shot to be charged.
  758. * @param charged
  759. */
  760. public void setChargedShot(ShotType type, boolean charged)
  761. {
  762. }
  763. /**
  764. * Try to recharge a shot.
  765. * @param physical skill are using Soul shots.
  766. * @param magical skill are using Spirit shots.
  767. */
  768. public void rechargeShots(boolean physical, boolean magical)
  769. {
  770. }
  771. /**
  772. * @param <T>
  773. * @param script
  774. * @return
  775. */
  776. public final <T> T addScript(T script)
  777. {
  778. if (_scripts == null)
  779. {
  780. // Double-checked locking
  781. synchronized (this)
  782. {
  783. if (_scripts == null)
  784. {
  785. _scripts = new FastMap<String, Object>().shared();
  786. }
  787. }
  788. }
  789. _scripts.put(script.getClass().getName(), script);
  790. return script;
  791. }
  792. /**
  793. * @param <T>
  794. * @param script
  795. * @return
  796. */
  797. @SuppressWarnings("unchecked")
  798. public final <T> T removeScript(Class<T> script)
  799. {
  800. if (_scripts == null)
  801. {
  802. return null;
  803. }
  804. return (T) _scripts.remove(script.getName());
  805. }
  806. /**
  807. * @param <T>
  808. * @param script
  809. * @return
  810. */
  811. @SuppressWarnings("unchecked")
  812. public final <T> T getScript(Class<T> script)
  813. {
  814. if (_scripts == null)
  815. {
  816. return null;
  817. }
  818. return (T) _scripts.get(script.getName());
  819. }
  820. public void removeStatusListener(L2Character object)
  821. {
  822. }
  823. }