More handler updates
Minor review in some handlers with regards to multiple MapleCharacter fetching in their contents. Changed to fetch from a variable containing the target character.
This commit is contained in:
@@ -753,6 +753,8 @@ Corrigido AP reset modificando stats de forma err
|
||||
03 Janeiro 2018,
|
||||
Corrigido item megafone permitindo o display de equipamentos não-comercializáveis, mesmo marcados como Untradeable.
|
||||
|
||||
10 - 11 Janeiro 2018,
|
||||
10 - 13 Janeiro 2018,
|
||||
Incrementado portal de MK Castle agora permitindo uso dos 2 itens possíveis.
|
||||
Resolvido alguns logs de erros disparados por mapas nulos no código-fonte.
|
||||
Resolvido alguns logs de erros disparados por mapas nulos no código-fonte.
|
||||
Resolvido pequenos problemas de volatidade (nulos) nas referencias ao jogador em alguns handlers.
|
||||
Corrigido alguns problemas com copyright em alguns arquivos.
|
||||
@@ -1,6 +1,9 @@
|
||||
/*
|
||||
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
|
||||
Copyleft (L) 2017 RonanLana
|
||||
This file is part of the OdinMS Maple Story Server
|
||||
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
|
||||
Matthias Butz <matze@odinms.de>
|
||||
Jan Christian Meyer <vimes@odinms.de>
|
||||
Copyleft (L) 2017 RonanLana (HeavenMS)
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
@@ -8,12 +11,10 @@
|
||||
the Free Software Foundation. You may not use, modify or distribute
|
||||
this program under any other version of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
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 Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
@@ -37,21 +37,19 @@ public final class AutoAggroHandler extends AbstractMaplePacketHandler {
|
||||
MapleMap map = c.getPlayer().getMap();
|
||||
int oid = slea.readInt();
|
||||
|
||||
try {
|
||||
MapleMonster monster = map.getMonsterByOid(oid);
|
||||
if (monster != null && monster.getController() != null) {
|
||||
if (!monster.isControllerHasAggro()) {
|
||||
if (map.getCharacterById(monster.getController().getId()) == null) {
|
||||
monster.switchController(c.getPlayer(), true);
|
||||
} else {
|
||||
monster.switchController(monster.getController(), true);
|
||||
}
|
||||
} else if (map.getCharacterById(monster.getController().getId()) == null) {
|
||||
MapleMonster monster = map.getMonsterByOid(oid);
|
||||
if (monster != null && monster.getController() != null) {
|
||||
if (!monster.isControllerHasAggro()) {
|
||||
if (map.getCharacterById(monster.getController().getId()) == null) {
|
||||
monster.switchController(c.getPlayer(), true);
|
||||
} else {
|
||||
monster.switchController(monster.getController(), true);
|
||||
}
|
||||
} else if (monster != null && monster.getController() == null) {
|
||||
} else if (map.getCharacterById(monster.getController().getId()) == null) {
|
||||
monster.switchController(c.getPlayer(), true);
|
||||
}
|
||||
} catch(NullPointerException npe) {}
|
||||
} else if (monster != null && monster.getController() == null) {
|
||||
monster.switchController(c.getPlayer(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,53 +49,53 @@ import constants.skills.WindArcher;
|
||||
public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
MapleCharacter player = c.getPlayer();
|
||||
player.setPetLootCd(System.currentTimeMillis());
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
chr.setPetLootCd(System.currentTimeMillis());
|
||||
|
||||
/*long timeElapsed = System.currentTimeMillis() - player.getAutobanManager().getLastSpam(8);
|
||||
/*long timeElapsed = System.currentTimeMillis() - chr.getAutobanManager().getLastSpam(8);
|
||||
if(timeElapsed < 300) {
|
||||
AutobanFactory.FAST_ATTACK.alert(player, "Time: " + timeElapsed);
|
||||
AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed);
|
||||
}
|
||||
player.getAutobanManager().spam(8);*/
|
||||
chr.getAutobanManager().spam(8);*/
|
||||
|
||||
AttackInfo attack = parseDamage(slea, player, false, false);
|
||||
if (player.getBuffEffect(MapleBuffStat.MORPH) != null) {
|
||||
if(player.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) {
|
||||
AttackInfo attack = parseDamage(slea, chr, false, false);
|
||||
if (chr.getBuffEffect(MapleBuffStat.MORPH) != null) {
|
||||
if(chr.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) {
|
||||
// How are they attacking when the client won't let them?
|
||||
player.getClient().disconnect(false, false);
|
||||
chr.getClient().disconnect(false, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (c.getPlayer().getDojoEnergy() < 10000 && (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009)) // PE hacking or maybe just lagging
|
||||
if (chr.getDojoEnergy() < 10000 && (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009)) // PE hacking or maybe just lagging
|
||||
return;
|
||||
if (player.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||
player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||
if (chr.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||
chr.setDojoEnergy(chr.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy()));
|
||||
}
|
||||
|
||||
player.getMap().broadcastMessage(player, MaplePacketCreator.closeRangeAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, attack.speed, attack.direction, attack.display), false, true);
|
||||
chr.getMap().broadcastMessage(chr, MaplePacketCreator.closeRangeAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, attack.speed, attack.direction, attack.display), false, true);
|
||||
int numFinisherOrbs = 0;
|
||||
Integer comboBuff = player.getBuffedValue(MapleBuffStat.COMBO);
|
||||
Integer comboBuff = chr.getBuffedValue(MapleBuffStat.COMBO);
|
||||
if (GameConstants.isFinisherSkill(attack.skill)) {
|
||||
if (comboBuff != null) {
|
||||
numFinisherOrbs = comboBuff.intValue() - 1;
|
||||
}
|
||||
player.handleOrbconsume();
|
||||
chr.handleOrbconsume();
|
||||
} else if (attack.numAttacked > 0) {
|
||||
if (attack.skill != 1111008 && comboBuff != null) {
|
||||
int orbcount = player.getBuffedValue(MapleBuffStat.COMBO);
|
||||
int oid = player.isCygnus() ? DawnWarrior.COMBO : Crusader.COMBO;
|
||||
int advcomboid = player.isCygnus() ? DawnWarrior.ADVANCED_COMBO : Hero.ADVANCED_COMBO;
|
||||
int orbcount = chr.getBuffedValue(MapleBuffStat.COMBO);
|
||||
int oid = chr.isCygnus() ? DawnWarrior.COMBO : Crusader.COMBO;
|
||||
int advcomboid = chr.isCygnus() ? DawnWarrior.ADVANCED_COMBO : Hero.ADVANCED_COMBO;
|
||||
Skill combo = SkillFactory.getSkill(oid);
|
||||
Skill advcombo = SkillFactory.getSkill(advcomboid);
|
||||
MapleStatEffect ceffect;
|
||||
int advComboSkillLevel = player.getSkillLevel(advcombo);
|
||||
int advComboSkillLevel = chr.getSkillLevel(advcombo);
|
||||
if (advComboSkillLevel > 0) {
|
||||
ceffect = advcombo.getEffect(advComboSkillLevel);
|
||||
} else {
|
||||
int comboLv = player.getSkillLevel(combo);
|
||||
if(comboLv <= 0 || player.isGM()) comboLv = SkillFactory.getSkill(oid).getMaxLevel();
|
||||
int comboLv = chr.getSkillLevel(combo);
|
||||
if(comboLv <= 0 || chr.isGM()) comboLv = SkillFactory.getSkill(oid).getMaxLevel();
|
||||
|
||||
if(comboLv > 0) ceffect = combo.getEffect(comboLv);
|
||||
else ceffect = null;
|
||||
@@ -109,20 +109,20 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
|
||||
}
|
||||
}
|
||||
|
||||
int olv = player.getSkillLevel(oid);
|
||||
int olv = chr.getSkillLevel(oid);
|
||||
if(olv <= 0) olv = SkillFactory.getSkill(oid).getMaxLevel();
|
||||
|
||||
int duration = combo.getEffect(olv).getDuration();
|
||||
List<Pair<MapleBuffStat, Integer>> stat = Collections.singletonList(new Pair<>(MapleBuffStat.COMBO, neworbcount));
|
||||
player.setBuffedValue(MapleBuffStat.COMBO, neworbcount);
|
||||
duration -= (int) (System.currentTimeMillis() - player.getBuffedStarttime(MapleBuffStat.COMBO));
|
||||
chr.setBuffedValue(MapleBuffStat.COMBO, neworbcount);
|
||||
duration -= (int) (System.currentTimeMillis() - chr.getBuffedStarttime(MapleBuffStat.COMBO));
|
||||
c.announce(MaplePacketCreator.giveBuff(oid, duration, stat));
|
||||
player.getMap().broadcastMessage(player, MaplePacketCreator.giveForeignBuff(player.getId(), stat), false);
|
||||
chr.getMap().broadcastMessage(chr, MaplePacketCreator.giveForeignBuff(chr.getId(), stat), false);
|
||||
}
|
||||
}
|
||||
} else if (player.getSkillLevel(player.isCygnus() ? SkillFactory.getSkill(15100004) : SkillFactory.getSkill(5110001)) > 0 && (player.getJob().isA(MapleJob.MARAUDER) || player.getJob().isA(MapleJob.THUNDERBREAKER2))) {
|
||||
} else if (chr.getSkillLevel(chr.isCygnus() ? SkillFactory.getSkill(15100004) : SkillFactory.getSkill(5110001)) > 0 && (chr.getJob().isA(MapleJob.MARAUDER) || chr.getJob().isA(MapleJob.THUNDERBREAKER2))) {
|
||||
for (int i = 0; i < attack.numAttacked; i++) {
|
||||
player.handleEnergyChargeGain();
|
||||
chr.handleEnergyChargeGain();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -132,60 +132,60 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler {
|
||||
if (dmgIt.hasNext()) {
|
||||
totDamageToOneMonster = dmgIt.next().get(0).intValue();
|
||||
}
|
||||
int remainingHP = player.getHp() - totDamageToOneMonster * attack.getAttackEffect(player, null).getX() / 100;
|
||||
int remainingHP = chr.getHp() - totDamageToOneMonster * attack.getAttackEffect(chr, null).getX() / 100;
|
||||
if (remainingHP > 1) {
|
||||
player.setHp(remainingHP);
|
||||
chr.setHp(remainingHP);
|
||||
} else {
|
||||
player.setHp(1);
|
||||
chr.setHp(1);
|
||||
}
|
||||
player.updateSingleStat(MapleStat.HP, player.getHp());
|
||||
player.checkBerserk(player.isHidden());
|
||||
chr.updateSingleStat(MapleStat.HP, chr.getHp());
|
||||
chr.checkBerserk(chr.isHidden());
|
||||
}
|
||||
if (attack.numAttacked > 0 && attack.skill == 1211002) {
|
||||
boolean advcharge_prob = false;
|
||||
int advcharge_level = player.getSkillLevel(SkillFactory.getSkill(1220010));
|
||||
int advcharge_level = chr.getSkillLevel(SkillFactory.getSkill(1220010));
|
||||
if (advcharge_level > 0) {
|
||||
advcharge_prob = SkillFactory.getSkill(1220010).getEffect(advcharge_level).makeChanceResult();
|
||||
}
|
||||
if (!advcharge_prob) {
|
||||
player.cancelEffectFromBuffStat(MapleBuffStat.WK_CHARGE);
|
||||
chr.cancelEffectFromBuffStat(MapleBuffStat.WK_CHARGE);
|
||||
}
|
||||
}
|
||||
int attackCount = 1;
|
||||
if (attack.skill != 0) {
|
||||
attackCount = attack.getAttackEffect(player, null).getAttackCount();
|
||||
attackCount = attack.getAttackEffect(chr, null).getAttackCount();
|
||||
}
|
||||
if (numFinisherOrbs == 0 && GameConstants.isFinisherSkill(attack.skill)) {
|
||||
return;
|
||||
}
|
||||
if (attack.skill % 10000000 == 1009) { // bamboo
|
||||
if (c.getPlayer().getDojoEnergy() < 10000) { // PE hacking or maybe just lagging
|
||||
if (chr.getDojoEnergy() < 10000) { // PE hacking or maybe just lagging
|
||||
return;
|
||||
}
|
||||
|
||||
player.setDojoEnergy(0);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||
chr.setDojoEnergy(0);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy()));
|
||||
c.announce(MaplePacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset."));
|
||||
} else if (attack.skill > 0) {
|
||||
Skill skill = SkillFactory.getSkill(attack.skill);
|
||||
MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill));
|
||||
MapleStatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill));
|
||||
if (effect_.getCooldown() > 0) {
|
||||
if (player.skillIsCooling(attack.skill)) {
|
||||
if (chr.skillIsCooling(attack.skill)) {
|
||||
return;
|
||||
} else {
|
||||
c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown()));
|
||||
player.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000);
|
||||
chr.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((player.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 || player.getSkillLevel(SkillFactory.getSkill(Rogue.DARK_SIGHT)) > 0) && player.getBuffedValue(MapleBuffStat.DARKSIGHT) != null) {// && player.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004
|
||||
player.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT);
|
||||
player.cancelBuffStats(MapleBuffStat.DARKSIGHT);
|
||||
} else if(player.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && player.getBuffedValue(MapleBuffStat.WIND_WALK) != null) {
|
||||
player.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK);
|
||||
player.cancelBuffStats(MapleBuffStat.WIND_WALK);
|
||||
if ((chr.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 || chr.getSkillLevel(SkillFactory.getSkill(Rogue.DARK_SIGHT)) > 0) && chr.getBuffedValue(MapleBuffStat.DARKSIGHT) != null) {// && chr.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004
|
||||
chr.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT);
|
||||
chr.cancelBuffStats(MapleBuffStat.DARKSIGHT);
|
||||
} else if(chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(MapleBuffStat.WIND_WALK) != null) {
|
||||
chr.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK);
|
||||
chr.cancelBuffStats(MapleBuffStat.WIND_WALK);
|
||||
}
|
||||
|
||||
applyAttack(attack, player, attackCount);
|
||||
applyAttack(attack, chr, attackCount);
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,6 @@
|
||||
package net.server.channel.handlers;
|
||||
|
||||
import server.MapleStatEffect;
|
||||
import server.TimerManager;
|
||||
import tools.MaplePacketCreator;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
import client.MapleBuffStat;
|
||||
@@ -39,51 +38,51 @@ import constants.skills.ILArchMage;
|
||||
public final class MagicDamageHandler extends AbstractDealDamageHandler {
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
MapleCharacter player = c.getPlayer();
|
||||
player.setPetLootCd(System.currentTimeMillis());
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
chr.setPetLootCd(System.currentTimeMillis());
|
||||
|
||||
/*long timeElapsed = System.currentTimeMillis() - player.getAutobanManager().getLastSpam(8);
|
||||
/*long timeElapsed = System.currentTimeMillis() - chr.getAutobanManager().getLastSpam(8);
|
||||
if(timeElapsed < 300) {
|
||||
AutobanFactory.FAST_ATTACK.alert(player, "Time: " + timeElapsed);
|
||||
AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed);
|
||||
}
|
||||
player.getAutobanManager().spam(8);*/
|
||||
chr.getAutobanManager().spam(8);*/
|
||||
|
||||
AttackInfo attack = parseDamage(slea, player, false, true);
|
||||
AttackInfo attack = parseDamage(slea, chr, false, true);
|
||||
|
||||
if (player.getBuffEffect(MapleBuffStat.MORPH) != null) {
|
||||
if(player.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) {
|
||||
if (chr.getBuffEffect(MapleBuffStat.MORPH) != null) {
|
||||
if(chr.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) {
|
||||
// How are they attacking when the client won't let them?
|
||||
player.getClient().disconnect(false, false);
|
||||
chr.getClient().disconnect(false, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||
player.setDojoEnergy(player.getDojoEnergy() + + ServerConstants.DOJO_ENERGY_ATK);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||
if (chr.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||
chr.setDojoEnergy(chr.getDojoEnergy() + + ServerConstants.DOJO_ENERGY_ATK);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy()));
|
||||
}
|
||||
|
||||
int charge = (attack.skill == Evan.FIRE_BREATH || attack.skill == Evan.ICE_BREATH || attack.skill == FPArchMage.BIG_BANG || attack.skill == ILArchMage.BIG_BANG || attack.skill == Bishop.BIG_BANG) ? attack.charge : -1;
|
||||
byte[] packet = MaplePacketCreator.magicAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display);
|
||||
byte[] packet = MaplePacketCreator.magicAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display);
|
||||
|
||||
player.getMap().broadcastMessage(player, packet, false, true);
|
||||
MapleStatEffect effect = attack.getAttackEffect(player, null);
|
||||
chr.getMap().broadcastMessage(chr, packet, false, true);
|
||||
MapleStatEffect effect = attack.getAttackEffect(chr, null);
|
||||
Skill skill = SkillFactory.getSkill(attack.skill);
|
||||
MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill));
|
||||
MapleStatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill));
|
||||
if (effect_.getCooldown() > 0) {
|
||||
if (player.skillIsCooling(attack.skill)) {
|
||||
if (chr.skillIsCooling(attack.skill)) {
|
||||
return;
|
||||
} else {
|
||||
c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown()));
|
||||
player.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000);
|
||||
chr.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000);
|
||||
}
|
||||
}
|
||||
applyAttack(attack, player, effect.getAttackCount());
|
||||
Skill eaterSkill = SkillFactory.getSkill((player.getJob().getId() - (player.getJob().getId() % 10)) * 10000);// MP Eater, works with right job
|
||||
int eaterLevel = player.getSkillLevel(eaterSkill);
|
||||
applyAttack(attack, chr, effect.getAttackCount());
|
||||
Skill eaterSkill = SkillFactory.getSkill((chr.getJob().getId() - (chr.getJob().getId() % 10)) * 10000);// MP Eater, works with right job
|
||||
int eaterLevel = chr.getSkillLevel(eaterSkill);
|
||||
if (eaterLevel > 0) {
|
||||
for (Integer singleDamage : attack.allDamage.keySet()) {
|
||||
eaterSkill.getEffect(eaterLevel).applyPassive(player, player.getMap().getMapObject(singleDamage), 0);
|
||||
eaterSkill.getEffect(eaterLevel).applyPassive(chr, chr.getMap().getMapObject(singleDamage), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,71 +46,69 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
|
||||
|
||||
int objectid = slea.readInt();
|
||||
short moveid = slea.readShort();
|
||||
|
||||
try {
|
||||
MapleMapObject mmo = map.getMapObject(objectid);
|
||||
if (mmo == null || mmo.getType() != MapleMapObjectType.MONSTER) {
|
||||
|
||||
MapleMapObject mmo = map.getMapObject(objectid);
|
||||
if (mmo == null || mmo.getType() != MapleMapObjectType.MONSTER) {
|
||||
return;
|
||||
}
|
||||
MapleMonster monster = (MapleMonster) mmo;
|
||||
List<LifeMovementFragment> res;
|
||||
byte skillByte = slea.readByte();
|
||||
byte skill = slea.readByte();
|
||||
int skill_1 = slea.readByte() & 0xFF;
|
||||
byte skill_2 = slea.readByte();
|
||||
byte skill_3 = slea.readByte();
|
||||
byte skill_4 = slea.readByte();
|
||||
slea.read(8);
|
||||
MobSkill toUse = null;
|
||||
if (skillByte == 1 && monster.getNoSkills() > 0) {
|
||||
int random = Randomizer.nextInt(monster.getNoSkills());
|
||||
Pair<Integer, Integer> skillToUse = monster.getSkills().get(random);
|
||||
toUse = MobSkillFactory.getMobSkill(skillToUse.getLeft(), skillToUse.getRight());
|
||||
int percHpLeft = (monster.getHp() / monster.getMaxHp()) * 100;
|
||||
if (toUse.getHP() < percHpLeft || !monster.canUseSkill(toUse)) {
|
||||
toUse = null;
|
||||
}
|
||||
}
|
||||
if ((skill_1 >= 100 && skill_1 <= 200) && monster.hasSkill(skill_1, skill_2)) {
|
||||
MobSkill skillData = MobSkillFactory.getMobSkill(skill_1, skill_2);
|
||||
if (skillData != null && monster.canUseSkill(skillData)) {
|
||||
skillData.applyEffect(c.getPlayer(), monster, true, banishPlayers);
|
||||
}
|
||||
}
|
||||
slea.readByte();
|
||||
slea.readInt(); // whatever
|
||||
short start_x = slea.readShort(); // hmm.. startpos?
|
||||
short start_y = slea.readShort(); // hmm...
|
||||
Point startPos = new Point(start_x, start_y);
|
||||
res = parseMovement(slea);
|
||||
if (monster.getController() != c.getPlayer()) {
|
||||
if (monster.isAttackedBy(c.getPlayer())) {// aggro and controller change
|
||||
monster.switchController(c.getPlayer(), true);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
MapleMonster monster = (MapleMonster) mmo;
|
||||
List<LifeMovementFragment> res;
|
||||
byte skillByte = slea.readByte();
|
||||
byte skill = slea.readByte();
|
||||
int skill_1 = slea.readByte() & 0xFF;
|
||||
byte skill_2 = slea.readByte();
|
||||
byte skill_3 = slea.readByte();
|
||||
byte skill_4 = slea.readByte();
|
||||
slea.read(8);
|
||||
MobSkill toUse = null;
|
||||
if (skillByte == 1 && monster.getNoSkills() > 0) {
|
||||
int random = Randomizer.nextInt(monster.getNoSkills());
|
||||
Pair<Integer, Integer> skillToUse = monster.getSkills().get(random);
|
||||
toUse = MobSkillFactory.getMobSkill(skillToUse.getLeft(), skillToUse.getRight());
|
||||
int percHpLeft = (monster.getHp() / monster.getMaxHp()) * 100;
|
||||
if (toUse.getHP() < percHpLeft || !monster.canUseSkill(toUse)) {
|
||||
toUse = null;
|
||||
}
|
||||
}
|
||||
if ((skill_1 >= 100 && skill_1 <= 200) && monster.hasSkill(skill_1, skill_2)) {
|
||||
MobSkill skillData = MobSkillFactory.getMobSkill(skill_1, skill_2);
|
||||
if (skillData != null && monster.canUseSkill(skillData)) {
|
||||
skillData.applyEffect(c.getPlayer(), monster, true, banishPlayers);
|
||||
}
|
||||
}
|
||||
slea.readByte();
|
||||
slea.readInt(); // whatever
|
||||
short start_x = slea.readShort(); // hmm.. startpos?
|
||||
short start_y = slea.readShort(); // hmm...
|
||||
Point startPos = new Point(start_x, start_y);
|
||||
res = parseMovement(slea);
|
||||
if (monster.getController() != c.getPlayer()) {
|
||||
if (monster.isAttackedBy(c.getPlayer())) {// aggro and controller change
|
||||
monster.switchController(c.getPlayer(), true);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
} else if (skill == -1 && monster.isControllerKnowsAboutAggro() && !monster.isMobile() && !monster.isFirstAttack()) {
|
||||
monster.setControllerHasAggro(false);
|
||||
monster.setControllerKnowsAboutAggro(false);
|
||||
}
|
||||
boolean aggro = monster.isControllerHasAggro();
|
||||
if (toUse != null) {
|
||||
c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro, toUse.getSkillId(), toUse.getSkillLevel()));
|
||||
} else {
|
||||
c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro));
|
||||
}
|
||||
if (aggro) {
|
||||
monster.setControllerKnowsAboutAggro(true);
|
||||
}
|
||||
if (res != null) {
|
||||
map.broadcastMessage(c.getPlayer(), MaplePacketCreator.moveMonster(skillByte, skill, skill_1, skill_2, skill_3, skill_4, objectid, startPos, res), monster.getPosition());
|
||||
updatePosition(res, monster, -1);
|
||||
map.moveMonster(monster, monster.getPosition());
|
||||
}
|
||||
} else if (skill == -1 && monster.isControllerKnowsAboutAggro() && !monster.isMobile() && !monster.isFirstAttack()) {
|
||||
monster.setControllerHasAggro(false);
|
||||
monster.setControllerKnowsAboutAggro(false);
|
||||
}
|
||||
boolean aggro = monster.isControllerHasAggro();
|
||||
if (toUse != null) {
|
||||
c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro, toUse.getSkillId(), toUse.getSkillLevel()));
|
||||
} else {
|
||||
c.announce(MaplePacketCreator.moveMonsterResponse(objectid, moveid, monster.getMp(), aggro));
|
||||
}
|
||||
if (aggro) {
|
||||
monster.setControllerKnowsAboutAggro(true);
|
||||
}
|
||||
if (res != null) {
|
||||
map.broadcastMessage(c.getPlayer(), MaplePacketCreator.moveMonster(skillByte, skill, skill_1, skill_2, skill_3, skill_4, objectid, startPos, res), monster.getPosition());
|
||||
updatePosition(res, monster, -1);
|
||||
map.moveMonster(monster, monster.getPosition());
|
||||
}
|
||||
|
||||
for (MapleCharacter chr : banishPlayers) {
|
||||
chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg());
|
||||
}
|
||||
} catch(NullPointerException npe) {}
|
||||
for (MapleCharacter chr : banishPlayers) {
|
||||
chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
/*
|
||||
This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server
|
||||
Copyleft (L) 2017 RonanLana
|
||||
This file is part of the OdinMS Maple Story Server
|
||||
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
|
||||
Matthias Butz <matze@odinms.de>
|
||||
Jan Christian Meyer <vimes@odinms.de>
|
||||
Copyleft (L) 2017 RonanLana (HeavenMS)
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
@@ -8,12 +11,10 @@
|
||||
the Free Software Foundation. You may not use, modify or distribute
|
||||
this program under any other version of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
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 Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -34,7 +35,7 @@ import constants.ServerConstants;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
* @author Ronan (multi-pot consumption feature)
|
||||
*/
|
||||
public final class PetAutoPotHandler extends AbstractMaplePacketHandler {
|
||||
@Override
|
||||
@@ -69,14 +70,12 @@ public final class PetAutoPotHandler extends AbstractMaplePacketHandler {
|
||||
if(toUse != null) {
|
||||
MapleStatEffect stat = MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId());
|
||||
|
||||
if (toUse.getQuantity() <= 0) return;
|
||||
if (toUse.getQuantity() <= 0 || toUse.getItemId() != itemId) {
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
return;
|
||||
}
|
||||
|
||||
do {
|
||||
if (toUse.getItemId() != itemId) {
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
return;
|
||||
}
|
||||
|
||||
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false);
|
||||
stat.applyTo(chr);
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ package net.server.channel.handlers;
|
||||
import server.MapleInventoryManipulator;
|
||||
import server.MapleItemInformationProvider;
|
||||
import server.MapleStatEffect;
|
||||
import server.TimerManager;
|
||||
import tools.MaplePacketCreator;
|
||||
import tools.Randomizer;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
@@ -51,47 +50,47 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
|
||||
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
MapleCharacter player = c.getPlayer();
|
||||
player.setPetLootCd(System.currentTimeMillis());
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
chr.setPetLootCd(System.currentTimeMillis());
|
||||
|
||||
/*long timeElapsed = System.currentTimeMillis() - player.getAutobanManager().getLastSpam(8);
|
||||
/*long timeElapsed = System.currentTimeMillis() - chr.getAutobanManager().getLastSpam(8);
|
||||
if(timeElapsed < 300) {
|
||||
AutobanFactory.FAST_ATTACK.alert(player, "Time: " + timeElapsed);
|
||||
AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed);
|
||||
}
|
||||
player.getAutobanManager().spam(8);*/
|
||||
chr.getAutobanManager().spam(8);*/
|
||||
|
||||
AttackInfo attack = parseDamage(slea, player, true, false);
|
||||
AttackInfo attack = parseDamage(slea, chr, true, false);
|
||||
|
||||
if (player.getBuffEffect(MapleBuffStat.MORPH) != null) {
|
||||
if(player.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) {
|
||||
if (chr.getBuffEffect(MapleBuffStat.MORPH) != null) {
|
||||
if(chr.getBuffEffect(MapleBuffStat.MORPH).isMorphWithoutAttack()) {
|
||||
// How are they attacking when the client won't let them?
|
||||
player.getClient().disconnect(false, false);
|
||||
chr.getClient().disconnect(false, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||
player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||
if (chr.getMap().isDojoMap() && attack.numAttacked > 0) {
|
||||
chr.setDojoEnergy(chr.getDojoEnergy() + ServerConstants.DOJO_ENERGY_ATK);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy()));
|
||||
}
|
||||
|
||||
if (attack.skill == Buccaneer.ENERGY_ORB || attack.skill == ThunderBreaker.SPARK || attack.skill == Shadower.TAUNT || attack.skill == NightLord.TAUNT) {
|
||||
player.getMap().broadcastMessage(player, MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false);
|
||||
applyAttack(attack, player, 1);
|
||||
chr.getMap().broadcastMessage(chr, MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false);
|
||||
applyAttack(attack, chr, 1);
|
||||
} else if (attack.skill == Aran.COMBO_SMASH || attack.skill == Aran.COMBO_FENRIR || attack.skill == Aran.COMBO_TEMPEST) {
|
||||
player.getMap().broadcastMessage(player, MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false);
|
||||
if (attack.skill == Aran.COMBO_SMASH && player.getCombo() >= 30) {
|
||||
player.setCombo((short) 0);
|
||||
applyAttack(attack, player, 1);
|
||||
} else if (attack.skill == Aran.COMBO_FENRIR && player.getCombo() >= 100) {
|
||||
player.setCombo((short) 0);
|
||||
applyAttack(attack, player, 2);
|
||||
} else if (attack.skill == Aran.COMBO_TEMPEST && player.getCombo() >= 200) {
|
||||
player.setCombo((short) 0);
|
||||
applyAttack(attack, player, 4);
|
||||
chr.getMap().broadcastMessage(chr, MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false);
|
||||
if (attack.skill == Aran.COMBO_SMASH && chr.getCombo() >= 30) {
|
||||
chr.setCombo((short) 0);
|
||||
applyAttack(attack, chr, 1);
|
||||
} else if (attack.skill == Aran.COMBO_FENRIR && chr.getCombo() >= 100) {
|
||||
chr.setCombo((short) 0);
|
||||
applyAttack(attack, chr, 2);
|
||||
} else if (attack.skill == Aran.COMBO_TEMPEST && chr.getCombo() >= 200) {
|
||||
chr.setCombo((short) 0);
|
||||
applyAttack(attack, chr, 4);
|
||||
}
|
||||
} else {
|
||||
Item weapon = player.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -11);
|
||||
Item weapon = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -11);
|
||||
MapleWeaponType type = MapleItemInformationProvider.getInstance().getWeaponType(weapon.getItemId());
|
||||
if (type == MapleWeaponType.NOT_A_WEAPON) {
|
||||
return;
|
||||
@@ -101,17 +100,17 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
|
||||
byte bulletCount = 1;
|
||||
MapleStatEffect effect = null;
|
||||
if (attack.skill != 0) {
|
||||
effect = attack.getAttackEffect(player, null);
|
||||
effect = attack.getAttackEffect(chr, null);
|
||||
bulletCount = effect.getBulletCount();
|
||||
if (effect.getCooldown() > 0) {
|
||||
c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect.getCooldown()));
|
||||
}
|
||||
}
|
||||
boolean hasShadowPartner = player.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null;
|
||||
boolean hasShadowPartner = chr.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null;
|
||||
if (hasShadowPartner) {
|
||||
bulletCount *= 2;
|
||||
}
|
||||
MapleInventory inv = player.getInventory(MapleInventoryType.USE);
|
||||
MapleInventory inv = chr.getInventory(MapleInventoryType.USE);
|
||||
for (short i = 1; i <= inv.getSlotLimit(); i++) {
|
||||
Item item = inv.getItem(i);
|
||||
if (item != null) {
|
||||
@@ -122,18 +121,18 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
|
||||
boolean cbow = ItemConstants.isArrowForCrossBow(id);
|
||||
if (item.getQuantity() >= bulletCount) { //Fixes the bug where you can't use your last arrow.
|
||||
if (type == MapleWeaponType.CLAW && ItemConstants.isThrowingStar(id) && weapon.getItemId() != 1472063) {
|
||||
if (((id == 2070007 || id == 2070018) && player.getLevel() < 70) || (id == 2070016 && player.getLevel() < 50)) {
|
||||
if (((id == 2070007 || id == 2070018) && chr.getLevel() < 70) || (id == 2070016 && chr.getLevel() < 50)) {
|
||||
} else {
|
||||
projectile = id;
|
||||
break;
|
||||
}
|
||||
} else if ((type == MapleWeaponType.GUN && ItemConstants.isBullet(id))) {
|
||||
if (id == 2331000 && id == 2332000) {
|
||||
if (player.getLevel() > 69) {
|
||||
if (chr.getLevel() > 69) {
|
||||
projectile = id;
|
||||
break;
|
||||
}
|
||||
} else if (player.getLevel() > (id % 10) * 20 + 9) {
|
||||
} else if (chr.getLevel() > (id % 10) * 20 + 9) {
|
||||
projectile = id;
|
||||
break;
|
||||
}
|
||||
@@ -144,8 +143,8 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
boolean soulArrow = player.getBuffedValue(MapleBuffStat.SOULARROW) != null;
|
||||
boolean shadowClaw = player.getBuffedValue(MapleBuffStat.SHADOW_CLAW) != null;
|
||||
boolean soulArrow = chr.getBuffedValue(MapleBuffStat.SOULARROW) != null;
|
||||
boolean shadowClaw = chr.getBuffedValue(MapleBuffStat.SHADOW_CLAW) != null;
|
||||
if (projectile != 0) {
|
||||
if (!soulArrow && !shadowClaw && attack.skill != 11101004 && attack.skill != 15111007 && attack.skill != 14101006) {
|
||||
byte bulletConsume = bulletCount;
|
||||
@@ -161,7 +160,7 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
|
||||
if (projectile != 0 || soulArrow || attack.skill == 11101004 || attack.skill == 15111007 || attack.skill == 14101006) {
|
||||
int visProjectile = projectile; //visible projectile sent to players
|
||||
if (ItemConstants.isThrowingStar(projectile)) {
|
||||
MapleInventory cash = player.getInventory(MapleInventoryType.CASH);
|
||||
MapleInventory cash = chr.getInventory(MapleInventoryType.CASH);
|
||||
for (int i = 1; i <= cash.getSlotLimit(); i++) { // impose order...
|
||||
Item item = cash.getItem((short) i);
|
||||
if (item != null) {
|
||||
@@ -181,46 +180,46 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler {
|
||||
case 3221001: // Pierce
|
||||
case 5221004: // Rapid Fire
|
||||
case 13111002: // KoC Hurricane
|
||||
packet = MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.rangedirection, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display);
|
||||
packet = MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.rangedirection, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display);
|
||||
break;
|
||||
default:
|
||||
packet = MaplePacketCreator.rangedAttack(player, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display);
|
||||
packet = MaplePacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, visProjectile, attack.allDamage, attack.speed, attack.direction, attack.display);
|
||||
break;
|
||||
}
|
||||
player.getMap().broadcastMessage(player, packet, false, true);
|
||||
chr.getMap().broadcastMessage(chr, packet, false, true);
|
||||
if (effect != null) {
|
||||
int money = effect.getMoneyCon();
|
||||
if (money != 0) {
|
||||
int moneyMod = money / 2;
|
||||
money += Randomizer.nextInt(moneyMod);
|
||||
if (money > player.getMeso()) {
|
||||
money = player.getMeso();
|
||||
if (money > chr.getMeso()) {
|
||||
money = chr.getMeso();
|
||||
}
|
||||
player.gainMeso(-money, false);
|
||||
chr.gainMeso(-money, false);
|
||||
}
|
||||
}
|
||||
if (attack.skill != 0) {
|
||||
Skill skill = SkillFactory.getSkill(attack.skill);
|
||||
MapleStatEffect effect_ = skill.getEffect(player.getSkillLevel(skill));
|
||||
MapleStatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill));
|
||||
if (effect_.getCooldown() > 0) {
|
||||
if (player.skillIsCooling(attack.skill)) {
|
||||
if (chr.skillIsCooling(attack.skill)) {
|
||||
return;
|
||||
} else {
|
||||
c.announce(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown()));
|
||||
player.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000);
|
||||
chr.addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 && player.getBuffedValue(MapleBuffStat.DARKSIGHT) != null && attack.numAttacked > 0 && player.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004) {
|
||||
player.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT);
|
||||
player.cancelBuffStats(MapleBuffStat.DARKSIGHT);
|
||||
} else if(player.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && player.getBuffedValue(MapleBuffStat.WIND_WALK) != null && attack.numAttacked > 0) {
|
||||
player.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK);
|
||||
player.cancelBuffStats(MapleBuffStat.WIND_WALK);
|
||||
if (chr.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 && chr.getBuffedValue(MapleBuffStat.DARKSIGHT) != null && attack.numAttacked > 0 && chr.getBuffSource(MapleBuffStat.DARKSIGHT) != 9101004) {
|
||||
chr.cancelEffectFromBuffStat(MapleBuffStat.DARKSIGHT);
|
||||
chr.cancelBuffStats(MapleBuffStat.DARKSIGHT);
|
||||
} else if(chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(MapleBuffStat.WIND_WALK) != null && attack.numAttacked > 0) {
|
||||
chr.cancelEffectFromBuffStat(MapleBuffStat.WIND_WALK);
|
||||
chr.cancelBuffStats(MapleBuffStat.WIND_WALK);
|
||||
}
|
||||
|
||||
applyAttack(attack, player, bulletCount);
|
||||
applyAttack(attack, chr, bulletCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,11 +22,9 @@
|
||||
package net.server.channel.handlers;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
|
||||
import net.AbstractMaplePacketHandler;
|
||||
import server.MapleStatEffect;
|
||||
import server.TimerManager;
|
||||
import server.life.MapleMonster;
|
||||
import tools.FilePrinter;
|
||||
import tools.MaplePacketCreator;
|
||||
@@ -54,25 +52,27 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler {
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
chr.getAutobanManager().setTimestamp(4, slea.readInt(), 3);
|
||||
int skillid = slea.readInt();
|
||||
|
||||
/*
|
||||
if ((!GameConstants.isPQSkillMap(c.getPlayer().getMapId()) && GameConstants.isPqSkill(skillid)) || (!c.getPlayer().isGM() && GameConstants.isGMSkills(skillid)) || (!GameConstants.isInJobTree(skillid, c.getPlayer().getJob().getId()) && !c.getPlayer().isGM())) {
|
||||
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit skills.");
|
||||
FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skillid + " without it being in their job.\r\n");
|
||||
if ((!GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(skillid)) || (!chr.isGM() && GameConstants.isGMSkills(skillid)) || (!GameConstants.isInJobTree(skillid, chr.getJob().getId()) && !chr.isGM())) {
|
||||
AutobanFactory.PACKET_EDIT.alert(chr, chr.getName() + " tried to packet edit skills.");
|
||||
FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " tried to use skill " + skillid + " without it being in their job.\r\n");
|
||||
c.disconnect(true, false);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
*/
|
||||
|
||||
Point pos = null;
|
||||
int __skillLevel = slea.readByte();
|
||||
Skill skill = SkillFactory.getSkill(skillid);
|
||||
int skillLevel = chr.getSkillLevel(skill);
|
||||
if (skillid % 10000000 == 1010 || skillid % 10000000 == 1011) {
|
||||
if (c.getPlayer().getDojoEnergy() < 10000) { // PE hacking or maybe just lagging
|
||||
if (chr.getDojoEnergy() < 10000) { // PE hacking or maybe just lagging
|
||||
return;
|
||||
}
|
||||
skillLevel = 1;
|
||||
c.getPlayer().setDojoEnergy(0);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", c.getPlayer().getDojoEnergy()));
|
||||
chr.setDojoEnergy(0);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy()));
|
||||
c.announce(MaplePacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset."));
|
||||
}
|
||||
if (skillLevel == 0 || skillLevel != __skillLevel) return;
|
||||
@@ -93,16 +93,16 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler {
|
||||
for (int i = 0; i < num; i++) {
|
||||
mobId = slea.readInt();
|
||||
success = slea.readByte();
|
||||
chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showMagnet(mobId, success), false);
|
||||
chr.getMap().broadcastMessage(chr, MaplePacketCreator.showMagnet(mobId, success), false);
|
||||
MapleMonster monster = chr.getMap().getMonsterByOid(mobId);
|
||||
if (monster != null) {
|
||||
if (!monster.isBoss()) {
|
||||
monster.switchController(c.getPlayer(), monster.isControllerHasAggro());
|
||||
monster.switchController(chr, monster.isControllerHasAggro());
|
||||
}
|
||||
}
|
||||
}
|
||||
byte direction = slea.readByte();
|
||||
chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid), direction), false);
|
||||
chr.getMap().broadcastMessage(chr, MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid), direction), false);
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
return;
|
||||
} else if (skillid == Brawler.MP_RECOVERY) {// MP Recovery
|
||||
@@ -116,7 +116,7 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler {
|
||||
chr.updateSingleStat(MapleStat.MP, chr.getMp());
|
||||
} else if (skillid == Priest.DISPEL || skillid == SuperGM.HEAL_PLUS_DISPEL) {
|
||||
slea.skip((skillid == Priest.DISPEL) ? 10 : 11);
|
||||
chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid)), false);
|
||||
chr.getMap().broadcastMessage(chr, MaplePacketCreator.showBuffeffect(chr.getId(), skillid, chr.getSkillLevel(skillid)), false);
|
||||
} else if (skillid % 10000000 == 1004) {
|
||||
slea.readShort();
|
||||
}
|
||||
@@ -126,11 +126,11 @@ public final class SpecialMoveHandler extends AbstractMaplePacketHandler {
|
||||
}
|
||||
if (chr.isAlive()) {
|
||||
if (skill.getId() != Priest.MYSTIC_DOOR) {
|
||||
skill.getEffect(skillLevel).applyTo(c.getPlayer(), pos);
|
||||
skill.getEffect(skillLevel).applyTo(chr, pos);
|
||||
} else if(chr.canDoor()) {
|
||||
//update door lists
|
||||
chr.cancelMagicDoor();
|
||||
skill.getEffect(skillLevel).applyTo(c.getPlayer(), pos);
|
||||
skill.getEffect(skillLevel).applyTo(chr, pos);
|
||||
} else {
|
||||
chr.message("Please wait 5 seconds before casting Mystic Door again.");
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
|
||||
@@ -28,12 +28,10 @@ import client.SkillFactory;
|
||||
import client.status.MonsterStatusEffect;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import net.AbstractMaplePacketHandler;
|
||||
import server.MapleStatEffect;
|
||||
import server.life.MapleMonster;
|
||||
import server.maps.MapleSummon;
|
||||
import tools.MaplePacketCreator;
|
||||
import tools.data.input.LittleEndianAccessor;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
|
||||
public final class SummonDamageHandler extends AbstractDealDamageHandler {
|
||||
|
||||
@@ -63,7 +63,7 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
List<MapleCharacter> banishPlayers = new ArrayList<>();
|
||||
|
||||
MapleCharacter player = c.getPlayer();
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
slea.readInt();
|
||||
byte damagefrom = slea.readByte();
|
||||
slea.readByte(); //Element
|
||||
@@ -73,7 +73,7 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
|
||||
boolean is_pgmr = false, is_pg = true, is_deadly = false;
|
||||
int mpattack = 0;
|
||||
MapleMonster attacker = null;
|
||||
final MapleMap map = player.getMap();
|
||||
final MapleMap map = chr.getMap();
|
||||
if (damagefrom != -3 && damagefrom != -4) {
|
||||
monsteridfrom = slea.readInt();
|
||||
oid = slea.readInt();
|
||||
@@ -100,17 +100,17 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
|
||||
loseItems = assaulter.getStats().loseItem();
|
||||
if (loseItems != null) {
|
||||
MapleInventoryType type;
|
||||
final int playerpos = player.getPosition().x;
|
||||
final int playerpos = chr.getPosition().x;
|
||||
byte d = 1;
|
||||
Point pos = new Point(0, player.getPosition().y);
|
||||
Point pos = new Point(0, chr.getPosition().y);
|
||||
for (loseItem loseItem : loseItems) {
|
||||
type = ItemConstants.getInventoryType(loseItem.getId());
|
||||
for (byte b = 0; b < loseItem.getX(); b++) {//LOL?
|
||||
if (Randomizer.nextInt(101) >= loseItem.getChance()) {
|
||||
if (player.haveItem(loseItem.getId())) {
|
||||
if (chr.haveItem(loseItem.getId())) {
|
||||
pos.x = (int) (playerpos + ((d % 2 == 0) ? (25 * (d + 1) / 2) : -(25 * (d / 2))));
|
||||
MapleInventoryManipulator.removeById(c, type, loseItem.getId(), 1, false, false);
|
||||
map.spawnItemDrop(c.getPlayer(), c.getPlayer(), new Item(loseItem.getId(), (short) 0, (short) 1), map.calcDropPos(pos, player.getPosition()), true, true);
|
||||
map.spawnItemDrop(chr, chr, new Item(loseItem.getId(), (short) 0, (short) 1), map.calcDropPos(pos, chr.getPosition()), true, true);
|
||||
d++;
|
||||
} else {
|
||||
break;
|
||||
@@ -140,123 +140,126 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
|
||||
MobAttackInfo attackInfo = MobAttackInfoFactory.getMobAttackInfo(attacker, damagefrom);
|
||||
if (attackInfo != null) {
|
||||
if (attackInfo.isDeadlyAttack()) {
|
||||
mpattack = player.getMp() - 1;
|
||||
mpattack = chr.getMp() - 1;
|
||||
is_deadly = true;
|
||||
}
|
||||
mpattack += attackInfo.getMpBurn();
|
||||
MobSkill skill = MobSkillFactory.getMobSkill(attackInfo.getDiseaseSkill(), attackInfo.getDiseaseLevel());
|
||||
if (skill != null && damage > 0) {
|
||||
skill.applyEffect(player, attacker, false, banishPlayers);
|
||||
skill.applyEffect(chr, attacker, false, banishPlayers);
|
||||
}
|
||||
|
||||
attacker.setMp(attacker.getMp() - attackInfo.getMpCon());
|
||||
if (player.getBuffedValue(MapleBuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) {
|
||||
int jobid = player.getJob().getId();
|
||||
if (chr.getBuffedValue(MapleBuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) {
|
||||
int jobid = chr.getJob().getId();
|
||||
if (jobid == 212 || jobid == 222 || jobid == 232) {
|
||||
int id = jobid * 10000 + 1002;
|
||||
Skill manaReflectSkill = SkillFactory.getSkill(id);
|
||||
if (player.isBuffFrom(MapleBuffStat.MANA_REFLECTION, manaReflectSkill) && player.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).makeChanceResult()) {
|
||||
int bouncedamage = (damage * manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).getX() / 100);
|
||||
if (chr.isBuffFrom(MapleBuffStat.MANA_REFLECTION, manaReflectSkill) && chr.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).makeChanceResult()) {
|
||||
int bouncedamage = (damage * manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).getX() / 100);
|
||||
if (bouncedamage > attacker.getMaxHp() / 5) {
|
||||
bouncedamage = attacker.getMaxHp() / 5;
|
||||
}
|
||||
map.damageMonster(player, attacker, bouncedamage);
|
||||
map.broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), true);
|
||||
player.getClient().announce(MaplePacketCreator.showOwnBuffEffect(id, 5));
|
||||
map.broadcastMessage(player, MaplePacketCreator.showBuffeffect(player.getId(), id, 5), false);
|
||||
map.damageMonster(chr, attacker, bouncedamage);
|
||||
map.broadcastMessage(chr, MaplePacketCreator.damageMonster(oid, bouncedamage), true);
|
||||
chr.getClient().announce(MaplePacketCreator.showOwnBuffEffect(id, 5));
|
||||
map.broadcastMessage(chr, MaplePacketCreator.showBuffeffect(chr.getId(), id, 5), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (damage == -1) {
|
||||
fake = 4020002 + (player.getJob().getId() / 10 - 40) * 100000;
|
||||
fake = 4020002 + (chr.getJob().getId() / 10 - 40) * 100000;
|
||||
}
|
||||
|
||||
//in dojo player cannot use pot, so deadly attacks should be turned off as well
|
||||
if(is_deadly && player.getMap().isDojoMap() && !ServerConstants.USE_DEADLY_DOJO) {
|
||||
if(is_deadly && chr.getMap().isDojoMap() && !ServerConstants.USE_DEADLY_DOJO) {
|
||||
damage = 0;
|
||||
mpattack = 0;
|
||||
}
|
||||
|
||||
if (damage == 0) {
|
||||
player.getAutobanManager().addMiss();
|
||||
chr.getAutobanManager().addMiss();
|
||||
} else {
|
||||
player.getAutobanManager().resetMisses();
|
||||
chr.getAutobanManager().resetMisses();
|
||||
}
|
||||
if (damage > 0 && !player.isHidden()) {
|
||||
if (attacker != null && damagefrom == -1 && player.getBuffedValue(MapleBuffStat.POWERGUARD) != null) { // PG works on bosses, but only at half of the rate.
|
||||
int bouncedamage = (int) (damage * (player.getBuffedValue(MapleBuffStat.POWERGUARD).doubleValue() / (attacker.isBoss() ? 200 : 100)));
|
||||
if (damage > 0 && !chr.isHidden()) {
|
||||
if (attacker != null && damagefrom == -1 && chr.getBuffedValue(MapleBuffStat.POWERGUARD) != null) { // PG works on bosses, but only at half of the rate.
|
||||
int bouncedamage = (int) (damage * (chr.getBuffedValue(MapleBuffStat.POWERGUARD).doubleValue() / (attacker.isBoss() ? 200 : 100)));
|
||||
bouncedamage = Math.min(bouncedamage, attacker.getMaxHp() / 10);
|
||||
damage -= bouncedamage;
|
||||
map.damageMonster(player, attacker, bouncedamage);
|
||||
map.broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), false, true);
|
||||
player.checkMonsterAggro(attacker);
|
||||
map.damageMonster(chr, attacker, bouncedamage);
|
||||
map.broadcastMessage(chr, MaplePacketCreator.damageMonster(oid, bouncedamage), false, true);
|
||||
chr.checkMonsterAggro(attacker);
|
||||
}
|
||||
if (attacker != null && damagefrom == -1 && player.getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) {
|
||||
if (attacker != null && damagefrom == -1 && chr.getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) {
|
||||
Skill skill = SkillFactory.getSkill(Aran.BODY_PRESSURE);
|
||||
final MapleStatEffect eff = skill.getEffect(player.getSkillLevel(skill));
|
||||
final MapleStatEffect eff = skill.getEffect(chr.getSkillLevel(skill));
|
||||
if (!attacker.alreadyBuffedStats().contains(MonsterStatus.NEUTRALISE)) {
|
||||
if (!attacker.isBoss() && eff.makeChanceResult()) {
|
||||
attacker.applyStatus(player, new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.NEUTRALISE, 1), skill, null, false), false, (eff.getDuration()/10) * 2, false);
|
||||
attacker.applyStatus(chr, new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.NEUTRALISE, 1), skill, null, false), false, (eff.getDuration()/10) * 2, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (damagefrom != -3 && damagefrom != -4) {
|
||||
int achilles = 0;
|
||||
Skill achilles1 = null;
|
||||
int jobid = player.getJob().getId();
|
||||
int jobid = chr.getJob().getId();
|
||||
if (jobid < 200 && jobid % 10 == 2) {
|
||||
achilles1 = SkillFactory.getSkill(jobid * 10000 + (jobid == 112 ? 4 : 5));
|
||||
achilles = player.getSkillLevel(achilles1);
|
||||
achilles = chr.getSkillLevel(achilles1);
|
||||
}
|
||||
if (achilles != 0 && achilles1 != null) {
|
||||
damage *= (achilles1.getEffect(achilles).getX() / 1000.0);
|
||||
}
|
||||
}
|
||||
Integer mesoguard = player.getBuffedValue(MapleBuffStat.MESOGUARD);
|
||||
if (player.getBuffedValue(MapleBuffStat.MAGIC_GUARD) != null && mpattack == 0) {
|
||||
int mploss = (int) (damage * (player.getBuffedValue(MapleBuffStat.MAGIC_GUARD).doubleValue() / 100.0));
|
||||
Integer mesoguard = chr.getBuffedValue(MapleBuffStat.MESOGUARD);
|
||||
if (chr.getBuffedValue(MapleBuffStat.MAGIC_GUARD) != null && mpattack == 0) {
|
||||
int mploss = (int) (damage * (chr.getBuffedValue(MapleBuffStat.MAGIC_GUARD).doubleValue() / 100.0));
|
||||
int hploss = damage - mploss;
|
||||
if (mploss > player.getMp()) {
|
||||
hploss += mploss - player.getMp();
|
||||
mploss = player.getMp();
|
||||
|
||||
int curmp = chr.getMp();
|
||||
if (mploss > curmp) {
|
||||
hploss += mploss - curmp;
|
||||
mploss = curmp;
|
||||
}
|
||||
player.addMPHP(-hploss, -mploss);
|
||||
|
||||
chr.addMPHP(-hploss, -mploss);
|
||||
} else if (mesoguard != null) {
|
||||
damage = Math.round(damage / 2);
|
||||
int mesoloss = (int) (damage * (mesoguard.doubleValue() / 100.0));
|
||||
if (player.getMeso() < mesoloss) {
|
||||
player.gainMeso(-player.getMeso(), false);
|
||||
player.cancelBuffStats(MapleBuffStat.MESOGUARD);
|
||||
if (chr.getMeso() < mesoloss) {
|
||||
chr.gainMeso(-chr.getMeso(), false);
|
||||
chr.cancelBuffStats(MapleBuffStat.MESOGUARD);
|
||||
} else {
|
||||
player.gainMeso(-mesoloss, false);
|
||||
chr.gainMeso(-mesoloss, false);
|
||||
}
|
||||
player.addMPHP(-damage, -mpattack);
|
||||
chr.addMPHP(-damage, -mpattack);
|
||||
} else {
|
||||
if (player.getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null) {
|
||||
if (player.getBuffedValue(MapleBuffStat.MONSTER_RIDING).intValue() == Corsair.BATTLE_SHIP) {
|
||||
player.decreaseBattleshipHp(damage);
|
||||
if (chr.getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null) {
|
||||
if (chr.getBuffedValue(MapleBuffStat.MONSTER_RIDING).intValue() == Corsair.BATTLE_SHIP) {
|
||||
chr.decreaseBattleshipHp(damage);
|
||||
}
|
||||
}
|
||||
player.addMPHP(-damage, -mpattack);
|
||||
chr.addMPHP(-damage, -mpattack);
|
||||
}
|
||||
}
|
||||
if (!player.isHidden()) {
|
||||
map.broadcastMessage(player, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, player.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false);
|
||||
player.checkBerserk(true);
|
||||
if (!chr.isHidden()) {
|
||||
map.broadcastMessage(chr, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, chr.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false);
|
||||
chr.checkBerserk(true);
|
||||
}
|
||||
else {
|
||||
map.broadcastGMMessage(player, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, player.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false);
|
||||
player.checkBerserk(false);
|
||||
map.broadcastGMMessage(chr, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, chr.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false);
|
||||
chr.checkBerserk(false);
|
||||
}
|
||||
if (GameConstants.isDojo(map.getId())) {
|
||||
player.setDojoEnergy(player.getDojoEnergy() + ServerConstants.DOJO_ENERGY_DMG);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
|
||||
chr.setDojoEnergy(chr.getDojoEnergy() + ServerConstants.DOJO_ENERGY_DMG);
|
||||
c.announce(MaplePacketCreator.getEnergy("energy", chr.getDojoEnergy()));
|
||||
}
|
||||
|
||||
for (MapleCharacter chr : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :)
|
||||
chr.changeMapBanish(attacker.getBanish().getMap(), attacker.getBanish().getPortal(), attacker.getBanish().getMsg());
|
||||
for (MapleCharacter player : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :)
|
||||
player.changeMapBanish(attacker.getBanish().getMap(), attacker.getBanish().getPortal(), attacker.getBanish().getMsg());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,16 +21,17 @@
|
||||
*/
|
||||
package net.server.channel.handlers;
|
||||
|
||||
import net.server.channel.handlers.AbstractDealDamageHandler;
|
||||
import client.MapleBuffStat;
|
||||
import client.MapleClient;
|
||||
import client.MapleCharacter;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
|
||||
public final class TouchMonsterDamageHandler extends AbstractDealDamageHandler {
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
if (c.getPlayer().getEnergyBar() == 15000 || c.getPlayer().getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) {
|
||||
applyAttack(parseDamage(slea, c.getPlayer(), false, false), c.getPlayer(), 1);
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
if (chr.getEnergyBar() == 15000 || chr.getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) {
|
||||
applyAttack(parseDamage(slea, chr, false, false), c.getPlayer(), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,12 +253,12 @@ public class MapleStorageInventory {
|
||||
if(dst > this.getSlotLimit()) {
|
||||
return;
|
||||
}
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
Item source = this.getItem(src);
|
||||
if (source == null) {
|
||||
return;
|
||||
}
|
||||
short slotMax = ii.getSlotMax(c, source.getItemId());
|
||||
short slotMax = MapleItemInformationProvider.getInstance().getSlotMax(c, source.getItemId());
|
||||
this.move(src, dst, slotMax);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user