package tools.packet;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.Item;
import handling.InteractionOpcode;
import handling.SendPacketOpcode;
import java.util.List;
import java.util.Map;
import server.MerchItemPackage;
import server.shops.AbstractPlayerStore;
import server.shops.HiredMerchant;
import server.shops.IMaplePlayerShop;
import server.shops.MapleMiniGame;
import server.shops.MaplePlayerShop;
import server.shops.MaplePlayerShopItem;
import tools.Pair;
import tools.data.output.MaplePacketLittleEndianWriter;
public class PlayerShopPacket {
public static byte[] sendTitleBox(int message) {
return sendTitleBox(message, 0, 0);
}
public static byte[] sendTitleBox(int message, int mapId, int ch) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SEND_TITLE_BOX.getValue());
mplew.write(message);
switch (message) {
case 7:
case 9:
case 15:
break;
case 8:
case 16:
mplew.writeInt(mapId);
mplew.write(ch);
case 10:
case 11:
case 12:
case 13:
case 14:
}
return mplew.getPacket();
}
public static byte[] sendPlayerShopBox(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.UPDATE_CHAR_BOX.getValue());
mplew.writeInt(chr.getId());
PacketHelper.addAnnounceBox(mplew, chr);
return mplew.getPacket();
}
public static byte[] getHiredMerch(MapleCharacter chr, HiredMerchant merch, boolean firstTime) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.房间.getValue());
mplew.write(6);
mplew.write(merch.getMaxSize());
mplew.writeShort((short) merch.getVisitorSlot(chr));
mplew.writeInt(merch.getItemId());
mplew.writeMapleAsciiString("雇佣商人");
for (Pair storechr : merch.getVisitors()) {
mplew.write(((Byte) storechr.left));
PacketHelper.addCharLook(mplew, (MapleCharacter) storechr.right, true, ((MapleCharacter) storechr.right).isZeroSecondLook());
mplew.writeMapleAsciiString(((MapleCharacter) storechr.right).getName());
mplew.writeShort(((MapleCharacter) storechr.right).getJob());
}
mplew.write(-1);
mplew.writeShort(merch.isOwner(chr) ? merch.getMessages().size() : 0);
if (merch.isOwner(chr)) {
for (int i = 0; i < merch.getMessages().size(); i++) {
mplew.writeMapleAsciiString((String) ((Pair) merch.getMessages().get(i)).getLeft());
mplew.write(((Byte) ((Pair) merch.getMessages().get(i)).getRight()));
}
}
mplew.writeMapleAsciiString(merch.getOwnerName());
if (merch.isOwner(chr)) {
mplew.writeInt(merch.getTimeLeft(firstTime));
mplew.write(firstTime ? 1 : 0);
mplew.write(merch.getBoughtItems().size());
for (AbstractPlayerStore.BoughtItem SoldItem : merch.getBoughtItems()) {
mplew.writeInt(SoldItem.id);
mplew.writeShort(SoldItem.quantity);
mplew.writeLong(SoldItem.totalPrice);
mplew.writeMapleAsciiString(SoldItem.buyer);
}
mplew.writeLong(merch.getMeso());
}
mplew.writeInt(merch.getObjectId());
mplew.writeMapleAsciiString(merch.getDescription());
mplew.write(16);
mplew.writeLong(merch.getMeso());
mplew.write(merch.getItems().size());
for (MaplePlayerShopItem item : merch.getItems()) {
mplew.writeShort(item.bundles);
mplew.writeShort(item.item.getQuantity());
mplew.writeLong(item.price);
PacketHelper.addItemInfo(mplew, item.item);
}
mplew.writeShort(0);
return mplew.getPacket();
}
public static byte[] getPlayerStore(MapleCharacter chr, boolean firstTime) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
IMaplePlayerShop ips = chr.getPlayerShop();
mplew.write(5);
switch (ips.getShopType()) {
case 2:
mplew.write(4);
mplew.write(4);
break;
case 3:
mplew.write(2);
mplew.write(2);
break;
case 4:
mplew.write(1);
mplew.write(2);
}
mplew.writeShort((short) ips.getVisitorSlot(chr));
PacketHelper.addCharLook(mplew, ((MaplePlayerShop) ips).getMCOwner(), false, ((MaplePlayerShop) ips).getMCOwner().isZeroSecondLook());
mplew.writeMapleAsciiString(ips.getOwnerName());
mplew.writeShort(((MaplePlayerShop) ips).getMCOwner().getJob());
for (Pair storechr : ips.getVisitors()) {
mplew.write(((Byte) storechr.left));
PacketHelper.addCharLook(mplew, (MapleCharacter) storechr.right, false, ((MapleCharacter) storechr.right).isZeroSecondLook());
mplew.writeMapleAsciiString(((MapleCharacter) storechr.right).getName());
mplew.writeShort(((MapleCharacter) storechr.right).getJob());
}
mplew.write(255);
mplew.writeMapleAsciiString(ips.getDescription());
mplew.write(10);
mplew.write(ips.getItems().size());
for (MaplePlayerShopItem item : ips.getItems()) {
mplew.writeShort(item.bundles);
mplew.writeShort(item.item.getQuantity());
mplew.writeInt(item.price);
PacketHelper.addItemInfo(mplew, item.item);
}
return mplew.getPacket();
}
public static byte[] shopChat(String message, int slot) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.聊天.getValue());
mplew.write(InteractionOpcode.聊天事件.getValue());
mplew.write(slot);
mplew.writeMapleAsciiString(message);
return mplew.getPacket();
}
public static byte[] shopErrorMessage(int error, int type) {
return shopErrorMessage(false, error, type);
}
public static byte[] shopErrorMessage(boolean room, int error, int type) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(room ? InteractionOpcode.房间.getValue() : InteractionOpcode.退出.getValue());
mplew.write(type);
mplew.write(error);
return mplew.getPacket();
}
public static byte[] spawnHiredMerchant(HiredMerchant hm) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SPAWN_HIRED_MERCHANT.getValue());
mplew.writeInt(hm.getOwnerId());
mplew.writeInt(hm.getItemId());
mplew.writePos(hm.getTruePosition());
mplew.writeShort(0);
mplew.writeMapleAsciiString(hm.getOwnerName());
PacketHelper.addInteraction(mplew, hm);
return mplew.getPacket();
}
public static byte[] destroyHiredMerchant(int id) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.DESTROY_HIRED_MERCHANT.getValue());
mplew.writeInt(id);
return mplew.getPacket();
}
public static byte[] shopItemUpdate(IMaplePlayerShop shop) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.雇佣商店_更新信息.getValue());
if (shop.getShopType() == 1) {
mplew.writeLong(shop.getMeso());
}
mplew.write(shop.getItems().size());
for (MaplePlayerShopItem item : shop.getItems()) {
mplew.writeShort(item.bundles);
mplew.writeShort(item.item.getQuantity());
mplew.writeLong(item.price);
PacketHelper.addItemInfo(mplew, item.item);
}
mplew.writeShort(0);
return mplew.getPacket();
}
public static byte[] shopVisitorAdd(MapleCharacter chr, int slot) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.访问.getValue());
mplew.write(slot);
PacketHelper.addCharLook(mplew, chr, false, chr.isZeroSecondLook());
mplew.writeMapleAsciiString(chr.getName());
mplew.writeShort(chr.getJob());
return mplew.getPacket();
}
public static byte[] shopVisitorLeave(byte slot) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.退出.getValue());
mplew.write(slot);
return mplew.getPacket();
}
public static byte[] Merchant_Buy_Error(byte message) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.雇佣商店_错误提示.getValue());
mplew.write(message);
return mplew.getPacket();
}
public static byte[] updateHiredMerchant(HiredMerchant shop) {
return updateHiredMerchant(shop, true);
}
public static byte[] updateHiredMerchant(HiredMerchant shop, boolean update) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(update ? SendPacketOpcode.UPDATE_HIRED_MERCHANT.getValue() : SendPacketOpcode.CHANGE_HIRED_MERCHANT_NAME.getValue());
mplew.writeInt(shop.getOwnerId());
PacketHelper.addInteraction(mplew, shop);
return mplew.getPacket();
}
public static byte[] hiredMerchantOwnerLeave() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.雇佣商店_关闭完成.getValue());
mplew.write(0);
return mplew.getPacket();
}
public static byte[] merchItem_Message(byte op) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MERCH_ITEM_MSG.getValue());
mplew.write(op);
return mplew.getPacket();
}
public static byte[] merchItemStore(byte op) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MERCH_ITEM_STORE.getValue());
mplew.write(op);
switch (op) {
case 42:
mplew.writeInt(0);
mplew.writeLong(0L);
break;
default:
mplew.write(0);
}
return mplew.getPacket();
}
public static byte[] merchItemStore(int mapId, int ch) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MERCH_ITEM_STORE.getValue());
mplew.write(43);
mplew.writeInt(9030000);
mplew.writeInt(mapId);
mplew.write(mapId != 999999999 ? ch : 0);
return mplew.getPacket();
}
public static byte[] merchItemStore_ItemData(MerchItemPackage pack) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MERCH_ITEM_STORE.getValue());
mplew.write(41);
mplew.writeInt(9030000);
mplew.writeInt(32272);
mplew.writeZero(5);
mplew.writeLong(pack.getMesos());
mplew.write(0);
mplew.write(pack.getItems().size());
for (Item item : pack.getItems()) {
PacketHelper.addItemInfo(mplew, item);
}
mplew.writeZero(3);
return mplew.getPacket();
}
public static byte[] getMiniGame(MapleClient c, MapleMiniGame minigame) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(5);
mplew.write(minigame.getGameType());
mplew.write(minigame.getMaxSize());
mplew.writeShort((short) minigame.getVisitorSlot(c.getPlayer()));
PacketHelper.addCharLook(mplew, minigame.getMCOwner(), false, false);
mplew.writeMapleAsciiString(minigame.getOwnerName());
mplew.writeShort(minigame.getMCOwner().getJob());
for (Pair visitorz : minigame.getVisitors()) {
mplew.write(((Byte) visitorz.getLeft()));
PacketHelper.addCharLook(mplew, (MapleCharacter) visitorz.getRight(), false, false);
mplew.writeMapleAsciiString(((MapleCharacter) visitorz.getRight()).getName());
mplew.writeShort(((MapleCharacter) visitorz.getRight()).getJob());
}
mplew.write(-1);
mplew.write(0);
addGameInfo(mplew, minigame.getMCOwner(), minigame);
for (Pair visitorz : minigame.getVisitors()) {
mplew.write(((Byte) visitorz.getLeft()));
addGameInfo(mplew, (MapleCharacter) visitorz.getRight(), minigame);
}
mplew.write(-1);
mplew.writeMapleAsciiString(minigame.getDescription());
mplew.writeShort(minigame.getPieceType());
return mplew.getPacket();
}
public static byte[] getMiniGameReady(boolean ready) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(ready ? 56 : 57);
return mplew.getPacket();
}
public static byte[] getMiniGameExitAfter(boolean ready) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(ready ? 54 : 55);
return mplew.getPacket();
}
public static byte[] getMiniGameStart(int loser) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(59);
mplew.write(loser == 1 ? 0 : 1);
return mplew.getPacket();
}
public static byte[] getMiniGameSkip(int slot) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(61);
mplew.write(slot);
return mplew.getPacket();
}
public static byte[] getMiniGameRequestTie() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(48);
return mplew.getPacket();
}
public static byte[] getMiniGameDenyTie() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(49);
return mplew.getPacket();
}
public static byte[] getMiniGameFull() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.writeShort(5);
mplew.write(2);
return mplew.getPacket();
}
public static byte[] getMiniGameMoveOmok(int move1, int move2, int move3) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(62);
mplew.writeInt(move1);
mplew.writeInt(move2);
mplew.write(move3);
return mplew.getPacket();
}
public static byte[] getMiniGameNewVisitor(MapleCharacter c, int slot, MapleMiniGame game) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(4);
mplew.write(slot);
PacketHelper.addCharLook(mplew, c, false, false);
mplew.writeMapleAsciiString(c.getName());
mplew.writeShort(c.getJob());
addGameInfo(mplew, c, game);
return mplew.getPacket();
}
public static void addGameInfo(MaplePacketLittleEndianWriter mplew, MapleCharacter chr, MapleMiniGame game) {
mplew.writeInt(game.getGameType());
mplew.writeInt(game.getWins(chr));
mplew.writeInt(game.getTies(chr));
mplew.writeInt(game.getLosses(chr));
mplew.writeInt(game.getScore(chr));
}
public static byte[] getMiniGameClose(byte number) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(10);
mplew.write(1);
mplew.write(number);
return mplew.getPacket();
}
public static byte[] getMatchCardStart(MapleMiniGame game, int loser) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(59);
mplew.write(loser == 1 ? 0 : 1);
int times = game.getPieceType() == 2 ? 30 : game.getPieceType() == 1 ? 20 : 12;
mplew.write(times);
for (int i = 1; i <= times; i++) {
mplew.writeInt(game.getCardId(i));
}
return mplew.getPacket();
}
public static byte[] getMatchCardSelect(int turn, int slot, int firstslot, int type) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(66);
mplew.write(turn);
mplew.write(slot);
if (turn == 0) {
mplew.write(firstslot);
mplew.write(type);
}
return mplew.getPacket();
}
public static byte[] getMiniGameResult(MapleMiniGame game, int type, int x) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(60);
mplew.write(type);
game.setPoints(x, type);
if (type != 0) {
game.setPoints(x == 1 ? 0 : 1, type == 2 ? 0 : 1);
}
if (type != 1) {
if (type == 0) {
mplew.write(x == 1 ? 0 : 1);
} else {
mplew.write(x);
}
}
addGameInfo(mplew, game.getMCOwner(), game);
for (Pair visitorz : game.getVisitors()) {
addGameInfo(mplew, (MapleCharacter) visitorz.right, game);
}
return mplew.getPacket();
}
public static byte[] MerchantVisitorView(Map<String, AbstractPlayerStore.VisitorInfo> visitor) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.雇佣商店_查看访问名单.getValue());
mplew.writeShort(visitor.size());
for (Map.Entry ret : visitor.entrySet()) {
mplew.writeMapleAsciiString((String) ret.getKey());
mplew.writeInt(((AbstractPlayerStore.VisitorInfo) ret.getValue()).getInTime());
}
return mplew.getPacket();
}
public static byte[] MerchantBlackListView(List<String> blackList) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.PLAYER_INTERACTION.getValue());
mplew.write(InteractionOpcode.雇佣商店_查看黑名单.getValue());
mplew.writeShort(blackList.size());
for (String visit : blackList) {
mplew.writeMapleAsciiString(visit);
}
return mplew.getPacket();
}
}