L2Trap.java 8.9 KB

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