L2Fishing.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  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.serverpackets.ExFishingHpRegen;
  23. import net.sf.l2j.gameserver.serverpackets.ExFishingStartCombat;
  24. import net.sf.l2j.gameserver.serverpackets.SystemMessage;
  25. import net.sf.l2j.gameserver.templates.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. _fishAiTask.cancel(false);
  115. _fishAiTask = null;
  116. if (_fisher == null) return;
  117. if (win)
  118. {
  119. int check = Rnd.get(100);
  120. if (check <= 5)
  121. {
  122. PenaltyMonster();
  123. }
  124. else
  125. {
  126. _fisher.sendPacket(new SystemMessage(SystemMessageId.YOU_CAUGHT_SOMETHING));
  127. _fisher.addItem("Fishing", _fishId, 1, null, true);
  128. }
  129. }
  130. _fisher.endFishing(win);
  131. _fisher = null;
  132. }
  133. protected void aiTask()
  134. {
  135. if (_thinking) return;
  136. _thinking = true;
  137. _time--;
  138. try
  139. {
  140. if (_mode == 1) {
  141. if (_deceptiveMode == 0)
  142. _fishCurHp += (int) _regenHp;
  143. }
  144. else {
  145. if (_deceptiveMode == 1)
  146. _fishCurHp += (int) _regenHp;
  147. }
  148. if (_stop == 0) {
  149. _stop = 1;
  150. int check = Rnd.get(100);
  151. if (check >= 70) {
  152. _mode = _mode == 0 ? 1 : 0;
  153. }
  154. if (_isUpperGrade) {
  155. check = Rnd.get(100);
  156. if (check >= 90)
  157. _deceptiveMode = _deceptiveMode == 0 ? 1 : 0;
  158. }
  159. }
  160. else {
  161. _stop--;
  162. }
  163. }
  164. finally
  165. {
  166. _thinking = false;
  167. ExFishingHpRegen efhr = new ExFishingHpRegen(_fisher, _time, _fishCurHp, _mode, 0, _anim, 0, _deceptiveMode);
  168. if (_anim != 0)
  169. _fisher.broadcastPacket(efhr);
  170. else
  171. _fisher.sendPacket(efhr);
  172. }
  173. }
  174. public void useRealing(int dmg, int pen)
  175. {
  176. _anim = 2;
  177. if (Rnd.get(100) > 90) {
  178. _fisher.sendPacket(new SystemMessage(SystemMessageId.FISH_RESISTED_ATTEMPT_TO_BRING_IT_IN));
  179. _goodUse = 0;
  180. changeHp(0, pen);
  181. return;
  182. }
  183. if (_fisher == null) return;
  184. if (_mode == 1)
  185. {
  186. if (_deceptiveMode == 0) {
  187. // Reeling is successful, Damage: $s1
  188. SystemMessage sm = new SystemMessage(SystemMessageId.REELING_SUCCESFUL_S1_DAMAGE);
  189. sm.addNumber(dmg);
  190. _fisher.sendPacket(sm);
  191. if (pen == 50) {
  192. sm = new SystemMessage(SystemMessageId.REELING_SUCCESSFUL_PENALTY_S1);
  193. sm.addNumber(pen);
  194. _fisher.sendPacket(sm);
  195. }
  196. _goodUse = 1;
  197. changeHp(dmg , pen);
  198. }
  199. else {
  200. // Reeling failed, Damage: $s1
  201. SystemMessage sm = new SystemMessage(SystemMessageId.FISH_RESISTED_REELING_S1_HP_REGAINED);
  202. sm.addNumber(dmg);
  203. _fisher.sendPacket(sm);
  204. _goodUse = 2;
  205. changeHp(-dmg, pen);
  206. }
  207. }
  208. else
  209. {
  210. if (_deceptiveMode == 0) {
  211. // Reeling failed, Damage: $s1
  212. SystemMessage sm = new SystemMessage(SystemMessageId.FISH_RESISTED_REELING_S1_HP_REGAINED);
  213. sm.addNumber(dmg);
  214. _fisher.sendPacket(sm);
  215. _goodUse = 2;
  216. changeHp(-dmg, pen);
  217. }
  218. else {
  219. // Reeling is successful, Damage: $s1
  220. SystemMessage sm = new SystemMessage(SystemMessageId.REELING_SUCCESFUL_S1_DAMAGE);
  221. sm.addNumber(dmg);
  222. _fisher.sendPacket(sm);
  223. if (pen == 50) {
  224. sm = new SystemMessage(SystemMessageId.REELING_SUCCESSFUL_PENALTY_S1);
  225. sm.addNumber(pen);
  226. _fisher.sendPacket(sm);
  227. }
  228. _goodUse = 1;
  229. changeHp(dmg , pen);
  230. }
  231. }
  232. }
  233. public void usePomping(int dmg, int pen)
  234. {
  235. _anim = 1;
  236. if (Rnd.get(100) > 90) {
  237. _fisher.sendPacket(new SystemMessage(SystemMessageId.FISH_RESISTED_ATTEMPT_TO_BRING_IT_IN));
  238. _goodUse = 0;
  239. changeHp(0, pen);
  240. return;
  241. }
  242. if (_fisher == null) return;
  243. if (_mode == 0)
  244. {
  245. if (_deceptiveMode == 0) {
  246. // Pumping is successful. Damage: $s1
  247. SystemMessage sm = new SystemMessage(SystemMessageId.PUMPING_SUCCESFUL_S1_DAMAGE);
  248. sm.addNumber(dmg);
  249. _fisher.sendPacket(sm);
  250. if (pen == 50) {
  251. sm = new SystemMessage(SystemMessageId.PUMPING_SUCCESSFUL_PENALTY_S1);
  252. sm.addNumber(pen);
  253. _fisher.sendPacket(sm);
  254. }
  255. _goodUse = 1;
  256. changeHp(dmg, pen);
  257. }
  258. else {
  259. // Pumping failed, Regained: $s1
  260. SystemMessage sm = new SystemMessage(SystemMessageId.FISH_RESISTED_PUMPING_S1_HP_REGAINED);
  261. sm.addNumber(dmg);
  262. _fisher.sendPacket(sm);
  263. _goodUse = 2;
  264. changeHp(-dmg, pen);
  265. }
  266. }
  267. else
  268. {
  269. if (_deceptiveMode == 0) {
  270. // Pumping failed, Regained: $s1
  271. SystemMessage sm = new SystemMessage(SystemMessageId.FISH_RESISTED_PUMPING_S1_HP_REGAINED);
  272. sm.addNumber(dmg);
  273. _fisher.sendPacket(sm);
  274. _goodUse = 2;
  275. changeHp(-dmg, pen);
  276. }
  277. else {
  278. // Pumping is successful. Damage: $s1
  279. SystemMessage sm = new SystemMessage(SystemMessageId.PUMPING_SUCCESFUL_S1_DAMAGE);
  280. sm.addNumber(dmg);
  281. _fisher.sendPacket(sm);
  282. if (pen == 50) {
  283. sm = new SystemMessage(SystemMessageId.PUMPING_SUCCESSFUL_PENALTY_S1);
  284. sm.addNumber(pen);
  285. _fisher.sendPacket(sm);
  286. }
  287. _goodUse = 1;
  288. changeHp(dmg, pen);
  289. }
  290. }
  291. }
  292. private void PenaltyMonster()
  293. {
  294. int lvl = (int)Math.round(_fisher.getLevel()*0.1);
  295. int npcid;
  296. _fisher.sendPacket(new SystemMessage(SystemMessageId.YOU_CAUGHT_SOMETHING_SMELLY_THROW_IT_BACK));
  297. switch (lvl)
  298. {
  299. case 0:
  300. case 1:
  301. npcid = 18319;
  302. break;
  303. case 2:
  304. npcid = 18320;
  305. break;
  306. case 3:
  307. npcid = 18321;
  308. break;
  309. case 4:
  310. npcid = 18322;
  311. break;
  312. case 5:
  313. npcid = 18323;
  314. break;
  315. case 6:
  316. npcid = 18324;
  317. break;
  318. case 7:
  319. npcid = 18325;
  320. break;
  321. case 8:
  322. npcid = 18326;
  323. break;
  324. default:
  325. npcid = 18319;
  326. break;
  327. }
  328. L2NpcTemplate temp;
  329. temp = NpcTable.getInstance().getTemplate(npcid);
  330. if (temp != null)
  331. {
  332. try
  333. {
  334. L2Spawn spawn = new L2Spawn(temp);
  335. spawn.setLocx(_fisher.getFishx());
  336. spawn.setLocy(_fisher.getFishy());
  337. spawn.setLocz(_fisher.getFishz());
  338. spawn.setAmount(1);
  339. spawn.setHeading(_fisher.getHeading());
  340. spawn.stopRespawn();
  341. ((L2PenaltyMonsterInstance)spawn.doSpawn()).setPlayerToKill(_fisher);
  342. }
  343. catch (Exception e)
  344. {
  345. // Nothing
  346. }
  347. }
  348. }
  349. }