Active Coupon Buff
Added buff icons for active coupons the player has. Fixed a minor issue, introduced on the last commit, that prevented coupons to become active automatically.
This commit is contained in:
@@ -1691,7 +1691,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
public void cancelAllDebuffs() {
|
||||
diseases.clear();
|
||||
}
|
||||
|
||||
|
||||
public void dispelSkill(int skillid) {
|
||||
LinkedList<MapleBuffStatValueHolder> allBuffs = new LinkedList<>(effects.values());
|
||||
for (MapleBuffStatValueHolder mbsvh : allBuffs) {
|
||||
@@ -3418,6 +3418,16 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
activateCouponsEffects();
|
||||
}
|
||||
|
||||
public void resetPlayerRates() {
|
||||
expRate = 1;
|
||||
mesoRate = 1;
|
||||
dropRate = 1;
|
||||
|
||||
expCoupon = 1;
|
||||
mesoCoupon = 1;
|
||||
dropCoupon = 1;
|
||||
}
|
||||
|
||||
private boolean isExpCoupon(int couponId) {
|
||||
return couponId / 1000 == 5211;
|
||||
}
|
||||
@@ -3436,6 +3446,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
|
||||
private void revertCouponsEffects() {
|
||||
dispelBuffCoupons();
|
||||
|
||||
this.expRate /= this.expCoupon;
|
||||
this.dropRate /= this.dropCoupon;
|
||||
this.mesoRate /= this.mesoCoupon;
|
||||
@@ -3451,20 +3463,34 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
int couponId = coupon.getKey();
|
||||
int couponQty = coupon.getValue();
|
||||
|
||||
commitBuffCoupon(couponId);
|
||||
if(isExpCoupon(couponId)) setExpCouponRate(couponId, couponQty);
|
||||
else setDropCouponRate(couponId, couponQty);
|
||||
}
|
||||
}
|
||||
else {
|
||||
int maxExpRate = 1, maxDropRate = 1;
|
||||
int maxExpRate = 1, maxDropRate = 1, maxExpCouponId = -1, maxDropCouponId = -1;
|
||||
|
||||
for(Entry<Integer,Integer> coupon: activeCoupons.entrySet()) {
|
||||
int couponId = coupon.getKey();
|
||||
|
||||
if(isExpCoupon(couponId)) maxExpRate = Math.max(maxExpRate, getCouponMultiplier(couponId));
|
||||
else maxDropRate = Math.max(maxDropRate, getCouponMultiplier(couponId));
|
||||
if(isExpCoupon(couponId)) {
|
||||
if(maxExpRate < getCouponMultiplier(couponId)) {
|
||||
maxExpCouponId = couponId;
|
||||
maxExpRate = getCouponMultiplier(couponId);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(maxDropRate < getCouponMultiplier(couponId)) {
|
||||
maxDropCouponId = couponId;
|
||||
maxDropRate = getCouponMultiplier(couponId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(maxExpCouponId > -1) commitBuffCoupon(maxExpCouponId);
|
||||
if(maxDropCouponId > -1) commitBuffCoupon(maxDropCouponId);
|
||||
|
||||
this.expCoupon = maxExpRate;
|
||||
this.dropCoupon = maxDropRate;
|
||||
this.mesoCoupon = maxDropRate;
|
||||
@@ -3494,6 +3520,24 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void commitBuffCoupon(int couponid) {
|
||||
if(!isLoggedin() || getCashShop().isOpened()) return;
|
||||
|
||||
MapleStatEffect mse = MapleItemInformationProvider.getInstance().getItemEffect(couponid);
|
||||
mse.applyTo(this);
|
||||
}
|
||||
|
||||
public void dispelBuffCoupons() {
|
||||
LinkedList<MapleBuffStatValueHolder> allBuffs = new LinkedList<>(effects.values());
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
for (MapleBuffStatValueHolder mbsvh : allBuffs) {
|
||||
if (ii.isRateCoupon(mbsvh.effect.getSourceId())) {
|
||||
cancelEffect(mbsvh.effect, false, mbsvh.startTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static MapleCharacter loadCharFromDB(int charid, MapleClient client, boolean channelserver) throws SQLException {
|
||||
try {
|
||||
@@ -3817,13 +3861,6 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
ret.maplemount.setTiredness(mounttiredness);
|
||||
ret.maplemount.setActive(false);
|
||||
|
||||
if(ServerConstants.USE_ADD_RATES_BY_LEVEL == true) {
|
||||
ret.setPlayerRates();
|
||||
}
|
||||
|
||||
ret.setWorldRates();
|
||||
ret.setCouponRates();
|
||||
|
||||
return ret;
|
||||
} catch (SQLException | RuntimeException e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -98,22 +98,22 @@ public class SkillFactory {
|
||||
}
|
||||
|
||||
public static void loadAllSkills() {
|
||||
final MapleDataDirectoryEntry root = datasource.getRoot();
|
||||
int skillid;
|
||||
for (MapleDataFileEntry topDir : root.getFiles()) { // Loop thru jobs
|
||||
if (topDir.getName().length() <= 8) {
|
||||
for (MapleData data : datasource.getData(topDir.getName())) { // Loop thru each jobs
|
||||
if (data.getName().equals("skill")) {
|
||||
for (MapleData data2 : data) { // Loop thru each jobs
|
||||
if (data2 != null) {
|
||||
skillid = Integer.parseInt(data2.getName());
|
||||
skills.put(skillid, loadFromData(skillid, data2));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
final MapleDataDirectoryEntry root = datasource.getRoot();
|
||||
int skillid;
|
||||
for (MapleDataFileEntry topDir : root.getFiles()) { // Loop thru jobs
|
||||
if (topDir.getName().length() <= 8) {
|
||||
for (MapleData data : datasource.getData(topDir.getName())) { // Loop thru each jobs
|
||||
if (data.getName().equals("skill")) {
|
||||
for (MapleData data2 : data) { // Loop thru each jobs
|
||||
if (data2 != null) {
|
||||
skillid = Integer.parseInt(data2.getName());
|
||||
skills.put(skillid, loadFromData(skillid, data2));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Skill loadFromData(int id, MapleData data) {
|
||||
@@ -135,251 +135,251 @@ public class SkillFactory {
|
||||
MapleData action_ = data.getChildByPath("action");
|
||||
boolean action = false;
|
||||
if (action_ == null) {
|
||||
if (data.getChildByPath("prepare/action") != null) {
|
||||
action = true;
|
||||
} else {
|
||||
switch (id) {
|
||||
case Gunslinger.INVISIBLE_SHOT:
|
||||
case Corsair.HYPNOTIZE:
|
||||
action = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (data.getChildByPath("prepare/action") != null) {
|
||||
action = true;
|
||||
} else {
|
||||
switch (id) {
|
||||
case Gunslinger.INVISIBLE_SHOT:
|
||||
case Corsair.HYPNOTIZE:
|
||||
action = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
action = true;
|
||||
}
|
||||
ret.action = action;
|
||||
MapleData hit = data.getChildByPath("hit");
|
||||
MapleData ball = data.getChildByPath("ball");
|
||||
isBuff = effect != null && hit == null && ball == null;
|
||||
isBuff |= action_ != null && MapleDataTool.getString("0", action_, "").equals("alert2");
|
||||
switch (id) {
|
||||
case Hero.RUSH:
|
||||
case Paladin.RUSH:
|
||||
case DarkKnight.RUSH:
|
||||
case DragonKnight.SACRIFICE:
|
||||
case FPMage.EXPLOSION:
|
||||
case FPMage.POISON_MIST:
|
||||
case Cleric.HEAL:
|
||||
case Ranger.MORTAL_BLOW:
|
||||
case Sniper.MORTAL_BLOW:
|
||||
case Assassin.DRAIN:
|
||||
case Hermit.SHADOW_WEB:
|
||||
case Bandit.STEAL:
|
||||
case Shadower.SMOKE_SCREEN:
|
||||
case SuperGM.HEAL_PLUS_DISPEL:
|
||||
case Hero.MONSTER_MAGNET:
|
||||
case Paladin.MONSTER_MAGNET:
|
||||
case DarkKnight.MONSTER_MAGNET:
|
||||
case Evan.ICE_BREATH:
|
||||
case Evan.FIRE_BREATH:
|
||||
case Gunslinger.RECOIL_SHOT:
|
||||
case Marauder.ENERGY_DRAIN:
|
||||
case BlazeWizard.FLAME_GEAR:
|
||||
case NightWalker.SHADOW_WEB:
|
||||
case NightWalker.POISON_BOMB:
|
||||
case NightWalker.VAMPIRE:
|
||||
case ChiefBandit.CHAKRA:
|
||||
case Evan.RECOVERY_AURA:
|
||||
isBuff = false;
|
||||
break;
|
||||
case Beginner.RECOVERY:
|
||||
case Beginner.NIMBLE_FEET:
|
||||
case Beginner.MONSTER_RIDER:
|
||||
case Beginner.ECHO_OF_HERO:
|
||||
case Swordsman.IRON_BODY:
|
||||
case Fighter.AXE_BOOSTER:
|
||||
case Fighter.POWER_GUARD:
|
||||
case Fighter.RAGE:
|
||||
case Fighter.SWORD_BOOSTER:
|
||||
case Crusader.ARMOR_CRASH:
|
||||
case Crusader.COMBO:
|
||||
case Hero.ENRAGE:
|
||||
case Hero.HEROS_WILL:
|
||||
case Hero.MAPLE_WARRIOR:
|
||||
case Hero.STANCE:
|
||||
case Page.BW_BOOSTER:
|
||||
case Page.POWER_GUARD:
|
||||
case Page.SWORD_BOOSTER:
|
||||
case Page.THREATEN:
|
||||
case WhiteKnight.BW_FIRE_CHARGE:
|
||||
case WhiteKnight.BW_ICE_CHARGE:
|
||||
case WhiteKnight.BW_LIT_CHARGE:
|
||||
case WhiteKnight.MAGIC_CRASH:
|
||||
case WhiteKnight.SWORD_FIRE_CHARGE:
|
||||
case WhiteKnight.SWORD_ICE_CHARGE:
|
||||
case WhiteKnight.SWORD_LIT_CHARGE:
|
||||
case Paladin.BW_HOLY_CHARGE:
|
||||
case Paladin.HEROS_WILL:
|
||||
case Paladin.MAPLE_WARRIOR:
|
||||
case Paladin.STANCE:
|
||||
case Paladin.SWORD_HOLY_CHARGE:
|
||||
case Spearman.HYPER_BODY:
|
||||
case Spearman.IRON_WILL:
|
||||
case Spearman.POLEARM_BOOSTER:
|
||||
case Spearman.SPEAR_BOOSTER:
|
||||
case DragonKnight.DRAGON_BLOOD:
|
||||
case DragonKnight.POWER_CRASH:
|
||||
case DarkKnight.AURA_OF_BEHOLDER:
|
||||
case DarkKnight.BEHOLDER:
|
||||
case DarkKnight.HEROS_WILL:
|
||||
case DarkKnight.HEX_OF_BEHOLDER:
|
||||
case DarkKnight.MAPLE_WARRIOR:
|
||||
case DarkKnight.STANCE:
|
||||
case Magician.MAGIC_GUARD:
|
||||
case Magician.MAGIC_ARMOR:
|
||||
case FPWizard.MEDITATION:
|
||||
case FPWizard.SLOW:
|
||||
case FPMage.SEAL:
|
||||
case FPMage.SPELL_BOOSTER:
|
||||
case FPArchMage.HEROS_WILL:
|
||||
case FPArchMage.INFINITY:
|
||||
case FPArchMage.MANA_REFLECTION:
|
||||
case FPArchMage.MAPLE_WARRIOR:
|
||||
case ILWizard.MEDITATION:
|
||||
case ILMage.SEAL:
|
||||
case ILWizard.SLOW:
|
||||
case ILMage.SPELL_BOOSTER:
|
||||
case ILArchMage.HEROS_WILL:
|
||||
case ILArchMage.INFINITY:
|
||||
case ILArchMage.MANA_REFLECTION:
|
||||
case ILArchMage.MAPLE_WARRIOR:
|
||||
case Cleric.INVINCIBLE:
|
||||
case Cleric.BLESS:
|
||||
case Priest.DISPEL:
|
||||
case Priest.DOOM:
|
||||
case Priest.HOLY_SYMBOL:
|
||||
case Priest.MYSTIC_DOOR:
|
||||
case Bishop.HEROS_WILL:
|
||||
case Bishop.HOLY_SHIELD:
|
||||
case Bishop.INFINITY:
|
||||
case Bishop.MANA_REFLECTION:
|
||||
case Bishop.MAPLE_WARRIOR:
|
||||
case Archer.FOCUS:
|
||||
case Hunter.BOW_BOOSTER:
|
||||
case Hunter.SOUL_ARROW:
|
||||
case Ranger.PUPPET:
|
||||
case Bowmaster.CONCENTRATE:
|
||||
case Bowmaster.HEROS_WILL:
|
||||
case Bowmaster.MAPLE_WARRIOR:
|
||||
case Bowmaster.SHARP_EYES:
|
||||
case Crossbowman.CROSSBOW_BOOSTER:
|
||||
case Crossbowman.SOUL_ARROW:
|
||||
case Sniper.PUPPET:
|
||||
case Marksman.BLIND:
|
||||
case Marksman.HEROS_WILL:
|
||||
case Marksman.MAPLE_WARRIOR:
|
||||
case Marksman.SHARP_EYES:
|
||||
case Rogue.DARK_SIGHT:
|
||||
case Assassin.CLAW_BOOSTER:
|
||||
case Assassin.HASTE:
|
||||
case Hermit.MESO_UP:
|
||||
case Hermit.SHADOW_PARTNER:
|
||||
case NightLord.HEROS_WILL:
|
||||
case NightLord.MAPLE_WARRIOR:
|
||||
case NightLord.NINJA_AMBUSH:
|
||||
case NightLord.SHADOW_STARS:
|
||||
case Bandit.DAGGER_BOOSTER:
|
||||
case Bandit.HASTE:
|
||||
case ChiefBandit.MESO_GUARD:
|
||||
case ChiefBandit.PICKPOCKET:
|
||||
case Shadower.HEROS_WILL:
|
||||
case Shadower.MAPLE_WARRIOR:
|
||||
case Shadower.NINJA_AMBUSH:
|
||||
case Pirate.DASH:
|
||||
case Marauder.TRANSFORMATION:
|
||||
case Buccaneer.SUPER_TRANSFORMATION:
|
||||
case Corsair.BATTLE_SHIP:
|
||||
case GM.HIDE:
|
||||
case SuperGM.HASTE:
|
||||
case SuperGM.HOLY_SYMBOL:
|
||||
case SuperGM.BLESS:
|
||||
case SuperGM.HIDE:
|
||||
case SuperGM.HYPER_BODY:
|
||||
case Noblesse.BLESSING_OF_THE_FAIRY:
|
||||
case Noblesse.ECHO_OF_HERO:
|
||||
case Noblesse.MONSTER_RIDER:
|
||||
case Noblesse.NIMBLE_FEET:
|
||||
case Noblesse.RECOVERY:
|
||||
case DawnWarrior.COMBO:
|
||||
case DawnWarrior.FINAL_ATTACK:
|
||||
case DawnWarrior.IRON_BODY:
|
||||
case DawnWarrior.RAGE:
|
||||
case DawnWarrior.SOUL:
|
||||
case DawnWarrior.SOUL_CHARGE:
|
||||
case DawnWarrior.SWORD_BOOSTER:
|
||||
case BlazeWizard.ELEMENTAL_RESET:
|
||||
case BlazeWizard.FLAME:
|
||||
case BlazeWizard.IFRIT:
|
||||
case BlazeWizard.MAGIC_ARMOR:
|
||||
case BlazeWizard.MAGIC_GUARD:
|
||||
case BlazeWizard.MEDITATION:
|
||||
case BlazeWizard.SEAL:
|
||||
case BlazeWizard.SLOW:
|
||||
case BlazeWizard.SPELL_BOOSTER:
|
||||
case WindArcher.BOW_BOOSTER:
|
||||
case WindArcher.EAGLE_EYE:
|
||||
case WindArcher.FINAL_ATTACK:
|
||||
case WindArcher.FOCUS:
|
||||
case WindArcher.PUPPET:
|
||||
case WindArcher.SOUL_ARROW:
|
||||
case WindArcher.STORM:
|
||||
case WindArcher.WIND_WALK:
|
||||
case NightWalker.CLAW_BOOSTER:
|
||||
case NightWalker.DARKNESS:
|
||||
case NightWalker.DARK_SIGHT:
|
||||
case NightWalker.HASTE:
|
||||
case NightWalker.SHADOW_PARTNER:
|
||||
case ThunderBreaker.DASH:
|
||||
case ThunderBreaker.ENERGY_CHARGE:
|
||||
case ThunderBreaker.ENERGY_DRAIN:
|
||||
case ThunderBreaker.KNUCKLER_BOOSTER:
|
||||
case ThunderBreaker.LIGHTNING:
|
||||
case ThunderBreaker.SPARK:
|
||||
case ThunderBreaker.LIGHTNING_CHARGE:
|
||||
case ThunderBreaker.SPEED_INFUSION:
|
||||
case ThunderBreaker.TRANSFORMATION:
|
||||
case Legend.BLESSING_OF_THE_FAIRY:
|
||||
case Legend.AGILE_BODY:
|
||||
case Legend.ECHO_OF_HERO:
|
||||
case Legend.RECOVERY:
|
||||
case Legend.MONSTER_RIDER:
|
||||
case Aran.MAPLE_WARRIOR:
|
||||
case Aran.HEROS_WILL:
|
||||
case Aran.POLEARM_BOOSTER:
|
||||
case Aran.COMBO_DRAIN:
|
||||
case Aran.SNOW_CHARGE:
|
||||
case Aran.BODY_PRESSURE:
|
||||
case Aran.SMART_KNOCKBACK:
|
||||
case Aran.COMBO_BARRIER:
|
||||
case Aran.COMBO_ABILITY:
|
||||
case Evan.BLESSING_OF_THE_FAIRY:
|
||||
case Evan.RECOVERY:
|
||||
case Evan.NIMBLE_FEET:
|
||||
case Evan.HEROS_WILL:
|
||||
case Evan.ECHO_OF_HERO:
|
||||
case Evan.MAGIC_BOOSTER:
|
||||
case Evan.MAGIC_GUARD:
|
||||
case Evan.ELEMENTAL_RESET:
|
||||
case Evan.MAPLE_WARRIOR:
|
||||
case Evan.MAGIC_RESISTANCE:
|
||||
case Evan.MAGIC_SHIELD:
|
||||
case Evan.SLOW:
|
||||
isBuff = true;
|
||||
break;
|
||||
MapleData hit = data.getChildByPath("hit");
|
||||
MapleData ball = data.getChildByPath("ball");
|
||||
isBuff = effect != null && hit == null && ball == null;
|
||||
isBuff |= action_ != null && MapleDataTool.getString("0", action_, "").equals("alert2");
|
||||
switch (id) {
|
||||
case Hero.RUSH:
|
||||
case Paladin.RUSH:
|
||||
case DarkKnight.RUSH:
|
||||
case DragonKnight.SACRIFICE:
|
||||
case FPMage.EXPLOSION:
|
||||
case FPMage.POISON_MIST:
|
||||
case Cleric.HEAL:
|
||||
case Ranger.MORTAL_BLOW:
|
||||
case Sniper.MORTAL_BLOW:
|
||||
case Assassin.DRAIN:
|
||||
case Hermit.SHADOW_WEB:
|
||||
case Bandit.STEAL:
|
||||
case Shadower.SMOKE_SCREEN:
|
||||
case SuperGM.HEAL_PLUS_DISPEL:
|
||||
case Hero.MONSTER_MAGNET:
|
||||
case Paladin.MONSTER_MAGNET:
|
||||
case DarkKnight.MONSTER_MAGNET:
|
||||
case Evan.ICE_BREATH:
|
||||
case Evan.FIRE_BREATH:
|
||||
case Gunslinger.RECOIL_SHOT:
|
||||
case Marauder.ENERGY_DRAIN:
|
||||
case BlazeWizard.FLAME_GEAR:
|
||||
case NightWalker.SHADOW_WEB:
|
||||
case NightWalker.POISON_BOMB:
|
||||
case NightWalker.VAMPIRE:
|
||||
case ChiefBandit.CHAKRA:
|
||||
case Evan.RECOVERY_AURA:
|
||||
isBuff = false;
|
||||
break;
|
||||
case Beginner.RECOVERY:
|
||||
case Beginner.NIMBLE_FEET:
|
||||
case Beginner.MONSTER_RIDER:
|
||||
case Beginner.ECHO_OF_HERO:
|
||||
case Swordsman.IRON_BODY:
|
||||
case Fighter.AXE_BOOSTER:
|
||||
case Fighter.POWER_GUARD:
|
||||
case Fighter.RAGE:
|
||||
case Fighter.SWORD_BOOSTER:
|
||||
case Crusader.ARMOR_CRASH:
|
||||
case Crusader.COMBO:
|
||||
case Hero.ENRAGE:
|
||||
case Hero.HEROS_WILL:
|
||||
case Hero.MAPLE_WARRIOR:
|
||||
case Hero.STANCE:
|
||||
case Page.BW_BOOSTER:
|
||||
case Page.POWER_GUARD:
|
||||
case Page.SWORD_BOOSTER:
|
||||
case Page.THREATEN:
|
||||
case WhiteKnight.BW_FIRE_CHARGE:
|
||||
case WhiteKnight.BW_ICE_CHARGE:
|
||||
case WhiteKnight.BW_LIT_CHARGE:
|
||||
case WhiteKnight.MAGIC_CRASH:
|
||||
case WhiteKnight.SWORD_FIRE_CHARGE:
|
||||
case WhiteKnight.SWORD_ICE_CHARGE:
|
||||
case WhiteKnight.SWORD_LIT_CHARGE:
|
||||
case Paladin.BW_HOLY_CHARGE:
|
||||
case Paladin.HEROS_WILL:
|
||||
case Paladin.MAPLE_WARRIOR:
|
||||
case Paladin.STANCE:
|
||||
case Paladin.SWORD_HOLY_CHARGE:
|
||||
case Spearman.HYPER_BODY:
|
||||
case Spearman.IRON_WILL:
|
||||
case Spearman.POLEARM_BOOSTER:
|
||||
case Spearman.SPEAR_BOOSTER:
|
||||
case DragonKnight.DRAGON_BLOOD:
|
||||
case DragonKnight.POWER_CRASH:
|
||||
case DarkKnight.AURA_OF_BEHOLDER:
|
||||
case DarkKnight.BEHOLDER:
|
||||
case DarkKnight.HEROS_WILL:
|
||||
case DarkKnight.HEX_OF_BEHOLDER:
|
||||
case DarkKnight.MAPLE_WARRIOR:
|
||||
case DarkKnight.STANCE:
|
||||
case Magician.MAGIC_GUARD:
|
||||
case Magician.MAGIC_ARMOR:
|
||||
case FPWizard.MEDITATION:
|
||||
case FPWizard.SLOW:
|
||||
case FPMage.SEAL:
|
||||
case FPMage.SPELL_BOOSTER:
|
||||
case FPArchMage.HEROS_WILL:
|
||||
case FPArchMage.INFINITY:
|
||||
case FPArchMage.MANA_REFLECTION:
|
||||
case FPArchMage.MAPLE_WARRIOR:
|
||||
case ILWizard.MEDITATION:
|
||||
case ILMage.SEAL:
|
||||
case ILWizard.SLOW:
|
||||
case ILMage.SPELL_BOOSTER:
|
||||
case ILArchMage.HEROS_WILL:
|
||||
case ILArchMage.INFINITY:
|
||||
case ILArchMage.MANA_REFLECTION:
|
||||
case ILArchMage.MAPLE_WARRIOR:
|
||||
case Cleric.INVINCIBLE:
|
||||
case Cleric.BLESS:
|
||||
case Priest.DISPEL:
|
||||
case Priest.DOOM:
|
||||
case Priest.HOLY_SYMBOL:
|
||||
case Priest.MYSTIC_DOOR:
|
||||
case Bishop.HEROS_WILL:
|
||||
case Bishop.HOLY_SHIELD:
|
||||
case Bishop.INFINITY:
|
||||
case Bishop.MANA_REFLECTION:
|
||||
case Bishop.MAPLE_WARRIOR:
|
||||
case Archer.FOCUS:
|
||||
case Hunter.BOW_BOOSTER:
|
||||
case Hunter.SOUL_ARROW:
|
||||
case Ranger.PUPPET:
|
||||
case Bowmaster.CONCENTRATE:
|
||||
case Bowmaster.HEROS_WILL:
|
||||
case Bowmaster.MAPLE_WARRIOR:
|
||||
case Bowmaster.SHARP_EYES:
|
||||
case Crossbowman.CROSSBOW_BOOSTER:
|
||||
case Crossbowman.SOUL_ARROW:
|
||||
case Sniper.PUPPET:
|
||||
case Marksman.BLIND:
|
||||
case Marksman.HEROS_WILL:
|
||||
case Marksman.MAPLE_WARRIOR:
|
||||
case Marksman.SHARP_EYES:
|
||||
case Rogue.DARK_SIGHT:
|
||||
case Assassin.CLAW_BOOSTER:
|
||||
case Assassin.HASTE:
|
||||
case Hermit.MESO_UP:
|
||||
case Hermit.SHADOW_PARTNER:
|
||||
case NightLord.HEROS_WILL:
|
||||
case NightLord.MAPLE_WARRIOR:
|
||||
case NightLord.NINJA_AMBUSH:
|
||||
case NightLord.SHADOW_STARS:
|
||||
case Bandit.DAGGER_BOOSTER:
|
||||
case Bandit.HASTE:
|
||||
case ChiefBandit.MESO_GUARD:
|
||||
case ChiefBandit.PICKPOCKET:
|
||||
case Shadower.HEROS_WILL:
|
||||
case Shadower.MAPLE_WARRIOR:
|
||||
case Shadower.NINJA_AMBUSH:
|
||||
case Pirate.DASH:
|
||||
case Marauder.TRANSFORMATION:
|
||||
case Buccaneer.SUPER_TRANSFORMATION:
|
||||
case Corsair.BATTLE_SHIP:
|
||||
case GM.HIDE:
|
||||
case SuperGM.HASTE:
|
||||
case SuperGM.HOLY_SYMBOL:
|
||||
case SuperGM.BLESS:
|
||||
case SuperGM.HIDE:
|
||||
case SuperGM.HYPER_BODY:
|
||||
case Noblesse.BLESSING_OF_THE_FAIRY:
|
||||
case Noblesse.ECHO_OF_HERO:
|
||||
case Noblesse.MONSTER_RIDER:
|
||||
case Noblesse.NIMBLE_FEET:
|
||||
case Noblesse.RECOVERY:
|
||||
case DawnWarrior.COMBO:
|
||||
case DawnWarrior.FINAL_ATTACK:
|
||||
case DawnWarrior.IRON_BODY:
|
||||
case DawnWarrior.RAGE:
|
||||
case DawnWarrior.SOUL:
|
||||
case DawnWarrior.SOUL_CHARGE:
|
||||
case DawnWarrior.SWORD_BOOSTER:
|
||||
case BlazeWizard.ELEMENTAL_RESET:
|
||||
case BlazeWizard.FLAME:
|
||||
case BlazeWizard.IFRIT:
|
||||
case BlazeWizard.MAGIC_ARMOR:
|
||||
case BlazeWizard.MAGIC_GUARD:
|
||||
case BlazeWizard.MEDITATION:
|
||||
case BlazeWizard.SEAL:
|
||||
case BlazeWizard.SLOW:
|
||||
case BlazeWizard.SPELL_BOOSTER:
|
||||
case WindArcher.BOW_BOOSTER:
|
||||
case WindArcher.EAGLE_EYE:
|
||||
case WindArcher.FINAL_ATTACK:
|
||||
case WindArcher.FOCUS:
|
||||
case WindArcher.PUPPET:
|
||||
case WindArcher.SOUL_ARROW:
|
||||
case WindArcher.STORM:
|
||||
case WindArcher.WIND_WALK:
|
||||
case NightWalker.CLAW_BOOSTER:
|
||||
case NightWalker.DARKNESS:
|
||||
case NightWalker.DARK_SIGHT:
|
||||
case NightWalker.HASTE:
|
||||
case NightWalker.SHADOW_PARTNER:
|
||||
case ThunderBreaker.DASH:
|
||||
case ThunderBreaker.ENERGY_CHARGE:
|
||||
case ThunderBreaker.ENERGY_DRAIN:
|
||||
case ThunderBreaker.KNUCKLER_BOOSTER:
|
||||
case ThunderBreaker.LIGHTNING:
|
||||
case ThunderBreaker.SPARK:
|
||||
case ThunderBreaker.LIGHTNING_CHARGE:
|
||||
case ThunderBreaker.SPEED_INFUSION:
|
||||
case ThunderBreaker.TRANSFORMATION:
|
||||
case Legend.BLESSING_OF_THE_FAIRY:
|
||||
case Legend.AGILE_BODY:
|
||||
case Legend.ECHO_OF_HERO:
|
||||
case Legend.RECOVERY:
|
||||
case Legend.MONSTER_RIDER:
|
||||
case Aran.MAPLE_WARRIOR:
|
||||
case Aran.HEROS_WILL:
|
||||
case Aran.POLEARM_BOOSTER:
|
||||
case Aran.COMBO_DRAIN:
|
||||
case Aran.SNOW_CHARGE:
|
||||
case Aran.BODY_PRESSURE:
|
||||
case Aran.SMART_KNOCKBACK:
|
||||
case Aran.COMBO_BARRIER:
|
||||
case Aran.COMBO_ABILITY:
|
||||
case Evan.BLESSING_OF_THE_FAIRY:
|
||||
case Evan.RECOVERY:
|
||||
case Evan.NIMBLE_FEET:
|
||||
case Evan.HEROS_WILL:
|
||||
case Evan.ECHO_OF_HERO:
|
||||
case Evan.MAGIC_BOOSTER:
|
||||
case Evan.MAGIC_GUARD:
|
||||
case Evan.ELEMENTAL_RESET:
|
||||
case Evan.MAPLE_WARRIOR:
|
||||
case Evan.MAGIC_RESISTANCE:
|
||||
case Evan.MAGIC_SHIELD:
|
||||
case Evan.SLOW:
|
||||
isBuff = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (MapleData level : data.getChildByPath("level")) {
|
||||
ret.effects.add(MapleStatEffect.loadSkillEffectFromData(level, id, isBuff));
|
||||
}
|
||||
ret.animationTime = 0;
|
||||
if (effect != null) {
|
||||
for (MapleData effectEntry : effect) {
|
||||
ret.animationTime += MapleDataTool.getIntConvert("delay", effectEntry, 0);
|
||||
|
||||
for (MapleData level : data.getChildByPath("level")) {
|
||||
ret.effects.add(MapleStatEffect.loadSkillEffectFromData(level, id, isBuff));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
ret.animationTime = 0;
|
||||
if (effect != null) {
|
||||
for (MapleData effectEntry : effect) {
|
||||
ret.animationTime += MapleDataTool.getIntConvert("delay", effectEntry, 0);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static String getSkillName(int skillid) {
|
||||
|
||||
@@ -199,7 +199,6 @@ public class MapleInventory implements Iterable<Item> {
|
||||
inventory.put(slot, item);
|
||||
|
||||
if(MapleItemInformationProvider.getInstance().isRateCoupon(item.getItemId())) {
|
||||
System.out.println("reformulating");
|
||||
owner.revertCouponRates();
|
||||
owner.setCouponRates();
|
||||
}
|
||||
@@ -209,7 +208,6 @@ public class MapleInventory implements Iterable<Item> {
|
||||
Item item = inventory.remove(slot);
|
||||
|
||||
if(item != null && MapleItemInformationProvider.getInstance().isRateCoupon(item.getItemId())) {
|
||||
System.out.println("reformulating");
|
||||
owner.revertCouponRates();
|
||||
owner.setCouponRates();
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ import client.inventory.MapleInventoryType;
|
||||
import client.inventory.MaplePet;
|
||||
import client.inventory.PetDataFactory;
|
||||
import constants.GameConstants;
|
||||
import constants.ServerConstants;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import server.TimerManager;
|
||||
|
||||
@@ -278,5 +279,12 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
|
||||
|
||||
mc.setHpDecreaseTask(hpDecreaseTask);
|
||||
}
|
||||
|
||||
player.dispelBuffCoupons();
|
||||
player.resetPlayerRates();
|
||||
|
||||
if(ServerConstants.USE_ADD_RATES_BY_LEVEL == true) player.setPlayerRates();
|
||||
player.setWorldRates();
|
||||
player.setCouponRates();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,29 +275,29 @@ public class MapleInventoryManipulator {
|
||||
}
|
||||
|
||||
public static void removeById(MapleClient c, MapleInventoryType type, int itemId, int quantity, boolean fromDrop, boolean consume) {
|
||||
int removeQuantity = quantity;
|
||||
MapleInventory inv = c.getPlayer().getInventory(type);
|
||||
int removeQuantity = quantity;
|
||||
MapleInventory inv = c.getPlayer().getInventory(type);
|
||||
int slotLimit = type == MapleInventoryType.EQUIPPED ? 128 : inv.getSlotLimit();
|
||||
|
||||
for (short i = 0; i <= slotLimit; i++) {
|
||||
Item item = inv.getItem((short) (type == MapleInventoryType.EQUIPPED ? -i : i));
|
||||
if (item != null) {
|
||||
if (item.getItemId() == itemId || item.getCashId() == itemId) {
|
||||
if (removeQuantity <= item.getQuantity()) {
|
||||
removeFromSlot(c, type, item.getPosition(), (short) removeQuantity, fromDrop, consume);
|
||||
removeQuantity = 0;
|
||||
break;
|
||||
} else {
|
||||
removeQuantity -= item.getQuantity();
|
||||
removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (short i = 0; i <= slotLimit; i++) {
|
||||
Item item = inv.getItem((short) (type == MapleInventoryType.EQUIPPED ? -i : i));
|
||||
if (item != null) {
|
||||
if (item.getItemId() == itemId || item.getCashId() == itemId) {
|
||||
if (removeQuantity <= item.getQuantity()) {
|
||||
removeFromSlot(c, type, item.getPosition(), (short) removeQuantity, fromDrop, consume);
|
||||
removeQuantity = 0;
|
||||
break;
|
||||
} else {
|
||||
removeQuantity -= item.getQuantity();
|
||||
removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (removeQuantity > 0) {
|
||||
throw new RuntimeException("[HACK] Not enough items available of Item:" + itemId + ", Quantity (After Quantity/Over Current Quantity): " + (quantity - removeQuantity) + "/" + quantity);
|
||||
}
|
||||
}
|
||||
if (removeQuantity > 0) {
|
||||
throw new RuntimeException("[HACK] Not enough items available of Item:" + itemId + ", Quantity (After Quantity/Over Current Quantity): " + (quantity - removeQuantity) + "/" + quantity);
|
||||
}
|
||||
}
|
||||
|
||||
public static void move(MapleClient c, MapleInventoryType type, short src, short dst) {
|
||||
if (src < 0 || dst < 0) {
|
||||
|
||||
Reference in New Issue
Block a user