L2Fishing.java 9.6 KB

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