L2Trap.java 8.3 KB

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