package tools.packet;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import constants.GameConstants;
import constants.ServerConstants;
import constants.WorldConstants;
import handling.SendPacketOpcode;
import handling.login.LoginServer;
import java.util.*;
import org.apache.log4j.Logger;
import server.ServerProperties;
import tools.HexTool;
import tools.data.output.MaplePacketLittleEndianWriter;
public class LoginPacket {
public static byte[] getHello(short mapleVersion, byte[] sendIv, byte[] recvIv) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(0xE);
mplew.writeShort(mapleVersion);
mplew.writeMapleAsciiString(ServerConstants.MAPLE_PATCH);
mplew.write(recvIv);
mplew.write(sendIv);
mplew.write(ServerConstants.MAPLE_TYPE.getType());
return mplew.getPacket();
}
public static byte[] getPing() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(2);
mplew.write(SendPacketOpcode.PING.getValue());
return mplew.getPacket();
}
public static byte[] getLoginAUTH() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(13);
mplew.write(SendPacketOpcode.LOGIN_AUTH.getValue());
//mplew.writeMapleAsciiString("MapLogin" + (Randomizer.nextInt(3) + 1));
String[] a = {"MapLogin", "MapLogin1", "MapLogin2", "MapLogin3", "MapLogin4", "MapLogin5"};
mplew.writeMapleAsciiString(a[(int) (Math.random() * a.length)]);
mplew.writeInt(GameConstants.getCurrentDate());
return mplew.getPacket();
}
public static byte[] licenseResult() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.LICENSE_RESULT.getValue());
mplew.write(1);
return mplew.getPacket();
}
/**
* 发送选择性别的包
* @param c
* @return
*/
public static byte[] genderNeeded(MapleClient c) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3);
mplew.write(SendPacketOpcode.CHOOSE_GENDER.getValue());
mplew.writeMapleAsciiString(c.getAccountName());
return mplew.getPacket();
}
public static byte[] genderChanged(MapleClient c) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3);
mplew.write(SendPacketOpcode.GENDER_SET.getValue());
mplew.write(0);
mplew.writeMapleAsciiString(c.getAccountName());
mplew.writeMapleAsciiString(String.valueOf(c.getAccID()));
return mplew.getPacket();
}
public static byte[] getLoginFailed(int reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.write(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.write(reason);
mplew.write(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] getPermBan(byte reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.write(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.writeShort(2);
mplew.write(0);
mplew.writeShort((short) reason);
mplew.write(HexTool.getByteArrayFromHexString("01 01 01 01 00"));
return mplew.getPacket();
}
public static byte[] getTempBan(long timestampTill, byte reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(17);
mplew.write(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.writeShort(2);
mplew.writeInt(0);
mplew.write(reason);
mplew.writeLong(timestampTill);
return mplew.getPacket();
}
public static byte[] getTempBan(long timestampTill) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(17);
mplew.write(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.writeShort(2);
mplew.writeLong(timestampTill);
return mplew.getPacket();
}
/**
* 登录成功
* @param client
* @return
*/
public static byte[] getAuthSuccessRequest(MapleClient client) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.write(0);
mplew.writeInt(client.getAccID());
mplew.write(client.getGender()); // 早期版本角色性别由帐号控制
mplew.write(client.isGm() ? 1 : 0);//给客户端判断是否GM,是GM客户端会给/找人命令加地图ID,有删除人物按钮,被封印后能使用技能,其他未知
mplew.writeMapleAsciiString(client.getAccountName());
mplew.writeInt(client.getAccID());
mplew.write(0);
return mplew.getPacket();
}
/**
* 检查是否需要排队
* @param client
* @return
*/
public static byte[] checkUserLimit() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(0x03);
mplew.write(4);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] getEjectWeb(byte i, String link) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.EJECT_WEB.getValue());
mplew.write(i);
mplew.writeMapleAsciiString(link);
return mplew.getPacket();
}
public static byte[] deleteCharResponse(int chrId, int state) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.DELETE_CHAR_RESPONSE.getValue());
mplew.writeInt(chrId);
mplew.write(state);
return mplew.getPacket();
}
public static byte[] secondPwError(byte mode) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3);
mplew.write(SendPacketOpcode.SECONDPW_ERROR.getValue());
mplew.write(mode);
return mplew.getPacket();
}
public static byte[] enableRecommended() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ENABLE_RECOMMENDED.getValue());
mplew.write(0);
return mplew.getPacket();
}
public static byte[] sendRecommended(int world, String message) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SEND_RECOMMENDED.getValue());
mplew.write((message != null) && (GameConstants.GMS) ? 1 : 0);
if ((message != null) && (GameConstants.GMS)) {
mplew.writeInt(world);
mplew.writeMapleAsciiString(message);
}
return mplew.getPacket();
}
/**
* 服务器列表
* @param world
* @param channelLoad
* @return
*/
public static byte[] getServerList(WorldConstants.Option world, Map<Integer, Integer> channelLoad) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SERVERLIST.getValue());
mplew.write(world.getWorld());
mplew.writeMapleAsciiString(LoginServer.getServerName());
int lastChannel = 1;
final Set<Integer> channels = channelLoad.keySet();
for (int i = 20; i > 0; i--) {
if (channels.contains(i)) {
lastChannel = i;
break;
}
}
mplew.write(lastChannel);
for (int i = 1; i <= lastChannel; i++) {
int load;
if (channels.contains(i)) {
load = channelLoad.get(i);
} else {
load = 255;
}
mplew.writeMapleAsciiString(world.name() + "-" + i);
mplew.writeInt(load);
mplew.write(world.getWorld());
mplew.write(i-1);
mplew.write(0);
}
return mplew.getPacket();
}
/**
* 服务器列表结束
* @return
*/
public static byte[] getEndOfServerList() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SERVERLIST.getValue());
mplew.write(0xFF);
return mplew.getPacket();
}
// 获取服务器状态
public static byte[] getServerStatus(int status) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SERVERSTATUS.getValue());
mplew.write(status);
if (status == 1) {
mplew.writeInt(0);
mplew.write(0);
}
return mplew.getPacket();
}
public static byte[] EventCheck() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.EVENT_CHECK.getValue());
mplew.write(HexTool.getByteArrayFromHexString("00 05 00 00 10 40 00 46 E5 58 00 57 F5 98 00 04 00 00 00 5F F5 98 00 04 00 00 00 6C F5 98 00 94 CA 07 00 D0 C3 A0 00 1C 16 01 00"));
return mplew.getPacket();
}
public static byte[] getChannelSelected() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CHANNEL_SELECTED.getValue());
mplew.writeInt(3);
return mplew.getPacket();
}
/**
* 角色列表
* @param secondpw
* @param chars
* @param charslots
* @return
*/
public static byte[] getCharList(String secondpw, List<MapleCharacter> chars, int charslots) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CHARLIST.getValue());
mplew.write(0);
mplew.writeInt(0);
mplew.write(chars.size());
for (MapleCharacter chr : chars) {
addCharEntry(mplew, chr);
}
return mplew.getPacket();
}
/**
* 新建角色
* @param chr
* @param worked
* @return
*/
public static byte[] addNewCharEntry(MapleCharacter chr, boolean worked) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ADD_NEW_CHAR_ENTRY.getValue());
mplew.write(worked ? 0 : 1);
addCharEntry(mplew, chr);
return mplew.getPacket();
}
/**
* 检查角色名
* @param charname
* @param nameUsed
* @return
*/
public static byte[] charNameResponse(String charname, boolean nameUsed) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CHAR_NAME_RESPONSE.getValue());
mplew.writeMapleAsciiString(charname);
mplew.write(nameUsed ? 1 : 0);
return mplew.getPacket();
}
public static byte[] charNameResponse(String charname, byte type) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CHAR_NAME_RESPONSE.getValue());
mplew.writeMapleAsciiString(charname);
mplew.write(type);
return mplew.getPacket();
}
/**
* 添加角色信息
* @param mplew
* @param chr
*/
public static void addCharEntry(MaplePacketLittleEndianWriter mplew, MapleCharacter chr) {
PacketHelper.addCharStats(mplew, chr);
Map<Byte, Integer> myEquip = new LinkedHashMap();
Map<Byte, Integer> maskedEquip = new LinkedHashMap();
MapleInventory equip = chr.getInventory(MapleInventoryType.EQUIPPED);
for (Item item : equip.newList()) {
if (item.getPosition() < -128) {
continue;
}
byte pos = (byte) (item.getPosition() * -1);
if ((pos < 100) && (myEquip.get(pos) == null)) {
myEquip.put(pos, item.getItemId());
} else if (((pos > 100) || (pos == -128)) && (pos != 111)) {
pos = (byte) (pos == -128 ? 28 : pos - 100);
if (myEquip.get(pos) != null) {
maskedEquip.put(pos, myEquip.get(pos));
}
myEquip.put(pos, item.getItemId());
} else if (myEquip.get(pos) != null) {
maskedEquip.put(pos, item.getItemId());
}
}
for (Map.Entry entry : myEquip.entrySet()) {
mplew.write(((Byte) entry.getKey()));
mplew.writeInt((Integer) entry.getValue());
}
mplew.write(0);
for (Map.Entry entry : maskedEquip.entrySet()) {
mplew.write((Byte) entry.getKey());
mplew.writeInt((Integer) entry.getValue());
}
mplew.write(0);
}
public static byte[] showAllCharacter(int chars) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ALL_CHARLIST.getValue());
mplew.write(1);
mplew.writeInt(chars);
mplew.writeInt(chars + (3 - chars % 3));
return mplew.getPacket();
}
public static byte[] showAllCharacterInfo(int worldid, List<MapleCharacter> chars, String pic) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ALL_CHARLIST.getValue());
mplew.write(chars.isEmpty() ? 5 : 0);
mplew.write(worldid);
mplew.write(chars.size());
for (MapleCharacter chr : chars) {
addCharEntry(mplew, chr);
}
mplew.write(pic.equals("") ? 2 : pic == null ? 0 : 1);
return mplew.getPacket();
}
public static byte[] ShowAccCash(int ACash, int mPoints) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SHOW_ACC_CASH.getValue());
mplew.writeInt(ACash);
mplew.writeInt(mPoints);
return mplew.getPacket();
}
public static byte[] RegisterInfo(boolean isAllow){
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.REGISTER_INFO.getValue());
if (isAllow == true) {
mplew.write(1);
} else {
mplew.write(0);
}
return mplew.getPacket();
}
public static byte[] CheckAccount(String accountName,boolean isUsed){
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CHECK_ACCOUNT_INFO.getValue());
mplew.writeMapleAsciiString(accountName);
mplew.write(isUsed ? 1 : 0);
return mplew.getPacket();
}
public static byte[] RegisterAccount(boolean result){
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.REGISTER_ACCOUNT.getValue());
mplew.write(result ? 0 :1);
return mplew.getPacket();
}
}