L2Playable.java 8.8 KB

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