package net.sf.odinms.tools;
import java.awt.Point;
import java.awt.Rectangle;
import java.net.InetAddress;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.Map.Entry;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import net.sf.odinms.client.BuddylistEntry;
import net.sf.odinms.client.IEquip;
import net.sf.odinms.client.IItem;
import net.sf.odinms.client.ISkill;
import net.sf.odinms.client.Item;
import net.sf.odinms.client.MapleBuffStat;
import net.sf.odinms.client.MapleCharacter;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.client.MapleInventory;
import net.sf.odinms.client.MapleInventoryType;
import net.sf.odinms.client.MapleKeyBinding;
import net.sf.odinms.client.MaplePet;
import net.sf.odinms.client.MapleQuestStatus;
import net.sf.odinms.client.MapleStat;
import net.sf.odinms.client.IEquip.ScrollResult;
import net.sf.odinms.client.MapleDisease;
import net.sf.odinms.client.MapleJob;
import net.sf.odinms.client.MapleMount;
import net.sf.odinms.client.MapleRing;
import net.sf.odinms.client.SkillMacro;
import net.sf.odinms.client.status.MonsterStatus;
import net.sf.odinms.database.DatabaseConnection;
import net.sf.odinms.net.ByteArrayMaplePacket;
import net.sf.odinms.net.MaplePacket;
import net.sf.odinms.net.SendPacketOpcode;
import net.sf.odinms.net.channel.handler.SummonDamageHandler.SummonAttackEntry;
import net.sf.odinms.net.login.LoginServer;
import net.sf.odinms.net.world.MapleParty;
import net.sf.odinms.net.world.MaplePartyCharacter;
import net.sf.odinms.net.world.PartyOperation;
import net.sf.odinms.net.world.PlayerCoolDownValueHolder;
import net.sf.odinms.server.MapleItemInformationProvider;
import net.sf.odinms.server.playerinteractions.*;
import net.sf.odinms.server.MapleStatEffect;
import net.sf.odinms.server.MTSItemInfo;
import net.sf.odinms.server.playerinteractions.HiredMerchant;
import net.sf.odinms.server.playerinteractions.MaplePlayerShop;
import net.sf.odinms.server.life.MapleMonster;
import net.sf.odinms.server.life.MapleNPC;
import net.sf.odinms.server.maps.MapleMap;
import net.sf.odinms.server.maps.MapleReactor;
import net.sf.odinms.server.movement.LifeMovementFragment;
import net.sf.odinms.tools.data.output.LittleEndianWriter;
import net.sf.odinms.tools.data.output.MaplePacketLittleEndianWriter;
import net.sf.odinms.net.world.guild.*;
import net.sf.odinms.client.MapleCSInventory;
import net.sf.odinms.client.MapleCSInventoryItem;
import net.sf.odinms.net.LongValueHolder;
import net.sf.odinms.server.MapleDueyActions;
import net.sf.odinms.server.MapleShopItem;
import net.sf.odinms.server.MapleTrade;
import net.sf.odinms.server.constants.Items;
import net.sf.odinms.server.life.MobSkill;
import net.sf.odinms.server.maps.MapleMist;
import net.sf.odinms.server.maps.MapleSummon;
/**
* Provides all MapleStory packets needed in one place.
*
* @author Frz
* @since Revision 259
* @version 1.0
*/
public class MaplePacketCreator {
private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MaplePacketCreator.class);
private final static byte[] CHAR_INFO_MAGIC = new byte[]{(byte) 0xff, (byte) 0xc9, (byte) 0x9a, 0x3b};
public static final List<Pair<MapleStat, Integer>> EMPTY_STATUPDATE = Collections.emptyList();
private final static long FINAL_TIME = 3439785600000L;
/**
* Sends a hello packet.
*
* @param mapleVersion The maple client version.
* @param sendIv the IV used by the server for sending
* @param recvIv the IV used by the server for receiving
* @param testServer
* @return
*/
public static MaplePacket getHello(short mapleVersion, byte[] sendIv, byte[] recvIv, boolean testServer) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
//53 00 00 00 68 1C C8 69 CD 29 F0 65 04
mplew.writeShort(0x0d);
mplew.writeShort(mapleVersion);
mplew.write(new byte[]{0, 0});
mplew.write(recvIv);
mplew.write(sendIv);
mplew.write(testServer ? 5 : 4);
return mplew.getPacket();
}
public static MaplePacket getHelloto() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
//1F 00 08 00 4D 61 70 4C 6F 67 69 6E
mplew.write(HexTool.getByteArrayFromHexString("1F 00 08 00 4D 61 70 4C 6F 67 69 6E"));
return mplew.getPacket();
}
/**
* Sends a ping packet.
*
* @return The packet.
*/
public static MaplePacket getPing() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.writeShort(SendPacketOpcode.PING.getValue());
return mplew.getPacket();
}
/**
* Gets a login failed packet.
*
* Possible values for <code>reason</code>:<br>
* 3: ID deleted or blocked<br>
* 4: Incorrect password<br>
* 5: Not a registered id<br>
* 6: System error<br>
* 7: Already logged in<br>
* 8: System error<br>
* 9: System error<br>
* 10: Cannot process so many connections<br>
* 11: Only users older than 20 can use this channel<br>
* 13: Unable to log on as master at this ip<br>
* 14: Wrong gateway or personal info and weird korean button<br>
* 15: Processing request with that korean button!<br>
* 16: Please verify your account through email...<br>
* 17: Wrong gateway or personal info<br>
* 21: Please verify your account through email...<br>
* 23: License agreement<br>
* 25: Maple Europe notice =[<br>
* 27: Some weird full client notice, probably for trial versions<br>
*
* @param reason The reason logging in failed.
* @return The login failed packet.
*/
public static MaplePacket getLoginFailed(int reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.writeShort(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.writeInt(reason);
mplew.writeShort(0);
return mplew.getPacket();
}
public static MaplePacket getPermBan(byte reason) {
// 00 00 02 00 01 01 01 01 01 00
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.writeShort(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.writeShort(0x02); // Account is banned
mplew.write(0x0);
mplew.write(reason);
mplew.write(HexTool.getByteArrayFromHexString("01 01 01 01 00"));
return mplew.getPacket();
}
public static MaplePacket getTempBan(long timestampTill, byte reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(17);
mplew.writeShort(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.write(0x02);
mplew.write(HexTool.getByteArrayFromHexString("00 00 00 00 00")); // Account is banned
mplew.write(reason);
mplew.writeLong(timestampTill); // Tempban date is handled as a 64-bit long, number of 100NS intervals since 1/1/1601. Lulz.
return mplew.getPacket();
}
/**
* Gets a successful authentication and PIN Request packet.
*
* @param account The account name.
* @return The successful authentication packet.
*/
public static MaplePacket getAuthSuccess(MapleClient c) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
//00 00 00 14 E7 77 02 00 00 00 0D 00
//6C 73 39 34 38 34 35 39 35 39 39 30 30 00 00 00 00 00 00 00 00 32 B5 C6 E7 24 CB 01 0
- 1
- 2
- 3
前往页