/* * This file is part of the OdinMS Maple Story Server Copyright (C) 2008 ~ 2010 * Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan * Christian Meyer <vimes@odinms.de> * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License version 3 as published by * the Free Software Foundation. You may not use, modify or distribute this * program under any other version of the GNU Affero General Public License. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package javastory.channel.packet; import javastory.channel.ChannelCharacter; import javastory.channel.shops.GenericPlayerStore; import javastory.channel.shops.HiredMerchantStore; import javastory.channel.shops.PlayerShop; import javastory.channel.shops.PlayerShopItem; import javastory.game.Item; import javastory.io.GamePacket; import javastory.io.PacketBuilder; import javastory.server.MerchItemPackage; import javastory.server.handling.ServerPacketOpcode; import javastory.tools.packets.GameCharacterPacket; public final class PlayerShopPacket { private PlayerShopPacket() { } private static void addAnnounceBox(final PacketBuilder builder, final PlayerShop shop) { builder.writeAsByte(4); builder.writeInt(((GenericPlayerStore) shop).getObjectId()); builder.writeLengthPrefixedString(shop.getDescription()); builder.writeAsByte(0); builder.writeAsByte(shop.getItemId() % 10); builder.writeAsByte(1); builder.writeAsByte(shop.getFreeSlot() > -1 ? 4 : 1); builder.writeAsByte(0); } public static GamePacket addCharBox(final ChannelCharacter c, final int type) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.UPDATE_CHAR_BOX.getValue()); builder.writeInt(c.getId()); addAnnounceBox(builder, c.getPlayerShop()); return builder.getPacket(); } public static GamePacket removeCharBox(final ChannelCharacter c) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.UPDATE_CHAR_BOX.getValue()); builder.writeInt(c.getId()); builder.writeAsByte(0); return builder.getPacket(); } public static GamePacket sendTitleBox() { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.SEND_TITLE_BOX.getValue()); builder.writeAsByte(7); return builder.getPacket(); } public static GamePacket sendPlayerShopBox(final ChannelCharacter c) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.UPDATE_CHAR_BOX.getValue()); builder.writeInt(c.getId()); addAnnounceBox(builder, c.getPlayerShop()); return builder.getPacket(); } public static GamePacket getHiredMerch(final ChannelCharacter chr, final HiredMerchantStore merch, final boolean firstTime) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); builder.writeAsByte(5); builder.writeAsByte(5); builder.writeAsByte(4); builder.writeAsShort(merch.getVisitorSlot(chr)); builder.writeInt(merch.getItemId()); builder.writeLengthPrefixedString("Hired Merchant"); int i = 1; for (final ChannelCharacter character : merch.getVisitors()) { builder.writeAsByte(i++); GameCharacterPacket.addCharLook(builder, character, false); builder.writeLengthPrefixedString(character.getName()); builder.writeAsShort(character.getJobId()); } builder.writeAsByte(-1); builder.writeAsShort(0); builder.writeLengthPrefixedString(merch.getOwnerName()); if (merch.isOwner(chr)) { builder.writeInt(merch.getTimeLeft()); builder.writeAsByte(firstTime ? 1 : 0); builder.writeInt(0); builder.writeAsByte(0); } builder.writeLengthPrefixedString(merch.getDescription()); builder.writeAsByte(10); builder.writeInt(merch.getMeso()); // meso builder.writeAsByte(merch.getItems().size()); for (final PlayerShopItem item : merch.getItems()) { builder.writeAsShort(item.bundles); builder.writeAsShort(item.item.getQuantity()); builder.writeInt(item.price); PacketHelper.addItemInfo(builder, item.item, true, true); } return builder.getPacket(); } public static GamePacket getPlayerStore(final ChannelCharacter chr, final boolean firstTime) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); final PlayerShop ips = chr.getPlayerShop(); switch (ips.getShopType()) { case 2: builder.writeAsByte(5); builder.writeAsByte(4); builder.writeAsByte(4); break; case 3: builder.writeAsByte(5); builder.writeAsByte(2); builder.writeAsByte(2); break; case 4: builder.writeAsByte(5); builder.writeAsByte(1); builder.writeAsByte(2); break; } builder.writeAsShort(ips.getVisitorSlot(chr)); GameCharacterPacket.addCharLook(builder, ((GenericPlayerStore) ips).getMCOwner(), false); builder.writeLengthPrefixedString(ips.getOwnerName()); int i = 1; for (final ChannelCharacter character : ips.getVisitors()) { builder.writeAsByte(i++); GameCharacterPacket.addCharLook(builder, character, false); builder.writeLengthPrefixedString(character.getName()); } builder.writeAsByte(0xFF); builder.writeLengthPrefixedString(ips.getDescription()); builder.writeAsByte(10); builder.writeAsByte(ips.getItems().size()); for (final PlayerShopItem item : ips.getItems()) { builder.writeAsShort(item.bundles); builder.writeAsShort(item.item.getQuantity()); builder.writeInt(item.price); PacketHelper.addItemInfo(builder, item.item, true, true); } return builder.getPacket(); } public static GamePacket shopChat(final String message, final int slot) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); builder.writeAsByte(6); builder.writeAsByte(8); builder.writeAsByte(slot); builder.writeLengthPrefixedString(message); return builder.getPacket(); } public static GamePacket shopErrorMessage(final int error, final int type) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); builder.writeAsByte(0x0A); builder.writeAsByte(type); builder.writeAsByte(error); return builder.getPacket(); } public static GamePacket spawnHiredMerchant(final HiredMerchantStore hm) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.SPAWN_HIRED_MERCHANT.getValue()); builder.writeInt(hm.getOwnerId()); builder.writeInt(hm.getItemId()); builder.writeVector(hm.getPosition()); builder.writeAsShort(0); builder.writeLengthPrefixedString(hm.getOwnerName()); builder.writeAsByte(5); builder.writeInt(hm.getObjectId()); builder.writeLengthPrefixedString(hm.getDescription()); builder.writeAsByte(hm.getItemId() % 10); builder.writeAsByte(1); builder.writeAsByte(4); return builder.getPacket(); } public static GamePacket destroyHiredMerchant(final int id) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.DESTROY_HIRED_MERCHANT.getValue()); builder.writeInt(id); return builder.getPacket(); } public static GamePacket shopItemUpdate(final PlayerShop shop) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); builder.writeAsByte(0x17); if (shop.getShopType() == 1) { builder.writeInt(0); } builder.writeAsByte(shop.getItems().size()); for (final PlayerShopItem item : shop.getItems()) { builder.writeAsShort(item.bundles); builder.writeAsShort(item.item.getQuantity()); builder.writeInt(item.price); PacketHelper.addItemInfo(builder, item.item, true, true); } return builder.getPacket(); } public static GamePacket shopVisitorAdd(final ChannelCharacter chr, final int slot) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); builder.writeAsByte(4); builder.writeAsByte(slot); GameCharacterPacket.addCharLook(builder, chr, false); builder.writeLengthPrefixedString(chr.getName()); builder.writeAsShort(chr.getJobId()); return builder.getPacket(); } public static GamePacket shopVisitorLeave(final byte slot) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); builder.writeAsByte(0x0A); builder.writeByte(slot); return builder.getPacket(); } public static GamePacket Merchant_Buy_Error(final byte message) { final PacketBuilder builder = new PacketBuilder(); // 2 = You have not enough meso builder.writeAsShort(ServerPacketOpcode.PLAYER_INTERACTION.getValue()); builder.writeAsByte(0x16); builder.writeByte(message); return builder.getPacket(); } public static GamePacket updateHiredMerchant(final HiredMerchantStore shop) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.UPDATE_HIRED_MERCHANT.getValue()); builder.writeInt(shop.getOwnerId()); builder.writeAsByte(0x05); builder.writeInt(shop.getObjectId()); builder.writeLengthPrefixedString(shop.getDescription()); builder.writeAsByte(shop.getItemId() % 10); builder.writeAsByte(shop.getFreeSlot() > -1 ? 3 : 2); builder.writeAsByte(0x04); return builder.getPacket(); } public static GamePacket merchItem_Message(final byte op) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.MERCH_ITEM_MSG.getValue()); builder.writeByte(op); return builder.getPacket(); } public static GamePacket merchItemStore(final byte op) { final PacketBuilder builder = new PacketBuilder(); // [28 01] [22 01] - Invalid Asiasoft Passport // [28 01] [22 00] - Open Asiasoft pin typing builder.writeAsShort(ServerPacketOpcode.MERCH_ITEM_STORE.getValue()); builder.writeByte(op); switch (op) { case 0x24: builder.writeZeroBytes(8); break; default: builder.writeAsByte(0); break; } return builder.getPacket(); } public static GamePacket merchItemStore_ItemData(final MerchItemPackage pack) { final PacketBuilder builder = new PacketBuilder(); builder.writeAsShort(ServerPacketOpcode.MERCH_ITEM_STORE.getValue()); builder.writeAsByte(0x23); builder.writeInt(9030000); // Fredrick builder.writeInt(32272); // pack.getPackageid() builder.writeZeroBytes(5); builder.writeInt(pack.getMesos()); builder.writeAsByte(0); builder.writeAsByte(pack.getItems().size()); for (final Item item : pack.getItems()) { PacketHelper.addItemInfo(builder, item, true, true); } builder.writeZeroBytes(3); return builder.getPacket(); } }