L2Fishing.java 9.8 KB

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