L2Trap.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package com.l2jserver.gameserver.model.actor;
  16. import java.util.Collection;
  17. import java.util.logging.Level;
  18. import com.l2jserver.gameserver.ThreadPoolManager;
  19. import com.l2jserver.gameserver.model.L2ItemInstance;
  20. import com.l2jserver.gameserver.model.L2Skill;
  21. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  22. import com.l2jserver.gameserver.model.actor.knownlist.TrapKnownList;
  23. import com.l2jserver.gameserver.network.SystemMessageId;
  24. import com.l2jserver.gameserver.network.serverpackets.AbstractNpcInfo;
  25. import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
  26. import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
  27. import com.l2jserver.gameserver.network.serverpackets.MyTargetSelected;
  28. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  29. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  30. import com.l2jserver.gameserver.taskmanager.DecayTaskManager;
  31. import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
  32. import com.l2jserver.gameserver.templates.item.L2Weapon;
  33. /**
  34. *
  35. * @author nBd
  36. */
  37. public class L2Trap extends L2Character
  38. {
  39. protected static final int TICK = 1000; // 1s
  40. private boolean _isTriggered;
  41. private final L2Skill _skill;
  42. private final int _lifeTime;
  43. private int _timeRemaining;
  44. /**
  45. * @param objectId
  46. * @param template
  47. */
  48. public L2Trap(int objectId, L2NpcTemplate template, int lifeTime, L2Skill skill)
  49. {
  50. super(objectId, template);
  51. setName(template.name);
  52. setIsInvul(false);
  53. _isTriggered = false;
  54. _skill = skill;
  55. if (lifeTime != 0)
  56. _lifeTime = lifeTime;
  57. else
  58. _lifeTime = 30000;
  59. _timeRemaining = _lifeTime;
  60. ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(), TICK);
  61. }
  62. /**
  63. *
  64. * @see com.l2jserver.gameserver.model.actor.L2Character#getKnownList()
  65. */
  66. @Override
  67. public TrapKnownList getKnownList()
  68. {
  69. return (TrapKnownList) super.getKnownList();
  70. }
  71. @Override
  72. public void initKnownList()
  73. {
  74. setKnownList(new TrapKnownList(this));
  75. }
  76. public boolean isAutoAttackable(L2Character attacker)
  77. {
  78. return !canSee(attacker);
  79. }
  80. /**
  81. *
  82. *
  83. */
  84. public void stopDecay()
  85. {
  86. DecayTaskManager.getInstance().cancelDecayTask(this);
  87. }
  88. /**
  89. *
  90. * @see com.l2jserver.gameserver.model.actor.L2Character#onDecay()
  91. */
  92. @Override
  93. public void onDecay()
  94. {
  95. deleteMe();
  96. }
  97. /**
  98. *
  99. * @return
  100. */
  101. public final int getNpcId()
  102. {
  103. return getTemplate().npcId;
  104. }
  105. @Override
  106. public void onAction(L2PcInstance player, boolean interact)
  107. {
  108. // Aggression target lock effect
  109. if (player.isLockedTarget() && player.getLockedTarget() != this)
  110. {
  111. player.sendPacket(new SystemMessage(SystemMessageId.FAILED_CHANGE_TARGET));
  112. player.sendPacket(ActionFailed.STATIC_PACKET);
  113. return;
  114. }
  115. player.setTarget(this);
  116. MyTargetSelected my = new MyTargetSelected(getObjectId(), player.getLevel()- getLevel());
  117. player.sendPacket(my);
  118. }
  119. /**
  120. *
  121. * @see com.l2jserver.gameserver.model.actor.L2Character#doDie(com.l2jserver.gameserver.model.actor.L2Character)
  122. */
  123. @Override
  124. public boolean doDie(L2Character killer)
  125. {
  126. if (!super.doDie(killer))
  127. return false;
  128. DecayTaskManager.getInstance().addDecayTask(this);
  129. return true;
  130. }
  131. /**
  132. *
  133. * @param owner
  134. */
  135. public void deleteMe()
  136. {
  137. decayMe();
  138. getKnownList().removeAllKnownObjects();
  139. }
  140. /**
  141. *
  142. * @param owner
  143. */
  144. public synchronized void unSummon()
  145. {
  146. if (isVisible() && !isDead())
  147. {
  148. if (getWorldRegion() != null)
  149. getWorldRegion().removeFromZones(this);
  150. deleteMe();
  151. }
  152. }
  153. /**
  154. *
  155. * @see com.l2jserver.gameserver.model.actor.L2Character#getActiveWeaponInstance()
  156. */
  157. @Override
  158. public L2ItemInstance getActiveWeaponInstance()
  159. {
  160. return null;
  161. }
  162. /**
  163. *
  164. * @see com.l2jserver.gameserver.model.actor.L2Character#getActiveWeaponItem()
  165. */
  166. @Override
  167. public L2Weapon getActiveWeaponItem()
  168. {
  169. return null;
  170. }
  171. /**
  172. *
  173. * @see com.l2jserver.gameserver.model.actor.L2Character#getLevel()
  174. */
  175. @Override
  176. public int getLevel()
  177. {
  178. return getTemplate().level;
  179. }
  180. /**
  181. *
  182. * @see com.l2jserver.gameserver.model.actor.L2Character#getTemplate()
  183. */
  184. @Override
  185. public L2NpcTemplate getTemplate()
  186. {
  187. return (L2NpcTemplate) super.getTemplate();
  188. }
  189. /**
  190. *
  191. * @see com.l2jserver.gameserver.model.actor.L2Character#getSecondaryWeaponInstance()
  192. */
  193. @Override
  194. public L2ItemInstance getSecondaryWeaponInstance()
  195. {
  196. return null;
  197. }
  198. /**
  199. *
  200. * @see com.l2jserver.gameserver.model.actor.L2Character#getSecondaryWeaponItem()
  201. */
  202. @Override
  203. public L2Weapon getSecondaryWeaponItem()
  204. {
  205. return null;
  206. }
  207. /**
  208. *
  209. * @see com.l2jserver.gameserver.model.actor.L2Character#updateAbnormalEffect()
  210. */
  211. @Override
  212. public void updateAbnormalEffect()
  213. {
  214. }
  215. public L2Skill getSkill()
  216. {
  217. return _skill;
  218. }
  219. public L2PcInstance getOwner()
  220. {
  221. return null;
  222. }
  223. public int getKarma()
  224. {
  225. return 0;
  226. }
  227. public byte getPvpFlag()
  228. {
  229. return 0;
  230. }
  231. /**
  232. * Checks is triggered
  233. * @return True if trap is triggered.
  234. */
  235. public boolean isTriggered()
  236. {
  237. return _isTriggered;
  238. }
  239. /**
  240. * Checks trap visibility
  241. * @param cha - checked character
  242. * @return True if character can see trap
  243. */
  244. public boolean canSee(L2Character cha)
  245. {
  246. return false;
  247. }
  248. /**
  249. * Reveal trap to the detector (if possible)
  250. * @param detector
  251. */
  252. public void setDetected(L2Character detector)
  253. {
  254. detector.sendPacket(new AbstractNpcInfo.TrapInfo(this, detector));
  255. }
  256. /**
  257. * Check if target can trigger trap
  258. * @param target
  259. * @return
  260. */
  261. protected boolean checkTarget(L2Character target)
  262. {
  263. return L2Skill.checkForAreaOffensiveSkills(this, target, _skill, false);
  264. }
  265. private class TrapTask implements Runnable
  266. {
  267. public void run()
  268. {
  269. try
  270. {
  271. if (!_isTriggered)
  272. {
  273. _timeRemaining -= TICK;
  274. if (_timeRemaining < _lifeTime - 15000)
  275. {
  276. SocialAction sa = new SocialAction(getObjectId(), 2);
  277. broadcastPacket(sa);
  278. }
  279. if (_timeRemaining < 0)
  280. {
  281. switch (getSkill().getTargetType())
  282. {
  283. case TARGET_AURA:
  284. case TARGET_FRONT_AURA:
  285. case TARGET_BEHIND_AURA:
  286. trigger(L2Trap.this);
  287. break;
  288. default:
  289. unSummon();
  290. }
  291. return;
  292. }
  293. for (L2Character target : getKnownList().getKnownCharactersInRadius(_skill.getSkillRadius()))
  294. {
  295. if (!checkTarget(target))
  296. continue;
  297. trigger(target);
  298. return;
  299. }
  300. ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(), TICK);
  301. }
  302. }
  303. catch (Exception e)
  304. {
  305. _log.log(Level.SEVERE, "", e);
  306. unSummon();
  307. }
  308. }
  309. }
  310. /**
  311. * Trigger trap
  312. * @param target
  313. */
  314. public void trigger(L2Character target)
  315. {
  316. _isTriggered = true;
  317. broadcastPacket(new AbstractNpcInfo.TrapInfo(this, null));
  318. setTarget(target);
  319. ThreadPoolManager.getInstance().scheduleGeneral(new TriggerTask(), 300);
  320. }
  321. private class TriggerTask implements Runnable
  322. {
  323. public void run()
  324. {
  325. try
  326. {
  327. doCast(_skill);
  328. ThreadPoolManager.getInstance().scheduleGeneral(new UnsummonTask(), _skill.getHitTime() + 300);
  329. }
  330. catch (Exception e)
  331. {
  332. unSummon();
  333. }
  334. }
  335. }
  336. private class UnsummonTask implements Runnable
  337. {
  338. public void run()
  339. {
  340. unSummon();
  341. }
  342. }
  343. @Override
  344. public void sendInfo(L2PcInstance activeChar)
  345. {
  346. if (_isTriggered || canSee(activeChar))
  347. activeChar.sendPacket(new AbstractNpcInfo.TrapInfo(this, activeChar));
  348. }
  349. @Override
  350. public void broadcastPacket(L2GameServerPacket mov)
  351. {
  352. Collection<L2PcInstance> plrs = getKnownList().getKnownPlayers().values();
  353. for (L2PcInstance player : plrs)
  354. if (player != null && (_isTriggered || canSee(player)))
  355. player.sendPacket(mov);
  356. }
  357. @Override
  358. public void broadcastPacket(L2GameServerPacket mov, int radiusInKnownlist)
  359. {
  360. Collection<L2PcInstance> plrs = getKnownList().getKnownPlayers().values();
  361. for (L2PcInstance player : plrs)
  362. {
  363. if (player == null)
  364. continue;
  365. if (isInsideRadius(player, radiusInKnownlist, false, false))
  366. if (_isTriggered || canSee(player))
  367. player.sendPacket(mov);
  368. }
  369. }
  370. }