2
0

L2Playable.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. /*
  2. * Copyright (C) 2004-2014 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.actor;
  20. import com.l2jserver.gameserver.ai.CtrlEvent;
  21. import com.l2jserver.gameserver.enums.InstanceType;
  22. import com.l2jserver.gameserver.instancemanager.InstanceManager;
  23. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  24. import com.l2jserver.gameserver.model.actor.knownlist.PlayableKnownList;
  25. import com.l2jserver.gameserver.model.actor.stat.PlayableStat;
  26. import com.l2jserver.gameserver.model.actor.status.PlayableStatus;
  27. import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate;
  28. import com.l2jserver.gameserver.model.effects.EffectFlag;
  29. import com.l2jserver.gameserver.model.effects.L2EffectType;
  30. import com.l2jserver.gameserver.model.entity.Instance;
  31. import com.l2jserver.gameserver.model.events.EventDispatcher;
  32. import com.l2jserver.gameserver.model.events.impl.character.OnCreatureKill;
  33. import com.l2jserver.gameserver.model.events.returns.TerminateReturn;
  34. import com.l2jserver.gameserver.model.quest.QuestState;
  35. import com.l2jserver.gameserver.model.skills.Skill;
  36. import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate;
  37. /**
  38. * This class represents all Playable characters in the world.<br>
  39. * L2Playable:
  40. * <ul>
  41. * <li>L2PcInstance</li>
  42. * <li>L2Summon</li>
  43. * </ul>
  44. */
  45. public abstract class L2Playable extends L2Character
  46. {
  47. private L2Character _lockedTarget = null;
  48. private L2PcInstance transferDmgTo = null;
  49. /**
  50. * Constructor of L2Playable.<br>
  51. * <B><U> Actions</U> :</B>
  52. * <ul>
  53. * <li>Call the L2Character constructor to create an empty _skills slot and link copy basic Calculator set to this L2Playable</li>
  54. * </ul>
  55. * @param objectId Identifier of the object to initialized
  56. * @param template The L2CharTemplate to apply to the L2Playable
  57. */
  58. public L2Playable(int objectId, L2CharTemplate template)
  59. {
  60. super(objectId, template);
  61. setInstanceType(InstanceType.L2Playable);
  62. setIsInvul(false);
  63. }
  64. @Override
  65. public PlayableKnownList getKnownList()
  66. {
  67. return (PlayableKnownList) super.getKnownList();
  68. }
  69. @Override
  70. public void initKnownList()
  71. {
  72. setKnownList(new PlayableKnownList(this));
  73. }
  74. @Override
  75. public PlayableStat getStat()
  76. {
  77. return (PlayableStat) super.getStat();
  78. }
  79. @Override
  80. public void initCharStat()
  81. {
  82. setStat(new PlayableStat(this));
  83. }
  84. @Override
  85. public PlayableStatus getStatus()
  86. {
  87. return (PlayableStatus) super.getStatus();
  88. }
  89. @Override
  90. public void initCharStatus()
  91. {
  92. setStatus(new PlayableStatus(this));
  93. }
  94. @Override
  95. public boolean doDie(L2Character killer)
  96. {
  97. final TerminateReturn returnBack = EventDispatcher.getInstance().notifyEvent(new OnCreatureKill(killer, this), this, TerminateReturn.class);
  98. if ((returnBack != null) && returnBack.terminate())
  99. {
  100. return false;
  101. }
  102. // killing is only possible one time
  103. synchronized (this)
  104. {
  105. if (isDead())
  106. {
  107. return false;
  108. }
  109. // now reset currentHp to zero
  110. setCurrentHp(0);
  111. setIsDead(true);
  112. }
  113. // Set target to null and cancel Attack or Cast
  114. setTarget(null);
  115. // Stop movement
  116. stopMove(null);
  117. // Stop HP/MP/CP Regeneration task
  118. getStatus().stopHpMpRegeneration();
  119. boolean deleteBuffs = true;
  120. if (isNoblesseBlessedAffected())
  121. {
  122. stopEffects(L2EffectType.NOBLESSE_BLESSING);
  123. deleteBuffs = false;
  124. }
  125. if (isResurrectSpecialAffected())
  126. {
  127. stopEffects(L2EffectType.RESURRECTION_SPECIAL);
  128. deleteBuffs = false;
  129. }
  130. if (isPlayer())
  131. {
  132. L2PcInstance activeChar = getActingPlayer();
  133. if (activeChar.hasCharmOfCourage())
  134. {
  135. if (activeChar.isInSiege())
  136. {
  137. getActingPlayer().reviveRequest(getActingPlayer(), null, false, 0);
  138. }
  139. activeChar.setCharmOfCourage(false);
  140. activeChar.sendPacket(new EtcStatusUpdate(activeChar));
  141. }
  142. }
  143. if (deleteBuffs)
  144. {
  145. stopAllEffectsExceptThoseThatLastThroughDeath();
  146. }
  147. // Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform
  148. broadcastStatusUpdate();
  149. if (getWorldRegion() != null)
  150. {
  151. getWorldRegion().onDeath(this);
  152. }
  153. // Notify Quest of L2Playable's death
  154. L2PcInstance actingPlayer = getActingPlayer();
  155. if (!actingPlayer.isNotifyQuestOfDeathEmpty())
  156. {
  157. for (QuestState qs : actingPlayer.getNotifyQuestOfDeath())
  158. {
  159. qs.getQuest().notifyDeath((killer == null ? this : killer), this, qs);
  160. }
  161. }
  162. // Notify instance
  163. if (getInstanceId() > 0)
  164. {
  165. final Instance instance = InstanceManager.getInstance().getInstance(getInstanceId());
  166. if (instance != null)
  167. {
  168. instance.notifyDeath(killer, this);
  169. }
  170. }
  171. if (killer != null)
  172. {
  173. L2PcInstance player = killer.getActingPlayer();
  174. if (player != null)
  175. {
  176. player.onKillUpdatePvPKarma(this);
  177. }
  178. }
  179. // Notify L2Character AI
  180. getAI().notifyEvent(CtrlEvent.EVT_DEAD);
  181. super.updateEffectIcons();
  182. return true;
  183. }
  184. public boolean checkIfPvP(L2Character target)
  185. {
  186. if (target == null)
  187. {
  188. return false; // Target is null
  189. }
  190. if (target == this)
  191. {
  192. return false; // Target is self
  193. }
  194. if (!target.isPlayable())
  195. {
  196. return false; // Target is not a L2Playable
  197. }
  198. final L2PcInstance player = getActingPlayer();
  199. if (player == null)
  200. {
  201. return false; // Active player is null
  202. }
  203. if (player.getKarma() != 0)
  204. {
  205. return false; // Active player has karma
  206. }
  207. final L2PcInstance targetPlayer = target.getActingPlayer();
  208. if (targetPlayer == null)
  209. {
  210. return false; // Target player is null
  211. }
  212. if (targetPlayer == this)
  213. {
  214. return false; // Target player is self
  215. }
  216. if (targetPlayer.getKarma() != 0)
  217. {
  218. return false; // Target player has karma
  219. }
  220. if (targetPlayer.getPvpFlag() == 0)
  221. {
  222. return false;
  223. }
  224. return true;
  225. // Even at war, there should be PvP flag
  226. // if(
  227. // player.getClan() == null ||
  228. // targetPlayer.getClan() == null ||
  229. // (
  230. // !targetPlayer.getClan().isAtWarWith(player.getClanId()) &&
  231. // targetPlayer.getWantsPeace() == 0 &&
  232. // player.getWantsPeace() == 0
  233. // )
  234. // )
  235. // {
  236. // return true;
  237. // }
  238. // return false;
  239. }
  240. /**
  241. * Return True.
  242. */
  243. @Override
  244. public boolean canBeAttacked()
  245. {
  246. return true;
  247. }
  248. // Support for Noblesse Blessing skill, where buffs are retained after resurrect
  249. public final boolean isNoblesseBlessedAffected()
  250. {
  251. return isAffected(EffectFlag.NOBLESS_BLESSING);
  252. }
  253. /**
  254. * @return {@code true} if char can resurrect by himself, {@code false} otherwise
  255. */
  256. public final boolean isResurrectSpecialAffected()
  257. {
  258. return isAffected(EffectFlag.RESURRECTION_SPECIAL);
  259. }
  260. /**
  261. * @return {@code true} if the Silent Moving mode is active, {@code false} otherwise
  262. */
  263. public boolean isSilentMovingAffected()
  264. {
  265. return isAffected(EffectFlag.SILENT_MOVE);
  266. }
  267. /**
  268. * For Newbie Protection Blessing skill, keeps you safe from an attack by a chaotic character >= 10 levels apart from you.
  269. * @return
  270. */
  271. public final boolean isProtectionBlessingAffected()
  272. {
  273. return isAffected(EffectFlag.PROTECTION_BLESSING);
  274. }
  275. @Override
  276. public void updateEffectIcons(boolean partyOnly)
  277. {
  278. getEffectList().updateEffectIcons(partyOnly);
  279. }
  280. public boolean isLockedTarget()
  281. {
  282. return _lockedTarget != null;
  283. }
  284. public L2Character getLockedTarget()
  285. {
  286. return _lockedTarget;
  287. }
  288. public void setLockedTarget(L2Character cha)
  289. {
  290. _lockedTarget = cha;
  291. }
  292. public void setTransferDamageTo(L2PcInstance val)
  293. {
  294. transferDmgTo = val;
  295. }
  296. public L2PcInstance getTransferingDamageTo()
  297. {
  298. return transferDmgTo;
  299. }
  300. public abstract int getKarma();
  301. public abstract byte getPvpFlag();
  302. public abstract boolean useMagic(Skill skill, boolean forceUse, boolean dontMove);
  303. public abstract void storeMe();
  304. public abstract void storeEffect(boolean storeEffects);
  305. public abstract void restoreEffects();
  306. @Override
  307. public boolean isPlayable()
  308. {
  309. return true;
  310. }
  311. }