L2Fishing.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. /*
  2. * Copyright (C) 2004-2014 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.fishing;
  20. import java.util.concurrent.Future;
  21. import com.l2jserver.gameserver.ThreadPoolManager;
  22. import com.l2jserver.gameserver.datatables.FishingMonstersData;
  23. import com.l2jserver.gameserver.datatables.NpcData;
  24. import com.l2jserver.gameserver.model.L2Spawn;
  25. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  26. import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
  27. import com.l2jserver.gameserver.network.SystemMessageId;
  28. import com.l2jserver.gameserver.network.serverpackets.ExFishingHpRegen;
  29. import com.l2jserver.gameserver.network.serverpackets.ExFishingStartCombat;
  30. import com.l2jserver.gameserver.network.serverpackets.PlaySound;
  31. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  32. import com.l2jserver.util.Rnd;
  33. public class L2Fishing implements Runnable
  34. {
  35. private L2PcInstance _fisher;
  36. private int _time;
  37. private int _stop = 0;
  38. private int _goodUse = 0;
  39. private int _anim = 0;
  40. private int _mode = 0;
  41. private int _deceptiveMode = 0;
  42. private Future<?> _fishAiTask;
  43. private boolean _thinking;
  44. // Fish datas
  45. private final int _fishId;
  46. private final int _fishMaxHp;
  47. private int _fishCurHp;
  48. private final double _regenHp;
  49. private final boolean _isUpperGrade;
  50. private int _lureType;
  51. @Override
  52. public void run()
  53. {
  54. if (_fisher == null)
  55. {
  56. return;
  57. }
  58. if (_fishCurHp >= (_fishMaxHp * 2))
  59. {
  60. // The fish got away
  61. _fisher.sendPacket(SystemMessageId.BAIT_STOLEN_BY_FISH);
  62. doDie(false);
  63. }
  64. else if (_time <= 0)
  65. {
  66. // Time is up, so that fish got away
  67. _fisher.sendPacket(SystemMessageId.FISH_SPIT_THE_HOOK);
  68. doDie(false);
  69. }
  70. else
  71. {
  72. aiTask();
  73. }
  74. }
  75. public L2Fishing(L2PcInstance Fisher, L2Fish fish, boolean isNoob, boolean isUpperGrade)
  76. {
  77. _fisher = Fisher;
  78. _fishMaxHp = fish.getFishHp();
  79. _fishCurHp = _fishMaxHp;
  80. _regenHp = fish.getHpRegen();
  81. _fishId = fish.getItemId();
  82. _time = fish.getCombatDuration();
  83. _isUpperGrade = isUpperGrade;
  84. if (isUpperGrade)
  85. {
  86. _deceptiveMode = Rnd.get(100) >= 90 ? 1 : 0;
  87. _lureType = 2;
  88. }
  89. else
  90. {
  91. _deceptiveMode = 0;
  92. _lureType = isNoob ? 0 : 1;
  93. }
  94. _mode = Rnd.get(100) >= 80 ? 1 : 0;
  95. _fisher.broadcastPacket(new ExFishingStartCombat(_fisher, _time, _fishMaxHp, _mode, _lureType, _deceptiveMode));
  96. _fisher.sendPacket(new PlaySound(1, "SF_S_01", 0, 0, 0, 0, 0));
  97. // Succeeded in getting a bite
  98. _fisher.sendPacket(SystemMessageId.GOT_A_BITE);
  99. if (_fishAiTask == null)
  100. {
  101. _fishAiTask = ThreadPoolManager.getInstance().scheduleEffectAtFixedRate(this, 1000, 1000);
  102. }
  103. }
  104. public void changeHp(int hp, int pen)
  105. {
  106. _fishCurHp -= hp;
  107. if (_fishCurHp < 0)
  108. {
  109. _fishCurHp = 0;
  110. }
  111. ExFishingHpRegen efhr = new ExFishingHpRegen(_fisher, _time, _fishCurHp, _mode, _goodUse, _anim, pen, _deceptiveMode);
  112. _fisher.broadcastPacket(efhr);
  113. _anim = 0;
  114. if (_fishCurHp > (_fishMaxHp * 2))
  115. {
  116. _fishCurHp = _fishMaxHp * 2;
  117. doDie(false);
  118. return;
  119. }
  120. else if (_fishCurHp == 0)
  121. {
  122. doDie(true);
  123. return;
  124. }
  125. }
  126. public synchronized void doDie(boolean win)
  127. {
  128. if (_fishAiTask != null)
  129. {
  130. _fishAiTask.cancel(false);
  131. _fishAiTask = null;
  132. }
  133. if (_fisher == null)
  134. {
  135. return;
  136. }
  137. if (win)
  138. {
  139. final L2FishingMonster fishingMonster = FishingMonstersData.getInstance().getFishingMonster(_fisher.getLevel());
  140. if (fishingMonster != null)
  141. {
  142. if (Rnd.get(100) <= fishingMonster.getProbability())
  143. {
  144. _fisher.sendPacket(SystemMessageId.YOU_CAUGHT_SOMETHING_SMELLY_THROW_IT_BACK);
  145. spawnMonster(fishingMonster.getFishingMonsterId());
  146. }
  147. else
  148. {
  149. _fisher.sendPacket(SystemMessageId.YOU_CAUGHT_SOMETHING);
  150. _fisher.addItem("Fishing", _fishId, 1, null, true);
  151. }
  152. }
  153. }
  154. _fisher.endFishing(win);
  155. _fisher = null;
  156. }
  157. protected void aiTask()
  158. {
  159. if (_thinking)
  160. {
  161. return;
  162. }
  163. _thinking = true;
  164. _time--;
  165. try
  166. {
  167. if (_mode == 1)
  168. {
  169. if (_deceptiveMode == 0)
  170. {
  171. _fishCurHp += (int) _regenHp;
  172. }
  173. }
  174. else
  175. {
  176. if (_deceptiveMode == 1)
  177. {
  178. _fishCurHp += (int) _regenHp;
  179. }
  180. }
  181. if (_stop == 0)
  182. {
  183. _stop = 1;
  184. int check = Rnd.get(100);
  185. if (check >= 70)
  186. {
  187. _mode = _mode == 0 ? 1 : 0;
  188. }
  189. if (_isUpperGrade)
  190. {
  191. check = Rnd.get(100);
  192. if (check >= 90)
  193. {
  194. _deceptiveMode = _deceptiveMode == 0 ? 1 : 0;
  195. }
  196. }
  197. }
  198. else
  199. {
  200. _stop--;
  201. }
  202. }
  203. finally
  204. {
  205. _thinking = false;
  206. ExFishingHpRegen efhr = new ExFishingHpRegen(_fisher, _time, _fishCurHp, _mode, 0, _anim, 0, _deceptiveMode);
  207. if (_anim != 0)
  208. {
  209. _fisher.broadcastPacket(efhr);
  210. }
  211. else
  212. {
  213. _fisher.sendPacket(efhr);
  214. }
  215. }
  216. }
  217. public void useReeling(int dmg, int pen)
  218. {
  219. _anim = 2;
  220. if (Rnd.get(100) > 90)
  221. {
  222. _fisher.sendPacket(SystemMessageId.FISH_RESISTED_ATTEMPT_TO_BRING_IT_IN);
  223. _goodUse = 0;
  224. changeHp(0, pen);
  225. return;
  226. }
  227. if (_fisher == null)
  228. {
  229. return;
  230. }
  231. if (_mode == 1)
  232. {
  233. if (_deceptiveMode == 0)
  234. {
  235. // Reeling is successful, Damage: $s1
  236. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESFUL_S1_DAMAGE);
  237. sm.addInt(dmg);
  238. _fisher.sendPacket(sm);
  239. if (pen > 0)
  240. {
  241. sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESSFUL_PENALTY_S1);
  242. sm.addInt(pen);
  243. _fisher.sendPacket(sm);
  244. }
  245. _goodUse = 1;
  246. changeHp(dmg, pen);
  247. }
  248. else
  249. {
  250. // Reeling failed, Damage: $s1
  251. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_REELING_S1_HP_REGAINED);
  252. sm.addInt(dmg);
  253. _fisher.sendPacket(sm);
  254. _goodUse = 2;
  255. changeHp(-dmg, pen);
  256. }
  257. }
  258. else
  259. {
  260. if (_deceptiveMode == 0)
  261. {
  262. // Reeling failed, Damage: $s1
  263. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_REELING_S1_HP_REGAINED);
  264. sm.addInt(dmg);
  265. _fisher.sendPacket(sm);
  266. _goodUse = 2;
  267. changeHp(-dmg, pen);
  268. }
  269. else
  270. {
  271. // Reeling is successful, Damage: $s1
  272. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESFUL_S1_DAMAGE);
  273. sm.addInt(dmg);
  274. _fisher.sendPacket(sm);
  275. if (pen > 0)
  276. {
  277. sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESSFUL_PENALTY_S1);
  278. sm.addInt(pen);
  279. _fisher.sendPacket(sm);
  280. }
  281. _goodUse = 1;
  282. changeHp(dmg, pen);
  283. }
  284. }
  285. }
  286. public void usePumping(int dmg, int pen)
  287. {
  288. _anim = 1;
  289. if (Rnd.get(100) > 90)
  290. {
  291. _fisher.sendPacket(SystemMessageId.FISH_RESISTED_ATTEMPT_TO_BRING_IT_IN);
  292. _goodUse = 0;
  293. changeHp(0, pen);
  294. return;
  295. }
  296. if (_fisher == null)
  297. {
  298. return;
  299. }
  300. if (_mode == 0)
  301. {
  302. if (_deceptiveMode == 0)
  303. {
  304. // Pumping is successful. Damage: $s1
  305. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESFUL_S1_DAMAGE);
  306. sm.addInt(dmg);
  307. _fisher.sendPacket(sm);
  308. if (pen > 0)
  309. {
  310. sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESSFUL_PENALTY_S1);
  311. sm.addInt(pen);
  312. _fisher.sendPacket(sm);
  313. }
  314. _goodUse = 1;
  315. changeHp(dmg, pen);
  316. }
  317. else
  318. {
  319. // Pumping failed, Regained: $s1
  320. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_PUMPING_S1_HP_REGAINED);
  321. sm.addInt(dmg);
  322. _fisher.sendPacket(sm);
  323. _goodUse = 2;
  324. changeHp(-dmg, pen);
  325. }
  326. }
  327. else
  328. {
  329. if (_deceptiveMode == 0)
  330. {
  331. // Pumping failed, Regained: $s1
  332. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_PUMPING_S1_HP_REGAINED);
  333. sm.addInt(dmg);
  334. _fisher.sendPacket(sm);
  335. _goodUse = 2;
  336. changeHp(-dmg, pen);
  337. }
  338. else
  339. {
  340. // Pumping is successful. Damage: $s1
  341. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESFUL_S1_DAMAGE);
  342. sm.addInt(dmg);
  343. _fisher.sendPacket(sm);
  344. if (pen > 0)
  345. {
  346. sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESSFUL_PENALTY_S1);
  347. sm.addInt(pen);
  348. _fisher.sendPacket(sm);
  349. }
  350. _goodUse = 1;
  351. changeHp(dmg, pen);
  352. }
  353. }
  354. }
  355. private void spawnMonster(int npcId)
  356. {
  357. final L2NpcTemplate monster = NpcData.getInstance().getTemplate(npcId);
  358. if (monster != null)
  359. {
  360. try
  361. {
  362. L2Spawn spawn = new L2Spawn(monster);
  363. spawn.setX(_fisher.getX());
  364. spawn.setY(_fisher.getY());
  365. spawn.setZ(_fisher.getZ());
  366. spawn.setAmount(1);
  367. spawn.setHeading(_fisher.getHeading());
  368. spawn.stopRespawn();
  369. spawn.doSpawn();
  370. spawn.getLastSpawn().setTarget(_fisher);
  371. }
  372. catch (Exception e)
  373. {
  374. // Nothing
  375. }
  376. }
  377. }
  378. }