All packet creating methods now create Packet instead of byte[]

This commit got way too big...
- Remove deprecated methods for sending packets
- Favor OutPacket & Packet over MaplePacketLittleEndianWriter, LittleEndianWriter, and byte array
- Split up some packet creating methods into separate classes
This commit is contained in:
P0nk
2021-08-21 01:36:51 +02:00
parent b5cd6887ae
commit 8f6860d7d7
231 changed files with 6403 additions and 6927 deletions

View File

@@ -54,44 +54,44 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
final MapleCharacter player = c.getPlayer();
long timeNow = currentServerTime();
if (timeNow - player.getLastUsedCashItem() < 3000) {
player.dropMessage(1, "You have used a cash item recently. Wait a moment, then try again.");
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
return;
}
player.setLastUsedCashItem(timeNow);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
short position = slea.readShort();
int itemId = slea.readInt();
int itemType = itemId / 10000;
MapleInventory cashInv = player.getInventory(MapleInventoryType.CASH);
Item toUse = cashInv.getItem(position);
if (toUse == null || toUse.getItemId() != itemId) {
toUse = cashInv.findById(itemId);
if (toUse == null) {
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
return;
}
position = toUse.getPosition();
}
if (toUse.getQuantity() < 1) {
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
return;
}
String medal = "";
Item medalItem = player.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -49);
if (medalItem != null) {
medal = "<" + ii.getName(medalItem.getItemId()) + "> ";
}
if (itemType == 504) { // vip teleport rock
String error1 = "Either the player could not be found or you were trying to teleport to an illegal location.";
boolean vip = slea.readByte() == 1 && itemId / 1000 >= 5041;
@@ -113,7 +113,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
} else {
String name = slea.readMapleAsciiString();
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(name);
if (victim != null) {
MapleMap targetMap = victim.getMap();
if (!FieldLimit.CANNOTVIPROCK.check(targetMap.getFieldLimit()) && (targetMap.getForcedReturnId() == 999999999 || targetMap.getId() < 100000000)) {
@@ -130,23 +130,23 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
player.dropMessage(1, "Player could not be found in this channel.");
}
}
if (!success) {
MapleInventoryManipulator.addById(c, itemId, (short) 1);
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
}
} else if (itemType == 505) { // AP/SP reset
if(!player.isAlive()) {
c.announce(PacketCreator.enableActions());
if (!player.isAlive()) {
c.sendPacket(PacketCreator.enableActions());
return;
}
if (itemId > 5050000) {
int SPTo = slea.readInt();
if (!AssignSPProcessor.canSPAssign(c, SPTo)) { // exploit found thanks to Arnah
return;
}
int SPFrom = slea.readInt();
Skill skillSPTo = SkillFactory.getSkill(SPTo);
Skill skillSPFrom = SkillFactory.getSkill(SPFrom);
@@ -155,39 +155,43 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
if ((curLevel < skillSPTo.getMaxLevel()) && curLevelSPFrom > 0) {
player.changeSkillLevel(skillSPFrom, (byte) (curLevelSPFrom - 1), player.getMasterLevel(skillSPFrom), -1);
player.changeSkillLevel(skillSPTo, (byte) (curLevel + 1), player.getMasterLevel(skillSPTo), -1);
// update macros, thanks to Arnah
if((curLevelSPFrom - 1) == 0){
if ((curLevelSPFrom - 1) == 0) {
boolean updated = false;
for(SkillMacro macro : player.getMacros()){
if(macro == null) continue;
for (SkillMacro macro : player.getMacros()) {
if (macro == null) {
continue;
}
boolean update = false;// cleaner?
if(macro.getSkill1() == SPFrom){
if (macro.getSkill1() == SPFrom) {
update = true;
macro.setSkill1(0);
}
if(macro.getSkill2() == SPFrom){
if (macro.getSkill2() == SPFrom) {
update = true;
macro.setSkill2(0);
}
if(macro.getSkill3() == SPFrom){
if (macro.getSkill3() == SPFrom) {
update = true;
macro.setSkill3(0);
}
if(update){
if (update) {
updated = true;
player.updateMacros(macro.getPosition(), macro);
}
}
if(updated) player.sendMacros();
if (updated) {
player.sendMacros();
}
}
}
} else {
int APTo = slea.readInt();
int APFrom = slea.readInt();
if(!AssignAPProcessor.APResetAction(c, APFrom, APTo)) {
if (!AssignAPProcessor.APResetAction(c, APFrom, APTo)) {
return;
}
}
@@ -292,16 +296,16 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
messages.add(message);
}
slea.readInt();
if (!MapleTVEffect.broadcastMapleTVIfNotActive(player, victim, messages, tvType)) {
player.dropMessage(1, "MapleTV is already in use.");
return;
}
if (megassenger) {
Server.getInstance().broadcastMessage(c.getWorld(), PacketCreator.serverNotice(3, c.getChannel(), medal + player.getName() + " : " + builder.toString(), ear));
Server.getInstance().broadcastMessage(c.getWorld(), PacketCreator.serverNotice(3, c.getChannel(), medal + player.getName() + " : " + builder, ear));
}
break;
case 6: //item megaphone
String msg = medal + player.getName() + " : " + slea.readMapleAsciiString();
@@ -313,7 +317,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
{
return;
}
// thanks Conrad for noticing that untradeable items should be allowed in megas
}
Server.getInstance().broadcastMessage(c.getWorld(), PacketCreator.itemMegaphone(msg, whisper, c.getChannel(), item));
@@ -335,12 +339,12 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
remove(c, position, itemId);
} else if (itemType == 508) { // thanks tmskdl12 for graduation banner; thanks ratency for first pointing lack of Kite handling
MapleKite kite = new MapleKite(player, slea.readMapleAsciiString(), itemId);
if (!GameConstants.isFreeMarketRoom(player.getMapId())) {
player.getMap().spawnKite(kite);
remove(c, position, itemId);
} else {
c.announce(PacketCreator.sendCannotSpawnKite());
c.sendPacket(PacketCreator.sendCannotSpawnKite());
}
} else if (itemType == 509) {
String sendTo = slea.readMapleAsciiString();
@@ -365,41 +369,46 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
} else if (itemType == 517) {
MaplePet pet = player.getPet(0);
if (pet == null) {
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
return;
}
String newName = slea.readMapleAsciiString();
pet.setName(newName);
pet.saveToDb();
Item item = player.getInventory(MapleInventoryType.CASH).getItem(pet.getPosition());
if (item != null)
if (item != null) {
player.forceUpdateItem(item);
}
player.getMap().broadcastMessage(player, PacketCreator.changePetName(player, newName, 1), true);
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
remove(c, position, itemId);
} else if (itemType == 520) {
player.gainMeso(ii.getMeso(itemId), true, false, true);
remove(c, position, itemId);
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
} else if (itemType == 523) {
int itemid = slea.readInt();
if(!YamlConfig.config.server.USE_ENFORCE_ITEM_SUGGESTION) c.getWorldServer().addOwlItemSearch(itemid);
if (!YamlConfig.config.server.USE_ENFORCE_ITEM_SUGGESTION) {
c.getWorldServer().addOwlItemSearch(itemid);
}
player.setOwlSearch(itemid);
List<Pair<MaplePlayerShopItem, AbstractMapleMapObject>> hmsAvailable = c.getWorldServer().getAvailableItemBundles(itemid);
if(!hmsAvailable.isEmpty()) remove(c, position, itemId);
c.announce(PacketCreator.owlOfMinerva(c, itemid, hmsAvailable));
c.announce(PacketCreator.enableActions());
if (!hmsAvailable.isEmpty()) {
remove(c, position, itemId);
}
c.sendPacket(PacketCreator.owlOfMinerva(c, itemid, hmsAvailable));
c.sendPacket(PacketCreator.enableActions());
} else if (itemType == 524) {
for (byte i = 0; i < 3; i++) {
MaplePet pet = player.getPet(i);
if (pet != null) {
Pair<Integer, Boolean> p = pet.canConsume(itemId);
if (p.getRight()) {
pet.gainClosenessFullness(player, p.getLeft(), 100, 1);
remove(c, position, itemId);
@@ -409,7 +418,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
break;
}
}
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
} else if (itemType == 530) {
ii.getItemEffect(itemId).applyTo(player);
remove(c, position, itemId);
@@ -418,20 +427,20 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
} else if (itemType == 537) {
if (GameConstants.isFreeMarketRoom(player.getMapId())) {
player.dropMessage(5, "You cannot use the chalkboard here.");
player.getClient().announce(PacketCreator.enableActions());
player.sendPacket(PacketCreator.enableActions());
return;
}
player.setChalkboard(slea.readMapleAsciiString());
player.getMap().broadcastMessage(PacketCreator.useChalkboard(player, false));
player.getClient().announce(PacketCreator.enableActions());
player.sendPacket(PacketCreator.enableActions());
//remove(c, position, itemId); thanks Conrad for noticing chalkboards shouldn't be depleted upon use
} else if (itemType == 539) {
List<String> strLines = new LinkedList<>();
for (int i = 0; i < 4; i++) {
strLines.add(slea.readMapleAsciiString());
}
final int world = c.getWorld();
Server.getInstance().broadcastMessage(world, PacketCreator.getAvatarMega(player, medal, c.getChannel(), itemId, strLines, (slea.readByte() != 0)));
TimerManager.getInstance().schedule(() -> Server.getInstance().broadcastMessage(world, PacketCreator.byeAvatarMega()), 1000 * 10);
@@ -439,20 +448,20 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
} else if (itemType == 540) {
slea.readByte();
slea.readInt();
if(itemId == 5400000) { //name change
c.announce(PacketCreator.showNameChangeCancel(player.cancelPendingNameChange()));
} else if(itemId == 5401000) { //world transfer
c.announce(PacketCreator.showWorldTransferCancel(player.cancelPendingWorldTranfer()));
if (itemId == 5400000) { //name change
c.sendPacket(PacketCreator.showNameChangeCancel(player.cancelPendingNameChange()));
} else if (itemId == 5401000) { //world transfer
c.sendPacket(PacketCreator.showWorldTransferCancel(player.cancelPendingWorldTranfer()));
}
remove(c, position, itemId);
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
} else if (itemType == 543) {
if(itemId == 5432000 && !c.gainCharacterSlot()) {
if (itemId == 5432000 && !c.gainCharacterSlot()) {
player.dropMessage(1, "You have already used up all 12 extra character slots.");
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
return;
}
String name = slea.readMapleAsciiString();
int face = slea.readInt();
int hair = slea.readInt();
@@ -461,39 +470,25 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
int gender = slea.readInt();
int jobid = slea.readInt();
int improveSp = slea.readInt();
int createStatus;
switch(jobid) {
case 0:
createStatus = WarriorCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
break;
case 1:
createStatus = MagicianCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
break;
case 2:
createStatus = BowmanCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
break;
case 3:
createStatus = ThiefCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
break;
default:
createStatus = PirateCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
}
if(createStatus == 0) {
c.announce(PacketCreator.sendMapleLifeError(0)); // success!
int createStatus = switch (jobid) {
case 0 -> WarriorCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
case 1 -> MagicianCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
case 2 -> BowmanCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
case 3 -> ThiefCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
default -> PirateCreator.createCharacter(c, name, face, hair + haircolor, skin, gender, improveSp);
};
if (createStatus == 0) {
c.sendPacket(PacketCreator.sendMapleLifeError(0)); // success!
player.showHint("#bSuccess#k on creation of the new character through the Maple Life card.");
remove(c, position, itemId);
} else {
if(createStatus == -1) { // check name
c.announce(PacketCreator.sendMapleLifeNameError());
if (createStatus == -1) { // check name
c.sendPacket(PacketCreator.sendMapleLifeNameError());
} else {
c.announce(PacketCreator.sendMapleLifeError(-1 * createStatus));
c.sendPacket(PacketCreator.sendMapleLifeError(-1 * createStatus));
}
}
} else if (itemType == 545) { // MiuMiu's travel store
@@ -504,25 +499,25 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
remove(c, position, itemId);
}
} else {
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
}
} else if (itemType == 550) { //Extend item expiration
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
} else if (itemType == 552) {
MapleInventoryType type = MapleInventoryType.getByType((byte) slea.readInt());
short slot = (short) slea.readInt();
Item item = player.getInventory(type).getItem(slot);
if (item == null || item.getQuantity() <= 0 || MapleKarmaManipulator.hasKarmaFlag(item) || !ii.isKarmaAble(item.getItemId())) {
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
return;
}
MapleKarmaManipulator.setKarmaFlag(item);
player.forceUpdateItem(item);
remove(c, position, itemId);
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
} else if (itemType == 552) { //DS EGG THING
c.announce(PacketCreator.enableActions());
c.sendPacket(PacketCreator.enableActions());
} else if (itemType == 557) {
slea.readInt();
int itemSlot = slea.readInt();
@@ -534,70 +529,74 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
equip.setVicious(equip.getVicious() + 1);
equip.setUpgradeSlots(equip.getUpgradeSlots() + 1);
remove(c, position, itemId);
c.announce(PacketCreator.enableActions());
c.announce(PacketCreator.sendHammerData(equip.getVicious()));
c.sendPacket(PacketCreator.enableActions());
c.sendPacket(PacketCreator.sendHammerData(equip.getVicious()));
player.forceUpdateItem(equip);
} else if (itemType == 561) { //VEGA'S SPELL
if (slea.readInt() != 1) {
return;
}
final byte eSlot = (byte) slea.readInt();
final Item eitem = player.getInventory(MapleInventoryType.EQUIP).getItem(eSlot);
if (slea.readInt() != 2) {
return;
}
final byte uSlot = (byte) slea.readInt();
final Item uitem = player.getInventory(MapleInventoryType.USE).getItem(uSlot);
if (eitem == null || uitem == null) {
return;
}
Equip toScroll = (Equip) eitem;
if (toScroll.getUpgradeSlots() < 1) {
c.announce(PacketCreator.getInventoryFull());
c.sendPacket(PacketCreator.getInventoryFull());
return;
}
//should have a check here against PE hacks
if(itemId / 1000000 != 5) itemId = 0;
if (itemId / 1000000 != 5) {
itemId = 0;
}
player.toggleBlockCashShop();
final int curlevel = toScroll.getLevel();
c.announce(PacketCreator.sendVegaScroll(0x40));
c.sendPacket(PacketCreator.sendVegaScroll(0x40));
final Equip scrolled = (Equip) ii.scrollEquipWithId(toScroll, uitem.getItemId(), false, itemId, player.isGM());
c.announce(PacketCreator.sendVegaScroll(scrolled.getLevel() > curlevel ? 0x41 : 0x43));
c.sendPacket(PacketCreator.sendVegaScroll(scrolled.getLevel() > curlevel ? 0x41 : 0x43));
//opcodes 0x42, 0x44: "this item cannot be used"; 0x39, 0x45: crashes
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, uSlot, (short) 1, false);
remove(c, position, itemId);
final MapleClient client = c;
TimerManager.getInstance().schedule(() -> {
if(!player.isLoggedin()) return;
if (!player.isLoggedin()) {
return;
}
player.toggleBlockCashShop();
player.toggleBlockCashShop();
final List<ModifyInventory> mods = new ArrayList<>();
mods.add(new ModifyInventory(3, scrolled));
mods.add(new ModifyInventory(0, scrolled));
client.announce(PacketCreator.modifyInventory(true, mods));
final List<ModifyInventory> mods = new ArrayList<>();
mods.add(new ModifyInventory(3, scrolled));
mods.add(new ModifyInventory(0, scrolled));
client.sendPacket(PacketCreator.modifyInventory(true, mods));
ScrollResult scrollResult = scrolled.getLevel() > curlevel ? ScrollResult.SUCCESS : ScrollResult.FAIL;
player.getMap().broadcastMessage(PacketCreator.getScrollEffect(player.getId(), scrollResult, false, false));
if (eSlot < 0 && (scrollResult == ScrollResult.SUCCESS)) {
player.equipChanged();
}
ScrollResult scrollResult = scrolled.getLevel() > curlevel ? ScrollResult.SUCCESS : ScrollResult.FAIL;
player.getMap().broadcastMessage(PacketCreator.getScrollEffect(player.getId(), scrollResult, false, false));
if (eSlot < 0 && (scrollResult == ScrollResult.SUCCESS)) {
player.equipChanged();
}
client.announce(PacketCreator.enableActions());
client.sendPacket(PacketCreator.enableActions());
}, 1000 * 3);
} else {
System.out.println("NEW CASH ITEM: " + itemType + "\n" + slea.toString());
c.announce(PacketCreator.enableActions());
System.out.println("NEW CASH ITEM: " + itemType + "\n" + slea);
c.sendPacket(PacketCreator.enableActions());
}
}
@@ -612,7 +611,7 @@ client.announce(PacketCreator.enableActions());
position = it.getPosition();
}
}
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.CASH, position, (short) 1, true, false);
} finally {
cashInv.unlockInventory();