package tools.packet;
import client.MapleCharacter;
import client.MapleClient;
import client.MapleJob;
import constants.JobConstants;
import constants.GameConstants;
import constants.JobConstants.LoginJob;
import constants.ServerConstants;
import handling.SendPacketOpcode;
import handling.login.LoginServer;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import server.Randomizer;
import tools.HexTool;
import tools.data.MaplePacketLittleEndianWriter;
public class LoginPacket {
public static final byte[] getHello(byte[] sendIv, byte[] recvIv) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.writeShort(14);
mplew.writeShort(ServerConstants.MAPLE_VERSION);
mplew.writeMapleAsciiString(ServerConstants.MAPLE_PATCH);
mplew.write(recvIv);
mplew.write(sendIv);
mplew.write(8);
return mplew.getPacket();
}
public static final byte[] getPing() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(2);
mplew.writeShort(SendPacketOpcode.PING.getValue());
return mplew.getPacket();
}
public static final byte[] getAuthSuccessRequest(MapleClient client) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.writeZeroBytes(6);
mplew.writeInt(client.getAccID());
mplew.writeLong(0);
mplew.write(0);
mplew.writeMapleAsciiString(client.getAccountName());
mplew.writeLong(0);
mplew.writeShort(0);
mplew.writeLong(0);
// Jobs
mplew.writeInt(21); //New Flag
mplew.write(JobConstants.enableJobs ? 1 : 0);
mplew.write(JobConstants.jobOrder);
for (LoginJob j : LoginJob.values()) {
mplew.write(j.getFlag());
}
mplew.write(1);
mplew.write(4);
mplew.writeLong(0); // Create date, whatever.
return mplew.getPacket();
}
public static final byte[] getLoginFailed(int reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.writeShort(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.write(reason);
mplew.write(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static final byte[] getPermBan(byte reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(16);
mplew.writeShort(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.writeShort(2);
mplew.writeInt(0);
mplew.writeShort(reason);
mplew.write(HexTool.getByteArrayFromHexString("01 01 01 01 00"));
return mplew.getPacket();
}
public static final byte[] getTempBan(long timestampTill, byte reason) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(17);
mplew.writeShort(SendPacketOpcode.LOGIN_STATUS.getValue());
mplew.write(2);
mplew.write(0);
mplew.writeInt(0);
mplew.write(reason);
mplew.writeLong(timestampTill);
return mplew.getPacket();
}
public static final byte[] getSecondAuthSuccess(MapleClient client) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.LOGIN_SECOND.getValue());
mplew.write(0);
mplew.writeInt(client.getAccID());
mplew.writeZeroBytes(5);
mplew.writeMapleAsciiString(client.getAccountName());
mplew.writeLong(2L);
mplew.writeZeroBytes(3);
mplew.writeInt(Randomizer.nextInt());
mplew.writeInt(Randomizer.nextInt());
mplew.writeInt(28);
mplew.writeInt(Randomizer.nextInt());
mplew.writeInt(Randomizer.nextInt());
mplew.write(1);
return mplew.getPacket();
}
public static final byte[] deleteCharResponse(int cid, int state) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.DELETE_CHAR_RESPONSE.getValue());
mplew.writeInt(cid);
mplew.write(state);
return mplew.getPacket();
}
public static final byte[] secondPwError(byte mode) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3);
mplew.writeShort(SendPacketOpcode.SECONDPW_ERROR.getValue());
mplew.write(0);
return mplew.getPacket();
}
public static byte[] enableRecommended() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ENABLE_RECOMMENDED.getValue());
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] sendRecommended(int world, String message) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SEND_RECOMMENDED.getValue());
mplew.write(message != null ? 1 : 0);
if (message != null) {
mplew.writeInt(world);
mplew.writeMapleAsciiString(message);
}
return mplew.getPacket();
}
public static byte[] ResetScreen() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.RESET_SCREEN.getValue());
mplew.write(HexTool.getByteArrayFromHexString("02 08 00 32 30 31 32 30 38 30 38 00 08 00 32 30 31 32 30 38 31 35 00"));
return mplew.getPacket();
}
public static final byte[] getServerList(int serverId, Map<Integer, Integer> channelLoad) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERLIST.getValue());
mplew.write(serverId);
String worldName = LoginServer.getTrueServerName();
mplew.writeMapleAsciiString(worldName);
mplew.write(LoginServer.getFlag());
mplew.writeMapleAsciiString(LoginServer.getEventMessage());
mplew.writeShort(100);
mplew.writeShort(100);
mplew.write(0);
int lastChannel = 1;
Set channels = channelLoad.keySet();
for (int i = 30; i > 0; i--) {
if (channels.contains(Integer.valueOf(i))) {
lastChannel = i;
break;
}
}
mplew.write(lastChannel);
for (int i = 1; i <= lastChannel; i++) {
int load;
if (channels.contains(Integer.valueOf(i))) {
load = ((Integer) channelLoad.get(Integer.valueOf(i))).intValue();
} else {
load = 1200;
}
mplew.writeMapleAsciiString(worldName + "-" + i);
mplew.writeInt(load);
mplew.write(serverId);
mplew.writeShort(i - 1);
}
mplew.writeShort(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static final byte[] getEndOfServerList() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERLIST.getValue());
mplew.write(-1);
mplew.write(0);
return mplew.getPacket();
}
public static final byte[] getServerStatus(int status) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SERVERSTATUS.getValue());
mplew.writeShort(status);
return mplew.getPacket();
}
public static final byte[] getChannelSelected() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CHANNEL_SELECTED.getValue());
mplew.writeZeroBytes(3);
return mplew.getPacket();
}
public static byte[] getCharList(String secondpw, List<MapleCharacter> chars, int charslots) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CHARLIST.getValue());
mplew.write(0);
mplew.write(chars.size());
for (MapleCharacter chr : chars) {
addCharEntry(mplew, chr, (!chr.isGM()) && (chr.getLevel() >= 30), false);
}
mplew.write((secondpw != null) && (secondpw.length() <= 0) ? 2 : (secondpw != null) && (secondpw.length() > 0) ? 1 : 0);
mplew.write(0);
mplew.writeLong(charslots);
mplew.writeInt(-1);
mplew.write(HexTool.getByteArrayFromHexString("19 6E CE 01 30 FB 84 E8"));
mplew.writeZeroBytes(50);
return mplew.getPacket();
}
public static final byte[] addNewCharEntry(MapleCharacter chr, boolean worked) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ADD_NEW_CHAR_ENTRY.getValue());
mplew.write(worked ? 0 : 1);
addCharEntry(mplew, chr, false, false);
return mplew.getPacket();
}
public static final byte[] charNameResponse(String charname, boolean nameUsed) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CHAR_NAME_RESPONSE.getValue());
mplew.writeMapleAsciiString(charname);
mplew.write(nameUsed ? 1 : 0);
return mplew.getPacket();
}
private static void addCharEntry(MaplePacketLittleEndianWriter mplew, MapleCharacter chr, boolean ranking, boolean viewAll) {
PacketHelper.addCharStats(mplew, chr);
PacketHelper.addCharLook(mplew, chr, true,false);
if (GameConstants.isZero(chr.getJob())) {
PacketHelper.addCharLook(mplew, chr, true, true);
}
if (!viewAll) {
mplew.write(0);
}
if (chr.isAdmin() || chr.isGM() || chr.isSuperGM()) {
mplew.write(0); // Prevent Crashing Error 38 GM Dont Have Ranks.
return;
}
mplew.write(1); // Ranks Enable
mplew.writeInt(chr.getRank());
mplew.writeInt(chr.getRankMove());
mplew.writeInt(chr.getJobRank());
mplew.writeInt(chr.getJobRankMove());
}
public static byte[] showAllCharacter(int chars) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(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.writeShort(SendPacketOpcode.ALL_CHARLIST.getValue());
mplew.write(chars.size() == 0 ? 5 : 0);
mplew.write(worldid);
mplew.write(chars.size());
for (MapleCharacter chr : chars) {
addCharEntry(mplew, chr, true, true);
}
mplew.write(pic == null ? 0 : pic.equals("") ? 2 : 1);
return mplew.getPacket();
}
public static byte[] enableSpecialCreation(int accid, boolean enable) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPECIAL_CREATION.getValue());
mplew.writeInt(accid);
mplew.write(enable ? 0 : 1);
mplew.write(0);
return mplew.getPacket();
}
}