Map chair skill + Hired Merchant fix

Changed map chair bonus healing mechanic to be a player skill, instead of promptly available for all players (healing buff takes place only if the player has the skill). Hired Merchant now properly checks for a space on the inventory before permitting a player to buy an item/bundle. Minor fix with concurrency on MapleStorage.
This commit is contained in:
ronancpl
2017-10-22 01:08:40 -02:00
parent 75e11e1996
commit e993c8c7b0
63 changed files with 354 additions and 191 deletions

View File

@@ -63,7 +63,7 @@ public enum MapleBuffStat {
BERSERK_FURY(0x8000000L),
DIVINE_BODY(0x10000000L),
SPARK(0x20000000L),
//0x40000000L
MAP_CHAIR(0x40000000L),
FINALATTACK(0x80000000L),
BATTLESHIP(0xA00000040L), // weird one
WATK(0x100000000L),

View File

@@ -121,6 +121,7 @@ import constants.GameConstants;
import constants.ItemConstants;
import constants.ServerConstants;
import constants.skills.Aran;
import constants.skills.Beginner;
import constants.skills.Bishop;
import constants.skills.BlazeWizard;
import constants.skills.Bowmaster;
@@ -135,10 +136,12 @@ import constants.skills.GM;
import constants.skills.Hermit;
import constants.skills.Hero;
import constants.skills.ILArchMage;
import constants.skills.Legend;
import constants.skills.Magician;
import constants.skills.Marauder;
import constants.skills.Marksman;
import constants.skills.NightLord;
import constants.skills.Noblesse;
import constants.skills.Paladin;
import constants.skills.Priest;
import constants.skills.Ranger;
@@ -1248,7 +1251,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
private void changeMapInternal(final MapleMap to, final Point pos, final byte[] warpPacket) {
if(!canWarpMap) return;
this.stopChairTask();
this.unregisterChairBuff();
this.clearBanishPlayerData();
this.closePlayerInteractions();
this.resetPlayerAggro();
@@ -2994,6 +2997,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
prtLock.unlock();
}
}
} else if (effect.isMapChair()) {
stopChairTask();
}
List<Pair<MapleBuffStat, MapleBuffStatValueHolder>> toCancel = deregisterBuffStats(buffstats);
@@ -3263,6 +3268,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
stopExtraTask();
startExtraTask(extraHpRec, extraMpRec, extraRecInterval); // HP & MP sharing the same task holder
}
} else if (effect.isMapChair()) {
startChairTask();
}
effLock.lock();
@@ -3324,7 +3331,36 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
recalcLocalStats();
}
private static int getJobMapChair(MapleJob job) {
switch(job.getId() / 1000) {
case 0:
return Beginner.MAP_CHAIR;
case 1:
return Noblesse.MAP_CHAIR;
default:
return Legend.MAP_CHAIR;
}
}
public void unregisterChairBuff() {
int skillId = getJobMapChair(job);
int skillLv = getSkillLevel(skillId);
if(skillLv > 0) {
MapleStatEffect mapChairSkill = SkillFactory.getSkill(skillId).getEffect(skillLv);
cancelEffect(mapChairSkill, false, -1);
}
}
public void registerChairBuff() {
int skillId = getJobMapChair(job);
int skillLv = getSkillLevel(skillId);
if(skillLv > 0) {
MapleStatEffect mapChairSkill = SkillFactory.getSkill(skillId).getEffect(skillLv);
mapChairSkill.applyTo(this);
}
}
public int getChair() {
return chair.get();
}

View File

@@ -1316,7 +1316,6 @@ public class MapleClient {
player.cancelBuffExpireTask();
player.cancelDiseaseExpireTask();
player.cancelSkillCooldownTask();
player.stopChairTask();
//Cancelling magicdoor? Nope
//Cancelling mounts? Noty
if (player.getBuffedValue(MapleBuffStat.PUPPET) != null) {

View File

@@ -74,9 +74,7 @@ import constants.skills.WhiteKnight;
import constants.skills.WindArcher;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import provider.MapleData;
@@ -189,6 +187,7 @@ public class SkillFactory {
case Beginner.NIMBLE_FEET:
case Beginner.MONSTER_RIDER:
case Beginner.ECHO_OF_HERO:
case Beginner.MAP_CHAIR:
case Swordsman.IRON_BODY:
case Fighter.AXE_BOOSTER:
case Fighter.POWER_GUARD:
@@ -303,6 +302,7 @@ public class SkillFactory {
case Noblesse.MONSTER_RIDER:
case Noblesse.NIMBLE_FEET:
case Noblesse.RECOVERY:
case Noblesse.MAP_CHAIR:
case DawnWarrior.COMBO:
case DawnWarrior.FINAL_ATTACK:
case DawnWarrior.IRON_BODY:
@@ -346,6 +346,7 @@ public class SkillFactory {
case Legend.ECHO_OF_HERO:
case Legend.RECOVERY:
case Legend.MONSTER_RIDER:
case Legend.MAP_CHAIR:
case Aran.MAPLE_WARRIOR:
case Aran.HEROS_WILL:
case Aran.POLEARM_BOOSTER: