123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- /*
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package com.l2jserver.gameserver.model;
- import java.util.concurrent.Future;
- import com.l2jserver.gameserver.ThreadPoolManager;
- import com.l2jserver.gameserver.datatables.NpcTable;
- import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
- import com.l2jserver.gameserver.model.actor.instance.L2PenaltyMonsterInstance;
- import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
- import com.l2jserver.gameserver.network.SystemMessageId;
- import com.l2jserver.gameserver.network.serverpackets.ExFishingHpRegen;
- import com.l2jserver.gameserver.network.serverpackets.ExFishingStartCombat;
- import com.l2jserver.gameserver.network.serverpackets.PlaySound;
- import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
- import com.l2jserver.util.Rnd;
- public class L2Fishing implements Runnable
- {
- // =========================================================
- // Data Field
- private L2PcInstance _fisher;
- private int _time;
- private int _stop = 0;
- private int _goodUse = 0;
- private int _anim = 0;
- private int _mode = 0;
- private int _deceptiveMode = 0;
- private Future<?> _fishAiTask;
- private boolean _thinking;
- // Fish datas
- private int _fishId;
- private int _fishMaxHp;
- private int _fishCurHp;
- private double _regenHp;
- private boolean _isUpperGrade;
- private int _lureType;
-
- @Override
- public void run()
- {
- if (_fisher == null)
- return;
-
- if (_fishCurHp >= _fishMaxHp * 2)
- {
- // The fish got away
- _fisher.sendPacket(SystemMessageId.BAIT_STOLEN_BY_FISH);
- doDie(false);
- }
- else if (_time <= 0)
- {
- // Time is up, so that fish got away
- _fisher.sendPacket(SystemMessageId.FISH_SPIT_THE_HOOK);
- doDie(false);
- }
- else aiTask();
- }
-
- // =========================================================
- public L2Fishing(L2PcInstance Fisher, FishData fish, boolean isNoob, boolean isUpperGrade)
- {
- _fisher = Fisher;
- _fishMaxHp = fish.getHP();
- _fishCurHp = _fishMaxHp;
- _regenHp = fish.getHpRegen();
- _fishId = fish.getId();
- _time = fish.getCombatTime() / 1000;
- _isUpperGrade = isUpperGrade;
- if (isUpperGrade) {
- _deceptiveMode = Rnd.get(100) >= 90 ? 1 : 0;
- _lureType = 2;
- }
- else {
- _deceptiveMode = 0;
- _lureType = isNoob ? 0 : 1;
- }
- _mode = Rnd.get(100) >= 80 ? 1 : 0;
-
- ExFishingStartCombat efsc = new ExFishingStartCombat(_fisher, _time, _fishMaxHp, _mode, _lureType, _deceptiveMode);
- _fisher.broadcastPacket(efsc);
- _fisher.sendPacket(new PlaySound(1, "SF_S_01", 0, 0, 0, 0, 0));
- // Succeeded in getting a bite
- _fisher.sendPacket(SystemMessageId.GOT_A_BITE);
-
- if (_fishAiTask == null)
- {
- _fishAiTask = ThreadPoolManager.getInstance().scheduleEffectAtFixedRate(this, 1000, 1000);
- }
-
- }
-
- public void changeHp(int hp, int pen)
- {
- _fishCurHp -= hp;
- if (_fishCurHp < 0) _fishCurHp = 0;
-
- ExFishingHpRegen efhr = new ExFishingHpRegen(_fisher, _time, _fishCurHp, _mode, _goodUse, _anim, pen, _deceptiveMode);
- _fisher.broadcastPacket(efhr);
- _anim = 0;
- if (_fishCurHp > _fishMaxHp * 2)
- {
- _fishCurHp = _fishMaxHp * 2;
- doDie(false);
- return;
- }
- else if (_fishCurHp == 0)
- {
- doDie(true);
- return;
- }
- }
-
- public synchronized void doDie(boolean win)
- {
- if (_fishAiTask != null)
- {
- _fishAiTask.cancel(false);
- _fishAiTask = null;
- }
-
- if (_fisher == null) return;
-
- if (win)
- {
- int check = Rnd.get(100);
- if (check <= 5)
- {
- PenaltyMonster();
- }
- else
- {
- _fisher.sendPacket(SystemMessageId.YOU_CAUGHT_SOMETHING);
- _fisher.addItem("Fishing", _fishId, 1, null, true);
- }
- }
- _fisher.endFishing(win);
- _fisher = null;
- }
-
- protected void aiTask()
- {
- if (_thinking) return;
- _thinking = true;
- _time--;
-
- try
- {
- if (_mode == 1) {
- if (_deceptiveMode == 0)
- _fishCurHp += (int) _regenHp;
- }
- else {
- if (_deceptiveMode == 1)
- _fishCurHp += (int) _regenHp;
- }
- if (_stop == 0) {
- _stop = 1;
- int check = Rnd.get(100);
- if (check >= 70) {
- _mode = _mode == 0 ? 1 : 0;
- }
- if (_isUpperGrade) {
- check = Rnd.get(100);
- if (check >= 90)
- _deceptiveMode = _deceptiveMode == 0 ? 1 : 0;
- }
- }
- else {
- _stop--;
- }
- }
- finally
- {
- _thinking = false;
- ExFishingHpRegen efhr = new ExFishingHpRegen(_fisher, _time, _fishCurHp, _mode, 0, _anim, 0, _deceptiveMode);
- if (_anim != 0)
- _fisher.broadcastPacket(efhr);
- else
- _fisher.sendPacket(efhr);
- }
- }
-
- public void useRealing(int dmg, int pen)
- {
- _anim = 2;
- if (Rnd.get(100) > 90) {
- _fisher.sendPacket(SystemMessageId.FISH_RESISTED_ATTEMPT_TO_BRING_IT_IN);
- _goodUse = 0;
- changeHp(0, pen);
- return;
- }
- if (_fisher == null) return;
- if (_mode == 1)
- {
- if (_deceptiveMode == 0) {
- // Reeling is successful, Damage: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESFUL_S1_DAMAGE);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- if (pen == 50) {
- sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESSFUL_PENALTY_S1);
- sm.addNumber(pen);
- _fisher.sendPacket(sm);
- }
- _goodUse = 1;
- changeHp(dmg , pen);
- }
- else {
- // Reeling failed, Damage: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_REELING_S1_HP_REGAINED);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- _goodUse = 2;
- changeHp(-dmg, pen);
- }
- }
- else
- {
- if (_deceptiveMode == 0) {
- // Reeling failed, Damage: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_REELING_S1_HP_REGAINED);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- _goodUse = 2;
- changeHp(-dmg, pen);
- }
- else {
- // Reeling is successful, Damage: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESFUL_S1_DAMAGE);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- if (pen == 50) {
- sm = SystemMessage.getSystemMessage(SystemMessageId.REELING_SUCCESSFUL_PENALTY_S1);
- sm.addNumber(pen);
- _fisher.sendPacket(sm);
- }
- _goodUse = 1;
- changeHp(dmg , pen);
- }
- }
- }
-
- public void usePomping(int dmg, int pen)
- {
- _anim = 1;
- if (Rnd.get(100) > 90) {
- _fisher.sendPacket(SystemMessageId.FISH_RESISTED_ATTEMPT_TO_BRING_IT_IN);
- _goodUse = 0;
- changeHp(0, pen);
- return;
- }
- if (_fisher == null) return;
- if (_mode == 0)
- {
- if (_deceptiveMode == 0) {
- // Pumping is successful. Damage: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESFUL_S1_DAMAGE);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- if (pen == 50) {
- sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESSFUL_PENALTY_S1);
- sm.addNumber(pen);
- _fisher.sendPacket(sm);
- }
- _goodUse = 1;
- changeHp(dmg, pen);
- }
- else {
- // Pumping failed, Regained: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_PUMPING_S1_HP_REGAINED);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- _goodUse = 2;
- changeHp(-dmg, pen);
- }
- }
- else
- {
- if (_deceptiveMode == 0) {
- // Pumping failed, Regained: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FISH_RESISTED_PUMPING_S1_HP_REGAINED);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- _goodUse = 2;
- changeHp(-dmg, pen);
- }
- else {
- // Pumping is successful. Damage: $s1
- SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESFUL_S1_DAMAGE);
- sm.addNumber(dmg);
- _fisher.sendPacket(sm);
- if (pen == 50) {
- sm = SystemMessage.getSystemMessage(SystemMessageId.PUMPING_SUCCESSFUL_PENALTY_S1);
- sm.addNumber(pen);
- _fisher.sendPacket(sm);
- }
- _goodUse = 1;
- changeHp(dmg, pen);
- }
- }
- }
-
- private void PenaltyMonster()
- {
- int lvl = (int)Math.round(_fisher.getLevel()*0.1);
-
- int npcid;
-
- _fisher.sendPacket(SystemMessageId.YOU_CAUGHT_SOMETHING_SMELLY_THROW_IT_BACK);
- switch (lvl)
- {
- case 0:
- case 1:
- npcid = 18319;
- break;
- case 2:
- npcid = 18320;
- break;
- case 3:
- npcid = 18321;
- break;
- case 4:
- npcid = 18322;
- break;
- case 5:
- npcid = 18323;
- break;
- case 6:
- npcid = 18324;
- break;
- case 7:
- npcid = 18325;
- break;
- case 8:
- case 9:
- npcid = 18326;
- break;
- default:
- npcid = 18319;
- break;
- }
- L2NpcTemplate temp;
- temp = NpcTable.getInstance().getTemplate(npcid);
- if (temp != null)
- {
- try
- {
- L2Spawn spawn = new L2Spawn(temp);
- spawn.setLocx(_fisher.getX());
- spawn.setLocy(_fisher.getY());
- spawn.setLocz(_fisher.getZ()+20);
- spawn.setAmount(1);
- spawn.setHeading(_fisher.getHeading());
- spawn.stopRespawn();
- ((L2PenaltyMonsterInstance)spawn.doSpawn().scheduleDespawn(3*60*1000)).setPlayerToKill(_fisher);
- }
- catch (Exception e)
- {
- // Nothing
- }
- }
- }
- }
|