L2Fishing.java 9.8 KB

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