2
0

L2Trap.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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. public void deleteMe()
  120. {
  121. decayMe();
  122. getKnownList().removeAllKnownObjects();
  123. }
  124. /**
  125. *
  126. * @param owner
  127. */
  128. public synchronized void unSummon()
  129. {
  130. if (isVisible() && !isDead())
  131. {
  132. if (getWorldRegion() != null)
  133. getWorldRegion().removeFromZones(this);
  134. deleteMe();
  135. }
  136. }
  137. /**
  138. *
  139. * @see com.l2jserver.gameserver.model.actor.L2Character#getActiveWeaponInstance()
  140. */
  141. @Override
  142. public L2ItemInstance getActiveWeaponInstance()
  143. {
  144. return null;
  145. }
  146. /**
  147. *
  148. * @see com.l2jserver.gameserver.model.actor.L2Character#getActiveWeaponItem()
  149. */
  150. @Override
  151. public L2Weapon getActiveWeaponItem()
  152. {
  153. return null;
  154. }
  155. /**
  156. *
  157. * @see com.l2jserver.gameserver.model.actor.L2Character#getLevel()
  158. */
  159. @Override
  160. public int getLevel()
  161. {
  162. return getTemplate().level;
  163. }
  164. /**
  165. *
  166. * @see com.l2jserver.gameserver.model.actor.L2Character#getTemplate()
  167. */
  168. @Override
  169. public L2NpcTemplate getTemplate()
  170. {
  171. return (L2NpcTemplate) super.getTemplate();
  172. }
  173. /**
  174. *
  175. * @see com.l2jserver.gameserver.model.actor.L2Character#getSecondaryWeaponInstance()
  176. */
  177. @Override
  178. public L2ItemInstance getSecondaryWeaponInstance()
  179. {
  180. return null;
  181. }
  182. /**
  183. *
  184. * @see com.l2jserver.gameserver.model.actor.L2Character#getSecondaryWeaponItem()
  185. */
  186. @Override
  187. public L2Weapon getSecondaryWeaponItem()
  188. {
  189. return null;
  190. }
  191. /**
  192. *
  193. * @see com.l2jserver.gameserver.model.actor.L2Character#updateAbnormalEffect()
  194. */
  195. @Override
  196. public void updateAbnormalEffect()
  197. {
  198. }
  199. public L2Skill getSkill()
  200. {
  201. return _skill;
  202. }
  203. public L2PcInstance getOwner()
  204. {
  205. return null;
  206. }
  207. public int getKarma()
  208. {
  209. return 0;
  210. }
  211. public byte getPvpFlag()
  212. {
  213. return 0;
  214. }
  215. /**
  216. * Checks is triggered
  217. * @return True if trap is triggered.
  218. */
  219. public boolean isTriggered()
  220. {
  221. return _isTriggered;
  222. }
  223. /**
  224. * Checks trap visibility
  225. * @param cha - checked character
  226. * @return True if character can see trap
  227. */
  228. public boolean canSee(L2Character cha)
  229. {
  230. return false;
  231. }
  232. /**
  233. * Reveal trap to the detector (if possible)
  234. * @param detector
  235. */
  236. public void setDetected(L2Character detector)
  237. {
  238. detector.sendPacket(new AbstractNpcInfo.TrapInfo(this, detector));
  239. }
  240. /**
  241. * Check if target can trigger trap
  242. * @param target
  243. * @return
  244. */
  245. protected boolean checkTarget(L2Character target)
  246. {
  247. return L2Skill.checkForAreaOffensiveSkills(this, target, _skill, false);
  248. }
  249. private class TrapTask implements Runnable
  250. {
  251. public void run()
  252. {
  253. try
  254. {
  255. if (!_isTriggered)
  256. {
  257. _timeRemaining -= TICK;
  258. if (_timeRemaining < _lifeTime - 15000)
  259. {
  260. SocialAction sa = new SocialAction(getObjectId(), 2);
  261. broadcastPacket(sa);
  262. }
  263. if (_timeRemaining < 0)
  264. {
  265. switch (getSkill().getTargetType())
  266. {
  267. case TARGET_AURA:
  268. case TARGET_FRONT_AURA:
  269. case TARGET_BEHIND_AURA:
  270. trigger(L2Trap.this);
  271. break;
  272. default:
  273. unSummon();
  274. }
  275. return;
  276. }
  277. for (L2Character target : getKnownList().getKnownCharactersInRadius(_skill.getSkillRadius()))
  278. {
  279. if (!checkTarget(target))
  280. continue;
  281. trigger(target);
  282. return;
  283. }
  284. ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(), TICK);
  285. }
  286. }
  287. catch (Exception e)
  288. {
  289. _log.log(Level.SEVERE, "", e);
  290. unSummon();
  291. }
  292. }
  293. }
  294. /**
  295. * Trigger trap
  296. * @param target
  297. */
  298. public void trigger(L2Character target)
  299. {
  300. _isTriggered = true;
  301. broadcastPacket(new AbstractNpcInfo.TrapInfo(this, null));
  302. setTarget(target);
  303. ThreadPoolManager.getInstance().scheduleGeneral(new TriggerTask(), 300);
  304. }
  305. private class TriggerTask implements Runnable
  306. {
  307. public void run()
  308. {
  309. try
  310. {
  311. doCast(_skill);
  312. ThreadPoolManager.getInstance().scheduleGeneral(new UnsummonTask(), _skill.getHitTime() + 300);
  313. }
  314. catch (Exception e)
  315. {
  316. unSummon();
  317. }
  318. }
  319. }
  320. private class UnsummonTask implements Runnable
  321. {
  322. public void run()
  323. {
  324. unSummon();
  325. }
  326. }
  327. @Override
  328. public void sendInfo(L2PcInstance activeChar)
  329. {
  330. if (_isTriggered || canSee(activeChar))
  331. activeChar.sendPacket(new AbstractNpcInfo.TrapInfo(this, activeChar));
  332. }
  333. @Override
  334. public void broadcastPacket(L2GameServerPacket mov)
  335. {
  336. Collection<L2PcInstance> plrs = getKnownList().getKnownPlayers().values();
  337. for (L2PcInstance player : plrs)
  338. if (player != null && (_isTriggered || canSee(player)))
  339. player.sendPacket(mov);
  340. }
  341. @Override
  342. public void broadcastPacket(L2GameServerPacket mov, int radiusInKnownlist)
  343. {
  344. Collection<L2PcInstance> plrs = getKnownList().getKnownPlayers().values();
  345. for (L2PcInstance player : plrs)
  346. {
  347. if (player == null)
  348. continue;
  349. if (isInsideRadius(player, radiusInKnownlist, false, false))
  350. if (_isTriggered || canSee(player))
  351. player.sendPacket(mov);
  352. }
  353. }
  354. }