package handling.channel.handler;
import client.MapleCharacter;
import client.MapleCharacterUtil;
import client.MapleClient;
import client.MapleStat;
import client.MonsterFamiliar;
import client.PlayerStats;
import client.Skill;
import client.SkillFactory;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.ItemFlag;
import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import client.inventory.PetFlag;
import constants.GameConstants;
import constants.ItemConstants;
import handling.channel.ChannelServer;
import handling.world.WorldBroadcastService;
import java.awt.Rectangle;
import java.util.EnumMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import server.AutobanManager;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.RandomRewards;
import server.Randomizer;
import server.StructFamiliar;
import server.StructItemOption;
import server.cashshop.CashItemFactory;
import server.events.MapleEvent;
import server.events.MapleEventType;
import server.life.MapleLifeFactory;
import server.maps.FieldLimitType;
import server.maps.MapleLove;
import server.maps.MapleMap;
import server.maps.MapleDefender;
import server.maps.MapleTVEffect;
import server.quest.MapleQuest;
import server.shop.MapleShopFactory;
import tools.FileoutputUtil;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.data.input.SeekableLittleEndianAccessor;
import tools.packet.InventoryPacket;
import tools.packet.MTSCSPacket;
import tools.packet.PetPacket;
public class UseCashItemHandler {
public static void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) {
// 2B 0F 00
// D0 C4 1F 00 // 道具ID
// 10 00 B2 E2 CA D4 C0 AE B0 C8 A3 A1 A3 A1 A3 A1 A3 A1
// 01
if ((chr == null) || (chr.getMap() == null)) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
chr.setScrolledPosition((short) 0);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
byte slot = (byte) slea.readShort();
int itemId = slea.readInt();
int itemType = itemId / 10000;
Item toUse = chr.getInventory(MapleInventoryType.USE).getItem((short) slot);
if ((toUse == null) || (toUse.getItemId() != itemId) || (toUse.getQuantity() < 1) || (chr.hasBlockedInventory())) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if (chr.isShowPacket()) {
chr.dropMessage(5, new StringBuilder().append("使用商城道具 物品ID: ").append(itemId).append(" 物品类型: ").append(itemType).toString());
}
boolean used = false;
boolean cc = false;
switch (itemType) {
case 217: // 缩地石
used = InventoryHandler.UseTeleRock(slea, c, itemId);
break;
case 218: // 洗点卷
// 2B 10 00 A0 43 21 00 80 00 00 00 40 00 00 00 敏捷加力量
// 2B 10 00 A0 43 21 00 00 01 00 00 00 02 00 00 减运气加智力
// 2B 1B 00 A0 43 21 00 80 00 00 00 40 00 00 00 减力量加敏捷
if (itemId == 2180000) { // 洗能力点
Map statupdate = new EnumMap(MapleStat.class);
int apto = slea.readInt();
int apfrom = slea.readInt();
int statLimit = c.getChannelServer().getStatLimit();
if (chr.isShowPacket()) {
chr.dropMessage(5, new StringBuilder().append("洗能力点 apto: ").append(apto).append(" apfrom: ").append(apfrom).toString());
}
if (apto == apfrom) {
break;
}
int job = chr.getJob();
PlayerStats playerst = chr.getStat();
used = true;
switch (apto) {
case 0x40:
if (playerst.getStr() < statLimit) {
break;
}
used = false;
break;
case 0x80:
if (playerst.getDex() < statLimit) {
break;
}
used = false;
break;
case 0x100:
if (playerst.getInt() < statLimit) {
break;
}
used = false;
break;
case 0x200:
if (playerst.getLuk() < statLimit) {
break;
}
used = false;
break;
case 0x400:
if (playerst.getMaxHp() < chr.getMaxHpForSever()) {
break;
}
used = false;
break;
case 0x800:
if (playerst.getMaxMp() < chr.getMaxMpForSever()) {
break;
}
used = false;
break;
default:
System.out.print("洗点未知的操作码:"+apto);
break;
}
switch (apfrom) {
case 0x40:
if (playerst.getStr() > 4) {
break;
}
used = false;
break;
case 0x80:
if (playerst.getDex() > 4) {
break;
}
used = false;
break;
case 0x100:
if (playerst.getInt() > 4) {
break;
}
used = false;
break;
case 0x200:
if (playerst.getLuk() > 4) {
break;
}
used = false;
break;
case 0x400:
if ((chr.getHpApUsed() > 0) && (chr.getHpApUsed() < 10000)) {
break;
}
used = false;
break;
case 0x800:
if ((chr.getHpApUsed() > 0) && (chr.getHpApUsed() < 10000)) {
break;
}
used = false;
}
if (used) {
switch (apto) {
case 0x40:
long toSet = playerst.getStr() + 1;
playerst.setStr((short) (int) toSet, chr);
statupdate.put(MapleStat.力量, toSet);
break;
case 0x80:
toSet = playerst.getDex() + 1;
playerst.setDex((short) (int) toSet, chr);
statupdate.put(MapleStat.敏捷, toSet);
break;
case 0x100:
toSet = playerst.getInt() + 1;
playerst.setInt((short) (int) toSet, chr);
statupdate.put(MapleStat.智力, toSet);
break;
case 0x200:
toSet = playerst.getLuk() + 1;
playerst.setLuk((short) (int) toSet, chr);
statupdate.put(MapleStat.运气, toSet);
break;
case 0x400:
int maxhp = playerst.getMaxHp();
if (GameConstants.is新手职业(job)) {
maxhp += Randomizer.rand(4, 8);
}else if (((job >= 100) && (job <= 132)) ) {
maxhp += Randomizer.rand(36, 42);
} else if (((job >= 200) && (job <= 232)) ) {
maxhp += Randomizer.rand(10, 12);
} else if (((job >= 300) && (job <= 322)) || ((job >= 400) && (job <= 434)) ) {
maxhp += Randomizer.rand(14, 18);
} else if (((job >= 510) && (job <= 512)) || ((job >= 580) && (job <= 582))) {
maxhp += Randomizer.rand(24, 28);
} else if (((job >= 500) && (job <= 532)) || ((job >= 590) && (job <= 592))) {
maxhp += Randomizer.rand(16, 20);
}else {
maxhp += Randomizer.rand(16, 20);
}
maxhp = Math.min(chr.getMaxHpForSever(), Math.abs(maxhp));
chr.setHpApUsed((short) (chr.getHpApUsed() + 1));
playerst.setMaxHp(maxhp, chr);
statupdate.put(MapleStat.MAXHP, (long) maxhp);
break;
case 0x800:
int maxmp = playerst.getMaxMp();
if (GameConstants.is新手职业(job)) {
maxmp += Randomizer.rand(6, 8);
} else {
if (((job >= 100) && (job <= 132)) ) {
maxmp += Randomizer.rand(4, 9);
} else if (((job >= 200) && (job <= 232)) ) {
maxmp += Randomizer.rand(32, 36);
} else if (((job >= 300) && (job <= 322)) || ((job >= 400) && (job <= 434)) || ((job >= 500) && (job <= 592))) {
maxmp += Randomizer.rand(8, 10);
} else {
maxmp += Randomizer.rand(6, 8);
}
}
maxmp = Math.min(chr.getMaxMpForSever(), Math.abs(maxmp));
chr.setHpApUsed((short) (chr.getHpApUsed() + 1));
playerst.setMaxMp(maxmp, chr);
statupdate.put(MapleStat.MAXMP, (long) maxmp);
}
switch (apfrom) {
case 0x40:
long toSet = playerst.getStr() - 1;
playerst.setStr((short) (int) toSet, chr);
statupdate.put(MapleStat.力量, toSet);
break;
case 0x80:
toSet = playerst.getDex() - 1;
playerst.setDex((short) (int) toSet, chr);
statupdate.put(MapleStat.敏捷, toSet);
break;
case 0x100:
toSet = playerst.getInt() - 1;
playerst.setInt((short) (int) toSet, chr);
statupdate.put(MapleStat.智力, toSet);
break;
case 0x200:
toSet = playerst.getLuk() - 1;
playerst.setLuk((short) (int) toSet, chr);
statupdate.put(MapleStat.运气, toSet);
break;
case 0x400:
int maxhp = playerst.getMaxHp();
if (GameConstants.is新手职业(job)) {
maxhp -= 12;
}else if (((job >= 200) && (job <= 232))) {
maxhp -= 10;
} else if (((job >= 300) && (job <= 322)) || ((job >= 400) && (job <= 434))) {
maxhp -= 15;
} else if (((job >= 500) && (job <= 592))) {
maxhp -= 22;
} else if (((job >= 100) && (job <= 132))) {
maxhp -= 32;
}else {
maxhp -= 20;
}
chr.setHpApUsed((short) (chr.getHpApUsed() - 1));
playerst.setMaxHp(maxhp, chr);
statupdate.put(MapleStat.MAXHP, (long) maxhp);
break;
case 0x800:
int maxmp = playerst.getMaxMp();
if (GameConstants.is新手职业(job)) {
maxmp -= 8;
} else {
if (((job >= 100) && (job <= 132)) || ((job >= 1100) && (job <= 1112)) || ((job >= 5100) && (job <= 5112))) {
maxmp -= 4;
} else if (((job >= 200) && (job <= 232)) || ((job >= 1200) && (job <= 1212)) || ((job >= 2700) && (job <= 2712))) {
maxmp -= 30;
} else if (((job >= 500) && (job <= 592)) || ((job >= 300) && (job <= 322)) || ((job >= 400) && (job <= 434)) || ((job >= 1300) && (job <= 1312)) || ((job >= 1400) && (job <= 1412)) || ((job >= 1500) && (job <= 1512)) || ((job >= 3300) && (job <= 3312)) || ((job >= 3500) && (job <= 3512)) || ((job >= 2300) && (job <= 2312)) || ((job >= 2400) && (job <= 2412))) {
maxmp -= 10;
} else if ((job >= 2000) && (job <= 2112)) {
maxmp -= 5;
} else {
maxmp -= 20;
}
}
chr.setHpApUsed((short) (chr.getHpApUsed() - 1));
playerst.setMaxMp(maxmp, chr);
statupdate.put(MapleStat.MAXMP, (long) maxmp);
}
c.getSession().write(MaplePacketCreator.updatePlayerStats(statupdate, true, chr));
}
}else {
// 洗技能点
// 2B 0B 00 A1 43 21 00 40 42 0F 00 41 42 0F 00
used = false;
int skillTo = slea.readInt();
int skillFrom = slea.readInt();
Skill skillSPTo = SkillFactory.getSkill(skillTo);
Skill skillSPFrom = SkillFactory.getSkill(skillFrom);
if ((itemId == 2180001 && (skillTo/10000)%100 == 0 && (skillFrom/10000)%100 == 0)
|| (itemId == 2180002 && ((skillTo/10000)%100 == 10 || (skillTo/10000)%100 == 20 || (skillTo/10000)%100 == 30) && ((skillFrom/10000)%100 != 10 || (skillFrom/10000)%100 != 20 || (skillFrom/10000)%100 != 30))
|| (itemId == 2180003 && ((skillTo/10000)%100 == 11 || (skillTo/10000)%100 == 21 || (skillTo/10000)%100 == 31) && ((skillFrom/10000)%100 != 11 || (skillFrom/10000)%100 != 21 || (skillFrom/10000)%100 != 31))
) {
if (GameConstants.getSkillBookBySkill(skillTo) != GameConstants.getSkillBookBySkill(skillFrom)) {
chr.dropMessage(1, "只能选择同一职业下的技能。");
} else if ((chr.getSkillLevel(skillSPTo) + 1 <= skillSPTo.getMaxLevel()) && (chr.getSkillLevel(skillSPFrom) > 0) && (skillSPTo.canBeLearnedBy(chr.getJob()))) {
chr.changeSingleSkillLevel(skillSPFrom, (byte) (chr.getSkillLevel(skillSPFrom) - 1), chr.getMasterLevel(skillSPFrom));
chr.changeSingleSkillLevel(skillSPTo, (byte) (chr.getSkillLevel(skillSPTo) + 1), chr.getMasterLevel(skillSPTo));
used = true;
}
} else {
chr.dropMessage(1, "请使用相应的洗点技能卡,不要作弊!");
}
}
break;
case 208: // 喇叭
// 2B 08 00 E8 C0 1F 00 0A 00 BA EC C0 AE B0 C8 B2 E2 CA D4
if (chr.isShowPacket()) {
chr.dropMessage(0, new StringBuilder().append("使用商场喇叭 道具类型: ").append(itemId / 1000 % 10).toString());
}
if (!c.getChannelServer().getMegaphoneMuteState()) {
int msgType = itemId / 1000 % 10;
used = true;
switch (msgType) {
case 0:
chr.getMap().broadcastMessage(MaplePacketCreator.serverMessageMega(new StringBuilder().append(chr.getMedalText()).append(chr.getName()).append(" : ").append(slea.readMapleAsciiString()).toString()));
break;
case 1:
c.getChannelServer().broadcastSmegaPacket(MaplePacketCreator.serverMessageMega(new StringBuilder().append(chr.getMedalText()).append(chr.getName()).append(" : ").append(slea.readMapleAsciiString()).toString()));
break;
case 2:
WorldBroadcastService.getInstance().broadcastSmega(MaplePacketCreator.serverNotice(3, c.getChannel(), new StringBuilder().append(chr.getMedalText()).append(chr.getName()).append(" : ").append(slea.readMapleAsciiString()).toString(), slea.readByte() != 0));
break;
}
} else {
chr.dropMessage(5, "当前频道禁止使用道具喇叭。");
}
break;
case 213: // 真情告白
// 2B 09 00 51 80 20 00
// 31 00 31 32 33 32 31 34 33 32 34 33 71 65 77 71 65 77 71 65 77 71 65 0A 65 77 71 65 77 71 65 77 0A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A
MapleLove love = new MapleLove(chr, chr.getPosition(), chr.getMap().getFootholds().findBelow(chr.getPosition()).getId(), slea.readMapleAsciiString(), itemId);
chr.getMap().spawnLove(love);
used = true;
break;
case 216: // 消息
String sendTo = slea.readMapleAsciiString();
String msg = slea.readMapleAsciiString();
chr.sendNote(sendTo, msg);
used = true;
break;
case 215: // 音乐盒
chr.getMap().startJukebox(chr.getName()+"演奏了祝贺曲!", itemId);
used = true;
break;
case 209: // 地图祝福
msg = ii.getMsg(itemId);
String ourMsg = slea.readMapleAsciiString();
if (!msg.contains("%s")) {
msg = ourMsg;
} else {
msg = msg.replaceFirst("%s", chr.getName());
if (!msg.contains("%s")) {
msg = ii.getMsg(itemId).replaceFirst("%s", ourMsg);
} else {
try {
msg = msg.replaceFirst("%s", ourMsg);
} catch (Exception e) {
msg = ii.getMsg(itemId).replaceFirst("%s", ourMsg);
}
}
}
chr.getMap().startMapEffect(msg, itemId);
int buff = ii.getStateChangeItem(itemId);
if (buff != 0) {
for (MapleCharacter mChar : chr.getMap().getCharactersThreadsafe()) {
ii.getItemEffect(buff).applyTo(mChar);
}
}
used = true;
break;
case 404: // 表情
break;
case 405: // 美发卡
if ((itemId >= 5152100) && (itemId <= 5152107)) {
int color = (itemId - 5152100) * 100;
if (color >= 0) {
if (changeFace(chr, color)) {
used = true;
} else {
chr.dropMessage(1, "当前脸型不支持这个颜色的隐形眼镜。");
}
} else {
chr.dropMessage(1, "使用一次性隐形眼镜出现错误。");
}
} else if (itemId == 5156000) {
if ((chr.getMarriageId() > 0) || (chr.getMarriageRing() != null)) {
chr.dropSpouseMessage(11, "已婚人士无法使用。");
} else {
chr.setGender(chr.getGender() == 0 ? 1 : (byte) 0);
Pair ret = GameConstants.getDefaultFaceAndHair(chr.getJob(), chr.getGender());
Map statup = new EnumMap(MapleStat.class);
chr.setFace(((Integer) ret.getLeft()));
chr.setHair(((Integer) ret.getRight()));
statup.put(MapleStat.脸型, (long) chr.getFace());
statup.put(MapleStat.发型, (long) chr.getHair());
c.getSession().write(MaplePacketCreator.updatePlayerStats(statup, chr));
c.getSession().write(MaplePacketCreator.showOwnCraftingEffect("Effect/BasicEff.img/TransGender", 0, 0));
chr.getMap().broadcastMessage(chr, MaplePacketCreator.showCraftingEffect(chr.getId(), "Effect/BasicEff.img/TransGender", 0, 0), false);
chr.equipChanged();
used = true;
}
} else {
chr.dropMessage(1, "暂不支持这个道具的使用。");
}
break;
case 211: // 宠物取名卡
int uniqueid = (int) slea.readLong();
MaplePet pet = null;
for (MaplePet petx : chr.getPets()) {
if ((petx != null) && (petx.getUniqueId() == uniqueid)) {
pet = petx;
break;
}
}
if (pet == null) {
chr.dropMessage(1, "宠物改名错误,找不到宠物的信息。");
} else {
String nName = slea.readMapleAsciiString();
for (String z : GameConstants.RESERVED) {
if ((pet.getName().contains(z)) || (nName.contains(z))) {
break;
}
}
if (!MapleCharacterUtil.canChangePetName(nName)) {
break;
}
pet.setName(nName);
pet.saveToDb();
c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), false));
c.getSession().write(MaplePacketCreator.enableActions());
chr.getMap().broadcastMessage(MTSCSPacket.changePetName(chr, nName, pet.getInventoryPosition()));
used = true;
}
break;
case 519:
if ((itemId >= 5190000) && (itemId <= 5190011)) {
uniqueid = (int) slea.readLong();
pet = null;
for (MaplePet petx : chr.getPets()) {
if ((petx != null) && (petx.getUniqueId() == uniqueid)) {
pet = petx;
break;
}
}
if (pet == null) {
chr.dropMessage(1, "宠物改名错误,找不到宠物的信息。");
} else {
PetFlag petFlag = PetFlag.getByAddId(itemId);
if ((petFlag == null) || (petFlag.check(pet.getFlags()))) {
break;
}
pet.setFlags(pet.getFlags() | petFlag.getValue());
pet.saveToDb();
c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), false));
c.getSession().write(MaplePacketCreator.enableActions());
c.getSession().write(MTSCSPacket.changePetFlag(uniqueid, true, petFlag.getValue()));
used = true;
}
} else {
if ((itemId < 5191000) || (itemId > 5191004)) {
break;
}
uniqueid = (int) slea.readLong();
pet = null;
for (MaplePet petx : chr.getPets()) {
if ((petx != null) && (petx.getUniqueId() == uniqueid)) {
pet = petx;
break;
}
}
if (pet == null) {
chr.dropMessage(1, "宠物改名错误,找不到宠物的信息。");
} else {
PetFlag petFlag = PetFlag.getByDelId(itemId);
if ((petFlag != null) && (petFlag.check(pet.getFlags()))) {
pet.setFlags(pet.getFlags() - petFlag.getValue());
pet.saveToDb();
c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), false));
c.getSession().write(MaplePacketCreator.enableActions());
c.getSession().write(MTSCSPacket.changePetFlag(uniqueid, false, petFlag.getValue()));
used = true;
}
}
}
break;
case 214: // 金币包
int mesars = ii.getMeso(itemId);
if ((mesars > 0) && (chr.getMeso() < 2147483647 - mesars)) {
used = true;
if (Math.random() > 0.1D) {
int gainmes = Randomizer.nextInt(mesars);
chr.gainMeso(gainmes, false);
c.getSession().write(MTSCSPacket.sendMesobagSuccess(gainmes));
} else {
c.getSession().write(MTSCSPacket.sendMesobagFailed());
}
} else {
chr.dropMessage(1, "金币已达到上限无法使用这个道具。");
}
break;
case 522:
if (itemId == 5220083) {
used = true;
for (Entry<Integer, StructFamiliar> f : ii.getFamiliars().entrySet()) {
if ((((StructFamiliar) f.getValue()).itemid == 2870055) || (((StructFamiliar) f.getValue()).itemid == 2871002) || (((StructFamiliar) f.getValue()).itemid == 2870235) || (((StructFamiliar) f.getValue()).itemid == 2870019)) {
MonsterFamiliar mf = (MonsterFamiliar) chr.getFamiliars().get(f.getKey());
if (mf != null) {
if (mf.getVitality() >= 3) {
mf.setExpiry(Math.min(System.currentTimeMillis() + 7776000000L, mf.getExpiry() + 2592000000L));
} else {
mf.setVitality(mf.getVitality() + 1);
mf.setExpiry(mf.getExpiry() + 2592000000L);
}
} else {
mf = new MonsterFamiliar(chr.getId(), (f.getKey()), System.currentTimeMillis() + 2592000000L);
chr.getFamiliars().put(f.getKey(), mf);
}
c.getSession().write(MaplePacketCreator.registerFamiliar(mf));
}
}
} else if (itemId == 5220084) {
if (chr.getInventory(MapleInventoryType.USE).getNumFreeSlot() < 3) {
chr.dropMessage(5, "请确保您有足够的背包空间。");
} else {
used = true;
int[] familiars = new int[3];
while (true) {
for (int i = 0; i < familiars.length; i++) {
if (familiars[i] > 0) {
continue;
}
for (Map.Entry f : ii.getFamiliars().entrySet()) {
if ((Randomizer.nextInt(500) == 0) && (((i < 2) && (((StructFamiliar) f.getValue()).grade == 0)) || ((i == 2) && (((StructFamiliar) f.getValue()).grade != 0)))) {
MapleInventoryManipulator.addById(c, ((StructFamiliar) f.getValue()).itemid, (short) 1, "Booster Pack");
c.getSession().write(MTSCSPacket.getBoosterFamiliar(chr.getId(), ((Integer) f.getKey()), 0));
familiars[i] = ((StructFamiliar) f.getValue()).itemid;
break;
}
}
}
if ((familiars[0] > 0) && (familiars[1] > 0) && (familiars[2] > 0)) {
break;
}
}
c.getSession().write(MTSCSPacket.getBoosterPack(familiars[0], familiars[1], familiars[2]));
c.getSession().write(MTSCSPacket.getBoosterPackClick());
c.getSession().write(MTSCSPacket.getBoosterPackReveal());
}
} else {
chr.dropMessage(1, "暂时无法使用这个道具。");
}
break;
case 523:
int itemSearch = slea.readInt();
List hms = c.getChannelServer().searchMerchant(itemSearch);
if (hms.size() > 0) {
c.getSession().write(MaplePacketCreator.getOwlSearched(itemSearch, hms));
used = true;
} else {
chr.dropMessage(1, "没有找到这个道具。");
}
MapleCharacterUtil.addToItemSearch(itemSearch);
break;
case 212:
pet = null;
MaplePet pets = chr.getSpawnPets();
if (pet == null) {
chr.dropMessage(1, "没有可以喂食的宠物。\r\n请重新确认。");
} else {
pet.setFullness(100);
if (pet.getCloseness() < 30000) {
if (pet.getCloseness() + 100 * c.getChannelServer().getTraitRate() > 30000) {
pet.setCloseness(30000);
} else {
pet.setCloseness(pet.getCloseness() + 100 * c.getChannelServer().getTraitRate());
}
if (pet.getCloseness() >= GameConstants.getClosenessNeededForLevel(pet.getLevel() + 1)) {
pet.setLevel(pet.getLevel() + 1);
c.getSession().write(PetPacket.showOwnPetLevelUp());
chr.getMap().broadcastMessage(PetPacket.showPetLevelUp(chr));
}
}
c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem(pet.getInventoryPosition()), false));
chr.getMap().broadcastMessage(chr, PetPacket.commandResponse(chr.getId(), (byte) 1, true, true), true);
used = true;
}
break;
default:
FileoutputUtil.log(new StringBuilder().append("使用未处理的商城道具 : ").append(itemId).toString());
FileoutputUtil.log(slea.toString(true));
}
if ((itemType != 506) || (used)) {
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, (short) slot, (short) 1, false, true);
}
c.getSession().write(MaplePacketCreator.enableActions());
if (cc) {
if ((!chr.isAlive()) || (chr.getEventInstance() != null) || (FieldLimitType.ChannelSwitch.check(chr.getMap().getFieldLimit()))) {
chr.dropMessage(1, "刷新人物数据失败。");
return;
}
chr.dropMessage(5, "正在刷新人数据.请等待...");
chr.fakeRelog();
if (chr.getScrolledPosition() != 0) {
c.getSession().write(MaplePacketCreator.pamSongUI());
}
}
}
private static boolean getIncubatedItems(MapleClient c, int itemId) {
if ((c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNumFreeSlot() < 2) || (c.getPlayer().getInventory(MapleInventoryType.USE).getNumFreeSlot() < 2) || (c.getPlayer().getInventory(MapleInventoryType.SETUP).getNumFreeSlot() < 2)) {
c.getPlayer().dropMessage(5, "请确保你有足够的背包空间。");
return false;
}
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
int id1 = RandomRewards.getPeanutReward();
int id2 = RandomRewards.getPeanutReward();
while (!ii.itemExists(id1)) {
id1 = RandomRewards.getPeanutReward();
}
while (!ii.itemExists(id2)) {
id2 = RandomRewards.getPeanutReward();
}
c.getSession().write(MaplePacketCreator.getPeanutResult(id1, (short) 1, id2, (short) 1, itemId));
MapleInventoryManipulator.addById(c, id1, (short) 1, new StringBuilder().append(ii.getName(itemId)).append(" 在 ").append(FileoutputUtil.CurrentReadable_Date()).toString());
MapleInventoryManipulator.addById(c, id2, (short) 1, new StringBuilder().append(ii.getName(itemId)).append(" 在 ").append(FileoutputUtil.CurrentReadable_Date()).toString());
return true;
}
private static boolean changeFace(MapleCharacter player, int color) {
if (player.getFace() % 1000 < 100) {
color += player.getFace();
} else if ((player.getFace() % 1000 >= 100) && (player.getFace() % 1000 < 200)) {
color += player.getFace() - 100;
} else if ((player.getFace() % 1000 >= 200) && (player.getFace() % 1000 < 300)) {
color += player.getFace() - 200;
} else if ((player.getFace() % 1000 >= 300) && (player.getFace() % 1000 < 400)) {
color += player.getFace() - 300;
} else if ((player.getFace() % 1000 >= 400) && (player.getFace() % 1000 < 500)) {
color += player.getFace() - 400;
} else if ((player.getFace() % 1000 >= 500) && (player.getFace() % 1000 < 600)) {
color += player.getFace() - 500;
} else if ((player.getFace() % 1000 >= 600) && (player.getFace() % 1000 < 700)) {
color += player.getFace() - 600;
} else if ((player.getFace() % 1000 >= 700) && (player.getFace() % 1000 < 800)) {
color += player.getFace() - 700;
}
if (MapleItemInformationProvider.getInstance().faceExists(color)) {
return false;
}
player.setFace(color);
player.updateSingleStat(MapleStat.脸型, player.getFace());
player.equipChanged();
return true;
}
}