package handling.channel.handler; import client.MapleCharacter; import client.MapleClient; import client.MapleDisease; import client.Skill; import client.SkillFactory; import client.inventory.Item; import client.inventory.MapleInventoryType; import client.inventory.MaplePet; import client.inventory.PetCommand; import client.inventory.PetDataFactory; import client.inventory.PetFlag; import constants.GameConstants; import java.awt.Point; import java.util.List; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.Randomizer; import server.maps.FieldLimitType; import server.quest.MapleQuest; import tools.FileoutputUtil; import tools.MaplePacketCreator; import tools.data.input.SeekableLittleEndianAccessor; import tools.packet.PetPacket; public class PetHandler { public static void SpawnPet(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { chr.spawnPet(slea.readByte(), slea.readByte() > 0); } public static void Pet_AutoPotion(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { slea.skip(1); short slot = slea.readShort(); if ((!chr.isAlive()) || (chr.getMapId() == 749040100) || (chr.getMap() == null)) { c.getSession().write(MaplePacketCreator.enableActions()); return; } Item toUse = chr.getInventory(MapleInventoryType.USE).getItem(slot); if ((toUse == null) || (toUse.getQuantity() < 1) || (toUse.getItemId() != slea.readInt())) { c.getSession().write(MaplePacketCreator.enableActions()); return; } long time = System.currentTimeMillis(); if (chr.getNextConsume() > time) { chr.dropMessage(5, "暂时无法使用道具."); c.getSession().write(MaplePacketCreator.enableActions()); return; } if (!FieldLimitType.PotionUse.check(chr.getMap().getFieldLimit())) { if (MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId()).applyTo(chr)) { MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false); if (chr.getMap().getConsumeItemCoolTime() > 0) { chr.setNextConsume(time + chr.getMap().getConsumeItemCoolTime() * 1000); } } } else { c.getSession().write(MaplePacketCreator.enableActions()); } } public static void PetExcludeItems(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { int petSlot = slea.readInt(); MaplePet pet = chr.getSpawnPet(); if ((pet == null) || (!PetFlag.PET_IGNORE_PICKUP.check(pet.getFlags()))) { c.getSession().write(MaplePacketCreator.enableActions()); return; } pet.clearExcluded(); byte amount = slea.readByte(); for (int i = 0; i < amount; i++) { pet.addExcluded(i, slea.readInt()); } } public static void PetChat(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if (slea.available() < 12L) { c.getSession().write(MaplePacketCreator.enableActions()); return; } int petid = slea.readInt(); if ((chr == null) || (chr.getMap() == null) || (chr.getSpawnPet() == null)) { return; } short command = slea.readShort(); String text = slea.readMapleAsciiString(); chr.getMap().broadcastMessage(chr, PetPacket.petChat(chr.getId(), command, text, (byte) petid), true); } public static void PetCommand(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { int petId = slea.readInt(); MaplePet pet; pet = chr.getSpawnPet(); slea.readByte(); if (pet == null) { c.getSession().write(MaplePacketCreator.enableActions()); return; } byte command = slea.readByte(); PetCommand petCommand = PetDataFactory.getPetCommand(pet.getPetItemId(), command); if (petCommand == null) { c.getSession().write(MaplePacketCreator.enableActions()); return; } boolean success = false; if (Randomizer.nextInt(99) <= petCommand.getProbability()) { success = true; if (pet.getCloseness() < 30000) { int newCloseness = pet.getCloseness() + petCommand.getIncrease() * c.getChannelServer().getTraitRate(); if (newCloseness > 30000) { newCloseness = 30000; } pet.setCloseness(newCloseness); if (newCloseness >= 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((short) (byte) pet.getInventoryPosition()), false)); } } chr.getMap().broadcastMessage(PetPacket.commandResponse(chr.getId(), (byte) petCommand.getCommand(), success, false)); } /** * 宠物食品 * @param slea * @param c * @param chr */ public static void PetFood(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { // 2A 05 00 40 59 20 00 // 2A 19 00 40 59 20 00 if ((chr == null) || (chr.getMap() == null)) { return; } int previousFullness = 100; MaplePet pet = chr.getSpawnPet(); short slot = slea.readShort(); int itemId = slea.readInt(); Item petFood = chr.getInventory(MapleInventoryType.USE).getItem(slot); if ((pet == null) || (petFood == null) || (petFood.getItemId() != itemId) || (petFood.getQuantity() <= 0) || (itemId / 10000 != 212)) { c.getSession().write(MaplePacketCreator.enableActions()); return; } boolean gainCloseness = false; if (Randomizer.nextInt(101) > 50) { gainCloseness = true; } if (pet.getFullness() < 100) { int newFullness = pet.getFullness() + 30; if (newFullness > 100) { newFullness = 100; } pet.setFullness(newFullness); if ((gainCloseness) && (pet.getCloseness() < 30000)) { int newCloseness = pet.getCloseness() + 1; if (newCloseness > 30000) { newCloseness = 30000; } pet.setCloseness(newCloseness); if (newCloseness >= 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((short) (byte) pet.getInventoryPosition()), false)); chr.getMap().broadcastMessage(c.getPlayer(), PetPacket.commandResponse(chr.getId(), (byte) 1, true, true), true); } else { if (gainCloseness) { int newCloseness = pet.getCloseness() - 1; if (newCloseness < 0) { newCloseness = 0; } pet.setCloseness(newCloseness); if (newCloseness < GameConstants.getClosenessNeededForLevel(pet.getLevel())) { pet.setLevel(pet.getLevel() - 1); } chr.dropMessage(5, "您的宠物的饥饿感是满值,如果继续使用将会有50%的几率减少1点亲密度。"); } c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), true)); chr.getMap().broadcastMessage(chr, PetPacket.commandResponse(chr.getId(), (byte) 1, false, true), true); } MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, true, false); c.getSession().write(MaplePacketCreator.enableActions()); } /** * 宠物移动 * @param slea * @param chr */ public static void MovePet(SeekableLittleEndianAccessor slea, MapleCharacter chr) { // 4C // 0F 00 B3 00 // 06 00 08 00 B3 00 83 FF 02 00 15 00 03 3C 00 00 07 00 B4 00 83 FF FE FF 15 00 03 0A 00 00 F6 FF B3 00 84 FF FE FF 14 00 03 8C 00 00 EE FF B3 00 CC FF FF FF 14 00 19 5A 00 00 EC FF B3 00 FC FF 00 00 14 00 19 3C 00 00 EC FF B3 00 00 00 00 00 14 00 19 96 00 00 MaplePet pet = chr.getSpawnPet(); if (pet == null) { return; } Point startPos = slea.readPos(); List res = MovementParse.parseMovement(slea, 3); if ((res != null) && (chr != null) && (!res.isEmpty()) && (chr.getMap() != null)) { if (slea.available() != 1) { FileoutputUtil.log("slea.available != 1 (宠物移动出错) 剩余封包长度: " + slea.available()); FileoutputUtil.log(FileoutputUtil.Movement_Pet, "slea.available != 1 (宠物移动出错) 封包: " + slea.toString(true)); return; } chr.getSpawnPet().updatePosition(res); // chr.getClient().getSession().write(PetPacket.movePet(chr.getId(),1,startPos,res)); chr.getMap().broadcastMessage(chr, PetPacket.movePet(chr.getId(), (byte)1, startPos, res), false); } } public static void AllowPetLoot(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if ((chr == null) || (chr.getMap() == null)) { c.getSession().write(MaplePacketCreator.enableActions()); return; } slea.skip(4); int data = slea.readShort(); if (data > 0) { chr.getQuestNAdd(MapleQuest.getInstance(122902)).setCustomData(String.valueOf(data)); } else { chr.getQuestRemove(MapleQuest.getInstance(122902)); } MaplePet pet = c.getPlayer().getSpawnPets(); if ((pet != null) && (pet.getSummoned())) { pet.setCanPickup(data > 0); chr.getClient().getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), false)); } c.getSession().write(PetPacket.showPetPickUpMsg(data > 0, 1)); } public static void AllowPetAutoEat(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { if ((chr == null) || (chr.getMap() == null)) { c.getSession().write(MaplePacketCreator.enableActions()); return; } slea.skip(4); slea.skip(4); boolean data = slea.readByte() > 0; c.getSession().write(PetPacket.showPetAutoEatMsg()); } }