public static void equip(final MapleClient c, final short src, short dst) {
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
final MapleCharacter chr = c.getPlayer();
if (chr == null || (GameConstants.GMS && dst == -55)) {
return;
}
c.getPlayer().getStat().recalcLocalStats(c.getPlayer());
final PlayerStats statst = c.getPlayer().getStat();
statst.recalcLocalStats(c.getPlayer());
Equip source = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(src);
Equip target;
if (source == null || source.getDurability() == 0 || GameConstants.isHarvesting(source.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (GameConstants.isGMEquip(source.getItemId()) && !c.getPlayer().isStaff()) {
c.getPlayer().dropMessage(1, "只有遊戲管理員可以使用此裝備.");
c.getPlayer().removeAll(source.getItemId(), false);
c.getSession().write(CWvsContext.enableActions());
return;
}
//if (GameConstants.isMadeByGM(c, source.getItemId(), src) && !c.getPlayer().isStaff()) {
// c.getPlayer().dropMessage(1, "You are not allowed to use GM-Made equips.");
// c.getSession().write(CWvsContext.enableActions());
// return;
//}
if (GameConstants.isOverPoweredEquip(c, source.getItemId(), src) && !c.getPlayer().isStaff()) {
c.getPlayer().dropMessage(1, "It seems that the item is way too over powered, please report to the Admin if you think that the system is wrong.");
//c.getPlayer().removeAll(source.getItemId(), false); //System might be wrong
c.getSession().write(CWvsContext.enableActions());
return;
}
if (!c.getPlayer().isGM()) {
if (source.getItemId() == 1112663 || source.getItemId() == 1112586) {
c.getPlayer().dropMessage(1, "White Angelic Blessing, and Dark Angelic Blessing are currently not working.");
c.getSession().write(CWvsContext.enableActions());
return;
}
}
final Map<String, Integer> stats = ii.getEquipStats(source.getItemId());
if (stats == null) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (dst > -1200 && dst < -999 && !GameConstants.isEvanDragonItem(source.getItemId()) && !GameConstants.isMechanicItem(source.getItemId())) {
c.getSession().write(CWvsContext.enableActions());
return;
// } else if ((dst <= -1200 || (dst >= -999 && dst < -99)) && !stats.containsKey("cash")) {
// c.getSession().write(CWvsContext.enableActions());
// return;
// }
} else if (((dst < -5003) || ((dst >= -999) && (dst < -99))) &&(!stats.containsKey("cash"))) {
c.getSession().write(CWvsContext.enableActions());
return;
}else if (dst > -1400 && dst <= -1300 && c.getPlayer().getAndroid() == null) {
c.getSession().write(CWvsContext.enableActions());
return;
} else if (dst > -5000 && dst <= -1400) {
c.getSession().write(CWvsContext.enableActions());
return;
} else if (dst > -5100 && dst <= -5000 && source.getItemId() / 10000 != 120) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (!ii.canEquip(stats, source.getItemId(), chr.getLevel(), chr.getJob(), chr.getFame(), statst.getTotalStr(), statst.getTotalDex(), statst.getTotalLuk(), statst.getTotalInt(), c.getPlayer().getStat().levelBonus, source.getReqLevel())) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (GameConstants.isWeapon(source.getItemId()) && dst != -10 && dst != -11) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (dst == -18 && !GameConstants.isMountItemAvailable(source.getItemId(), c.getPlayer().getJob())) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (dst == -118 && source.getItemId() / 10000 != 190) {
c.getSession().write(CWvsContext.enableActions());
return;
}
//totem2
if ((dst <= -5000) && (dst > -5003) && (source.getItemId() / 10000 != 120))
{
c.getSession().write(CWvsContext.enableActions());
return;
}
if (dst == -59) { //pendant
MapleQuestStatus stat = c.getPlayer().getQuestNoAdd(MapleQuest.getInstance(GameConstants.PENDANT_SLOT));
if (stat == null || stat.getCustomData() == null || Long.parseLong(stat.getCustomData()) < System.currentTimeMillis()) {
c.getSession().write(CWvsContext.enableActions());
return;
}
}
if (GameConstants.isKatara(source.getItemId()) || source.getItemId() / 10000 == 135) {
dst = (byte) -10; //shield slot
}
if (GameConstants.isEvanDragonItem(source.getItemId()) && (chr.getJob() < 2200 || chr.getJob() > 2218)) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (GameConstants.isMechanicItem(source.getItemId()) && (chr.getJob() < 3500 || chr.getJob() > 3512)) {
c.getSession().write(CWvsContext.enableActions());
return;
}
if (source.getItemId() / 1000 == 1112) { //ring
for (RingSet s : RingSet.values()) {
if (s.id.contains(Integer.valueOf(source.getItemId()))) {
List<Integer> theList = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).listIds();
for (Integer i : s.id) {
if (theList.contains(i)) {
c.getPlayer().dropMessage(1, "You may not equip this item because you already have a " + (StringUtil.makeEnumHumanReadable(s.name())) + " equipped.");
c.getSession().write(CWvsContext.enableActions());
return;
}
}
}
}
}
switch (dst) {
case -6: { // Top
final Item top = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
if (top != null && GameConstants.isOverall(top.getItemId())) {
if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(InventoryPacket.getShowInventoryFull());
return;
}
unequip(c, (byte) -5, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
break;
}
case -5: {
final Item top = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
final Item bottom = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -6);
if (top != null && GameConstants.isOverall(source.getItemId())) {
if (chr.getInventory(MapleInventoryType.EQUIP).isFull(bottom != null && GameConstants.isOverall(source.getItemId()) ? 1 : 0)) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(InventoryPacket.getShowInventoryFull());
return;
}
unequip(c, (byte) -5, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
if (bottom != null && GameConstants.isOverall(source.getItemId())) {
if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(InventoryPacket.getShowInventoryFull());
return;
}
unequip(c, (byte) -6, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
break;
}
case -10: { // Shield
Item weapon = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
if (GameConstants.isKatara(source.getItemId())) {
if ((chr.getJob() != 900 && !GameConstants.isDualBlade(chr.getJob())) || weapon == null || !GameConstants.isDagger(weapon.getItemId())) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(InventoryPacket.getShowInventoryFull());
return;
}
} else if (weapon != null && GameConstants.isTwoHanded(weapon.getItemId()) && !GameConstants.isSpecialShield(source.getItemId())) {
if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(InventoryPacket.getShowInventoryFull());
return;
}
unequip(c, (byte) -11, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
break;
}
case -11: { // Weapon
Item shield = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -10);
if (shield != null && GameConstants.isTwoHanded(source.getItemId()) && !GameConstants.isSpecialShield(shield.getItemId())) {
if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(InventoryPacket.getInventoryFull());
c.getSession().write(InventoryPacket.getShowInventoryFull());
return;
}
unequip(c, (byte) -10, chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
break;
}
}
source = (Equip) chr.getInventory(MapleInventoryType.EQUIP).getItem(src); // Equip
target = (Equip) chr.getInventory(MapleInventoryType.EQUIPPED).getItem(dst); // Currently equipping
if (source == null) {
c.getSession().write(CWvsContext.enableActions());
return;
}
short flag = source.getFlag();
if (stats.get("equipTradeBlock") != null || source.getItemId() / 10000 == 167) { // Block trade when equipped.
if (!ItemFlag.UNTRADABLE.check(flag)) {
flag |= ItemFlag.UNTRADABLE.getValue();
source.setFlag(flag);
c.getSession().write(InventoryPacket.updateSpecialItemUse_(source, MapleInventoryType.EQUIP.getType(), c.getPlayer()));
}
}
if (source.getItemId() / 10000 == 166) {
if (source.getAndroid() == null) {
int uid = MapleInventoryIdentifier.getInstance();
source.setUniqueId(uid);
source.setAndroid(MapleAndroid.create(source.getItemId(), uid));
flag = (short) (flag | ItemFlag.LOCK.getValue());
flag = (short) (flag | ItemFlag.UNTRADABLE.getValue());
flag = (short) (flag | ItemFlag.ANDROID_ACTIVATED.getValue());
source.setFlag(flag);
c.getSession().write(CWvsContext.InventoryPacket.updateSpecialItemUse_(source, MapleInventoryType.EQUIP.getType(), c.getPlayer()));
}
chr.removeAndroid();
chr.setAndroid(source.getAndroid());
} else if ((dst <= -1300) && (chr.getAndroid() != null)) {
chr.setAndroid(chr.getAndroid());
}
if (source.getCharmEXP() > 0 && !ItemFlag.CHARM_EQUIPPED.check(flag)) {
chr.getTrait(MapleTraitType.charm).addExp(source.getCharmEXP(), chr);
source.setCharmEXP((short) 0);
flag |= ItemFlag.CHARM_EQUIPPED.getValue();
source.setFlag(flag);
c.getSession().write(InventoryPacket.updateSpecialItemUse_(source, GameConstants.getInventoryType(source.getItemId()).getType(), c.getPlayer()));
}
chr.getInventory(MapleInventoryType.EQUIP).removeSlot(src);
if (target != null) {
chr.getInventory(MapleInventoryType.EQUIPPED).removeSlot(dst);
}
source.setPosition(dst);
chr.getInventory(MapleInventoryType.EQUIPPED).addFromDB(source);
if (target != null) {
target.setPosition(src);
chr.getInventory(MapleInventoryType.EQUIP).addFromDB(target);
}
if (GameConstants.isWeapon(source.getItemId())) {
c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.BOOSTER);
c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.SPIRIT_CLAW);
c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.SOULARROW);
c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.WK_CHARGE);
c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.LIGHTNING_CHARGE);
}
if (source.getItemId() / 10000 == 190 || source.getItemId() / 10000 == 191) {
c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING);
c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.MECH_CHANGE);
} else if (GameConstants.isReverseItem(source.getItemId())) {
// chr.finishAchievement(9);
} else if (GameConstants.isTimelessItem(source.getItemId())) {
//chr.finishAchievement(10);
} else if (stats.containsKey("reqLevel") && stats.get("reqLevel") >= 140) {
// chr.finishAchievement(41);
} else if (stats.containsKey("reqLevel") && stats.get("reqLevel") >= 130) {
//chr.finishAchievement(40);
} else if (source.getItemId() == 1122017) {
chr.startFairySchedule(true, true);
}
if (source.getState() >= 17) {
final Map<Skill, SkillEntry> ss = new HashMap<>();
int[] potentials = {source.getPotential1(), source.getPotential2(), source.getPotential3(), source.getBonusPotential1(), source.getBonusPotential2()};
for (int i : potentials) {
if (i > 0) {
StructItemOption pot = ii.getPotentialInfo(i).get(ii.getReqLevel(source.getItemId()) / 10);
if (pot != null && pot.get("skillID") > 0) {
ss.put(SkillFactory.getSkill(PlayerStats.getSkillByJob(pot.get("skillID"), c.getPlayer().getJob())), new SkillEntry((byte) 1, (byte) 0, -1));
}
}
}
c.getPlayer().changeSkillLevel_Skip(ss, true);
}
if (source.getSocketState() > 15) {
final Map<Skill, SkillEntry> ss = new HashMap<>();
int[] sockets = {source.getSocket1(), source.getSocket2(), source.getSocket3()};
for (int i : sockets) {
if (i > 0) {
StructItemOption soc = ii.getSocketInfo(i);
if (soc != null && soc.get("skillID") > 0) {
ss.put(SkillFactory.getSkill(PlayerStats.getSkillByJob(soc.get("skillID"), c.getPlayer().getJob())), new SkillEntry((byte) 1, (byte) 0, -1));
}
}
}
c.getPlayer().changeSkillLevel_Skip(ss, true);
}
c.getSession().write(InventoryPacket.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 2, false, false));
chr.equipChanged();
}