diff --git a/build/built-jar.properties b/build/built-jar.properties index 49c99bf7cd..472a03fe1e 100644 --- a/build/built-jar.properties +++ b/build/built-jar.properties @@ -1,4 +1,4 @@ -#Mon, 05 Jun 2017 18:49:35 -0300 +#Tue, 06 Jun 2017 11:24:55 -0300 C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2= diff --git a/build/classes/client/MapleCharacter$10.class b/build/classes/client/MapleCharacter$10.class index 3a3efdb2b6..5f0ce40e27 100644 Binary files a/build/classes/client/MapleCharacter$10.class and b/build/classes/client/MapleCharacter$10.class differ diff --git a/build/classes/client/MapleCharacter$11.class b/build/classes/client/MapleCharacter$11.class index 4252e637f9..7fd3b0df0b 100644 Binary files a/build/classes/client/MapleCharacter$11.class and b/build/classes/client/MapleCharacter$11.class differ diff --git a/build/classes/client/MapleCharacter$12.class b/build/classes/client/MapleCharacter$12.class index 7e07646415..ff52803678 100644 Binary files a/build/classes/client/MapleCharacter$12.class and b/build/classes/client/MapleCharacter$12.class differ diff --git a/build/classes/client/MapleCharacter$13.class b/build/classes/client/MapleCharacter$13.class index 81a23e7eb6..929057fc15 100644 Binary files a/build/classes/client/MapleCharacter$13.class and b/build/classes/client/MapleCharacter$13.class differ diff --git a/build/classes/client/MapleCharacter$14.class b/build/classes/client/MapleCharacter$14.class index fb8197d77c..528a878bb6 100644 Binary files a/build/classes/client/MapleCharacter$14.class and b/build/classes/client/MapleCharacter$14.class differ diff --git a/build/classes/client/MapleCharacter$15.class b/build/classes/client/MapleCharacter$15.class index 11a189b7d7..3b8820a150 100644 Binary files a/build/classes/client/MapleCharacter$15.class and b/build/classes/client/MapleCharacter$15.class differ diff --git a/build/classes/client/MapleCharacter$16.class b/build/classes/client/MapleCharacter$16.class index b2126df10c..332837dac9 100644 Binary files a/build/classes/client/MapleCharacter$16.class and b/build/classes/client/MapleCharacter$16.class differ diff --git a/build/classes/client/MapleCharacter$17.class b/build/classes/client/MapleCharacter$17.class index c13f335e1e..b729093d33 100644 Binary files a/build/classes/client/MapleCharacter$17.class and b/build/classes/client/MapleCharacter$17.class differ diff --git a/build/classes/client/MapleCharacter$18.class b/build/classes/client/MapleCharacter$18.class index 6181a97224..33992be8ca 100644 Binary files a/build/classes/client/MapleCharacter$18.class and b/build/classes/client/MapleCharacter$18.class differ diff --git a/build/classes/client/MapleCharacter$7.class b/build/classes/client/MapleCharacter$7.class index 08349e41ce..b9fcbc8260 100644 Binary files a/build/classes/client/MapleCharacter$7.class and b/build/classes/client/MapleCharacter$7.class differ diff --git a/build/classes/client/MapleCharacter$8.class b/build/classes/client/MapleCharacter$8.class index 9cd51606e5..a0c8e524bb 100644 Binary files a/build/classes/client/MapleCharacter$8.class and b/build/classes/client/MapleCharacter$8.class differ diff --git a/build/classes/client/MapleCharacter$9.class b/build/classes/client/MapleCharacter$9.class index ede27e6191..d53c17dda8 100644 Binary files a/build/classes/client/MapleCharacter$9.class and b/build/classes/client/MapleCharacter$9.class differ diff --git a/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class b/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class index 65a3a7ed99..32023e20f8 100644 Binary files a/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class and b/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class differ diff --git a/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class b/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class index 2c5c5f7b89..e22e6a87f1 100644 Binary files a/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class and b/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class differ diff --git a/build/classes/client/MapleCharacter$SkillEntry.class b/build/classes/client/MapleCharacter$SkillEntry.class index 205a73a2f0..6719195663 100644 Binary files a/build/classes/client/MapleCharacter$SkillEntry.class and b/build/classes/client/MapleCharacter$SkillEntry.class differ diff --git a/build/classes/client/MapleCharacter.class b/build/classes/client/MapleCharacter.class index d50d166b50..4a1f176933 100644 Binary files a/build/classes/client/MapleCharacter.class and b/build/classes/client/MapleCharacter.class differ diff --git a/build/classes/client/command/Commands$1.class b/build/classes/client/command/Commands$1.class index d837825cda..f9489108a0 100644 Binary files a/build/classes/client/command/Commands$1.class and b/build/classes/client/command/Commands$1.class differ diff --git a/build/classes/client/command/Commands.class b/build/classes/client/command/Commands.class index 809ceafcab..307ff1db86 100644 Binary files a/build/classes/client/command/Commands.class and b/build/classes/client/command/Commands.class differ diff --git a/build/classes/constants/GameConstants.class b/build/classes/constants/GameConstants.class index 0875f6693f..7542b38edd 100644 Binary files a/build/classes/constants/GameConstants.class and b/build/classes/constants/GameConstants.class differ diff --git a/build/classes/constants/ServerConstants.class b/build/classes/constants/ServerConstants.class index ee4af3ed8e..2fd4a62ade 100644 Binary files a/build/classes/constants/ServerConstants.class and b/build/classes/constants/ServerConstants.class differ diff --git a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class index a6677b5ce9..fe5b3afb5f 100644 Binary files a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class and b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class differ diff --git a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class index 0f85761d1c..9eaefb7b1f 100644 Binary files a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class and b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class differ diff --git a/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class b/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class index 50d05b0ea0..330f125371 100644 Binary files a/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class and b/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class differ diff --git a/build/classes/server/MapleStatEffect$CancelEffectAction.class b/build/classes/server/MapleStatEffect$CancelEffectAction.class index 1768534406..92b195c8da 100644 Binary files a/build/classes/server/MapleStatEffect$CancelEffectAction.class and b/build/classes/server/MapleStatEffect$CancelEffectAction.class differ diff --git a/build/classes/server/MapleStatEffect.class b/build/classes/server/MapleStatEffect.class index 2b064a77aa..0bfbc621fb 100644 Binary files a/build/classes/server/MapleStatEffect.class and b/build/classes/server/MapleStatEffect.class differ diff --git a/dist/MapleSolaxia.jar b/dist/MapleSolaxia.jar index 2c3d52e6bf..eec1fdd48f 100644 Binary files a/dist/MapleSolaxia.jar and b/dist/MapleSolaxia.jar differ diff --git a/mychanges_ptbr.txt b/mychanges_ptbr.txt index a00b96ba92..886b26a6de 100644 --- a/mychanges_ptbr.txt +++ b/mychanges_ptbr.txt @@ -294,4 +294,9 @@ V 05 Junho 2016, Novo NPC Skillbook announcer: Abdula. -Consertada a função que retorna se uma skill pertence ou não à árvore de habilidades do jogador. \ No newline at end of file +Consertada a função que retorna se uma skill pertence ou não à árvore de habilidades do jogador. + +06 Junho 2016, +Corrigido command empowerme. +Corrigidos exploits relacionados a algumas das skills do empowerme. +Corrigido possivel loop infinito no sistema de EXP. \ No newline at end of file diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 6d8d3ad834..1fce9d1dba 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -11,6 +11,18 @@ - + + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/command/Commands.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleStatEffect.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/GameConstants.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/Server.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/Skill.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/handlers/login/CharlistRequestHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/AbstractDealDamageHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/CloseRangeDamageHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/MaplePacketCreator.java + diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index 8b124f3847..5823177669 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -2087,15 +2087,22 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { int equip = (int)Math.min((long)((gain / 10) * pendantExp), Integer.MAX_VALUE); long total = gain + equip + party; + gainExpInternal(total, equip, party, show, inChat, white); + } + + private void gainExpInternal(long gain, int equip, int party, boolean show, boolean inChat, boolean white) { + long total = gain; if (level < getMaxLevel()) { - if ((long) this.exp.get() + total > (long) Integer.MAX_VALUE) { - int gainFirst = ExpTable.getExpNeededForLevel(level) - this.exp.get(); - total -= gainFirst + 1; - this.gainExp(gainFirst + 1, party, false, inChat, white); + long leftover = 0; + long nextExp = exp.get() + total; + + if (nextExp > (long)Integer.MAX_VALUE) { + total = Integer.MAX_VALUE - exp.get(); + leftover = nextExp - Integer.MAX_VALUE; } - updateSingleStat(MapleStat.EXP, this.exp.addAndGet((int)Math.min(total, Integer.MAX_VALUE))); + updateSingleStat(MapleStat.EXP, exp.addAndGet((int)total)); if (show && gain != 0) { - client.announce(MaplePacketCreator.getShowExpGain(gain, equip, party, inChat, white)); + client.announce(MaplePacketCreator.getShowExpGain((int)Math.min(gain, Integer.MAX_VALUE), equip, party, inChat, white)); } while (exp.get() >= ExpTable.getExpNeededForLevel(level)) { levelUp(true); @@ -2105,6 +2112,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { break; } } + + if(leftover > 0) gainExpInternal(leftover, equip, party, false, inChat, white); } } diff --git a/src/client/command/Commands.java b/src/client/command/Commands.java index 13018ebf09..437b9849a1 100644 --- a/src/client/command/Commands.java +++ b/src/client/command/Commands.java @@ -791,10 +791,10 @@ public class Commands { } else if (sub[0].equals("buffmap")) { for (MapleCharacter chr : player.getMap().getCharacters()){ //GM Skills : Haste(Super) - Holy Symbol - Bless - Hyper Body - Echo of Hero - SkillFactory.getSkill(4101004).getEffect(SkillFactory.getSkill(4101004).getMaxLevel()).applyTo(chr); - SkillFactory.getSkill(2311003).getEffect(SkillFactory.getSkill(2311003).getMaxLevel()).applyTo(chr); - SkillFactory.getSkill(1301007).getEffect(SkillFactory.getSkill(1301007).getMaxLevel()).applyTo(chr); - SkillFactory.getSkill(2301004).getEffect(SkillFactory.getSkill(2301004).getMaxLevel()).applyTo(chr); + SkillFactory.getSkill(9101001).getEffect(SkillFactory.getSkill(9101001).getMaxLevel()).applyTo(chr); + SkillFactory.getSkill(9101002).getEffect(SkillFactory.getSkill(9101002).getMaxLevel()).applyTo(chr); + SkillFactory.getSkill(9101003).getEffect(SkillFactory.getSkill(9101003).getMaxLevel()).applyTo(chr); + SkillFactory.getSkill(9101008).getEffect(SkillFactory.getSkill(9101008).getMaxLevel()).applyTo(chr); SkillFactory.getSkill(1005).getEffect(SkillFactory.getSkill(1005).getMaxLevel()).applyTo(chr); chr.setHp(chr.getMaxHp()); chr.updateSingleStat(MapleStat.HP, chr.getMaxHp()); @@ -847,13 +847,14 @@ public class Commands { Equip eu = (Equip) equip.getItem(i); if(eu == null) continue; - short incval= (short)newStat; + short incval = (short)newStat; eu.setWdef(incval); eu.setAcc(incval); eu.setAvoid(incval); eu.setJump(incval); eu.setMatk(incval); eu.setMdef(incval); + eu.setHp(incval); eu.setMp(incval); eu.setSpeed(incval); eu.setHands(incval); @@ -1376,7 +1377,7 @@ public class Commands { } } player.yellowMessage("Skills maxed out."); - } else if (sub[0].equals("mesos")) { + } else if (sub[0].equals("mesos")) { if (sub.length >= 2) { player.gainMeso(Integer.parseInt(sub[1]), true); } @@ -1930,6 +1931,27 @@ public class Commands { } else if (sub.length > 1) { time *= Integer.parseInt(sub[1]); } + + if(time > 1) { + int seconds = (int) (time / 1000) % 60 ; + int minutes = (int) ((time / (1000*60)) % 60); + int hours = (int) ((time / (1000*60*60)) % 24); + int days = (int) ((time / (1000*60*60*24))); + + String strTime = ""; + if(days > 0) strTime += days + " days, "; + if(hours > 0) strTime += hours + " hours, "; + strTime += minutes + " minutes, "; + strTime += seconds + " seconds"; + + for(World w : Server.getInstance().getWorlds()) { + for(MapleCharacter chr: w.getPlayerStorage().getAllCharacters()) { + chr.dropMessage("Server is undergoing maintenance process, and will be shutdown in " + strTime + ". Prepare yourself to quit safely in the mean time."); + } + } + } + + TimerManager.getInstance().schedule(Server.getInstance().shutdown(false), time); break; case "face": diff --git a/src/constants/GameConstants.java b/src/constants/GameConstants.java index 3cecc83e8a..03c2197531 100644 --- a/src/constants/GameConstants.java +++ b/src/constants/GameConstants.java @@ -94,10 +94,10 @@ public class GameConstants { if(!isInBranchJobTree(skillJob, jobId, 0)) { for(int i = 1; i <= 3; i++) { if(hasDivergedBranchJobTree(skillJob, jobId, i)) return false; - if(isInBranchJobTree(skillJob, jobId, i)) return true; + if(isInBranchJobTree(skillJob, jobId, i)) return (skillJob <= jobId); } } else { - return true; + return (skillJob <= jobId); } return false; diff --git a/src/constants/ServerConstants.java b/src/constants/ServerConstants.java index 3bbae2c2d2..f89753c0b7 100644 --- a/src/constants/ServerConstants.java +++ b/src/constants/ServerConstants.java @@ -39,6 +39,7 @@ public class ServerConstants { public static final boolean USE_DEBUG_SHOW_INFO_EQPEXP = false; //Prints on the cmd all equip exp gain info. public static final boolean USE_MTS = false; public static final boolean USE_FAMILY_SYSTEM = false; + public static final boolean USE_PERMISSIVE_BUFFS = true; //WARNING: Allows players that does not have increased certain buff-type skills to use it's effect. Used mainly on buff-cast commands, however making this active may generate a source for possible client-edited exploits. public static final boolean USE_DUEY = true; public static final boolean USE_ITEM_SORT = true; public static final boolean USE_ITEM_SORT_BY_NAME = false; //Item sorting based on name rather than id. diff --git a/src/net/server/channel/handlers/AbstractDealDamageHandler.java b/src/net/server/channel/handlers/AbstractDealDamageHandler.java index c7ab44236a..fb3777daed 100644 --- a/src/net/server/channel/handlers/AbstractDealDamageHandler.java +++ b/src/net/server/channel/handlers/AbstractDealDamageHandler.java @@ -272,24 +272,28 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl player.checkMonsterAggro(monster); if (player.getBuffedValue(MapleBuffStat.PICKPOCKET) != null && (attack.skill == 0 || attack.skill == Rogue.DOUBLE_STAB || attack.skill == Bandit.SAVAGE_BLOW || attack.skill == ChiefBandit.ASSAULTER || attack.skill == ChiefBandit.BAND_OF_THIEVES || attack.skill == Shadower.ASSASSINATE || attack.skill == Shadower.TAUNT || attack.skill == Shadower.BOOMERANG_STEP)) { Skill pickpocket = SkillFactory.getSkill(ChiefBandit.PICKPOCKET); - int delay = 0; - final int maxmeso = player.getBuffedValue(MapleBuffStat.PICKPOCKET).intValue(); - for (Integer eachd : onedList) { - eachd += Integer.MAX_VALUE; - if (pickpocket.getEffect(player.getSkillLevel(pickpocket)).makeChanceResult()) { - final Integer eachdf; - if(eachd < 0) - eachdf = eachd + Integer.MAX_VALUE; - else - eachdf = eachd; - - TimerManager.getInstance().schedule(new Runnable() { - @Override - public void run() { - player.getMap().spawnMesoDrop(Math.min((int) Math.max(((double) eachdf / (double) 20000) * (double) maxmeso, (double) 1), maxmeso), new Point((int) (monster.getPosition().getX() + Randomizer.nextInt(100) - 50), (int) (monster.getPosition().getY())), monster, player, true, (byte) 2); - } - }, delay); - delay += 100; + int picklv = (player.getSkillLevel(pickpocket) > 0 || !ServerConstants.USE_PERMISSIVE_BUFFS) ? player.getSkillLevel(pickpocket) : pickpocket.getMaxLevel(); + if(picklv > 0) { + int delay = 0; + final int maxmeso = player.getBuffedValue(MapleBuffStat.PICKPOCKET).intValue(); + for (Integer eachd : onedList) { + eachd += Integer.MAX_VALUE; + + if (pickpocket.getEffect(picklv).makeChanceResult()) { + final Integer eachdf; + if(eachd < 0) + eachdf = eachd + Integer.MAX_VALUE; + else + eachdf = eachd; + + TimerManager.getInstance().schedule(new Runnable() { + @Override + public void run() { + player.getMap().spawnMesoDrop(Math.min((int) Math.max(((double) eachdf / (double) 20000) * (double) maxmeso, (double) 1), maxmeso), new Point((int) (monster.getPosition().getX() + Randomizer.nextInt(100) - 50), (int) (monster.getPosition().getY())), monster, player, true, (byte) 2); + } + }, delay); + delay += 100; + } } } } else if (attack.skill == Marauder.ENERGY_DRAIN || attack.skill == ThunderBreaker.ENERGY_DRAIN || attack.skill == NightWalker.VAMPIRE || attack.skill == Assassin.DRAIN) { @@ -648,14 +652,16 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl } else { // Normal Combo int skillLv = chr.getSkillLevel(oid); - if(skillLv <= 0) skillLv = SkillFactory.getSkill(oid).getMaxLevel(); + if(skillLv <= 0 && ServerConstants.USE_PERMISSIVE_BUFFS) skillLv = SkillFactory.getSkill(oid).getMaxLevel(); - MapleStatEffect ceffect = SkillFactory.getSkill(oid).getEffect(skillLv); - calcDmgMax = (int) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (skillLv / 6)) / 100); + if(skillLv > 0) { + MapleStatEffect ceffect = SkillFactory.getSkill(oid).getEffect(skillLv); + calcDmgMax = (int) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (skillLv / 6)) / 100); + } } if(GameConstants.isFinisherSkill(ret.skill)) { - // Finisher skills do more damage based on how many orbs the player has. + // Finisher skills do more damage based on how many orbs the player has. int orbs = comboBuff - 1; if(orbs == 2) calcDmgMax *= 1.2; diff --git a/src/net/server/channel/handlers/CloseRangeDamageHandler.java b/src/net/server/channel/handlers/CloseRangeDamageHandler.java index c18c57026b..086ac8d991 100644 --- a/src/net/server/channel/handlers/CloseRangeDamageHandler.java +++ b/src/net/server/channel/handlers/CloseRangeDamageHandler.java @@ -39,6 +39,7 @@ import client.MapleStat; import client.Skill; import client.SkillFactory; import constants.GameConstants; +import constants.ServerConstants; import constants.skills.Crusader; import constants.skills.DawnWarrior; import constants.skills.DragonKnight; @@ -88,25 +89,30 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { ceffect = advcombo.getEffect(advComboSkillLevel); } else { int comboLv = player.getSkillLevel(combo); - if(comboLv <= 0) comboLv = SkillFactory.getSkill(oid).getMaxLevel(); - ceffect = combo.getEffect(comboLv); - } - if (orbcount < ceffect.getX() + 1) { - int neworbcount = orbcount + 1; - if (advComboSkillLevel > 0 && ceffect.makeChanceResult()) { - if (neworbcount <= ceffect.getX()) { - neworbcount++; - } - } + if(comboLv <= 0 && ServerConstants.USE_PERMISSIVE_BUFFS) comboLv = SkillFactory.getSkill(oid).getMaxLevel(); - int olv = player.getSkillLevel(oid); - if(olv <= 0) olv = SkillFactory.getSkill(oid).getMaxLevel(); - int duration = combo.getEffect(olv).getDuration(); - List> stat = Collections.singletonList(new Pair<>(MapleBuffStat.COMBO, neworbcount)); - player.setBuffedValue(MapleBuffStat.COMBO, neworbcount); - duration -= (int) (System.currentTimeMillis() - player.getBuffedStarttime(MapleBuffStat.COMBO)); - c.announce(MaplePacketCreator.giveBuff(oid, duration, stat)); - player.getMap().broadcastMessage(player, MaplePacketCreator.giveForeignBuff(player.getId(), stat), false); + if(comboLv > 0) ceffect = combo.getEffect(comboLv); + else ceffect = null; + } + if(ceffect != null) { + if (orbcount < ceffect.getX() + 1) { + int neworbcount = orbcount + 1; + if (advComboSkillLevel > 0 && ceffect.makeChanceResult()) { + if (neworbcount <= ceffect.getX()) { + neworbcount++; + } + } + + int olv = player.getSkillLevel(oid); + if(olv <= 0) olv = SkillFactory.getSkill(oid).getMaxLevel(); + + int duration = combo.getEffect(olv).getDuration(); + List> stat = Collections.singletonList(new Pair<>(MapleBuffStat.COMBO, neworbcount)); + player.setBuffedValue(MapleBuffStat.COMBO, neworbcount); + duration -= (int) (System.currentTimeMillis() - player.getBuffedStarttime(MapleBuffStat.COMBO)); + c.announce(MaplePacketCreator.giveBuff(oid, duration, stat)); + player.getMap().broadcastMessage(player, MaplePacketCreator.giveForeignBuff(player.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))) { for (int i = 0; i < attack.numAttacked; i++) { diff --git a/src/server/MapleStatEffect.java b/src/server/MapleStatEffect.java index 7c9e07c3ff..7dd38bd901 100644 --- a/src/server/MapleStatEffect.java +++ b/src/server/MapleStatEffect.java @@ -708,9 +708,11 @@ public class MapleStatEffect { AutobanFactory.MPCON.addPoint(applyfrom.getAutobanManager(), "mpCon hack for skill:" + sourceid + "; Player MP: " + applyto.getMp() + " MP Needed: " + getMpCon()); } */ if (hpchange != 0) { - if (hpchange < 0 && (-hpchange) >= applyto.getHp() && (!applyto.hasDisease(MapleDisease.ZOMBIFY) || hpCon == 0)) { - applyto.getClient().announce(MaplePacketCreator.enableActions()); - return false; + if (hpchange < 0 && (-hpchange) >= applyto.getHp() && (!applyto.hasDisease(MapleDisease.ZOMBIFY) || hpCon > 0)) { + if(!ServerConstants.USE_PERMISSIVE_BUFFS) { + applyto.getClient().announce(MaplePacketCreator.enableActions()); + return false; + } } int newHp = applyto.getHp() + hpchange; if (newHp < 1) { @@ -722,8 +724,13 @@ public class MapleStatEffect { int newMp = applyto.getMp() + mpchange; if (mpchange != 0) { if (mpchange < 0 && -mpchange > applyto.getMp()) { - applyto.getClient().announce(MaplePacketCreator.enableActions()); - return false; + if(!ServerConstants.USE_PERMISSIVE_BUFFS) { + applyto.getClient().announce(MaplePacketCreator.enableActions()); + return false; + } + else { + newMp = 0; + } } applyto.setMp(newMp);