package tools.packet;
import client.*;
import client.MapleStat.Temp;
import client.inventory.*;
import constants.GameConstants;
import handling.SendPacketOpcode;
import handling.channel.DojoRankingsData;
import handling.channel.MapleGeneralRanking.CandyRankingInfo;
import handling.channel.MapleGuildRanking;
import handling.world.MapleParty;
import handling.world.MaplePartyCharacter;
import handling.world.PartyOperation;
import handling.world.World;
import handling.world.exped.MapleExpedition;
import handling.world.exped.PartySearch;
import handling.world.exped.PartySearchType;
import handling.world.family.MapleFamily;
import handling.world.family.MapleFamilyBuff;
import handling.world.family.MapleFamilyCharacter;
import handling.world.guild.*;
import java.awt.Point;
import static java.lang.Math.E;
import java.util.*;
import java.util.Map.Entry;
import server.MapleItemInformationProvider;
import server.MapleStatEffect;
import server.Randomizer;
import server.StructFamiliar;
import server.life.MapleMonster;
import server.life.PlayerNPC;
import server.stores.HiredMerchant;
import server.stores.MaplePlayerShopItem;
import tools.HexTool;
import tools.Pair;
import tools.StringUtil;
import tools.Triple;
import tools.data.MaplePacketLittleEndianWriter;
public class CWvsContext {
public static byte[] enableActions() {
return updatePlayerStats(new EnumMap<MapleStat, Long>(MapleStat.class), true, null);
}
public static byte[] updatePlayerStats(Map<MapleStat, Long> stats, MapleCharacter chr) {
return updatePlayerStats(stats, false, chr);
}
public static byte[] updatePlayerStats(Map<MapleStat, Long> mystats, boolean itemReaction, MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_STATS.getValue());
mplew.write(itemReaction ? 1 : 0);
long updateMask = 0L;
for (MapleStat statupdate : mystats.keySet()) {
updateMask |= statupdate.getValue();
}
mplew.writeLong(updateMask);
for (final Entry<MapleStat, Long> statupdate : mystats.entrySet()) {
switch (statupdate.getKey()) {
case SKIN:
case LEVEL:
case FATIGUE:
case BATTLE_RANK:
case ICE_GAGE:
mplew.write((statupdate.getValue()).byteValue());
break;
// case JOB:
case STR:
case DEX:
case INT:
case LUK:
case AVAILABLEAP:
mplew.writeShort((statupdate.getValue()).shortValue());
break;
case AVAILABLESP:
if (GameConstants.isSeparatedSp(chr.getJob())) {
mplew.write(chr.getRemainingSpSize());
for (int i = 0; i < chr.getRemainingSps().length; i++) {
if (chr.getRemainingSp(i) > 0) {
mplew.write(i + 1);
mplew.writeInt(chr.getRemainingSp(i));
}
}
} else {
mplew.writeShort(chr.getRemainingSp());
}
break;
case TRAIT_LIMIT:
mplew.writeInt((statupdate.getValue()).intValue());
mplew.writeInt((statupdate.getValue()).intValue());
mplew.writeInt((statupdate.getValue()).intValue());
break;
case EXP:
case MESO:
mplew.writeLong((statupdate.getValue()).longValue());
break;
case PET:
mplew.writeLong((statupdate.getValue()).intValue());
mplew.writeLong((statupdate.getValue()).intValue());
mplew.writeLong((statupdate.getValue()).intValue());
break;
case BATTLE_POINTS:
case VIRTUE:
mplew.writeLong((statupdate.getValue()).longValue());
break;
default:
mplew.writeInt((statupdate.getValue()).intValue());
}
}
if ((updateMask == 0L) && (!itemReaction)) {
mplew.write(1);
}
mplew.write(0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] setTemporaryStats(short str, short dex, short _int, short luk, short watk, short matk, short acc, short avoid, short speed, short jump) {
Map<Temp, Integer> stats = new EnumMap<>(MapleStat.Temp.class);
stats.put(MapleStat.Temp.STR, Integer.valueOf(str));
stats.put(MapleStat.Temp.DEX, Integer.valueOf(dex));
stats.put(MapleStat.Temp.INT, Integer.valueOf(_int));
stats.put(MapleStat.Temp.LUK, Integer.valueOf(luk));
stats.put(MapleStat.Temp.WATK, Integer.valueOf(watk));
stats.put(MapleStat.Temp.MATK, Integer.valueOf(matk));
stats.put(MapleStat.Temp.ACC, Integer.valueOf(acc));
stats.put(MapleStat.Temp.AVOID, Integer.valueOf(avoid));
stats.put(MapleStat.Temp.SPEED, Integer.valueOf(speed));
stats.put(MapleStat.Temp.JUMP, Integer.valueOf(jump));
return temporaryStats(stats);
}
public static byte[] temporaryStats_Aran() {
Map<Temp, Integer> stats = new EnumMap<>(MapleStat.Temp.class);
stats.put(MapleStat.Temp.STR, Integer.valueOf(999));
stats.put(MapleStat.Temp.DEX, Integer.valueOf(999));
stats.put(MapleStat.Temp.INT, Integer.valueOf(999));
stats.put(MapleStat.Temp.LUK, Integer.valueOf(999));
stats.put(MapleStat.Temp.WATK, Integer.valueOf(255));
stats.put(MapleStat.Temp.ACC, Integer.valueOf(999));
stats.put(MapleStat.Temp.AVOID, Integer.valueOf(999));
stats.put(MapleStat.Temp.SPEED, Integer.valueOf(140));
stats.put(MapleStat.Temp.JUMP, Integer.valueOf(120));
return temporaryStats(stats);
}
public static byte[] temporaryStats_Balrog(MapleCharacter chr) {
Map<Temp, Integer> stats = new EnumMap<>(MapleStat.Temp.class);
int offset = 1 + (chr.getLevel() - 90) / 20;
stats.put(MapleStat.Temp.STR, Integer.valueOf(chr.getStat().getTotalStr() / offset));
stats.put(MapleStat.Temp.DEX, Integer.valueOf(chr.getStat().getTotalDex() / offset));
stats.put(MapleStat.Temp.INT, Integer.valueOf(chr.getStat().getTotalInt() / offset));
stats.put(MapleStat.Temp.LUK, Integer.valueOf(chr.getStat().getTotalLuk() / offset));
stats.put(MapleStat.Temp.WATK, Integer.valueOf(chr.getStat().getTotalWatk() / offset));
stats.put(MapleStat.Temp.MATK, Integer.valueOf(chr.getStat().getTotalMagic() / offset));
return temporaryStats(stats);
}
public static byte[] temporaryStats(Map<MapleStat.Temp, Integer> mystats) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.TEMP_STATS.getValue());
int updateMask = 0;
for (MapleStat.Temp statupdate : mystats.keySet()) {
updateMask |= statupdate.getValue();
}
mplew.writeInt(updateMask);
for (final Entry<MapleStat.Temp, Integer> statupdate : mystats.entrySet()) {
switch (statupdate.getKey()) {
case SPEED:
case JUMP:
case UNKNOWN:
mplew.write((statupdate.getValue()).byteValue());
break;
default:
mplew.writeShort((statupdate.getValue()).shortValue());
}
}
return mplew.getPacket();
}
public static byte[] temporaryStats_Reset() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.TEMP_STATS_RESET.getValue());
return mplew.getPacket();
}
public static byte[] updateSkills(Map<Skill, SkillEntry> update, boolean hyper) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_SKILLS.getValue());
mplew.write(1);
mplew.writeShort(0);//wasbyte142
mplew.writeShort(update.size());
for (Map.Entry z : update.entrySet()) {
mplew.writeInt(((Skill) z.getKey()).getId());
mplew.writeInt(((SkillEntry) z.getValue()).skillevel);
mplew.writeInt(((SkillEntry) z.getValue()).masterlevel);
PacketHelper.addExpirationTime(mplew, ((SkillEntry) z.getValue()).expiration);
}
mplew.write(/*hyper ? 0x0C : */4);
return mplew.getPacket();
}
public static byte[] giveFameErrorResponse(int op) {
return OnFameResult(op, null, true, 0);
}
public static byte[] OnFameResult(int op, String charname, boolean raise, int newFame) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAME_RESPONSE.getValue());
mplew.write(op);
if ((op == 0) || (op == 5)) {
mplew.writeMapleAsciiString(charname == null ? "" : charname);
mplew.write(raise ? 1 : 0);
if (op == 0) {
mplew.writeInt(newFame);
}
}
return mplew.getPacket();
}
public static byte[] fullClientDownload() {
//Opens "http://maplestory.nexon.net/support/game-download"
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FULL_CLIENT_DOWNLOAD.getValue());
return mplew.getPacket();
}
public static byte[] bombLieDetector(boolean error, int mapid, int channel) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LIE_DETECTOR.getValue());
mplew.write(error ? 2 : 1);
mplew.writeInt(mapid);
mplew.writeInt(channel);
return mplew.getPacket();
}
public static byte[] sendLieDetector(final byte[] image) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LIE_DETECTOR.getValue());
mplew.write(6); // 1 = not attacking, 2 = tested, 3 = going through
mplew.write(4); // 2 give invalid pointer (suppose to be admin macro)
mplew.write(1); // the time >0 is always 1 minute
if (image == null) {
mplew.writeInt(0);
return mplew.getPacket();
}
mplew.writeInt(image.length);
mplew.write(image);
return mplew.getPacket();
}
public static byte[] LieDetectorResponse(final byte msg) {
return LieDetectorResponse(msg, (byte) 0);
}
public static byte[] LieDetectorResponse(final byte msg, final byte msg2) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LIE_DETECTOR.getValue());
mplew.write(msg); // 1 = not attacking, 2 = tested, 3 = going through
mplew.write(msg2);
return mplew.getPacket();
}
public static byte[] getLieDetector(byte type, String tester) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LIE_DETECTOR.getValue()); // 2A 00 01 00 00 00
mplew.write(type); // 1 = not attacking, 2 = tested, 3 = going through, 4 save screenshot
switch (type) {
case 4: //save screen shot
mplew.write(0);
mplew.writeMapleAsciiString(""); // file name
break;
case 5:
mplew.write(1); // 2 = save screen shot
mplew.writeMapleAsciiString(tester); // me or file name
break;
case 6:
mplew.write(4); // 2 or anything else, 2 = with maple admin picture, basicaly manager's skill?
mplew.write(1); // if > 0, then time = 60,000..maybe try < 0?
//mplew.writeInt(size);
//mplew.write(byte); // bytes
break;
case 7://send this if failed
// 2 = You have been appointed as a auto BOT program user and will be restrained.
mplew.write(4); // default
break;
case 9:
// 0 = passed lie detector test
// 1 = reward 5000 mesos for not botting.
// 2 = thank you for your cooperation with administrator.
mplew.write(0);
break;
case 8: // save screen shot.. it appears that you may be using a macro-assisted program
mplew.write(0); // 2 or anything else , 2 = show msg, 0 = none
mplew.writeMapleAsciiString(""); // file name
break;
case 10: // no save
mplew.write(0); // 2 or anything else, 2 = show msg
mplew.writeMapleAsciiString(""); // ?? // hi_You have passed the lie detector test
break;
default:
mplew.write(0);
break;
}
return mplew.getPacket();
}
public static byte[] lieDetector(byte mode, byte action, byte[] image, String str1, String str2, String str3) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LIE_DETECTOR.getValue());
mplew.write(mode);
mplew.write(action); //2 = show msg/save screenshot/maple admin picture(mode 6)
if (mode == 6) {
mplew.write(1); //if true time is 60:00
PacketHelper.addImageInfo(mplew, image);
}
if (mode == 7 || mode == 9) {
}
if (mode == 4) { //save screenshot
mplew.writeMapleAsciiString(str1); //file name
}
if (mode != 5) {
if (mode == 10) {
mplew.writeMapleAsciiString(str2); //passed lie detector message
} else {
if (mode != 8) {
}
mplew.writeMapleAsciiString(str2); //failed lie detector, file name (for screenshot)
}
}
mplew.writeMapleAsciiString(str3); //file name for screenshot
return mplew.getPacket();
}
public static byte[] report(int mode) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.REPORT_RESPONSE.getValue());
mplew.write(mode);
if (mode == 2) {
mplew.write(0);
mplew.writeInt(1); //times left to report
}
return mplew.getPacket();
}
public static byte[] OnSetClaimSvrAvailableTime(int from, int to) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(4);
mplew.writeShort(SendPacketOpcode.REPORT_TIME.getValue());
mplew.write(from);
mplew.write(to);
return mplew.getPacket();
}
public static byte[] OnClaimSvrStatusChanged(boolean enable) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3);
mplew.writeShort(SendPacketOpcode.REPORT_STATUS.getValue());
mplew.write(enable ? 1 : 0);
return mplew.getPacket();
}
public static byte[] updateMount(MapleCharacter chr, boolean levelup) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_MOUNT.getValue());
mplew.writeInt(chr.getId());
mplew.writeInt(chr.getMount().getLevel());
mplew.writeInt(chr.getMount().getExp());
mplew.writeInt(chr.getMount().getFatigue());
mplew.write(levelup ? 1 : 0);
return mplew.getPacket();
}
public static byte[] showQuestCompletion(int id) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_QUEST_COMPLETION.getValue());
mplew.writeShort(id);
return mplew.getPacket();
}
public static byte[] useSkillBook(MapleCharacter chr, int skillid, int maxlevel, boolean canuse, boolean success) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.USE_SKILL_BOOK.getValue());
mplew.write(0);
mplew.writeInt(chr.getId());
mplew.write(1);
mplew.writeInt(skillid);
mplew.writeInt(maxlevel);
mplew.write(canuse ? 1 : 0);
mplew.write(success ? 1 : 0);
return mplew.getPacket();
}
public static byte[] useAPSPReset(boolean spReset, int cid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(spReset ? SendPacketOpcode.SP_RESET.getValue() : SendPacketOpcode.AP_RESET.getValue());
mplew.write(1);
mplew.writeInt(cid);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] expandCharacterSlots(int mode) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPAND_CHARACTER_SLOTS.getValue());
mplew.writeInt(mode);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] finishedGather(int type) {
return gatherSortItem(true, type);
}
public static byte[] finishedSort(int type) {
return gatherSortItem(false, type);
}
public static byte[] gatherSortItem(boolean gather, int type) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(gather ? SendPacketOpcode.FINISH_GATHER.getValue() : SendPacketOpcode.FINISH_SORT.getValue());
mplew.write(1);
mplew.write(type);
return mplew.getPacket();
}
public static byte[] updateExpPotion(int mode, int id, int itemId, boolean firstTime, int level, int potionDstLevel) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXP_POTION.getValue());
mplew.write(mode);
mplew.write(1); //bool for get_update_time
mplew.writeInt(id);
if (id != 0) {
mplew.write(1); //not even being read how rude of nexon
if (mode == 1) {
mplew.writeInt(0);
}
if (mode == 2) {
mplew.write(firstTime ? 1 : 0); //1 on first time then it turns 0
mplew.writeInt(itemId);
if (itemId != 0) {
mplew.writeInt(level); //level, confirmed
mplew.writeInt(potionDstLevel); //max level with potion
mplew.writeLong(384); //random, more like potion id
}
}
}
return mplew.getPacket();
}
public static byte[] updateGender(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_GENDER.getValue());
mplew.write(chr.getGender());
return mplew.getPacket();
}
public static byte[] charInfo(MapleCharacter chr, boolean isSelf) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CHAR_INFO.getValue());
mplew.writeInt(chr.getId());
mplew.write(chr.getLevel());
mplew.writeShort(chr.getJob());
mplew.writeShort(chr.getSubcategory());
mplew.write(chr.getStat().pvpRank);
mplew.writeInt(chr.getFame());
MapleMarriage marriage = chr.getMarriage();
mplew.write(marriage != null && marriage.getId() != 0);
if (marriage != null && marriage.getId() != 0) {
mplew.writeInt(marriage.getId()); //marriage id
mplew.writeInt(marriage.getHusbandId()); //husband char id
mplew.writeInt(marriage.getWifeId()); //wife char id
mplew.writeShort(3); //msg type
mplew.writeInt(chr.getMarriageItemId()); //ring id husband
mplew.writeInt(chr.getMarriageItemId()); //ring id wife
mplew.writeAsciiString(marriage.getHusbandName(), 13); //husband name
mplew.writeAsciiString(marriage.getWifeName(), 13); //wife name
}
List prof = chr.getProfessions();
mplew.write(prof.size());
for (Iterator i$ = prof.iterator(); i$.hasNext();) {
int i = ((Integer) i$.next()).intValue();
mplew.writeShort(i);
}
if (chr.getGuildId() <= 0) {
mplew.writeMapleAsciiString("-");
mplew.writeMapleAsciiString("");
} else {
MapleGuild gs = World.Guild.getGuild(chr.getGuildId());
if (gs != null) {
mplew.writeMapleAsciiString(gs.getName());
if (gs.getAllianceId() > 0) {
MapleGuildAlliance allianceName = World.Alliance.getAlliance(gs.getAllianceId());
if (allianceName != null) {
mplew.writeMapleAsciiString(allianceName.getName());
} else {
mplew.writeMapleAsciiString("");
}
} else {
mplew.writeMapleAsciiString("");
}
} else {
mplew.writeMapleAsciiString("-");
mplew.writeMapleAsciiString("");
}
}
mplew.write(isSelf ? 1 : 0);
mplew.write(0);
byte index = 1;
for (MaplePet pet : chr.getSummonedPets()) {
if (index == 1) { // please test if this doesn't d/c when viewing multipets
mplew.write(index);
}
mplew.writeInt(pet.getPetItemId());
mplew.writeMapleAsciiString(pet.getName());
mplew.write(pet.getLevel());
mplew.writeShort(pet.getCloseness());
mplew.write(pet.getFullness());
mplew.writeShort(0);
Item inv = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (byte) (index == 2 ? -130 : index == 1 ? -114 : -138));
mplew.writeInt(inv == null ? 0 : inv.getItemId());
mplew.writeInt(-1);//new v140
mplew.write(chr.getSummonedPets().size() > index); //continue loop
index++;
}
if (index == 1) { //index no change means no pets
mplew.write(0);
}
/*if ((chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -18) != null) && (chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -19) != null)) {
MapleMount mount = chr.getMount();
mplew.write(1);
mplew.writeInt(mount.getLevel());
mplew.writeInt(mount.getExp());
mplew.writeInt(mount.getFatigue());
} else {
mplew.write(0);
}*/
int wishlistSize = chr.getWishlistSize();
mplew.write(wishlistSize);
if (wishlistSize > 0) {
int[] wishlist = chr.getWishlist();
for (int x = 0; x < wishlistSize; x++) {
mplew.writeInt(wishlist[x]);
}
}
Item medal = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -46);
mplew.writeInt(medal == null ? 0 : medal.getItemId());
List<Pair<Integer, Long>> medalQuests = chr.getCompletedMedals();
mplew.writeShort(medalQuests.size());
for (Pair x : medalQuests) {
mplew.writeShort(((Integer) x.left).intValue());
mplew.writeLong(((Long) x.right).longValue());
}
for (MapleTrait.MapleTraitType t : MapleTrait.MapleTraitType.values()) {
mplew.write(chr.getTrait(t).getLevel());
}
mplew.writeInt(0); //farm id?
PacketHelper.addFarmInfo(mplew, chr.getClient(), 0);
mplew.writeInt(0);
mplew.writeInt(0);
List chairs = new ArrayList();
for (Item i : chr.getInventory(MapleInventoryType.SETUP).newList()) {
if ((i.getItemId() / 10000 == 301) && (!chairs.contains(Integer.valueOf(i.getItemId())))) {
chairs.add(Integer.valueOf(i.getItemId()));
}
}
mplew.writeInt(chairs.size());
for (Iterator i$ = chairs.iterator(); i$.hasNext();) {
int i = ((Integer) i$.next()).intValue();
mplew.writeInt(i);
}
return mplew.getPacket();
}
public static byte[] getMonsterBookInfo(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BOOK_INFO.getValue());
mplew.writeInt(chr.getId());
mplew.writeInt(chr.getLevel());
chr.getMonsterBook().writeCharInfoPacket(mplew);
return mplew.getPacket();
}
public static byte[] spawnPortal(int townId, int targetId, int skillId, Point pos) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_PORTAL.getValue());
mplew.writeInt(townId);
mplew.writeInt(targetId);
if ((townId != 999999999) && (targetId != 999999999)) {
mplew.writeInt(skillId);
mplew.writePos(pos);
}
return mplew.getPacket();
}
public static byte[] mechPortal(Point pos) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MECH_PORTAL.getValue());
mplew.writePos(pos);
return mplew.getPacket();
}
public static byte[] echoMegaphone(String name, String message) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ECHO_MESSAGE.getValue());
mplew.write(0);
mplew.writeLong(PacketHelper.getTime(System.currentTimeMillis()));
mplew.writeMapleAsciiString(name);
mplew.writeMapleAsciiString(message);
return mplew.getPacket();
}
public static byte[] showQuestMsg(String msg) {
return broadcastMsg(5, msg);
}
public static byte[] Mulung_Pts(int recv, int total) {
return showQuestMsg(new StringBuilder().append("You have received ").append(recv).append(" training points, for the accumulated total of ").append(total).append(" training points.").toString());
}
public static byte[] broadcastMsg(String message) {
return broadcastMessage(4, 0, message, false);
}
public static byte[] broadcastMsg(int type, String message) {
return broadcastMessage(type, 0, message, false);
}
public static byte[] broadcastMsg(int type, int channel, String message) {
return broadcastMessage(type, channel, message, false);
}
public static byte[] broadcastMsg(int type, int channel, String message, boolean smegaEar) {
return broadcastMessage(type, channel, message, smegaEar);
}
private static byte[] broadcastMessage(int type, int channel, String message, boolean megaEar) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERMESSAGE.getValue());
mplew.write(type);
if (type == 4) {
mplew.write(1);
}
if ((type != 23) && (type != 24)) {
mplew.writeMapleAsciiString(message);
}
switch (type) {
case 3:
case 22:
case 25:
case 26:
mplew.write(channel - 1);
mplew.write(megaEar ? 1 : 0);
break;
case 9:
mplew.write(channel - 1);
break;
case 12:
mplew.writeInt(channel);
break;
case 6:
case 11:
case 20:
mplew.writeInt((channel >= 1000000) && (channel < 6000000) ? channel : 0);
break;
case 24:
mplew.writeShort(0);
case 4:
case 5:
case 7:
case 8:
case 10:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 21:
case 23:
}
return mplew.getPacket();
}
public static byte[] getGachaponMega(String name, String message, int channel, Item item, byte rareness, String gacha) {
return getGachaponMega(name, message, channel, item, rareness, false, gacha);
}
public static byte[] getGachaponMega(String name, String message, int channel, Item item, byte rareness, boolean dragon, String gacha) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERMESSAGE.getValue());
mplew.write(24);
mplew.writeMapleAsciiString(new StringBuilder().append(name).append(message).toString());
if (!dragon) {
mplew.writeInt(channel -1);
mplew.writeInt(0);
}
mplew.writeMapleAsciiString(gacha);
PacketHelper.addItemInfo(mplew, item);
return mplew.getPacket();
}
public static byte[] getEventEnvelope(int questID, int time) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERMESSAGE.getValue());
mplew.write(23);
mplew.writeShort(questID);
mplew.writeInt(time);
return mplew.getPacket();
}
public static byte[] tripleSmega(List<String> message, boolean ear, int channel) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERMESSAGE.getValue());
mplew.write(10);
if (message.get(0) != null) {
mplew.writeMapleAsciiString((String) message.get(0));
}
mplew.write(message.size());
for (int i = 1; i < message.size(); i++) {
if (message.get(i) != null) {
mplew.writeMapleAsciiString((String) message.get(i));
}
}
mplew.write(channel - 1);
mplew.write(ear ? 1 : 0);
return mplew.getPacket();
}
public static byte[] itemMegaphone(String msg, boolean whisper, int channel, Item item) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERMESSAGE.getValue());
mplew.write(8);
mplew.writeMapleAsciiString(msg);
mplew.write(channel - 1);
mplew.write(whisper ? 1 : 0);
PacketHelper.addItemPosition(mplew, item, true, false);
if (item != null) {
PacketHelper.addItemInfo(mplew, item);
}
return mplew.getPacket();
}
public static byte[] getPeanutResult(int itemId, short quantity, int itemId2, short quantity2, int ourItem) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PIGMI_REWARD.getValue());
mplew.writeInt(itemId);
mplew.writeShort(quantity);
mplew.writeInt(ourItem);
mplew.writeInt(itemId2);
mplew.writeInt(quantity2);
mplew.write(0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] getOwlOpen() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.OWL_OF_MINERVA.getValue());
mplew.write(9);
mplew.write(GameConstants.owlItems.length);
for (int i : GameConstants.owlItems) {
mplew.writeInt(i);
}
return mplew.getPacket();
}
public static byte[] getOwlSearched(int itemSearch, List<HiredMerchant> hms) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.OWL_OF_MINERVA.getValue());
mplew.write(8);
mplew.writeInt(0);
mplew.writeInt(itemSearch);
int size = 0;
for (HiredMerchant hm : hms) {
size += hm.searchItem(itemSearch).size();
}
mplew.writeInt(size);
for (HiredMerchant hm : hms) {
for (Iterator<HiredMerchant> i = hms.iterator(); i.hasNext();) {
hm = (HiredMerchant) i.next();
final List<MaplePlayerShopItem> items = hm.searchItem(itemSearch);
for (MaplePlayerShopItem item : items) {
mplew.writeMapleAsciiString(hm.getOwnerName());
mplew.writeInt(hm.getMap().getId());
mplew.writeMapleAsciiString(hm.getDescription());
mplew.writeInt(item.item.getQuantity());
mplew.writeInt(item.bundles);
mplew.writeInt(item.price);
switch (2) {
case 0:
mplew.writeInt(hm.getOwnerId());
break;
case 1:
mplew.writeInt(hm.getStoreId());
break;
default:
mplew.writeInt(hm.getObjectId());
}
mplew.write(hm.getFreeSlot() == -1 ? 1 : 0);
mplew.write(GameConstants.getInventoryType(itemSearch).getType());
if (GameConstants.getInventoryType(itemSearch) == MapleInventoryType.EQUIP) {
PacketHelper.addItemInfo(mplew, item.item);
}
}
}
}
return mplew.getPacket();
}
public static byte[] getOwlMessage(int msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3);
mplew.writeShort(SendPacketOpcode.OWL_RESULT.getValue());
mplew.write(msg);
return mplew.getPacket();
}
public static byte[] sendEngagementRequest(String name, int cid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ENGAGE_REQUEST.getValue());
mplew.write(0);
mplew.writeMapleAsciiString(name);
mplew.writeInt(cid);
return mplew.getPacket();
}
public static byte[] sendEngagement(byte msg, int item, MapleCharacter male, MapleCharacter female) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ENGAGE_RESULT.getValue());
mplew.write(msg);
if (msg == 9 || msg >= 11 && msg <= 14) {
mplew.writeInt(0);
mplew.writeInt(male.getId());
mplew.writeInt(female.getId());
mplew.writeShort(1);
mplew.writeInt(item);
mplew.writeInt(item);
mplew.writeAsciiString(male.getName(), 13);
mplew.writeAsciiString(female.getName(), 13);
} else if (msg == 10 || msg >= 15 && msg <= 16) {
mplew.writeAsciiString("Male", 13);
mplew.writeAsciiString("Female", 13);
mplew.writeShort(0);
}
return mplew.getPacket();
}
public static byte[] sendWeddingGive() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.WEDDING_GIFT.getValue());
mplew.write(9);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] sendWeddingReceive() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.WEDDING_GIFT.getValue());
mplew.write(10);
mplew.writeLong(-1L);
mplew.writeInt(0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] giveWeddingItem() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.WEDDING_GIFT.getValue());
mplew.write(11);
mplew.write(0);
mplew.writeLong(0L);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] receiveWeddingItem() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.WEDDING_GIFT.getValue());
mplew.write(15);
mplew.writeLong(0L);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] sendCashPetFood(boolean success, byte index) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3 + (success ? 1 : 0));
mplew.writeShort(SendPacketOpcode.USE_CASH_PET_FOOD.getValue());
mplew.write(success ? 0 : 1);
if (success) {
mplew.write(index);
}
return mplew.getPacket();
}
public static byte[] yellowChat(String msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.YELLOW_CHAT.getValue());
mplew.write(-1);
mplew.writeMapleAsciiString(msg);
return mplew.getPacket();
}
public static byte[] shopDiscount(int percent) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOP_DISCOUNT.getValue());
mplew.write(percent);
return mplew.getPacket();
}
public static byte[] catchMob(int mobid, int itemid, byte success) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CATCH_MOB.getValue());
mplew.write(success);
mplew.writeInt(itemid);
mplew.writeInt(mobid);
return mplew.getPacket();
}
public static byte[] spawnPlayerNPC(PlayerNPC npc) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PLAYER_NPC.getValue());
mplew.write(1);
mplew.writeInt(npc.getId());
mplew.writeMapleAsciiString(npc.getName());
PacketHelper.addCharLook(mplew, npc, true, false);
return mplew.getPacket();
}
public static byte[] disabledNPC(List<Integer> ids) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3 + ids.size() * 4);
mplew.writeShort(SendPacketOpcode.DISABLE_NPC.getValue());
mplew.write(ids.size());
for (Integer i : ids) {
mplew.writeInt(i.intValue());
}
return mplew.getPacket();
}
public static byte[] getCard(int itemid, int level) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GET_CARD.getValue());
mplew.write(itemid > 0 ? 1 : 0);
if (itemid > 0) {
mplew.writeInt(itemid);
mplew.writeInt(level);
}
return mplew.getPacket();
}
public static byte[] changeCardSet(int set) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CARD_SET.getValue());
mplew.writeInt(set);
return mplew.getPacket();
}
public static byte[] upgradeBook(Item book, MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BOOK_STATS.getValue());
mplew.writeInt(book.getPosition());
PacketHelper.addItemInfo(mplew, book, chr);
return mplew.getPacket();
}
public static byte[] getCardDrops(int cardid, List<Integer> drops) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CARD_DROPS.getValue());
mplew.writeInt(cardid);
mplew.writeShort(drops == null ? 0 : drops.size());
if (drops != null) {
for (Integer de : drops) {
mplew.writeInt(de.intValue());
}
}
return mplew.getPacket();
}
public static byte[] getFamiliarInfo(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILIAR_INFO.getValue());
mplew.writeInt(chr.getFamiliars().size());
for (MonsterFamiliar mf : chr.getFamiliars().values()) {
mf.writeRegisterPacket(mplew, true);
}
List<Pair<Integer, Long>> size = new ArrayList<>();
for (Item i : chr.getInventory(MapleInventoryType.USE).list()) {
if (i.getItemId() / 10000 == 287) {
StructFamiliar f = MapleItemInformationProvider.getInstance().getFamiliarByItem(i.getItemId());
if (f != null) {
size.add(new Pair<>(f.familiar, i.getInventoryId()));
}
}
}
mplew.writeInt(size.size());
for (Pair<?, ?> s : size) {
mplew.writeInt(chr.getId());
mplew.writeInt(((Integer) s.left));
mplew.writeLong(((Long) s.right));
mplew.write(0);
}
size.clear();
return mplew.getPacket();
}
public static byte[] updateWebBoard(boolean result) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.WEB_BOARD_UPDATE.getValue());
mplew.writeBoolean(result);
return mplew.getPacket();
}
public static byte[] MulungEnergy(int energy) {
return sendPyramidEnergy("energy", String.valueOf(energy));
}
public static byte[] sendPyramidEnergy(String type, String amount) {
return sendString(1, type, amount);
}
public static byte[] sendGhostPoint(String type, String amount) {
return sendString(2, type, amount);
}
public static byte[] sendGhostStatus(String type, String amount) {
return sendString(3, type, amount);
}
public static byte[] sendString(int type, String object, String amount) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
switch (type) {
case 1:
mplew.writeShort(SendPacketOpcode.SESSION_VALUE.getValue());
break;
case 2:
mplew.writeShort(SendPacketOpcode.PARTY_VALUE.getValue());
break;
case 3:
mplew.writeShort(SendPacketOpcode.MAP_VALUE.getValue());
}
mplew.writeMapleAsciiString(object);
mplew.writeMapleAsciiString(amount);
return mplew.getPacket();
}
public static byte[] fairyPendantMessage(int termStart, int incExpR) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(14);
mplew.writeShort(SendPacketOpcode.EXP_BONUS.getValue());
mplew.writeInt(17);
mplew.writeInt(0);
mplew.writeInt(incExpR);
return mplew.getPacket();
}
public static byte[] potionDiscountMessage(int type, int potionDiscR) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(10);
mplew.writeShort(SendPacketOpcode.POTION_BONUS.getValue());
mplew.writeInt(type);
mplew.writeInt(potionDiscR);
return mplew.getPacket();
}
public static byte[] sendLevelup(boolean family, int level, String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LEVEL_UPDATE.getValue());
mplew.write(family ? 1 : 2);
mplew.writeInt(level);
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] sendMarriage(boolean family, String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MARRIAGE_UPDATE.getValue());
mplew.write(family ? 1 : 0);
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
//mark packet
public static byte[] giveMarkOfTheif(int cid, int oid, int skillid, List<MapleMonster> monsters, Point p1, Point p2, int javelin) {
MaplePacketLittleEndianWriter packet = new MaplePacketLittleEndianWriter();
packet.writeShort(SendPacketOpcode.GAIN_FORCE.getValue());
packet.write(1);
packet.writeInt(cid);
packet.writeInt(oid);
packet.writeInt(11); //type
packet.write(1);
packet.writeInt(monsters.size());
for (MapleMonster monster : monsters) {
packet.writeInt(monster.getObjectId());
}
packet.writeInt(skillid); //skillid
for (int i = 0; i < monsters.size(); i++) {
packet.write(1);
packet.writeInt(i + 2);
packet.writeInt(1);
packet.writeInt(Randomizer.rand(0x2A, 0x2B));
packet.writeInt(Randomizer.rand(0x03, 0x04));
packet.writeInt(Randomizer.rand(0x43, 0xF5));
packet.writeInt(200);
packet.writeLong(0);
packet.writeInt(Randomizer.nextInt());
packet.writeInt(0);
}
packet.write(0);
//for (Point p : pos) {
packet.writeInt(p1.x);
packet.writeInt(p1.y);
packet.writeInt(p2.x);
packet.writeInt(p2.y);
//}
packet.writeInt(javelin);
//System.out.println(packet.toString());
// packet.writeZeroBytes(69); //We might need this =p
return packet.getPacket();
}
//
public static byte[] sendJobup(boolean family, int jobid, String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.JOB_UPDATE.getValue());
mplew.write(family ? 1 : 0);
mplew.writeInt(jobid);
mplew.writeMapleAsciiString(new StringBuilder().append(!family ? "> " : "").append(name).toString());
return mplew.getPacket();
}
public static byte[] getAvatarMega(MapleCharacter chr, int channel, int itemId, List<String> text, boolean ear) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.AVATAR_MEGA.getValue());
mplew.writeInt(itemId);
mplew.writeMapleAsciiString(chr.getName());
for (String i : text) {
mplew.writeMapleAsciiString(i);
}
mplew.writeInt(channel - 1);
mplew.write(ear ? 1 : 0);
PacketHelper.addCharLook(mplew, chr, true, false);
return mplew.getPacket();
}
public static byte[] GMPoliceMessage(boolean dc) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3);
mplew.writeShort(SendPacketOpcode.GM_POLICE.getValue());
mplew.write(dc ? 10 : 0);
return mplew.getPacket();
}
public static byte[] GMPoliceMessage(String msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MAPLE_ADMIN_MSG.getValue());
mplew.writeMapleAsciiString(msg);
return mplew.getPacket();
}
public static byte[] pendantSlot(boolean p) { //slot -59
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SLOT_UPDATE.getValue());
mplew.write(p ? 1 : 0);
return mplew.getPacket();
}
public static byte[] followRequest(int chrid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FOLLOW_REQUEST.getValue());
mplew.writeInt(chrid);
return mplew.getPacket();
}
public static byte[] getTopMsg(String msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.TOP_MSG.getValue());
mplew.writeMapleAsciiString(msg);
return mplew.getPacket();
}
public static byte[] showMidMsg(String s, int l) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MID_MSG.getValue());
mplew.write(l);
mplew.writeMapleAsciiString(s);
mplew.write(s.length() > 0 ? 0 : 1);
return mplew.getPacket();
}
public static byte[] getMidMsg(String msg, boolean keep, int index) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MID_MSG.getValue());
mplew.write(index);
mplew.writeMapleAsciiString(msg);
mplew.write(keep ? 0 : 1);
return mplew.getPacket();
}
public static byte[] clearMidMsg() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CLEAR_MID_MSG.getValue());
return mplew.getPacket();
}
public static byte[] getSpecialMsg(String msg, int type, boolean show) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPECIAL_MSG.getValue());
mplew.writeMapleAsciiString(msg);
mplew.writeInt(type);
mplew.writeInt(show ? 0 : 1);
return mplew.getPacket();
}
public static byte[] CakePieMsg() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CAKE_VS_PIE_MSG.getValue());
return mplew.getPacket();
}
public static byte[] gmBoard(int increnement, String url) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GM_STORY_BOARD.getValue());
mplew.writeInt(increnement); //Increnement number
mplew.writeMapleAsciiString(url);
return mplew.getPacket();
}
public static byte[] updateJaguar(MapleCharacter from) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_JAGUAR.getValue());
PacketHelper.addJaguarInfo(mplew, from);
return mplew.getPacket();
}
public static byte[] loadInformation(byte mode, int location, int birthday, int favoriteAction, int favoriteLocation, boolean success) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.YOUR_INFORMATION.getValue());
mplew.write(mode);
if (mode == 2) {
mplew.writeInt(location);
mplew.writeInt(birthday);
mplew.writeInt(favoriteAction);
mplew.writeInt(favoriteLocation);
} else if (mode == 4) {
mplew.write(success ? 1 : 0);
}
return mplew.getPacket();
}
public static byte[] saveInformation(boolean fail) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.YOUR_INFORMATION.getValue());
mplew.write(4);
mplew.write(fail ? 0 : 1);
return mplew.getPacket();
}
public static byte[] myInfoResult() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FIND_FRIEND.getValue());
mplew.write(6);
mplew.writeInt(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] findFriendResult(byte mode, List<MapleCharacter> friends, int error, MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FIND_FRIEND.getValue());
mplew.write(mode);
switch (mode) {
case 6:
mplew.writeInt(0);
mplew.writeInt(0);
break;
case 8:
mplew.writeShort(friends.size());
for (MapleCharacter mc : friends) {
mplew.writeInt(mc.getId());
mplew.writeMapleAsciiString(mc.getName());
mplew.write(mc.getLevel());
mplew.writeShort(mc.getJob());
mplew.writeInt(0);
mplew.writeInt(0);
}
break;
case 9:
mplew.write(error);
break;
case 11:
mplew.writeInt(chr.getId());
PacketHelper.addCharLook(mplew, chr, true, false);
break;
}
return mplew.getPacket();
}
public static byte[] showBackgroundEffect(String eff, int value) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.VISITOR.getValue());
mplew.writeMapleAsciiString(eff);
mplew.write(value);
return mplew.getPacket();
}
public static byte[] sendPinkBeanChoco() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PINKBEAN_CHOCO.getValue());
mplew.writeInt(0);
mplew.write(1);
mplew.write(0);
mplew.write(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] changeChannelMsg(int channel, String msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(8 + msg.length());
mplew.writeShort(SendPacketOpcode.AUTO_CC_MSG.getValue());
mplew.writeInt(channel);
mplew.writeMapleAsciiString(msg);
return mplew.getPacket();
}
public static byte[] pamSongUI() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PAM_SONG.getValue());
return mplew.getPacket();
}
public static byte[] ultimateExplorer() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ULTIMATE_EXPLORER.getValue());
return mplew.getPacket();
}
public static byte[] professionInfo(String skil, int level1, int level2, int chance) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPECIAL_STAT.getValue());
mplew.writeMapleAsciiString(skil);
mplew.writeInt(level1);
mplew.writeInt(level2);
mplew.write(1);
mplew.writeInt((skil.startsWith("9200")) || (skil.startsWith("9201")) ? 100 : chance);
return mplew.getPacket();
}
public static byte[] updateAzwanFame(int level, int fame, boolean levelup) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_HONOUR.getValue());
mplew.writeInt(level);
mplew.writeInt(fame);
mplew.write(levelup ? 1 : 0);
return mplew.getPacket();
}
public static byte[] showAzwanKilled() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.AZWAN_KILLED.getValue());
return mplew.getPacket();
}
public static byte[] showSilentCrusadeMsg(byte type, short chapter) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SILENT_CRUSADE_MSG.getValue());
mplew.write(type);
mplew.writeShort(chapter - 1);
/* type:
* 0 - open ui (short is chapter)
* 2 - not enough inventory space
* 3 - failed due to unknown error
*/
return mplew.getPacket();
}
public static byte[] getSilentCrusadeMsg(byte type) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SILENT_CRUSADE_SHOP.getValue());
mplew.write(type);
return mplew.getPacket();
}
public static byte[] showSCShopMsg(byte type) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SILENT_CRUSADE_SHOP.getValue());
mplew.write(type);
return mplew.getPacket();
}
public static byte[] updateImpTime() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_IMP_TIME.getValue());
mplew.writeInt(0);
mplew.writeLong(0L);
return mplew.getPacket();
}
public static byte[] updateImp(MapleImp imp, int mask, int index, boolean login) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ITEM_POT.getValue());
mplew.write(login ? 0 : 1);
mplew.writeInt(index + 1);
mplew.writeInt(mask);
if ((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) {
Pair<?, ?> i = MapleItemInformationProvider.getInstance().getPot(imp.getItemId());
if (i == null) {
return enableActions();
}
mplew.writeInt(((Integer) i.left).intValue());
mplew.write(imp.getLevel());
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.STATE.getValue()) != 0)) {
mplew.write(imp.getState());
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.FULLNESS.getValue()) != 0)) {
mplew.writeInt(imp.getFullness());
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.CLOSENESS.getValue()) != 0)) {
mplew.writeInt(imp.getCloseness());
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.CLOSENESS_LEFT.getValue()) != 0)) {
mplew.writeInt(1);
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.MINUTES_LEFT.getValue()) != 0)) {
mplew.writeInt(0);
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.LEVEL.getValue()) != 0)) {
mplew.write(1);
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.FULLNESS_2.getValue()) != 0)) {
mplew.writeInt(imp.getFullness());
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.UPDATE_TIME.getValue()) != 0)) {
mplew.writeLong(PacketHelper.getTime(System.currentTimeMillis()));
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.CREATE_TIME.getValue()) != 0)) {
mplew.writeLong(PacketHelper.getTime(System.currentTimeMillis()));
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.AWAKE_TIME.getValue()) != 0)) {
mplew.writeLong(PacketHelper.getTime(System.currentTimeMillis()));
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.SLEEP_TIME.getValue()) != 0)) {
mplew.writeLong(PacketHelper.getTime(System.currentTimeMillis()));
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.MAX_CLOSENESS.getValue()) != 0)) {
mplew.writeInt(100);
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.MAX_DELAY.getValue()) != 0)) {
mplew.writeInt(1000);
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.MAX_FULLNESS.getValue()) != 0)) {
mplew.writeInt(1000);
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.MAX_ALIVE.getValue()) != 0)) {
mplew.writeInt(1);
}
if (((mask & MapleImp.ImpFlag.SUMMONED.getValue()) != 0) || ((mask & MapleImp.ImpFlag.MAX_MINUTES.getValue()) != 0)) {
mplew.writeInt(10);
}
mplew.write(0);
return mplew.getPacket();
}
// public static byte[] getMulungRanking(MapleClient c, List<DojoRankingInfo> all) {
// final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
// mplew.writeShort(SendPacketOpcode.MULUNG_DOJO_RANKING.getValue());
// MapleDojoRanking data = MapleDojoRanking.getInstance();
// mplew.writeInt(all.size()); // size
// for (DojoRankingInfo info : all) {
// mplew.writeShort(info.getRank());
// mplew.writeMapleAsciiString(info.getName());
// mplew.writeLong(info.getTime());
// }
// return mplew.getPacket();
// }
public static byte[] getMulungRanking() {
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MULUNG_DOJO_RANKING.getValue());
DojoRankingsData data = DojoRankingsData.loadLeaderboard();
mplew.writeInt(data.totalCharacters); // size
for (int i = 0; i < data.totalCharacters; i++) {
mplew.writeShort(data.ranks[i]); // rank
mplew.writeMapleAsciiString(data.names[i]); // Character name
mplew.writeLong(data.times[i]); // time in seconds
}
return mplew.getPacket();
}
public static byte[] getMulungMessage(boolean dc, String msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MULUNG_MESSAGE.getValue());
mplew.write(dc ? 1 : 0);
mplew.writeMapleAsciiString(msg);
return mplew.getPacket();
}
public static byte[] getCandyRanking(MapleClient c, List<CandyRankingInfo> all) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(10);
mplew.writeShort(SendPacketOpcode.CANDY_RANKING.getValue());
mplew.writeInt(all.size());
for (CandyRankingInfo info : all) {
mplew.writeShort(info.getRank());
mplew.writeMapleAsciiString(info.getName());
}
return mplew.getPacket();
}
public static byte[] showForeignDamageSkin(MapleCharacter chr, int skinid) {
MaplePacketLittleEndianWriter packet = new MaplePacketLittleEndianWriter();
packet.writeShort(SendPacketOpcode.SHOW_DAMAGE_SKIN.getValue());
packet.writeInt(chr.getId());
packet.writeInt(skinid);
return packet.getPacket();
}
public static class AlliancePacket {
public static byte[] getAllianceInfo(MapleGuildAlliance alliance) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(12);
mplew.write(alliance == null ? 0 : 1);
if (alliance != null) {
addAllianceInfo(mplew, alliance);
}
return mplew.getPacket();
}
private static void addAllianceInfo(MaplePacketLittleEndianWriter mplew, MapleGuildAlliance alliance) {
mplew.writeInt(alliance.getId());
mplew.writeMapleAsciiString(alliance.getName());
for (int i = 1; i <= 5; i++) {
mplew.writeMapleAsciiString(alliance.getRank(i));
}
mplew.write(alliance.getNoGuilds());
for (int i = 0; i < alliance.getNoGuilds(); i++) {
mplew.writeInt(alliance.getGuildId(i));
}
mplew.writeInt(alliance.getCapacity());
mplew.writeMapleAsciiString(alliance.getNotice());
}
public static byte[] getGuildAlliance(MapleGuildAlliance alliance) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(13);
if (alliance == null) {
mplew.writeInt(0);
return mplew.getPacket();
}
int noGuilds = alliance.getNoGuilds();
MapleGuild[] g = new MapleGuild[noGuilds];
for (int i = 0; i < alliance.getNoGuilds(); i++) {
g[i] = World.Guild.getGuild(alliance.getGuildId(i));
if (g[i] == null) {
return CWvsContext.enableActions();
}
}
mplew.writeInt(noGuilds);
for (MapleGuild gg : g) {
CWvsContext.GuildPacket.getGuildInfo(mplew, gg);
}
return mplew.getPacket();
}
public static byte[] allianceMemberOnline(int alliance, int gid, int id, boolean online) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(14);
mplew.writeInt(alliance);
mplew.writeInt(gid);
mplew.writeInt(id);
mplew.write(online ? 1 : 0);
return mplew.getPacket();
}
public static byte[] removeGuildFromAlliance(MapleGuildAlliance alliance, MapleGuild expelledGuild, boolean expelled) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(16);
addAllianceInfo(mplew, alliance);
CWvsContext.GuildPacket.getGuildInfo(mplew, expelledGuild);
mplew.write(expelled ? 1 : 0);
return mplew.getPacket();
}
public static byte[] addGuildToAlliance(MapleGuildAlliance alliance, MapleGuild newGuild) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(18);
addAllianceInfo(mplew, alliance);
mplew.writeInt(newGuild.getId());
CWvsContext.GuildPacket.getGuildInfo(mplew, newGuild);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] sendAllianceInvite(String allianceName, MapleCharacter inviter) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(3);
mplew.writeInt(inviter.getGuildId());
mplew.writeMapleAsciiString(inviter.getName());
mplew.writeMapleAsciiString(allianceName);
return mplew.getPacket();
}
public static byte[] getAllianceUpdate(MapleGuildAlliance alliance) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(23);
addAllianceInfo(mplew, alliance);
return mplew.getPacket();
}
public static byte[] createGuildAlliance(MapleGuildAlliance alliance) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(15);
addAllianceInfo(mplew, alliance);
int noGuilds = alliance.getNoGuilds();
MapleGuild[] g = new MapleGuild[noGuilds];
for (int i = 0; i < alliance.getNoGuilds(); i++) {
g[i] = World.Guild.getGuild(alliance.getGuildId(i));
if (g[i] == null) {
return CWvsContext.enableActions();
}
}
for (MapleGuild gg : g) {
CWvsContext.GuildPacket.getGuildInfo(mplew, gg);
}
return mplew.getPacket();
}
public static byte[] updateAlliance(MapleGuildCharacter mgc, int allianceid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(24);
mplew.writeInt(allianceid);
mplew.writeInt(mgc.getGuildId());
mplew.writeInt(mgc.getId());
mplew.writeInt(mgc.getLevel());
mplew.writeInt(mgc.getJobId());
return mplew.getPacket();
}
public static byte[] updateAllianceLeader(int allianceid, int newLeader, int oldLeader) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(25);
mplew.writeInt(allianceid);
mplew.writeInt(oldLeader);
mplew.writeInt(newLeader);
return mplew.getPacket();
}
public static byte[] allianceRankChange(int aid, String[] ranks) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(26);
mplew.writeInt(aid);
for (String r : ranks) {
mplew.writeMapleAsciiString(r);
}
return mplew.getPacket();
}
public static byte[] updateAllianceRank(MapleGuildCharacter mgc) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(27);
mplew.writeInt(mgc.getId());
mplew.write(mgc.getAllianceRank());
return mplew.getPacket();
}
public static byte[] changeAllianceNotice(int allianceid, String notice) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(28);
mplew.writeInt(allianceid);
mplew.writeMapleAsciiString(notice);
return mplew.getPacket();
}
public static byte[] disbandAlliance(int alliance) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(29);
mplew.writeInt(alliance);
return mplew.getPacket();
}
public static byte[] changeAlliance(MapleGuildAlliance alliance, boolean in) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(1);
mplew.write(in ? 1 : 0);
mplew.writeInt(in ? alliance.getId() : 0);
int noGuilds = alliance.getNoGuilds();
MapleGuild[] g = new MapleGuild[noGuilds];
for (int i = 0; i < noGuilds; i++) {
g[i] = World.Guild.getGuild(alliance.getGuildId(i));
if (g[i] == null) {
return CWvsContext.enableActions();
}
}
mplew.write(noGuilds);
for (int i = 0; i < noGuilds; i++) {
mplew.writeInt(g[i].getId());
Collection<MapleGuildCharacter> members = g[i].getMembers();
mplew.writeInt(members.size());
for (MapleGuildCharacter mgc : members) {
mplew.writeInt(mgc.getId());
mplew.write(in ? mgc.getAllianceRank() : 0);
}
}
return mplew.getPacket();
}
public static byte[] changeAllianceLeader(int allianceid, int newLeader, int oldLeader) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(2);
mplew.writeInt(allianceid);
mplew.writeInt(oldLeader);
mplew.writeInt(newLeader);
return mplew.getPacket();
}
public static byte[] changeGuildInAlliance(MapleGuildAlliance alliance, MapleGuild guild, boolean add) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(4);
mplew.writeInt(add ? alliance.getId() : 0);
mplew.writeInt(guild.getId());
Collection<MapleGuildCharacter> members = guild.getMembers();
mplew.writeInt(members.size());
for (MapleGuildCharacter mgc : members) {
mplew.writeInt(mgc.getId());
mplew.write(add ? mgc.getAllianceRank() : 0);
}
return mplew.getPacket();
}
public static byte[] changeAllianceRank(int allianceid, MapleGuildCharacter player) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(5);
mplew.writeInt(allianceid);
mplew.writeInt(player.getId());
mplew.writeInt(player.getAllianceRank());
return mplew.getPacket();
}
}
public static class FamilyPacket {
public static byte[] getFamilyData() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILY.getValue());
MapleFamilyBuff[] entries = MapleFamilyBuff.values();
mplew.writeInt(entries.length);
for (MapleFamilyBuff entry : entries) {
mplew.write(entry.type);
mplew.writeInt(entry.rep);
mplew.writeInt(1);
mplew.writeMapleAsciiString(entry.name);
mplew.writeMapleAsciiString(entry.desc);
}
return mplew.getPacket();
}
public static byte[] getFamilyInfo(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.OPEN_FAMILY.getValue());
mplew.writeInt(chr.getCurrentRep());
mplew.writeInt(chr.getTotalRep());
mplew.writeInt(chr.getTotalRep());
mplew.writeShort(chr.getNoJuniors());
mplew.writeShort(2);
mplew.writeShort(chr.getNoJuniors());
MapleFamily family = World.Family.getFamily(chr.getFamilyId());
if (family != null) {
mplew.writeInt(family.getLeaderId());
mplew.writeMapleAsciiString(family.getLeaderName());
mplew.writeMapleAsciiString(family.getNotice());
} else {
mplew.writeLong(0L);
}
List<?> b = chr.usedBuffs();
mplew.writeInt(b.size());
for (Iterator<?> i$ = b.iterator(); i$.hasNext();) {
int ii = ((Integer) i$.next()).intValue();
mplew.writeInt(ii);
mplew.writeInt(1);
}
return mplew.getPacket();
}
public static void addFamilyCharInfo(MapleFamilyCharacter ldr, MaplePacketLittleEndianWriter mplew) {
mplew.writeInt(ldr.getId());
mplew.writeInt(ldr.getSeniorId());
mplew.writeShort(ldr.getJobId());
mplew.writeShort(0);
mplew.write(ldr.getLevel());
mplew.write(ldr.isOnline() ? 1 : 0);
mplew.writeInt(ldr.getCurrentRep());
mplew.writeInt(ldr.getTotalRep());
mplew.writeInt(ldr.getTotalRep());
mplew.writeInt(ldr.getTotalRep());
mplew.writeInt(Math.max(ldr.getChannel(), 0));
mplew.writeInt(0);
mplew.writeMapleAsciiString(ldr.getName());
}
public static byte[] getFamilyPedigree(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SEND_PEDIGREE.getValue());
mplew.writeInt(chr.getId());
MapleFamily family = World.Family.getFamily(chr.getFamilyId());
int descendants = 2;
int gens = 0;
int generations = 0;
if (family == null) {
mplew.writeInt(2);
addFamilyCharInfo(new MapleFamilyCharacter(chr, 0, 0, 0, 0), mplew);
} else {
mplew.writeInt(family.getMFC(chr.getId()).getPedigree().size() + 1);
addFamilyCharInfo(family.getMFC(family.getLeaderId()), mplew);
if (chr.getSeniorId() > 0) {
MapleFamilyCharacter senior = family.getMFC(chr.getSeniorId());
if (senior != null) {
if (senior.getSeniorId() > 0) {
addFamilyCharInfo(family.getMFC(senior.getSeniorId()), mplew);
}
addFamilyCharInfo(senior, mplew);
}
}
}
addFamilyCharInfo(chr.getMFC() == null ? new MapleFamilyCharacter(chr, 0, 0, 0, 0) : chr.getMFC(), mplew);
if (family != null) {
if (chr.getSeniorId() > 0) {
MapleFamilyCharacter senior = family.getMFC(chr.getSeniorId());
if (senior != null) {
if ((senior.getJunior1() > 0) && (senior.getJunior1() != chr.getId())) {
addFamilyCharInfo(family.getMFC(senior.getJunior1()), mplew);
} else if ((senior.getJunior2() > 0) && (senior.getJunior2() != chr.getId())) {
addFamilyCharInfo(family.getMFC(senior.getJunior2()), mplew);
}
}
}
if (chr.getJunior1() > 0) {
MapleFamilyCharacter junior = family.getMFC(chr.getJunior1());
if (junior != null) {
addFamilyCharInfo(junior, mplew);
}
}
if (chr.getJunior2() > 0) {
MapleFamilyCharacter junior = family.getMFC(chr.getJunior2());
if (junior != null) {
addFamilyCharInfo(junior, mplew);
}
}
if (chr.getJunior1() > 0) {
MapleFamilyCharacter junior = family.getMFC(chr.getJunior1());
if (junior != null) {
if ((junior.getJunior1() > 0) && (family.getMFC(junior.getJunior1()) != null)) {
gens++;
addFamilyCharInfo(family.getMFC(junior.getJunior1()), mplew);
}
if ((junior.getJunior2() > 0) && (family.getMFC(junior.getJunior2()) != null)) {
gens++;
addFamilyCharInfo(family.getMFC(junior.getJunior2()), mplew);
}
}
}
if (chr.getJunior2() > 0) {
MapleFamilyCharacter junior = family.getMFC(chr.getJunior2());
if (junior != null) {
if ((junior.getJunior1() > 0) && (family.getMFC(junior.getJunior1()) != null)) {
gens++;
addFamilyCharInfo(family.getMFC(junior.getJunior1()), mplew);
}
if ((junior.getJunior2() > 0) && (family.getMFC(junior.getJunior2()) != null)) {
gens++;
addFamilyCharInfo(family.getMFC(junior.getJunior2()), mplew);
}
}
}
generations = family.getMemberSize();
}
mplew.writeLong(gens);
mplew.writeInt(0);
mplew.writeInt(-1);
mplew.writeInt(generations);
if (family != null) {
if (chr.getJunior1() > 0) {
MapleFamilyCharacter junior = family.getMFC(chr.getJunior1());
if (junior != null) {
if ((junior.getJunior1() > 0) && (family.getMFC(junior.getJunior1()) != null)) {
mplew.writeInt(junior.getJunior1());
mplew.writeInt(family.getMFC(junior.getJunior1()).getDescendants());
} else {
mplew.writeInt(0);
}
if ((junior.getJunior2() > 0) && (family.getMFC(junior.getJunior2()) != null)) {
mplew.writeInt(junior.getJunior2());
mplew.writeInt(family.getMFC(junior.getJunior2()).getDescendants());
} else {
mplew.writeInt(0);
}
}
}
if (chr.getJunior2() > 0) {
MapleFamilyCharacter junior = family.getMFC(chr.getJunior2());
if (junior != null) {
if ((junior.getJunior1() > 0) && (family.getMFC(junior.getJunior1()) != null)) {
mplew.writeInt(junior.getJunior1());
mplew.writeInt(family.getMFC(junior.getJunior1()).getDescendants());
} else {
mplew.writeInt(0);
}
if ((junior.getJunior2() > 0) && (family.getMFC(junior.getJunior2()) != null)) {
mplew.writeInt(junior.getJunior2());
mplew.writeInt(family.getMFC(junior.getJunior2()).getDescendants());
} else {
mplew.writeInt(0);
}
}
}
}
List<?> b = chr.usedBuffs();
mplew.writeInt(b.size());
for (Iterator<?> i$ = b.iterator(); i$.hasNext();) {
int ii = ((Integer) i$.next()).intValue();
mplew.writeInt(ii);
mplew.writeInt(1);
}
mplew.writeShort(2);
return mplew.getPacket();
}
public static byte[] getFamilyMsg(byte type, int meso) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILY_MESSAGE.getValue());
mplew.writeInt(type);
mplew.writeInt(meso);
return mplew.getPacket();
}
public static byte[] sendFamilyInvite(int cid, int otherLevel, int otherJob, String inviter) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILY_INVITE.getValue());
mplew.writeInt(cid);
mplew.writeInt(otherLevel);
mplew.writeInt(otherJob);
mplew.writeInt(0);
mplew.writeMapleAsciiString(inviter);
return mplew.getPacket();
}
public static byte[] sendFamilyJoinResponse(boolean accepted, String added) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILY_JUNIOR.getValue());
mplew.write(accepted ? 1 : 0);
mplew.writeMapleAsciiString(added);
return mplew.getPacket();
}
public static byte[] getSeniorMessage(String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SENIOR_MESSAGE.getValue());
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] changeRep(int r, String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.REP_INCREASE.getValue());
mplew.writeInt(r);
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] familyLoggedIn(boolean online, String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILY_LOGGEDIN.getValue());
mplew.write(online ? 1 : 0);
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] familyBuff(int type, int buffnr, int amount, int time) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILY_BUFF.getValue());
mplew.write(type);
if ((type >= 2) && (type <= 4)) {
mplew.writeInt(buffnr);
mplew.writeInt(type == 3 ? 0 : amount);
mplew.writeInt(type == 2 ? 0 : amount);
mplew.write(0);
mplew.writeInt(time);
}
return mplew.getPacket();
}
public static byte[] cancelFamilyBuff() {
return familyBuff(0, 0, 0, 0);
}
public static byte[] familySummonRequest(String name, String mapname) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FAMILY_USE_REQUEST.getValue());
mplew.writeMapleAsciiString(name);
mplew.writeMapleAsciiString(mapname);
return mplew.getPacket();
}
}
public static class BuddylistPacket {
public static byte[] updateBuddylist(Collection<BuddylistEntry> buddylist) {
return updateBuddylist(buddylist, 7);
}
public static byte[] updateBuddylist(Collection<BuddylistEntry> buddylist, int deleted) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BUDDYLIST.getValue());
mplew.write(deleted);
mplew.write(buddylist.size());
for (BuddylistEntry buddy : buddylist) {
mplew.writeInt(buddy.getCharacterId());
mplew.writeAsciiString(buddy.getName(), 13);
mplew.write(buddy.isVisible() ? 0 : 1);//if adding = 2
mplew.writeInt(buddy.getChannel() == -1 ? -1 : buddy.getChannel());
mplew.writeAsciiString(buddy.getGroup(), 17);
}
for (int x = 0; x < buddylist.size(); x++) {
mplew.writeInt(0);
}
return mplew.getPacket();
}
public static byte[] updateBuddyChannel(int characterid, int channel) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BUDDYLIST.getValue());
mplew.write(20);
mplew.writeInt(characterid);
mplew.write(0);
mplew.writeInt(channel);
return mplew.getPacket();
}
public static byte[] requestBuddylistAdd(int cidFrom, String nameFrom, int levelFrom, int jobFrom) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BUDDYLIST.getValue());
mplew.write(9);
mplew.writeInt(cidFrom);
mplew.writeMapleAsciiString(nameFrom);
mplew.writeInt(levelFrom);
mplew.writeInt(jobFrom);
mplew.writeInt(0);//v115
mplew.writeInt(cidFrom);
mplew.writeAsciiString(nameFrom, 13);
mplew.write(1);
mplew.writeInt(0);
mplew.writeAsciiString("ETC", 16);
mplew.writeShort(0);//was1
return mplew.getPacket();
}
public static byte[] updateBuddyCapacity(int capacity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BUDDYLIST.getValue());
mplew.write(21);
mplew.write(capacity);
return mplew.getPacket();
}
public static byte[] buddylistMessage(byte message) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BUDDYLIST.getValue());
mplew.write(message);
return mplew.getPacket();
}
}
public static byte[] giveKilling(int x) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, MapleBuffStat.KILL_COUNT);
// mplew.writeInt(0);
// mplew.write(0);
// mplew.writeInt(x);
// mplew.writeZeroBytes(6);
mplew.writeShort(0);
mplew.write(0);
mplew.writeInt(x);
return mplew.getPacket();
}
public static class ExpeditionPacket {
public static byte[] expeditionStatus(MapleExpedition me, boolean created, boolean silent) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(created ? 86 : silent ? 72 : 76);//74
mplew.writeInt(me.getType().exped);
mplew.writeInt(0);
for (int i = 0; i < 6; i++) {
if (i < me.getParties().size()) {
MapleParty party = World.Party.getParty((me.getParties().get(i)).intValue());
CWvsContext.PartyPacket.addPartyStatus(-1, party, mplew, false, true);
} else {
CWvsContext.PartyPacket.addPartyStatus(-1, null, mplew, false, true);
}
}
return mplew.getPacket();
}
public static byte[] expeditionError(int errcode, String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(100);//88
mplew.writeInt(errcode);
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] expeditionMessage(int code) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(code);
return mplew.getPacket();
}
public static byte[] expeditionJoined(String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(87);//75
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] expeditionLeft(String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(91);//79
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] expeditionLeaderChanged(int newLeader) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(96);//84
mplew.writeInt(newLeader);
return mplew.getPacket();
}
public static byte[] expeditionUpdate(int partyIndex, MapleParty party) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(97);//85
mplew.writeInt(0);
mplew.writeInt(partyIndex);
CWvsContext.PartyPacket.addPartyStatus(-1, party, mplew, false, true);
return mplew.getPacket();
}
public static byte[] expeditionInvite(MapleCharacter from, int exped) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EXPEDITION_OPERATION.getValue());
mplew.write(99);//87
mplew.writeInt(from.getLevel());
mplew.writeInt(from.getJob());
mplew.writeInt(0);
mplew.writeMapleAsciiString(from.getName());
mplew.writeInt(exped);
return mplew.getPacket();
}
}
public static class PartyPacket {
public static byte[] partyCreated(int partyid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
mplew.write(14);//12 v140
mplew.writeInt(partyid);
mplew.writeInt(999999999);
mplew.writeInt(999999999);
mplew.writeInt(0);
mplew.writeShort(0);
mplew.writeShort(0);
mplew.write(0);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] partyInvite(MapleCharacter from) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
mplew.write(4);
mplew.writeInt(from.getParty() == null ? 0 : from.getParty().getId());
mplew.writeMapleAsciiString(from.getName());
mplew.writeInt(from.getLevel());
mplew.writeInt(from.getJob());
mplew.write(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] partyRequestInvite(MapleCharacter from) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
mplew.write(7);
mplew.writeInt(from.getId());
mplew.writeMapleAsciiString(from.getName());
mplew.writeInt(from.getLevel());
mplew.writeInt(from.getJob());
return mplew.getPacket();
}
public static byte[] partyStatusMessage(int message, String charname) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
mplew.write(message);
if ((message == 30) || (message == 52)) {
mplew.writeMapleAsciiString(charname);
} else if (message == 45) {
mplew.write(0);
}
return mplew.getPacket();
}
public static void addPartyStatus(int forchannel, MapleParty party, MaplePacketLittleEndianWriter lew, boolean leaving) {
addPartyStatus(forchannel, party, lew, leaving, false);
}
public static void addPartyStatus(int forchannel, MapleParty party, MaplePacketLittleEndianWriter lew, boolean leaving, boolean exped) {
List<MaplePartyCharacter> partymembers;
if (party == null) {
partymembers = new ArrayList();
} else {
partymembers = new ArrayList(party.getMembers());
}
while (partymembers.size() < 6) {
partymembers.add(new MaplePartyCharacter());
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeInt(partychar.getId());
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeAsciiString(partychar.getName(), 13);
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeInt(partychar.getJobId());
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeInt(0);
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeInt(partychar.getLevel());
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeInt(partychar.isOnline() ? partychar.getChannel() - 1 : -2);
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeInt(0);
}
lew.writeInt(party == null ? 0 : party.getLeader().getId());
if (exped) {
return;
}
for (MaplePartyCharacter partychar : partymembers) {
lew.writeInt(partychar.getChannel() == forchannel ? partychar.getMapid() : 999999999);
}
for (MaplePartyCharacter partychar : partymembers) {
if ((partychar.getChannel() == forchannel) && (!leaving)) {
lew.writeInt(partychar.getDoorTown());
lew.writeInt(partychar.getDoorTarget());
lew.writeInt(partychar.getDoorSkill());
lew.writeInt(partychar.getDoorPosition().x);
lew.writeInt(partychar.getDoorPosition().y);
} else {
lew.writeInt(leaving ? 999999999 : 0);
lew.writeLong(leaving ? 999999999L : 0L);
lew.writeLong(leaving ? -1L : 0L);
}
}
lew.write(1);
}
public static byte[] updateParty(int forChannel, MapleParty party, PartyOperation op, MaplePartyCharacter target) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
switch (op) {
case DISBAND:
case EXPEL:
case LEAVE:
mplew.write(18);
mplew.writeInt(party.getId());
mplew.writeInt(target.getId());
mplew.write(op == PartyOperation.DISBAND ? 0 : 1);
if (op == PartyOperation.DISBAND) {
break;
}
mplew.write(op == PartyOperation.EXPEL ? 1 : 0);
mplew.writeMapleAsciiString(target.getName());
addPartyStatus(forChannel, party, mplew, op == PartyOperation.LEAVE);
break;
case JOIN:
mplew.write(21);
mplew.writeInt(party.getId());
mplew.writeMapleAsciiString(target.getName());
addPartyStatus(forChannel, party, mplew, false);
break;
case SILENT_UPDATE:
case LOG_ONOFF:
mplew.write(13);
mplew.writeInt(party.getId());
addPartyStatus(forChannel, party, mplew, op == PartyOperation.LOG_ONOFF);
break;
case CHANGE_LEADER:
case CHANGE_LEADER_DC:
mplew.write(45);
mplew.writeInt(target.getId());
mplew.write(op == PartyOperation.CHANGE_LEADER_DC ? 1 : 0);
}
return mplew.getPacket();
}
public static byte[] partyPortal(int townId, int targetId, int skillId, Point position, boolean animation) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
mplew.write(61);
mplew.write(animation ? 0 : 1);
mplew.writeInt(townId);
mplew.writeInt(targetId);
mplew.writeInt(skillId);
mplew.writePos(position);
return mplew.getPacket();
}
public static byte[] getPartyListing(PartySearchType pst) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
mplew.write(GameConstants.GMS ? 147 : 77);
mplew.writeInt(pst.id);
final List<PartySearch> parties = World.Party.searchParty(pst);
mplew.writeInt(parties.size());
for (PartySearch party : parties) {
mplew.writeInt(0);
mplew.writeInt(2);
if (pst.exped) {
MapleExpedition me = World.Party.getExped(party.getId());
mplew.writeInt(me.getType().maxMembers);
mplew.writeInt(party.getId());
mplew.writeAsciiString(party.getName(), 48);
for (int i = 0; i < 5; i++) {
if (i < me.getParties().size()) {
MapleParty part = World.Party.getParty((me.getParties().get(i)).intValue());
if (part != null) {
addPartyStatus(-1, part, mplew, false, true);
} else {
mplew.writeZeroBytes(202);
}
} else {
mplew.writeZeroBytes(202);
}
}
} else {
mplew.writeInt(0);
mplew.writeInt(party.getId());
mplew.writeAsciiString(party.getName(), 48);
addPartyStatus(-1, World.Party.getParty(party.getId()), mplew, false, true);
}
mplew.writeShort(0);
}
return mplew.getPacket();
}
public static byte[] partyListingAdded(PartySearch ps) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_OPERATION.getValue());
mplew.write(93);
mplew.writeInt(ps.getType().id);
mplew.writeInt(0);
mplew.writeInt(1);
if (ps.getType().exped) {
MapleExpedition me = World.Party.getExped(ps.getId());
mplew.writeInt(me.getType().maxMembers);
mplew.writeInt(ps.getId());
mplew.writeAsciiString(ps.getName(), 48);
for (int i = 0; i < 5; i++) {
if (i < me.getParties().size()) {
MapleParty party = World.Party.getParty((me.getParties().get(i)).intValue());
if (party != null) {
addPartyStatus(-1, party, mplew, false, true);
} else {
mplew.writeZeroBytes(202);
}
} else {
mplew.writeZeroBytes(202);
}
}
} else {
mplew.writeInt(0);
mplew.writeInt(ps.getId());
mplew.writeAsciiString(ps.getName(), 48);
addPartyStatus(-1, World.Party.getParty(ps.getId()), mplew, false, true);
}
mplew.writeShort(0);
return mplew.getPacket();
}
public static byte[] showMemberSearch(List<MapleCharacter> chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MEMBER_SEARCH.getValue());
mplew.write(chr.size());
for (MapleCharacter c : chr) {
mplew.writeInt(c.getId());
mplew.writeMapleAsciiString(c.getName());
mplew.writeShort(c.getJob());
mplew.write(c.getLevel());
}
return mplew.getPacket();
}
public static byte[] showPartySearch(List<MapleParty> chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PARTY_SEARCH.getValue());
mplew.write(chr.size());
for (MapleParty c : chr) {
mplew.writeInt(c.getId());
mplew.writeMapleAsciiString(c.getLeader().getName());
mplew.write(c.getLeader().getLevel());
mplew.write(c.getLeader().isOnline() ? 1 : 0);
mplew.write(c.getMembers().size());
for (MaplePartyCharacter ch : c.getMembers()) {
mplew.writeInt(ch.getId());
mplew.writeMapleAsciiString(ch.getName());
mplew.writeShort(ch.getJobId());
mplew.write(ch.getLevel());
mplew.write(ch.isOnline() ? 1 : 0);
}
}
return mplew.getPacket();
}
}
public static class GuildPacket {
public static byte[] guildInvite(int gid, String charName, int levelFrom, int jobFrom) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(5);
mplew.writeInt(gid);
mplew.writeMapleAsciiString(charName);
mplew.writeInt(levelFrom);
mplew.writeInt(jobFrom);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] showGuildInfo(MapleCharacter c) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(32);
if ((c == null) || (c.getMGC() == null)) {
mplew.write(0);
return mplew.getPacket();
}
MapleGuild g = World.Guild.getGuild(c.getGuildId());
if (g == null) {
mplew.write(0);
return mplew.getPacket();
}
mplew.write(1);
getGuildInfo(mplew, g);
return mplew.getPacket();
}
public static void getGuildInfo(MaplePacketLittleEndianWriter mplew, MapleGuild guild) {
mplew.writeInt(guild.getId());
mplew.writeMapleAsciiString(guild.getName());
for (int i = 1; i <= 5; i++) {
mplew.writeMapleAsciiString(guild.getRankTitle(i));
}
guild.addMemberData(mplew);
mplew.writeInt(guild.getCapacity());
mplew.writeShort(guild.getLogoBG());
mplew.write(guild.getLogoBGColor());
mplew.writeShort(guild.getLogo());
mplew.write(guild.getLogoColor());
mplew.writeMapleAsciiString(guild.getNotice());
mplew.writeInt(guild.getGP());
mplew.writeInt(guild.getGP());
mplew.writeInt(guild.getAllianceId() > 0 ? guild.getAllianceId() : 0);
mplew.write(guild.getLevel());
mplew.writeShort(0);
mplew.writeShort(guild.getSkills().size());
for (MapleGuildSkill i : guild.getSkills()) {
mplew.writeInt(i.skillID);
mplew.writeShort(i.level);
mplew.writeLong(PacketHelper.getTime(i.timestamp));
mplew.writeMapleAsciiString(i.purchaser);
mplew.writeMapleAsciiString(i.activator);
}
}
public static byte[] newGuildInfo(MapleCharacter c) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(38);
if ((c == null) || (c.getMGC() == null)) {
return genericGuildMessage((byte) 37);
}
MapleGuild g = World.Guild.getGuild(c.getGuildId());
if (g == null) {
return genericGuildMessage((byte) 37);
}
getGuildInfo(mplew, g);
return mplew.getPacket();
}
public static byte[] newGuildMember(MapleGuildCharacter mgc) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(45);
mplew.writeInt(mgc.getGuildId());
mplew.writeInt(mgc.getId());
mplew.writeAsciiString(mgc.getName(), 13);
mplew.writeInt(mgc.getJobId());
mplew.writeInt(mgc.getLevel());
mplew.writeInt(mgc.getGuildRank());
mplew.writeInt(mgc.isOnline() ? 1 : 0);
mplew.writeInt(mgc.getAllianceRank());
mplew.writeInt(mgc.getGuildContribution());
return mplew.getPacket();
}
public static byte[] memberLeft(MapleGuildCharacter mgc, boolean bExpelled) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(bExpelled ? 53 : 50);
mplew.writeInt(mgc.getGuildId());
mplew.writeInt(mgc.getId());
mplew.writeMapleAsciiString(mgc.getName());
return mplew.getPacket();
}
public static byte[] guildDisband(int gid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(56);
mplew.writeInt(gid);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] guildCapacityChange(int gid, int capacity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(64);
mplew.writeInt(gid);
mplew.write(capacity);
return mplew.getPacket();
}
public static byte[] guildContribution(int gid, int cid, int c) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(72);
mplew.writeInt(gid);
mplew.writeInt(cid);
mplew.writeInt(c);
return mplew.getPacket();
}
public static byte[] changeRank(MapleGuildCharacter mgc) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(70);
mplew.writeInt(mgc.getGuildId());
mplew.writeInt(mgc.getId());
mplew.write(mgc.getGuildRank());
return mplew.getPacket();
}
public static byte[] rankTitleChange(int gid, String[] ranks) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(68);
mplew.writeInt(gid);
for (String r : ranks) {
mplew.writeMapleAsciiString(r);
}
return mplew.getPacket();
}
public static byte[] guildEmblemChange(int gid, short bg, byte bgcolor, short logo, byte logocolor) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(73);
mplew.writeInt(gid);
mplew.writeShort(bg);
mplew.write(bgcolor);
mplew.writeShort(logo);
mplew.write(logocolor);
return mplew.getPacket();
}
public static byte[] updateGP(int gid, int GP, int glevel) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(79);
mplew.writeInt(gid);
mplew.writeInt(GP);
mplew.writeInt(glevel);
return mplew.getPacket();
}
public static byte[] guildNotice(int gid, String notice) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(75);
mplew.writeInt(gid);
mplew.writeMapleAsciiString(notice);
return mplew.getPacket();
}
public static byte[] guildMemberLevelJobUpdate(MapleGuildCharacter mgc) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(66);
mplew.writeInt(mgc.getGuildId());
mplew.writeInt(mgc.getId());
mplew.writeInt(mgc.getLevel());
mplew.writeInt(mgc.getJobId());
return mplew.getPacket();
}
public static byte[] guildMemberOnline(int gid, int cid, boolean bOnline) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(67);
mplew.writeInt(gid);
mplew.writeInt(cid);
mplew.write(bOnline ? 1 : 0);
return mplew.getPacket();
}
public static byte[] showGuildRanks(int npcid, List<MapleGuildRanking.GuildRankingInfo> all) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(80);
mplew.writeInt(npcid);
mplew.writeInt(all.size());
for (MapleGuildRanking.GuildRankingInfo info : all) {
mplew.writeShort(0);
mplew.writeMapleAsciiString(info.getName());
mplew.writeInt(info.getGP());
mplew.writeInt(info.getLogo());
mplew.writeInt(info.getLogoColor());
mplew.writeInt(info.getLogoBg());
mplew.writeInt(info.getLogoBgColor());
}
return mplew.getPacket();
}
public static byte[] guildSkillPurchased(int gid, int sid, int level, long expiration, String purchase, String activate) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(85);
mplew.writeInt(gid);
mplew.writeInt(sid);
mplew.writeShort(level);
mplew.writeLong(PacketHelper.getTime(expiration));
mplew.writeMapleAsciiString(purchase);
mplew.writeMapleAsciiString(activate);
return mplew.getPacket();
}
public static byte[] guildLeaderChanged(int gid, int oldLeader, int newLeader, int allianceId) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(89);
mplew.writeInt(gid);
mplew.writeInt(oldLeader);
mplew.writeInt(newLeader);
mplew.write(1);
mplew.writeInt(allianceId);
return mplew.getPacket();
}
public static byte[] denyGuildInvitation(String charname) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(61);
mplew.writeMapleAsciiString(charname);
return mplew.getPacket();
}
public static byte[] genericGuildMessage(byte code) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(code);//30 = cant find in ch
if (code == 87) {
mplew.writeInt(0);
}
if ((code == 3) || (code == 59) || (code == 60) || (code == 61) || (code == 84) || (code == 87)) {
mplew.writeMapleAsciiString("");
}
return mplew.getPacket();
}
public static byte[] BBSThreadList(List<MapleBBSThread> bbs, int start) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BBS_OPERATION.getValue());
mplew.write(6);
if (bbs == null) {
mplew.write(0);
mplew.writeLong(0L);
return mplew.getPacket();
}
int threadCount = bbs.size();
MapleBBSThread notice = null;
for (MapleBBSThread b : bbs) {
if (b.isNotice()) {
notice = b;
break;
}
}
mplew.write(notice == null ? 0 : 1);
if (notice != null) {
addThread(mplew, notice);
}
if (threadCount < start) {
start = 0;
}
mplew.writeInt(threadCount);
int pages = Math.min(10, threadCount - start);
mplew.writeInt(pages);
for (int i = 0; i < pages; i++) {
addThread(mplew, (MapleBBSThread) bbs.get(start + i));
}
return mplew.getPacket();
}
private static void addThread(MaplePacketLittleEndianWriter mplew, MapleBBSThread rs) {
mplew.writeInt(rs.localthreadID);
mplew.writeInt(rs.ownerID);
mplew.writeMapleAsciiString(rs.name);
mplew.writeLong(PacketHelper.getKoreanTimestamp(rs.timestamp));
mplew.writeInt(rs.icon);
mplew.writeInt(rs.getReplyCount());
}
public static byte[] showThread(MapleBBSThread thread) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BBS_OPERATION.getValue());
mplew.write(7);
mplew.writeInt(thread.localthreadID);
mplew.writeInt(thread.ownerID);
mplew.writeLong(PacketHelper.getKoreanTimestamp(thread.timestamp));
mplew.writeMapleAsciiString(thread.name);
mplew.writeMapleAsciiString(thread.text);
mplew.writeInt(thread.icon);
mplew.writeInt(thread.getReplyCount());
for (MapleBBSThread.MapleBBSReply reply : thread.replies.values()) {
mplew.writeInt(reply.replyid);
mplew.writeInt(reply.ownerID);
mplew.writeLong(PacketHelper.getKoreanTimestamp(reply.timestamp));
mplew.writeMapleAsciiString(reply.content);
}
return mplew.getPacket();
}
}
public static class InfoPacket {
public static byte[] showMesoGain(long gain, boolean inChat) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
if (!inChat) {
mplew.write(0);
mplew.write(1);
mplew.write(0);
mplew.writeLong(gain);
mplew.writeShort(0);
} else {
mplew.write(6);
mplew.writeLong(gain);
mplew.writeInt(-1);
}
return mplew.getPacket();
}
public static byte[] getShowInventoryStatus(int mode) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(0);
mplew.write(mode);
mplew.writeInt(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] getShowItemGain(int itemId, short quantity) {
return getShowItemGain(itemId, quantity, false);
}
public static byte[] getShowItemGain(int itemId, short quantity, boolean inChat) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
if (inChat) {
mplew.writeShort(SendPacketOpcode.SHOW_SPECIAL_EFFECT.getValue());
mplew.write(5);
mplew.write(1);
mplew.writeInt(itemId);
mplew.writeInt(quantity);
} else {
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.writeShort(0);
mplew.writeInt(itemId);
mplew.writeInt(quantity);
}
return mplew.getPacket();
}
public static byte[] updateQuest(MapleQuestStatus quest) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(1);
mplew.writeShort(quest.getQuest().getId());
mplew.write(quest.getStatus());
switch (quest.getStatus()) {
case 0:
mplew.write(0);
break;
case 1:
mplew.writeMapleAsciiString(quest.getCustomData() != null ? quest.getCustomData() : "");
break;
case 2:
mplew.writeLong(PacketHelper.getTime(System.currentTimeMillis()));
}
return mplew.getPacket();
}
public static byte[] updateQuestMobKills(MapleQuestStatus status) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(1);
mplew.writeShort(status.getQuest().getId());
mplew.write(1);
StringBuilder sb = new StringBuilder();
for (Iterator<?> i$ = status.getMobKills().values().iterator(); i$.hasNext();) {
int kills = ((Integer) i$.next()).intValue();
sb.append(StringUtil.getLeftPaddedStr(String.valueOf(kills), '0', 3));
}
mplew.writeMapleAsciiString(sb.toString());
mplew.writeLong(0L);
return mplew.getPacket();
}
public static byte[] itemExpired(int itemid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(2);
mplew.writeInt(itemid);
return mplew.getPacket();
}
public static byte[] GainEXP_Monster(int gain, boolean white, int partyinc, int Class_Bonus_EXP, int Equipment_Bonus_EXP, int Premium_Bonus_EXP) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(3);
mplew.write(white ? 1 : 0);
mplew.writeInt(gain);
mplew.write(0);
mplew.writeInt(0);
mplew.write(0);
mplew.write(0);
mplew.writeInt(0);
mplew.write(0);
mplew.writeInt(partyinc);
mplew.writeInt(Equipment_Bonus_EXP);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.write(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(Premium_Bonus_EXP);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] GainEXP_Others(long gain, boolean inChat, boolean white) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(3);
mplew.write(white ? 1 : 0);
mplew.writeLong(gain);
mplew.write(inChat ? 1 : 0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
if (inChat) {
mplew.writeLong(0L);
} else {
mplew.writeShort(0);
mplew.write(0);
}
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] getSPMsg(byte sp, short job) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(4);
mplew.writeShort(job);
mplew.write(sp);
return mplew.getPacket();
}
public static byte[] getShowFameGain(int gain) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(5);
mplew.writeInt(gain);
return mplew.getPacket();
}
public static byte[] getGPMsg(int itemid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(7);
mplew.writeInt(itemid);
return mplew.getPacket();
}
public static byte[] getGPContribution(int itemid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(8);
mplew.writeInt(itemid);
return mplew.getPacket();
}
public static byte[] getStatusMsg(int itemid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(9);
mplew.writeInt(itemid);
return mplew.getPacket();
}
public static byte[] showInfo(String info) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(11);
mplew.writeMapleAsciiString(info);
return mplew.getPacket();
}
public static byte[] updateInfoQuest(int quest, String data) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(12);
mplew.writeShort(quest);
mplew.writeMapleAsciiString(data);
// System.err.println("infoquest " + mplew.toString());
return mplew.getPacket();
}
public static byte[] showItemReplaceMessage(List<String> message) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(14);
mplew.write(message.size());
for (String x : message) {
mplew.writeMapleAsciiString(x);
}
return mplew.getPacket();
}
public static byte[] showTraitGain(MapleTrait.MapleTraitType trait, int amount) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(16);
mplew.writeLong(trait.getStat().getValue());
mplew.writeInt(amount);
return mplew.getPacket();
}
public static byte[] showTraitMaxed(MapleTrait.MapleTraitType trait) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(17);
mplew.writeLong(trait.getStat().getValue());
return mplew.getPacket();
}
public static byte[] getBPMsg(int amount) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(21);
mplew.writeInt(amount);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] showExpireMessage(byte type, List<Integer> item) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(4 + item.size() * 4);
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(type);
mplew.write(item.size());
for (Integer it : item) {
mplew.writeInt(it.intValue());
}
return mplew.getPacket();
}
public static byte[] showStatusMessage(int mode, String info, String data) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(mode);
if (mode == 22) {
mplew.writeMapleAsciiString(info);
mplew.writeMapleAsciiString(data);
}
return mplew.getPacket();
}
public static byte[] showReturnStone(int act) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(23);
mplew.write(act);
return mplew.getPacket();
}
public static byte[] showItemBox() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(1);
mplew.write(0x7A);
mplew.write(0x1C);
mplew.write(1);
mplew.write(1);
mplew.write(0);
mplew.write(0x30);
return mplew.getPacket();
}
public static byte[] getShowCoreGain(int core, int quantity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
mplew.write(30);
mplew.write(22);
mplew.writeInt(core);
mplew.writeInt(quantity);
return mplew.getPacket();
}
}
public static class BuffPacket {
public static byte[] giveDice(int buffid, int skillid, int duration, Map<MapleBuffStat, Integer> statups) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeBuffMask(mplew, statups);
mplew.writeShort(Math.max(buffid / 100, Math.max(buffid / 10, buffid % 10))); // 1-6
mplew.writeInt(skillid); // skillid
mplew.writeInt(duration);
mplew.writeShort(0);
mplew.write(0);
mplew.writeInt(GameConstants.getDiceStat(buffid, 3));
mplew.writeInt(GameConstants.getDiceStat(buffid, 3));
mplew.writeInt(GameConstants.getDiceStat(buffid, 4));
mplew.writeZeroBytes(20); //idk
mplew.writeInt(GameConstants.getDiceStat(buffid, 2));
mplew.writeZeroBytes(12); //idk
mplew.writeInt(GameConstants.getDiceStat(buffid, 5));
mplew.writeZeroBytes(16); //idk
mplew.writeInt(GameConstants.getDiceStat(buffid, 6));
mplew.writeZeroBytes(16);
mplew.writeZeroBytes(6);//new 143
mplew.writeInt(1000);//new 143
mplew.write(1);
mplew.writeInt(0);//new143
// mplew.write(4); // Total buffed times
// mplew.write(0);//v112
return mplew.getPacket();
}
public static byte[] giveHoming(int skillid, int mobid, int x) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, MapleBuffStat.HOMING_BEACON);
mplew.writeShort(0);
mplew.write(0);
mplew.writeInt(1);
mplew.writeLong(skillid);
mplew.write(0);
mplew.writeLong(mobid);
mplew.writeShort(0);
mplew.writeShort(0);
mplew.write(0);
mplew.write(0);//v112
return mplew.getPacket();
}
public static byte[] giveMount(int buffid, int skillid, Map<MapleBuffStat, Integer> statups) {
MaplePacketLittleEndianWriter packet = new MaplePacketLittleEndianWriter();
packet.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
packet.writeLong(MapleBuffStat.MONSTER_RIDING.getValue());
packet.writeLong(0);
packet.writeLong(0);
packet.writeLong(0);
packet.writeLong(0); //v192 //144
packet.writeInt(0);
packet.writeInt(10);
packet.writeInt(10);
packet.writeInt(skillid); // skillid
packet.write(HexTool.getByteArrayFromHexString("00 C2 EB 0B"));
packet.writeInt(10);
packet.writeInt(skillid); // skillid
packet.write(HexTool.getByteArrayFromHexString("00 C2 EB 0B"));
packet.writeInt(0);
packet.writeInt(0);
packet.write(0);
packet.writeInt(buffid); // 1902000 saddle
packet.writeInt(skillid); // skillid
packet.write(0);
packet.writeInt(0);
packet.writeInt(0);
packet.write(1);
packet.writeInt(4);
packet.write(0);
return packet.getPacket();
}
public static byte[] showMonsterRiding(int cid, Map<MapleBuffStat, Integer> statups, int buffid, int skillId) {
MaplePacketLittleEndianWriter packet = new MaplePacketLittleEndianWriter();
packet.writeShort(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
packet.writeInt(cid);
packet.writeLong(MapleBuffStat.MONSTER_RIDING.getValue());
packet.writeLong(0);
packet.writeLong(0);
packet.writeLong(0);
packet.writeZeroBytes(39); //v192 4byte. /144
packet.writeInt(buffid); // 1902000 saddle
packet.writeInt(skillId); // skillid
packet.writeZeroBytes(7);
return packet.getPacket();
}
public static byte[] givePirate(Map<MapleBuffStat, Integer> statups, int duration, int skillid) {
return giveForeignPirate(statups, duration, -1, skillid);
}
public static byte[] giveForeignPirate(Map<MapleBuffStat, Integer> statups, int duration, int cid, int skillid) {
final boolean infusion = skillid == 5121009 || skillid == 15111005;
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(cid);
PacketHelper.writeBuffMask(mplew, statups);
mplew.writeShort(0);
mplew.write(0);
for (Integer stat : statups.values()) {
mplew.writeInt(stat.intValue());
mplew.writeLong(skillid);
mplew.writeZeroBytes(infusion ? 6 : 1);
mplew.writeShort(duration);//duration... seconds
}
mplew.writeShort(0);
mplew.writeShort(0);
mplew.write(1);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] giveArcane(int skillid, Map<Integer, Integer> statups) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, MapleBuffStat.MANY_USES);
mplew.writeShort(statups.size());
mplew.writeInt(skillid);
mplew.writeInt(5000);
mplew.writeShort(0);
mplew.write(0);
mplew.writeShort(0);
mplew.writeShort(0);
mplew.write(0);
mplew.write(0);
mplew.writeZeroBytes(9);
return mplew.getPacket();
}
public static byte[] giveEnergyChargeTest(int bar, int bufflength) {
return giveEnergyChargeTest(-1, bar, bufflength);
}
public static byte[] giveEnergyChargeTest(int cid, int bar, int bufflength) {
if (true) {
return CWvsContext.enableActions();
}
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
if (cid == -1) {
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
} else {
mplew.writeShort(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(cid);
}
PacketHelper.writeSingleMask(mplew, MapleBuffStat.ENERGY_CHARGE);
mplew.writeShort(0);
mplew.write(0);
mplew.writeInt(Math.min(bar, 10000));
mplew.writeLong(0L);
mplew.write(0);
mplew.writeInt(bar >= 10000 ? bufflength : 0);
mplew.write(0);
mplew.write(6);
return mplew.getPacket();
}
public static byte[] giveBuff(int buffid, int bufflength, Map<MapleBuffStat, Integer> statups, MapleStatEffect effect) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeBuffMask(mplew, statups);//48
boolean stacked = false;
boolean isAura = false;
boolean iscombo = false;
for (Map.Entry<MapleBuffStat, Integer> stat : statups.entrySet()) {
isAura = GameConstants.isAuraBuff(stat.getKey());
if (stat.getKey() == MapleBuffStat.COMBO) {
iscombo = true;
}
if (!stat.getKey().canStack()) {
boolean specialBuff = GameConstants.isSpecialBuff(stat.getKey());
if (specialBuff) {
mplew.writeInt(stat.getValue());
} else {
mplew.writeShort(stat.getValue());
}
mplew.writeInt(buffid);
mplew.writeInt(bufflength);
if (stat.getKey() == MapleBuffStat.HOLY_SHIELD) {
mplew.writeInt(0);
}
if (stat.getKey() == MapleBuffStat.TEMPEST_BLADES) {
mplew.writeZeroBytes(5);
mplew.writeInt(buffid == 61101002 ? 1 : 2);
mplew.writeInt(buffid == 61101002 ? 3 : 5);
mplew.writeInt(effect.getWeapon()); //weapon
mplew.writeInt(buffid == 61101002 ? 3 : 5);
if (buffid == 61120007) {
mplew.writeZeroBytes(8);
}
}
}
}
for (Map.Entry<MapleBuffStat, Integer> stat : statups.entrySet()) {
if (stat.getKey().canStack()) {
if (!stacked) {
mplew.writeZeroBytes(5);
mplew.writeZeroBytes(4); //new v143?
if (GameConstants.isSpecialStackBuff(stat.getKey())) {
mplew.writeZeroBytes(1); //not sure where this part comes
}
stacked = true;
}
mplew.writeInt(1); //amount of the same buffstat
//for each of the same buffstats:
mplew.writeInt(buffid);
mplew.writeInt(stat.getValue());
mplew.writeInt(Integer.MAX_VALUE); //some kind of time
mplew.writeInt(0);
mplew.writeInt(bufflength);
if (stat.getKey() == MapleBuffStat.DAMAGE_CAP_INCREASE) {
mplew.writeInt(1000);
}
}
}
if (buffid == 24121004) {// Priere D'Aria
mplew.writeZeroBytes(3);
mplew.writeShort(0);
mplew.write(0);
}
if (buffid == 2321054) {
mplew.writeInt(0);
}
if (buffid == 32110000 || buffid == 32111012 || buffid == 2221054 || buffid == 11101022 || buffid == 11111022 || buffid == 2311012 || buffid == 32001003 || buffid == 32120013 || buffid == 32101003 || buffid == 32120014 || buffid == 32111012 || buffid == 32120015 || buffid == 2221054 || buffid == 36121003 || buffid == 11101022 || buffid == 11111022 || buffid == 2311012 || buffid == 100001263 || buffid == 100001264) {
mplew.write(1);
}
if (!isAura) {
mplew.writeShort(0);
if (effect != null) {
if (effect.isDivineShield()) {
mplew.writeInt(effect.getEnhancedWatk());
} else if (effect.getCharColor() > 0) {
mplew.writeInt(effect.getCharColor());
} else if (effect.isInflation()) {
mplew.writeInt(effect.getInflation());
}
}
}
mplew.writeShort(0);
if (buffid == 27121005) {
mplew.writeInt(effect.getX());
}
if (buffid == 15001022 && effect.getY() > 0) {
mplew.writeInt(effect.getY());
}
//mplew.writeZeroBytes((buffid != 36111003 && buffid != 101120109 && buffid != 27121005) ? 3 : 0); // 197
// if (buffid == 31011001) {// Overload Release?? idk
// mplew.writeInt(effect.getDuration());
// JobPacket.AvengerPacket.cancelExceed();
// }
if (buffid == 31211004) {// Recovery
mplew.writeInt(effect.getDuration());
JobPacket.AvengerPacket.cancelExceed();
}
// if (buffid == 27111004) {
// mplew.write(0);
// mplew.writeShort(1000);
// mplew.writeShort(0);
// }
if (buffid == 27110007) {
mplew.write(0);
mplew.writeShort(25);
}
if (buffid == 27101202) {
mplew.writeZeroBytes(10);
}
if (iscombo) {
mplew.writeShort(258);
mplew.writeShort(600);
} else {
mplew.write(0);
mplew.write((effect != null) && (effect.isShadow()) ? 1 : 2);
}
if (isAura) {
mplew.writeInt(0);
}
if ((statups.containsKey(MapleBuffStat.JUMP)) || (statups.containsKey(MapleBuffStat.SPEED)) || (statups.containsKey(MapleBuffStat.MORPH)) || (statups.containsKey(MapleBuffStat.GHOST_MORPH)) /*|| (statups.containsKey(MapleBuffStat.MAPLE_WARRIOR)) || (statups.containsKey(MapleBuffStat.MONSTER_RIDING))*/ || (statups.containsKey(MapleBuffStat.DASH_SPEED)) || (statups.containsKey(MapleBuffStat.DASH_JUMP)) || (statups.containsKey(MapleBuffStat.SOARING)) || (statups.containsKey(MapleBuffStat.YELLOW_AURA)) || (statups.containsKey(MapleBuffStat.SNATCH)) || (statups.containsKey(MapleBuffStat.INDIE_SPEED)) || (statups.containsKey(MapleBuffStat.ANGEL_JUMP)) || (statups.containsKey(MapleBuffStat.ENERGY_CHARGE))/* || (statups.containsKey(MapleBuffStat.MECH_CHANGE))*/) {
mplew.write(4);
}
if (buffid == 23111004) {//ignis roar
mplew.write(0);
mplew.writeShort(1000);
} else {
mplew.writeShort(0);
}
if (statups.containsKey(MapleBuffStat.MAPLE_WARRIOR)) {
mplew.write(HexTool.getByteArrayFromHexString("00 E8 03 00 00 00 13 00 00 00 00"));
return mplew.getPacket();
}
if (statups.containsKey(MapleBuffStat.KAISER_COMBO)) { //this too
mplew.writeZeroBytes(8);
}
mplew.writeZeroBytes(69); //make sure no dc incase not enough length
//new v142
mplew.writeShort(1);
mplew.write(0);
mplew.write(0);
mplew.write(0);
System.err.println("sent Buff with buffid: " + buffid +" as packet: "+ mplew.toString());
return mplew.getPacket();
}
public static byte[] giveDebuff(MapleDisease statups, int x, int skillid, int level, int duration) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, statups);
mplew.writeShort(x);
mplew.writeShort(skillid);
mplew.writeShort(level);
mplew.writeInt(duration);
mplew.writeShort(0);
mplew.writeShort(0);
//mplew.write(1);
mplew.write(0);
//mplew.write(1);
mplew.writeZeroBytes(30);
//System.out.println(HexTool.toString(mplew.getPacket()));
return mplew.getPacket();
}
/* public static byte[] cancelBuff(List<MapleBuffStat> statups) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_BUFF.getValue());
PacketHelper.writeMask(mplew, statups);
for (MapleBuffStat z : statups) {
if (z.canStack()) {
mplew.writeInt(0); //amount of buffs still in the stack? dunno mans
}
}
mplew.write(3);
mplew.write(1);
mplew.writeLong(0);
mplew.writeLong(0);
mplew.writeLong(0);
mplew.write(0);
return mplew.getPacket();
}*/
public static byte[] cancelBuff(List<MapleBuffStat> statups) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_BUFF.getValue());
PacketHelper.writeMask(mplew, statups);
for (MapleBuffStat z : statups) {
if (z.canStack()) {
mplew.writeInt(0);
}
}
mplew.writeZeroBytes(2);
mplew.writeLong(0L);
mplew.writeLong(0L);
mplew.writeLong(0L);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] cancelDebuff(MapleDisease mask) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, mask);
mplew.write(3);
mplew.write(1);
mplew.writeLong(0);
mplew.write(0);//v112
return mplew.getPacket();
}
public static byte[] cancelHoming() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, MapleBuffStat.HOMING_BEACON);
mplew.write(0);//v112
return mplew.getPacket();
}
public static byte[] giveAriaBuff(Map<MapleBuffStat, Integer> statups, int bufflevel, int buffid, int bufflength) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeBuffMask(mplew, statups);
// mplew.write(HexTool.getByteArrayFromHexString("00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00"));
for (Map.Entry stat : statups.entrySet()) {
mplew.writeShort(((Integer) stat.getValue()).intValue());
mplew.writeInt(buffid);
mplew.writeInt(bufflength);
}
mplew.writeZeroBytes(3);
mplew.writeShort(0); // not sure..
mplew.write(0);
mplew.writeShort(0);
return mplew.getPacket();
}
public static byte[] giveForeignBuff(int cid, Map<MapleBuffStat, Integer> statups, MapleStatEffect effect) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(cid);
PacketHelper.writeBuffMask(mplew, (Map) statups);
for (Entry<MapleBuffStat, Integer> statup : statups.entrySet()) {
if (statup.getKey() == MapleBuffStat.SHADOWPARTNER || statup.getKey() == MapleBuffStat.MECH_CHANGE || statup.getKey() == MapleBuffStat.DARK_AURA || statup.getKey() == MapleBuffStat.YELLOW_AURA || statup.getKey() == MapleBuffStat.BLUE_AURA || statup.getKey() == MapleBuffStat.GIANT_POTION || statup.getKey() == MapleBuffStat.SPIRIT_LINK || statup.getKey() == MapleBuffStat.PYRAMID_PQ || statup.getKey() == MapleBuffStat.WK_CHARGE || statup.getKey() == MapleBuffStat.DAMAGE_R || statup.getKey() == MapleBuffStat.MORPH || statup.getKey() == MapleBuffStat.WATER_SHIELD || statup.getKey() == MapleBuffStat.DARK_METAMORPHOSIS) {
mplew.writeShort(statup.getValue().shortValue());
mplew.writeInt(effect.isSkill() ? effect.getSourceId() : -effect.getSourceId());
} else if (statup.getKey() == MapleBuffStat.FAMILIAR_SHADOW) {
mplew.writeInt(statup.getValue());
mplew.writeInt(effect.getCharColor());
} else {
mplew.writeShort(statup.getValue().shortValue());
}
}
mplew.writeShort(1);//was 0, ourstory does 1?
mplew.write(0);
if (effect.getSourceId() == 13101024) {
mplew.writeLong(0);
mplew.writeLong(0);
mplew.writeLong(0);
mplew.writeZeroBytes(6);
mplew.write(1);
mplew.writeZeroBytes(22);
} else if (effect.getSourceId() == 4001003 || effect.getSourceId() == 23111005) {
mplew.writeLong(0);
mplew.writeLong(0);
mplew.writeZeroBytes(3);
} else if (/*effect.getSourceId() == 1101013 || effect.getSourceId() == 1120003 ||*/ effect.getSourceId() == 11111001 || effect.getSourceId() == 11110005) { //콤보 어택
mplew.writeLong(1);
mplew.writeLong(0);
mplew.writeZeroBytes(4);
} else if (effect.getSourceId() == 15001004) {
mplew.writeInt(0);
mplew.write(0);
mplew.writeShort(23);
mplew.writeShort(20);
mplew.write(0);
mplew.write(HexTool.getByteArrayFromHexString("AB E5 E4 00"));
mplew.writeInt(0);
mplew.write(0);
mplew.writeShort(23);
mplew.writeShort(0);
} else if (effect.getSourceId() == 61120008 || effect.getSourceId() == 61111008 || effect.getSourceId() == 61121053) {// KAISER BUFFS!
/* mplew.writeLong(0); // old kaiser
mplew.writeLong(0);
mplew.writeZeroBytes(5);*/
mplew.writeInt(2);
mplew.writeZeroBytes(13);
mplew.writeShort(600);
mplew.writeZeroBytes(20);//ourstory method
} else if (effect.getSourceId() == 21101006) {
mplew.writeShort(0);
mplew.write(7);
mplew.writeLong(0);
mplew.writeLong(0);
mplew.write(208);
mplew.write(2);
}/* else if (effect.getSourceId() == 3101004 || effect.getSourceId() == 3201004 || effect.getSourceId() == 13101003 || effect.getSourceId() == 33101003) {
mplew.writeLong(0);
mplew.writeLong(0);
}*/ else if (effect.getSourceId() == 30001001 || effect.getSourceId() == 30011001 || effect.getSourceId() == 2311009) {
mplew.writeLong(0);
mplew.writeLong(0);
mplew.write(0);
} else if (effect.getSourceId() == 1221004 || effect.getSourceId() == 1211006 || effect.getSourceId() == 1211008 || effect.getSourceId() == 1211004) {
mplew.writeShort(0);
mplew.writeLong(4);
mplew.writeLong(0);
mplew.write(0);
mplew.writeShort(602);
} else if (effect.getSourceId() == 32120000 || effect.getSourceId() == 32001003 || effect.getSourceId() == 32110000 || effect.getSourceId() == 32111012 || effect.getSourceId() == 32120001 || effect.getSourceId() == 32101003) { //오라
mplew.writeLong(0);
mplew.writeLong(0);
mplew.writeZeroBytes(5);
} else {
mplew.writeLong(0);
mplew.writeLong(0);
mplew.writeZeroBytes(6);
}
System.out.println("Sent foreign Efftect: "+effect.getSourceId()+" as packet: "+mplew.toString());
return mplew.getPacket();
}
public static byte[] giveForeignDebuff(int cid, final MapleDisease statups, int skillid, int level, int x) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(cid);
PacketHelper.writeSingleMask(mplew, statups);
if (skillid == 125) {
mplew.writeShort(0);
mplew.write(0); //todo test
}
mplew.writeShort(x);
mplew.writeShort(skillid);
mplew.writeShort(level);
mplew.writeShort(0); // same as give_buff
mplew.writeShort(0); //Delay
mplew.write(1);
mplew.write(1);
mplew.write(0);//v112
mplew.writeZeroBytes(20);
return mplew.getPacket();
}
public static byte[] cancelForeignBuff(int cid, List<MapleBuffStat> statups) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_FOREIGN_BUFF.getValue());
mplew.writeInt(cid);
PacketHelper.writeMask(mplew, statups);
mplew.write(3);
mplew.write(1);
mplew.write(0);
mplew.writeZeroBytes(20);
return mplew.getPacket();
}
public static byte[] cancelForeignRiding(int cid, List<MapleBuffStat> statups) {
MaplePacketLittleEndianWriter packet = new MaplePacketLittleEndianWriter();
packet.writeShort(SendPacketOpcode.CANCEL_FOREIGN_BUFF.getValue());
packet.writeInt(cid);
packet.writeLong(MapleBuffStat.MONSTER_RIDING.getValue());
packet.writeLong(0);
packet.writeLong(0);
packet.writeLong(0);
packet.writeLong(0); // v181
packet.write(1);
return packet.getPacket();
}
public static byte[] cancelForeignDebuff(int cid, MapleDisease mask) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_FOREIGN_BUFF.getValue());
mplew.writeInt(cid);
PacketHelper.writeSingleMask(mplew, mask);//48 bytes
//mplew.write(3);
mplew.write(1);
//mplew.write(0);//v112
return mplew.getPacket();
}
public static byte[] giveCard(int cid, int oid, int skillid) {
MaplePacketLittleEndianWriter writer = new MaplePacketLittleEndianWriter();
writer.writeShort(SendPacketOpcode.GAIN_FORCE.getValue());
writer.write(0);
writer.writeInt(cid);
writer.writeInt(1);
writer.writeInt(oid);
writer.writeInt(skillid);
writer.write(1);
writer.writeInt(2);
writer.writeInt(1);
writer.writeInt(21);
writer.writeInt(8);
writer.writeInt(8);
writer.write(0);
return writer.getPacket();
}
}
public static class InventoryPacket {
public static byte[] addInventorySlot(MapleInventoryType type, Item item) {
return addInventorySlot(type, item, false);
}
public static byte[] addInventorySlot(MapleInventoryType type, Item item, boolean fromDrop) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(fromDrop ? 1 : 0);
mplew.write(1);
mplew.write(0);
mplew.write(GameConstants.isInBag(item.getPosition(), type.getType()) ? 9 : 0);
mplew.write(type.getType());
mplew.writeShort(item.getPosition());
PacketHelper.addItemInfo(mplew, item);
return mplew.getPacket();
}
public static byte[] updateInventorySlot(MapleInventoryType type, Item item, boolean fromDrop) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(fromDrop ? 1 : 0);
mplew.write(1);
mplew.write(0);
mplew.write(GameConstants.isInBag(item.getPosition(), type.getType()) ? 6 : 1);
mplew.write(type.getType());
mplew.writeShort(item.getPosition());
mplew.writeShort(item.getQuantity());
return mplew.getPacket();
}
public static byte[] moveInventoryItem(MapleInventoryType type, short src, short dst, boolean bag, boolean bothBag) {
return moveInventoryItem(type, src, dst, (byte) -1, bag, bothBag);
}
public static byte[] moveInventoryItem(MapleInventoryType type, short src, short dst, short equipIndicator, boolean bag, boolean bothBag) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(1);
mplew.write(0);
mplew.write(bag ? 5 : bothBag ? 8 : 2);
mplew.write(type.getType());
mplew.writeShort(src);
mplew.writeShort(dst);
if (bag) {
mplew.writeShort(0);
}
if (equipIndicator != -1) {
mplew.write(equipIndicator);
}
return mplew.getPacket();
}
public static byte[] moveAndMergeInventoryItem(MapleInventoryType type, short src, short dst, short total, boolean bag, boolean switchSrcDst, boolean bothBag) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(2);
mplew.write(0);
mplew.write((bag) && ((switchSrcDst) || (bothBag)) ? 7 : 3);
mplew.write(type.getType());
mplew.writeShort(src);
mplew.write((bag) && ((!switchSrcDst) || (bothBag)) ? 6 : 1);
mplew.write(type.getType());
mplew.writeShort(dst);
mplew.writeShort(total);
return mplew.getPacket();
}
public static byte[] moveAndMergeWithRestInventoryItem(MapleInventoryType type, short src, short dst, short srcQ, short dstQ, boolean bag, boolean switchSrcDst, boolean bothBag) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(2);
mplew.write(0);
mplew.write((bag) && ((switchSrcDst) || (bothBag)) ? 6 : 1);
mplew.write(type.getType());
mplew.writeShort(src);
mplew.writeShort(srcQ);
mplew.write((bag) && ((!switchSrcDst) || (bothBag)) ? 6 : 1);
mplew.write(type.getType());
mplew.writeShort(dst);
mplew.writeShort(dstQ);
return mplew.getPacket();
}
public static byte[] clearInventoryItem(MapleInventoryType type, short slot, boolean fromDrop) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(fromDrop ? 1 : 0);
mplew.write(1);
mplew.write(0);
mplew.write((slot > 100) && (type == MapleInventoryType.ETC) ? 7 : 3);
mplew.write(type.getType());
mplew.writeShort(slot);
return mplew.getPacket();
}
public static byte[] updateSpecialItemUse(Item item, byte invType, MapleCharacter chr) {
return updateSpecialItemUse(item, invType, item.getPosition(), false, chr);
}
public static byte[] updateSpecialItemUse(Item item, byte invType, short pos, boolean theShort, MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(0);
mplew.write(2);
mplew.write(0);
mplew.write(GameConstants.isInBag(pos, invType) ? 7 : 3);
mplew.write(invType);
mplew.writeShort(pos);
mplew.write(0);
mplew.write(invType);
if ((item.getType() == 1) || (theShort)) {
mplew.writeShort(pos);
} else {
mplew.write(pos);
}
PacketHelper.addItemInfo(mplew, item, chr);
if (pos < 0) {
mplew.write(2);
}
return mplew.getPacket();
}
public static byte[] updateSpecialItemUse_(Item item, byte invType, MapleCharacter chr) {
return updateSpecialItemUse_(item, invType, item.getPosition(), chr);
}
public static byte[] updateSpecialItemUse_(Item item, byte invType, short pos, MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(0);
mplew.write(1);
mplew.write(0);
mplew.write(0);
mplew.write(invType);
if (item.getType() == 1) {
mplew.writeShort(pos);
} else {
mplew.write(pos);
}
PacketHelper.addItemInfo(mplew, item, chr);
if (pos < 0) {
mplew.write(1);
}
return mplew.getPacket();
}
public static byte[] updateEquippedItem(MapleCharacter chr, Equip eq, short pos) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(0);
mplew.write(1);
mplew.write(0);
mplew.write(0);
mplew.write(1);
mplew.writeShort(pos);
PacketHelper.addItemInfo(mplew, eq, chr);
return mplew.getPacket();
}
public static byte[] scrolledItem(Item scroll, MapleInventoryType inv, Item item, boolean destroyed, boolean potential, boolean equipped) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(destroyed ? 2 : 3);
mplew.write(0);
mplew.write(scroll.getQuantity() > 0 ? 1 : 3);
mplew.write(GameConstants.getInventoryType(scroll.getItemId()).getType());
mplew.writeShort(scroll.getPosition());
if (scroll.getQuantity() > 0) {
mplew.writeShort(scroll.getQuantity());
}
mplew.write(3);
mplew.write(inv.getType());
mplew.writeShort(item.getPosition());
if (!destroyed) {
mplew.write(0);
mplew.write(inv.getType());
mplew.writeShort(item.getPosition());
PacketHelper.addItemInfo(mplew, item);
}
if (!potential) {
mplew.write(1);
}
if (equipped) {
mplew.write(8);
}
return mplew.getPacket();
}
public static byte[] moveAndUpgradeItem(MapleInventoryType type, Item item, short oldpos, short newpos, MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(3);
mplew.write(0);
mplew.write(GameConstants.isInBag(newpos, type.getType()) ? 7 : 3);
mplew.write(type.getType());
mplew.writeShort(oldpos);
mplew.write(0);
mplew.write(1);
mplew.writeShort(oldpos);
PacketHelper.addItemInfo(mplew, item, chr);
mplew.write(2);
mplew.write(type.getType());
mplew.writeShort(oldpos);
mplew.writeShort(newpos);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] dropInventoryItem(MapleInventoryType type, short src) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(1);
mplew.write(0);
mplew.write(3);
mplew.write(type.getType());
mplew.writeShort(src);
if (src < 0) {
mplew.write(1);
}
return mplew.getPacket();
}
public static byte[] dropInventoryItemUpdate(MapleInventoryType type, Item item) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(1);
mplew.write(0);
mplew.write(1);
mplew.write(type.getType());
mplew.writeShort(item.getPosition());
mplew.writeShort(item.getQuantity());
return mplew.getPacket();
}
public static byte[] getInventoryFull() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(1);
mplew.write(0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] getInventoryStatus() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(0);
mplew.write(0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] getSlotUpdate(byte invType, byte newSlots) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_GROW.getValue());
mplew.write(invType);
mplew.write(newSlots);
return mplew.getPacket();
}
public static byte[] getShowInventoryFull() {
return CWvsContext.InfoPacket.getShowInventoryStatus(255);
}
public static byte[] showItemUnavailable() {
return CWvsContext.InfoPacket.getShowInventoryStatus(254);
}
}
public static byte[] updateHyperSp(int mode, int remainSp) {
return updateSpecialStat("hyper", 0x1C, mode, remainSp);
}
public static byte[] updateSpecialStat(String stat, int array, int mode, int amount) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPECIAL_STAT.getValue());
mplew.writeMapleAsciiString(stat);
mplew.writeInt(array);
mplew.writeInt(mode);
mplew.write(1);
mplew.writeInt(amount);
return mplew.getPacket();
}
public static byte[] updateMaplePoint(int mp) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MAPLE_POINT.getValue());
mplew.writeInt(mp);
return mplew.getPacket();
}
public static byte[] updateCrowns(int[] titles) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.EVENT_CROWN.getValue());
for (int i = 0; i < 5; i++) {
mplew.writeMapleAsciiString("");
if (titles.length < i + 1) {
mplew.write(-1);
} else {
mplew.write(titles[i]);
}
}
return mplew.getPacket();
}
public static byte[] magicWheel(int type, List<Integer> items, String data, int endSlot) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MAGIC_WHEEL.getValue());
mplew.write(type);
switch (type) {
case 3:
mplew.write(items.size());
for (int item : items) {
mplew.writeInt(item);
}
mplew.writeMapleAsciiString(data); // nexon encrypt the item and then send the string
mplew.write(endSlot);
break;
case 5:
//<Character Name> got <Item Name>.
break;
case 6:
//You don't have a Magic Gachapon Wheel in your Inventory.
break;
case 7:
//You don't have any Inventory Space.\r\n You must have 2 or more slots available\r\n in each of your tabs.
break;
case 8:
//Please try this again later.
break;
case 9:
//Failed to delete Magic Gachapon Wheel item.
break;
case 0xA:
//Failed to receive Magic Gachapon Wheel item.
break;
case 0xB:
//You cannot move while Magic Wheel window is open.
break;
}
return mplew.getPacket();
}
public static class Reward {
public static byte[] receiveReward(int id, byte mode, int quantity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.REWARD.getValue());
mplew.write(mode); // mode
switch (mode) { // mode
case 9:
mplew.writeInt(0);
break;
case 0x0B:
mplew.writeInt(id);
mplew.writeInt(quantity); //quantity
//Popup: You have received the Maple Points.\r\n( %d maple point )
break;
case 0x0C:
mplew.writeInt(id);
//Popup You have received the Game item.
break;
case 0x0E:
mplew.writeInt(id);
mplew.writeInt(quantity); //quantity
//Popup: You have received the Mesos.\r\n( %d meso )
break;
case 0x0F:
mplew.writeInt(id);
mplew.writeInt(quantity); //quantity
//Popup: You have received the Exp.\r\n( %d exp )
break;
case 0x14:
//Popup: Failed to receive the Maple Points.
break;
case 0x15:
mplew.write(0);
//Popup: Failed to receive the Game Item.
break;
case 0x16:
mplew.write(0);
//Popup: Failed to receive the Game Item.
break;
case 0x17:
//Popup: Failed to receive the Mesos.
break;
case 0x18:
//Popup: Failed to receive the Exp.
break;
case 0x21:
mplew.write(0); //66
//No inventory space
break;
}
return mplew.getPacket();
}
public static byte[] updateReward(int id, byte mode, List<MapleReward> rewards, int option) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.REWARD.getValue());
mplew.write(mode); // mode
switch (mode) { // mode
case 9:
mplew.writeInt(rewards.size());
if (rewards.size() > 0) {
for (int i = 0; i < rewards.size(); i++) {
MapleReward reward = rewards.get(i);
boolean empty = reward.getId() < 1;
mplew.writeInt(empty ? 0 : reward.getId()); // 0 = blank 1+ = gift
if (!empty) {
if ((option & 1) != 0) {
mplew.writeLong(reward.getReceiveDate()); //start time
mplew.writeLong(reward.getExpireDate()); //end time
mplew.writeLong(reward.getReceiveDate()); //start time
mplew.writeLong(reward.getExpireDate()); //end time
}
if ((option & 2) != 0) { //nexon do here a3 & 2 when a3 is 9
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeMapleAsciiString("");
mplew.writeMapleAsciiString("");
mplew.writeMapleAsciiString("");
}
mplew.writeInt(reward.getType()); //type 3 = maple point 4 = mesos 5 = exp
mplew.writeInt(reward.getItem()); // item id
mplew.writeInt(/*itemQ*/reward.getItem() > 0 ? 1 : 0); // item quantity (?)
mplew.writeInt(0);
mplew.writeLong(0L);
mplew.writeInt(0);
mplew.writeInt(reward.getMaplePoints()); // maple point amount
mplew.writeInt(reward.getMeso()); // mesos amount
mplew.writeInt(reward.getExp()); // exp amount
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeMapleAsciiString("");
mplew.writeMapleAsciiString("");
mplew.writeMapleAsciiString("");
mplew.writeMapleAsciiString(reward.getDesc());
}
}
}
break;
case 0x0B:
mplew.writeInt(id);
mplew.writeInt(0); //quantity
//Popup: You have received the Maple Points.\r\n( %d maple point )
break;
case 0x0C:
mplew.writeInt(id);
//Popup You have received the Game item.
break;
case 0x0E:
mplew.writeInt(id);
mplew.writeInt(0); //quantity
//Popup: You have received the Mesos.\r\n( %d meso )
break;
case 0x0F:
mplew.writeInt(id);
mplew.writeInt(0); //quantity
//Popup: You have received the Exp.\r\n( %d exp )
break;
case 0x14:
//Popup: Failed to receive the Maple Points.
break;
case 0x15:
mplew.write(0);
//Popup: Failed to receive the Game Item.
break;
case 0x16:
mplew.write(0);
//Popup: Failed to receive the Game Item.
break;
case 0x17:
//Popup: Failed to receive the Mesos.
break;
case 0x18:
//Popup: Failed to receive the Exp.
break;
case 0x21:
mplew.write(0); //66
//No inventory space
break;
}
return mplew.getPacket();
}
}
}