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);