L2Fishing.java 9.7 KB

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