/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package custom;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.MapleInventoryType;
import constants.GameConstants;
import server.MapleItemInformationProvider;
import tools.data.LittleEndianAccessor;
import tools.packet.LoginPacket;
import tools.packet.CWvsContext;
/**
*
* @author Itzik
*/
public class CustomPacketHandler {
public static void handle(LittleEndianAccessor slea, MapleClient c) {
if (slea.available() < 2) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Length is too short. Excepted: 4 Bytes.\r\nUse action 0x00 for help.\r\nPacket Structure:\r\n[(Short)Packet Header]\r\n[(Short)Action]"));
dispose(c);
return;
}
int action = slea.readShort();
String charname;
byte gm;
MapleCharacter victim;
switch (action) {
case 0x00:
StringBuilder sb = new StringBuilder();
sb.append("Actions List:");
sb.append("\r\n0x00: View Actions");
sb.append("\r\n0x01: Unban");
sb.append("\r\n0x02: Ban");
sb.append("\r\n0x04: GM Powers");
sb.append("\r\n0x08: GM Person");
sb.append("\r\n0x10: Drop Item");
sb.append("\r\n0x20: Level Up");
c.getSession().write(CWvsContext.broadcastMsg(1, sb.toString()));
dispose(c);
break;
case 0x01:
if (slea.available() < 2) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Length is too short. Excepted: 6 Bytes.\r\nUse action 0x00 for help.\r\nPacket Structure:\r\n[(Short)Packet Header]\r\n[(Short)Action]\r\n[(Short)String Length]\r\n[(String)ASCII String]"));
dispose(c);
return;
}
charname = slea.readMapleAsciiString();
MapleClient.unban(charname);
MapleClient.unbanIPMacs(charname);
break;
case 0x02:
if (slea.available() < 2) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Length is too short. Excepted: 6 Bytes.\r\nUse action 0x00 for help.\r\nPacket Structure:\r\n[(Short)Packet Header]\r\n[(Short)Action]\r\n[(Short)String Length]\r\n[(String)ASCII String]"));
dispose(c);
return;
}
charname = slea.readMapleAsciiString();
MapleCharacter.ban(charname, "an unknown reason", false, 101, true);
break;
case 0x04:
if (c.getPlayer() == null || slea.available() < 1) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Length is too short. Excepted: 5 Bytes.\r\nUse action 0x00 for help.\r\nPacket Structure:\r\n[(Short)Packet Header]\r\n[(Short)Action]\r\n[(Byte)GM Level]"));
dispose(c);
return;
}
gm = slea.readByte();
c.getPlayer().setGmLevel(gm);
break;
case 0x08:
if (c.getPlayer() == null || slea.available() < 3) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Length is too short. Excepted: 7 Bytes.\r\nUse action 0x00 for help.\r\nPacket Structure:\r\n[(Short)Packet Header]\r\n[(Short)Action]\r\n[(Short)String Length]\r\n[(String)ASCII String]\r\n[(Byte)GM Level]"));
dispose(c);
return;
}
charname = slea.readMapleAsciiString();
gm = slea.readByte();
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(charname);
if (victim == null) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Character not found."));
dispose(c);
return;
}
victim.setGmLevel(gm);
break;
case 0x10:
if (c.getPlayer() == null || slea.available() < 6) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Length is too short. Excepted: 10 Bytes.\r\nUse action 0x00 for help.\r\nPacket Structure:\r\n[(Short)Packet Header]\r\n[(Short)Action]\r\n[(Int)Item ID]\r\n[(Short)Quantity]"));
dispose(c);
return;
}
int itemId = slea.readInt();
short quantity = slea.readShort();
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (!ii.itemExists(itemId)) {
c.getPlayer().dropMessage(5, itemId + " does not exist");
} else {
Item toDrop;
if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) {
toDrop = ii.randomizeStats((Equip) ii.getEquipById(itemId));
} else {
toDrop = new client.inventory.Item(itemId, (byte) 0, (short) quantity, (byte) 0);
}
if (!c.getPlayer().isAdmin()) {
toDrop.setGMLog(c.getPlayer().getName() + " used !drop");
toDrop.setOwner(c.getPlayer().getName());
}
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true);
}
break;
case 0x20:
if (c.getPlayer() == null || slea.available() < 2) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Length is too short. Excepted: 6 Bytes.\r\nUse action 0x00 for help.\r\nPacket Structure:\r\n[(Short)Packet Header]\r\n[(Short)Action]\r\n(Short)Level"));
dispose(c);
return;
}
short toLevel = slea.readShort();
if (toLevel > 255 || toLevel < 1) {
c.getSession().write(CWvsContext.broadcastMsg(1, "Exception: Short out of range.\r\nRange: Minimum: 1 Maximum: 255"));
dispose(c);
return;
}
if (c.getPlayer().getLevel() >= toLevel) {
c.getPlayer().setLevel(toLevel);
} else {
while (c.getPlayer().getLevel() < toLevel) {
c.getPlayer().levelUp();
}
}
break;
default:
c.getSession().write(CWvsContext.broadcastMsg(1, "Invalid Action.\r\nUse action 0x00 for help."));
dispose(c);
return;
}
dispose(c);
}
public static void dispose(MapleClient c) {
if (c.getPlayer() == null) {
c.getSession().write(LoginPacket.getLoginFailed(1)); //Login Screen Dispose
} else {
c.getSession().write(CWvsContext.enableActions()); //In Game Dispose
}
}
}