package handling.channel.handler;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.Item;
import client.inventory.ItemFlag;
import client.inventory.MapleInventoryType;
import constants.ItemConstants;
import handling.InteractionOpcode;
import handling.world.WorldBroadcastService;
import java.util.Arrays;
import org.apache.log4j.Logger;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MapleTrade;
import server.ServerProperties;
import server.maps.FieldLimitType;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.shops.HiredMerchant;
import server.shops.IMaplePlayerShop;
import server.shops.MapleMiniGame;
import server.shops.MaplePlayerShop;
import server.shops.MaplePlayerShopItem;
import tools.FileoutputUtil;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.StringUtil;
import tools.data.input.SeekableLittleEndianAccessor;
import tools.packet.PlayerShopPacket;
public class PlayerInteractionHandler {
private static final Logger log = Logger.getLogger(PlayerInteractionHandler.class);
public static void PlayerInteraction(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) {
byte mode = slea.readByte();
InteractionOpcode action = InteractionOpcode.getByAction(mode);
if (chr == null || (action == null)) {
FileoutputUtil.log("玩家互动未知的操作类型: " + mode + " " + slea.toString());
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
chr.setScrolledPosition((short) 0);
if (chr.isShowPacket()) {
chr.dropMessage(5, "玩家互动操作类型: " + action);
}
switch (action) {
case 创建:
if ((chr.getPlayerShop() != null) || (c.getChannelServer().isShutdown()) || (chr.hasBlockedInventory())) {
chr.dropMessage(1, "现在还不能进行.");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
byte createType = slea.readByte();
if (createType == 4) {
MapleTrade.startTrade(chr);
} else {
if ((createType != 1) && (createType != 2) && (createType != 5) && (createType != 6)) {
break;
}
if ((!chr.getMap().getMapObjectsInRange(chr.getTruePosition(), 20000.0D, Arrays.asList(new MapleMapObjectType[]{MapleMapObjectType.SHOP, MapleMapObjectType.HIRED_MERCHANT})).isEmpty()) || (!chr.getMap().getPortalsInRange(chr.getTruePosition(), 20000.0D).isEmpty())) {
chr.dropMessage(1, "无法在这个地方使用.");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if (((createType == 1) || (createType == 2)) && ((FieldLimitType.Minigames.check(chr.getMap().getFieldLimit())) || (chr.getMap().allowPersonalShop()))) {
chr.dropMessage(1, "无法在这个地方使用.");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
String desc = slea.readMapleAsciiString();
String pass = "";
if (slea.readByte() > 0) {
pass = slea.readMapleAsciiString();
}
if ((createType == 1) || (createType == 2)) {
int piece = slea.readByte();
int itemId = createType == 1 ? 4080000 + piece : 4080100;
if ((!chr.haveItem(itemId)) || ((c.getPlayer().getMapId() >= 910000001) && (c.getPlayer().getMapId() <= 910000022))) {
return;
}
MapleMiniGame game = new MapleMiniGame(chr, itemId, desc, pass, createType);
game.setPieceType(piece);
chr.setPlayerShop(game);
game.setAvailable(true);
game.setOpen(true);
game.send(c);
chr.getMap().addMapObject(game);
game.update();
} else if (chr.getMap().allowPersonalShop()) {
Item shop = c.getPlayer().getInventory(MapleInventoryType.CASH).getItem((short) (byte) slea.readShort());
if ((shop == null) || (shop.getQuantity() <= 0) || (shop.getItemId() != slea.readInt()) || (c.getPlayer().getMapId() < 910000001) || (c.getPlayer().getMapId() > 910000022)) {
return;
}
if (createType == 4) {
MaplePlayerShop mps = new MaplePlayerShop(chr, shop.getItemId(), desc);
chr.setPlayerShop(mps);
chr.getMap().addMapObject(mps);
c.getSession().write(PlayerShopPacket.getPlayerStore(chr, true));
} else if (HiredMerchantHandler.UseHiredMerchant(chr.getClient(), false)) {
HiredMerchant merch = new HiredMerchant(chr, shop.getItemId(), desc);
chr.setPlayerShop(merch);
chr.getMap().addMapObject(merch);
c.getSession().write(PlayerShopPacket.getHiredMerch(chr, merch, true));
}
}
}
break;
case 交易邀请:
if (chr.getMap() == null) {
return;
}
MapleCharacter chrr = chr.getMap().getCharacterById(slea.readInt());
if ((chrr == null) || (c.getChannelServer().isShutdown()) || (chrr.hasBlockedInventory())) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
MapleTrade.inviteTrade(chr, chrr);
break;
case 拒绝邀请:
MapleTrade.declineTrade(chr);
break;
case 访问:
if (c.getChannelServer().isShutdown()) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if ((chr.getTrade() != null) && (chr.getTrade().getPartner() != null) && (!chr.getTrade().inTrade())) {
MapleTrade.visitTrade(chr, chr.getTrade().getPartner().getChr());
} else {
if ((chr.getMap() == null) || (chr.getTrade() != null)) {
break;
}
int obid = slea.readInt();
MapleMapObject ob = chr.getMap().getMapObject(obid, MapleMapObjectType.HIRED_MERCHANT);
if (ob == null) {
ob = chr.getMap().getMapObject(obid, MapleMapObjectType.SHOP);
}
if (((ob instanceof IMaplePlayerShop)) && (chr.getPlayerShop() == null)) {
IMaplePlayerShop ips = (IMaplePlayerShop) ob;
if ((ob instanceof HiredMerchant)) {
HiredMerchant merchant = (HiredMerchant) ips;
if ((merchant.isOwner(chr)) && (merchant.isOpen()) && (merchant.isAvailable())) {
merchant.setOpen(false);
merchant.removeAllVisitors(18, 1);
chr.setPlayerShop(ips);
c.getSession().write(PlayerShopPacket.getHiredMerch(chr, merchant, false));
} else if ((!merchant.isOpen()) || (!merchant.isAvailable())) {
chr.dropMessage(1, "主人正在整理商店物品\r\n请稍后再度光临!");
} else if (ips.getFreeSlot() == -1) {
chr.dropMessage(1, "店铺已达到最大人数\r\n请稍后再度光临!");
} else if (merchant.isInBlackList(chr.getName())) {
chr.dropMessage(1, "你被禁止进入该店铺");
} else {
chr.setPlayerShop(ips);
merchant.addVisitor(chr);
c.getSession().write(PlayerShopPacket.getHiredMerch(chr, merchant, false));
}
} else if (((ips instanceof MaplePlayerShop)) && (((MaplePlayerShop) ips).isBanned(chr.getName()))) {
chr.dropMessage(1, "你被禁止进入该店铺");
} else if ((ips.getFreeSlot() < 0) || (ips.getVisitorSlot(chr) > -1) || (!ips.isOpen()) || (!ips.isAvailable())) {
c.getSession().write(PlayerShopPacket.getMiniGameFull());
} else {
if ((slea.available() > 0L) && (slea.readByte() > 0)) {
String pass = slea.readMapleAsciiString();
if (!pass.equals(ips.getPassword())) {
c.getPlayer().dropMessage(1, "你输入的密码不正确.");
return;
}
} else if (ips.getPassword().length() > 0) {
c.getPlayer().dropMessage(1, "你输入的密码不正确.");
return;
}
chr.setPlayerShop(ips);
ips.addVisitor(chr);
if ((ips instanceof MapleMiniGame)) {
((MapleMiniGame) ips).send(c);
} else {
c.getSession().write(PlayerShopPacket.getPlayerStore(chr, false));
}
}
}
}
break;
case 聊天:
String message = slea.readMapleAsciiString();
if (chr.getTrade() != null) {
chr.getTrade().chat(message);
} else {
if (chr.getPlayerShop() == null) {
break;
}
IMaplePlayerShop ips = chr.getPlayerShop();
ips.broadcastToVisitors(PlayerShopPacket.shopChat(chr.getName() + " : " + message, ips.getVisitorSlot(chr)));
if (ips.getShopType() == 1) {
ips.getMessages().add(new Pair(chr.getName() + " : " + message, ips.getVisitorSlot(chr)));
}
if (chr.getClient().isMonitored()) {
WorldBroadcastService.getInstance().broadcastGMMessage(MaplePacketCreator.serverMessageRedText(chr.getName() + " said in " + ips.getOwnerName() + " shop : " + message));
}
}
break;
case 退出:
if (chr.getTrade() != null) {
MapleTrade.cancelTrade(chr.getTrade(), chr.getClient(), chr);
} else {
IMaplePlayerShop ips = chr.getPlayerShop();
if (ips == null) {
return;
}
if ((ips.isOwner(chr)) && (ips.getShopType() != 1)) {
ips.closeShop(false, ips.isAvailable());
// ips.setOpen(true);
// ips.setAvailable(true);
} else {
ips.removeVisitor(chr);
if ((ips.isOwner(chr)) && (ips.isOpen() == false) && (ips.isAvailable())) {
ips.setOpen(true);
}
}
chr.setPlayerShop(null);
}
break;
case 管理员修改雇佣商店名称:
IMaplePlayerShop shop = chr.getPlayerShop();
if ((shop == null) || (!shop.isOwner(chr)) || (shop.getShopType() >= 3) || (shop.isAvailable())) {
break;
}
if (chr.getMap().allowPersonalShop()) {
if (c.getChannelServer().isShutdown()) {
chr.dropMessage(1, "服务器即将关闭维护,暂时无法进行此操作。.");
c.getSession().write(MaplePacketCreator.enableActions());
shop.closeShop(shop.getShopType() == 1, false);
return;
}
if ((shop.getShopType() == 1) && (HiredMerchantHandler.UseHiredMerchant(chr.getClient(), false))) {
HiredMerchant merchant = (HiredMerchant) shop;
merchant.setStoreid(c.getChannelServer().addMerchant(merchant));
merchant.setOpen(true);
merchant.setAvailable(true);
shop.saveItems();
chr.getMap().broadcastMessage(PlayerShopPacket.spawnHiredMerchant(merchant));
chr.setPlayerShop(null);
} else {
if (shop.getShopType() != 2) {
break;
}
shop.setOpen(true);
shop.setAvailable(true);
shop.update();
}
} else {
chr.getClient().disconnect(true, false);
c.getSession().close(true);
}
break;
case 设置物品:
case 设置物品_001:
case 设置物品_002:
case 设置物品_003:
MapleInventoryType ivType = MapleInventoryType.getByType(slea.readByte());
Item item = chr.getInventory(ivType).getItem((short) (byte) slea.readShort());
short quantity = slea.readShort();
byte targetSlot = slea.readByte();
if (chr.getTrade() == null || item == null) {
break;
}
boolean canTrade = true;
if (item.getItemId() == 4000463 && !canTrade) {
chr.dropMessage(1, "该道具无法进行交易.");
c.getSession().write(MaplePacketCreator.enableActions());
} else if ((quantity <= item.getQuantity() && quantity >= 0) || ItemConstants.is飞镖道具(item.getItemId()) || ItemConstants.is子弹道具(item.getItemId())) {
chr.getTrade().setItems(c, item, targetSlot, quantity);
}
break;
case 设置金币:
case 设置金币_005:
case 设置金币_006:
case 设置金币_007:
MapleTrade trade = chr.getTrade();
if (trade == null) {
break;
}
trade.setMeso(slea.readInt());
break;
case 确认交易:
case 确认交易_009:
case 确认交易_00A:
case 确认交易_00B:
if (chr.getTrade() == null) {
break;
}
MapleTrade.completeTrade(chr);
break;
case 添加物品:
case 添加物品_0020:
case 添加物品_0021:
case 添加物品_0022:
MapleInventoryType type = MapleInventoryType.getByType(slea.readByte());
final byte slot = (byte) slea.readShort();
short bundles = slea.readShort();
short perBundle = slea.readShort();
int price = slea.readInt();
if ((price <= 0) || (bundles <= 0) || (perBundle <= 0)) {
chr.dropMessage(1, "添加物品出现错误(1)");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
shop = chr.getPlayerShop();
if ((shop == null) || (!shop.isOwner(chr)) || ((shop instanceof MapleMiniGame))) {
return;
}
Item ivItem = chr.getInventory(type).getItem((short) slot);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (ivItem == null) {
break;
}
long check = bundles * perBundle;
if ((check > 32767L) || (check <= 0L)) {
return;
}
short bundles_perbundle = (short) (bundles * perBundle);
if (ivItem.getQuantity() >= bundles_perbundle) {
short flag = ivItem.getFlag();
if (ItemFlag.封印.check(flag)) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if (ItemFlag.不可交易.check(flag) && !ItemFlag.KARMA_USE.check(flag)) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if ((ii.isDropRestricted(ivItem.getItemId()) || ii.isAccountShared(ivItem.getItemId())) && !ItemFlag.KARMA_USE.check(flag)) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if (ivItem.getItemId() == 4000463) {
chr.dropMessage(1, "该道具无法进行贩卖.");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if ((bundles_perbundle >= 50) && (ivItem.getItemId() == 2340000)) {
c.setMonitored(true);
}
if (ItemConstants.getLowestPrice(ivItem.getItemId()) > price) {
c.getPlayer().dropMessage(1, "The lowest you can sell this for is " + ItemConstants.getLowestPrice(ivItem.getItemId()));
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if ((ItemConstants.is飞镖道具(ivItem.getItemId())) || (ItemConstants.is子弹道具(ivItem.getItemId()))) {
MapleInventoryManipulator.removeFromSlot(c, type, (short) slot, ivItem.getQuantity(), true);
Item sellItem = ivItem.copy();
shop.addItem(new MaplePlayerShopItem(sellItem, (short) 1, price));
} else {
MapleInventoryManipulator.removeFromSlot(c, type, (short) slot, bundles_perbundle, true);
Item sellItem = ivItem.copy();
sellItem.setQuantity(perBundle);
shop.addItem(new MaplePlayerShopItem(sellItem, bundles, price));
}
c.getSession().write(PlayerShopPacket.shopItemUpdate(shop));
} else {
chr.dropMessage(1, "添加物品的数量错误。如果是飞镖,子弹之类请充了后在进行贩卖。");
}
break;
case BUY_ITEM_STORE:
case 雇佣商店_购买道具:
case 雇佣商店_购买道具0024:
case 雇佣商店_购买道具0025:
case 雇佣商店_购买道具0026:
//case 雇佣商店_求购道具:
int item1 = slea.readByte();
quantity = slea.readShort();
shop = chr.getPlayerShop();
if ((shop == null) || (shop.isOwner(chr)) || ((shop instanceof MapleMiniGame)) || (item1 >= shop.getItems().size())) {
chr.dropMessage(1, "购买道具出现错误(1)");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
MaplePlayerShopItem tobuy = (MaplePlayerShopItem) shop.getItems().get(item1);
if (tobuy == null) {
chr.dropMessage(1, "购买道具出现错误(2)");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
check = tobuy.bundles * quantity;
long check2 = tobuy.price * quantity;
long check3 = tobuy.item.getQuantity() * quantity;
if ((check <= 0L) || (check2 > 9999999999L) || (check2 <= 0L) || (check3 > 32767L) || (check3 < 0L)) {
chr.dropMessage(1, "购买道具出现错误(3)");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if (chr.getMeso() - check2 < 0L) {
c.getSession().write(PlayerShopPacket.Merchant_Buy_Error((byte) 2));
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if ((tobuy.bundles < quantity) || ((tobuy.bundles % quantity != 0) && (ItemConstants.isEquip(tobuy.item.getItemId()))) || (chr.getMeso() - check2 > 9999999999L) || (shop.getMeso() + check2 < 0L) || (shop.getMeso() + check2 > 9999999999L)) {
chr.dropMessage(1, "购买道具出现错误(4)");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
if ((quantity >= 50) && (tobuy.item.getItemId() == 2340000)) {
c.setMonitored(true);
}
shop.buy(c, item1, quantity);
shop.broadcastToVisitors(PlayerShopPacket.shopItemUpdate(shop));
break;
case 雇佣商店_求购道具:
chr.dropMessage(1, "当前服务器暂不支持求购道具.");
break;
case 雇佣商店_维护:
slea.skip(1);
byte type1 = slea.readByte();
slea.skip(3);
int obid = slea.readInt();
if (type1 == 6) {
MapleMapObject ob = chr.getMap().getMapObject(obid, MapleMapObjectType.HIRED_MERCHANT);
if (((ob instanceof IMaplePlayerShop)) && (chr.getPlayerShop() == null)) {
IMaplePlayerShop ips = (IMaplePlayerShop) ob;
if ((ob instanceof HiredMerchant)) {
HiredMerchant merchant = (HiredMerchant) ips;
if ((merchant.isOwner(chr)) && (merchant.isOpen()) && (merchant.isAvailable())) {
merchant.setOpen(false);
merchant.removeAllVisitors(18, 1);
chr.setPlayerShop(ips);
c.getSession().write(PlayerShopPacket.getHiredMerch(chr, merchant, false));
} else if ((!merchant.isOpen()) || (!merchant.isAvailable())) {
chr.dropMessage(1, "主人正在整理商店物品\r\n请稍后再度光临!");
} else if (ips.getFreeSlot() == -1) {
chr.dropMessage(1, "店铺已达到最大人数\r\n请稍后再度光临!");
} else if (merchant.isInBlackList(chr.getName())) {
chr.dropMessage(1, "你被禁止进入该店铺");
}
}
}
} else {
c.getSession().write(MaplePacketCreator.enableActions());
}
break;
case 移除物品:
slea.skip(1);
int slot1 = slea.readShort();
IMaplePlayerShop shop1 = chr.getPlayerShop();
if (chr.isShowPacket()) {
chr.dropMessage(5, "移除商店道具: 道具数量 " + shop1.getItems().size() + " slot " + slot1);
}
if ((shop1 == null) || (!shop1.isOwner(chr)) || ((shop1 instanceof MapleMiniGame)) || (shop1.getItems().size() <= 0) || (shop1.getItems().size() <= slot1) || (slot1 < 0)) {
return;
}
MaplePlayerShopItem item2 = (MaplePlayerShopItem) shop1.getItems().get(slot1);
if ((item2 != null)
&& (item2.bundles > 0)) {
Item item_get = item2.item.copy();
check = item2.bundles * item2.item.getQuantity();
if ((check < 0L) || (check > 32767L)) {
if (chr.isShowPacket()) {
chr.dropMessage(5, "移除商店道具出错: check " + check);
}
return;
}
item_get.setQuantity((short) (int) check);
if ((item_get.getQuantity() >= 50) && (item2.item.getItemId() == 2340000)) {
c.setMonitored(true);
}
if (MapleInventoryManipulator.checkSpace(c, item_get.getItemId(), item_get.getQuantity(), item_get.getOwner())) {
MapleInventoryManipulator.addFromDrop(c, item_get, false);
item2.bundles = 0;
shop1.removeFromSlot(slot1);
}
}
c.getSession().write(PlayerShopPacket.shopItemUpdate(shop1));
break;
case 打开:
// c.getPlayer().haveItem(mode, 1, false, true)
shop = chr.getPlayerShop();
if ((shop == null) || (!shop.isOwner(chr)) || (shop.getShopType() >= 3) || (shop.isAvailable())) {
break;
}
if (chr.getMap().allowPersonalShop()) {
if (c.getChannelServer().isShutdown()) {
chr.dropMessage(1, "服务器即将关闭维护,暂时无法进行此操作。.");
c.getSession().write(MaplePacketCreator.enableActions());
shop.closeShop(shop.getShopType() == 1, false);
return;
}
if ((shop.getShopType() == 1) && (HiredMerchantHandler.UseHiredMerchant(chr.getClient(), false))) {
HiredMerchant merchant = (HiredMerchant) shop;
merchant.setStoreid(c.getChannelServer().addMerchant(merchant));
merchant.setOpen(true);
merchant.setAvailable(true);
shop.saveItems();
chr.getMap().broadcastMessage(PlayerShopPacket.spawnHiredMerchant(merchant));
chr.setPlayerShop(null);
// c.getActive().finished(chr, activeEvent.activeType.开设雇佣商店);
} else {
if (shop.getShopType() != 2) {
break;
}
shop.setOpen(true);
shop.setAvailable(true);
shop.update();
}
} else {
c.getSession().close(true);
}
break;
case 雇佣商店_关闭完成:
case 雇佣商店_维护开启:
shop = chr.getPlayerShop();
if ((shop != null) && ((shop instanceof HiredMerchant)) && (shop.isOwner(chr)) && (shop.isAvailable())) {
shop.setOpen(true);
shop.saveItems();
shop.getMessages().clear();
shop.removeAllVisitors(-1, -1);
}
c.getSession().write(MaplePacketCreator.enableActions());
break;
case 雇佣商店_整理:
IMaplePlayerShop imps = chr.getPlayerShop();
if ((imps == null) || (!imps.isOwner(chr)) || ((imps instanceof MapleMiniGame))) {
break;
}
for (int i = 0; i < imps.getItems().size(); i++) {
if (((MaplePlayerShopItem) imps.getItems().get(i)).bundles == 0) {
imps.getItems().remove(i);
}
}
if (chr.getMeso() + imps.getMeso() > 0) {
chr.gainMeso(imps.getMeso(), false);
FileoutputUtil.log("[雇佣] " + chr.getName() + " 雇佣整理获得金币: " + imps.getMeso() + " 时间: " + FileoutputUtil.CurrentReadable_Date());
FileoutputUtil.hiredMerchLog(chr.getName(), "雇佣整理获得金币: " + imps.getMeso());
imps.setMeso(0);
}
c.getSession().write(PlayerShopPacket.shopItemUpdate(imps));
break;
case 雇佣商店_关闭:
IMaplePlayerShop merchant = chr.getPlayerShop();
if ((merchant != null) && (merchant.getShopType() == 1) && (merchant.isOwner(chr))) {
c.getSession().write(PlayerShopPacket.hiredMerchantOwnerLeave());
merchant.removeAllVisitors(-1, -1);
chr.setPlayerShop(null);
merchant.closeShop(true, true);
} else {
chr.dropMessage(1, "关闭商店出现未知错误.");
c.getSession().write(MaplePacketCreator.enableActions());
}
break;
case 雇佣商店_错误提示:
chr.dropMessage(1, "暂不支持管理员修改雇佣商店的名字.");
c.getSession().write(MaplePacketCreator.enableActions());
break;
case 雇佣商店_查看访问名单:
merchant = chr.getPlayerShop();
if ((merchant == null) || (merchant.getShopType() != 1) || (!merchant.isOwner(chr))) {
break;
}
((HiredMerchant) merchant).sendVisitor(c);
break;
case 雇佣商店_查看黑名单:
merchant = chr.getPlayerShop();
if ((merchant == null) || (merchant.getShopType() != 1) || (!merchant.isOwner(chr))) {
break;
}
((HiredMerchant) merchant).sendBlackList(c);
break;
case 雇佣商店_添加黑名单:
merchant = chr.getPlayerShop();
if ((merchant == null) || (merchant.getShopType() != 1) || (!merchant.isOwner(chr))) {
break;
}
((HiredMerchant) merchant).addBlackList(slea.readMapleAsciiString());
break;
case 雇佣商店_移除黑名单:
merchant = chr.getPlayerShop();
if ((merchant == null) || (merchant.getShopType() != 1) || (!merchant.isOwner(chr))) {
break;
}
((HiredMerchant) merchant).removeBlackList(slea.readMapleAsciiString());
break;
case 雇佣商店_修改商店名称:
merchant = chr.getPlayerShop();
if ((merchant == null) || (merchant.getShopType() != 1) || (!merchant.isOwner(chr))) {
break;
}
String desc = slea.readMapleAsciiString();
if (((HiredMerchant) merchant).canChangeName()) {
merchant.setDescription(desc);
} else {
c.getSession().write(MaplePacketCreator.craftMessage("还不能变更名称,还需要等待" + ((HiredMerchant) merchant).getChangeNameTimeLeft() + "秒。"));
}
break;
case GIVE_UP:
IMaplePlayerShop ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
MapleMiniGame game = (MapleMiniGame) ips;
if (game.isOpen()) {
break;
}
game.broadcastToVisitors(PlayerShopPacket.getMiniGameResult(game, 0, game.getVisitorSlot(chr)));
game.nextLoser();
game.setOpen(true);
game.update();
game.checkExitAfterGame();
break;
case EXPEL:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))
|| (!((MapleMiniGame) ips).isOpen())) {
break;
}
ips.removeAllVisitors(3, 1);
break;
case READY:
case UN_READY:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if ((!game.isOwner(chr)) && (game.isOpen())) {
game.setReady(game.getVisitorSlot(chr));
game.broadcastToVisitors(PlayerShopPacket.getMiniGameReady(game.isReady(game.getVisitorSlot(chr))));
}
break;
case START:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if ((game.isOwner(chr)) && (game.isOpen())) {
for (int i = 1; i < ips.getSize(); i++) {
if (!game.isReady(i)) {
return;
}
}
game.setGameType();
game.shuffleList();
if (game.getGameType() == 1) {
game.broadcastToVisitors(PlayerShopPacket.getMiniGameStart(game.getLoser()));
} else {
game.broadcastToVisitors(PlayerShopPacket.getMatchCardStart(game, game.getLoser()));
}
game.setOpen(false);
game.update();
}
break;
case REQUEST_TIE:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if (game.isOpen()) {
break;
}
if (game.isOwner(chr)) {
game.broadcastToVisitors(PlayerShopPacket.getMiniGameRequestTie(), false);
} else {
game.getMCOwner().getClient().getSession().write(PlayerShopPacket.getMiniGameRequestTie());
}
game.setRequestedTie(game.getVisitorSlot(chr));
break;
case ANSWER_TIE:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if (game.isOpen()) {
break;
}
if ((game.getRequestedTie() > -1) && (game.getRequestedTie() != game.getVisitorSlot(chr))) {
if (slea.readByte() > 0) {
game.broadcastToVisitors(PlayerShopPacket.getMiniGameResult(game, 1, game.getRequestedTie()));
game.nextLoser();
game.setOpen(true);
game.update();
game.checkExitAfterGame();
} else {
game.broadcastToVisitors(PlayerShopPacket.getMiniGameDenyTie());
}
game.setRequestedTie(-1);
}
break;
case SKIP:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if (game.isOpen()) {
break;
}
if (game.getLoser() != ips.getVisitorSlot(chr)) {
ips.broadcastToVisitors(PlayerShopPacket.shopChat("Turn could not be skipped by " + chr.getName() + ". Loser: " + game.getLoser() + " Visitor: " + ips.getVisitorSlot(chr), ips.getVisitorSlot(chr)));
return;
}
ips.broadcastToVisitors(PlayerShopPacket.getMiniGameSkip(ips.getVisitorSlot(chr)));
game.nextLoser();
break;
case MOVE_OMOK:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if (game.isOpen()) {
break;
}
if (game.getLoser() != game.getVisitorSlot(chr)) {
game.broadcastToVisitors(PlayerShopPacket.shopChat("Omok could not be placed by " + chr.getName() + ". Loser: " + game.getLoser() + " Visitor: " + game.getVisitorSlot(chr), game.getVisitorSlot(chr)));
return;
}
game.setPiece(slea.readInt(), slea.readInt(), slea.readByte(), chr);
break;
case SELECT_CARD:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if (game.isOpen()) {
break;
}
if (game.getLoser() != game.getVisitorSlot(chr)) {
game.broadcastToVisitors(PlayerShopPacket.shopChat("Card could not be placed by " + chr.getName() + ". Loser: " + game.getLoser() + " Visitor: " + game.getVisitorSlot(chr), game.getVisitorSlot(chr)));
return;
}
if (slea.readByte() != game.getTurn()) {
game.broadcastToVisitors(PlayerShopPacket.shopChat("Omok could not be placed by " + chr.getName() + ". Loser: " + game.getLoser() + " Visitor: " + game.getVisitorSlot(chr) + " Turn: " + game.getTurn(), game.getVisitorSlot(chr)));
return;
}
int slot2 = slea.readByte();
int turn = game.getTurn();
int fs = game.getFirstSlot();
if (turn == 1) {
game.setFirstSlot(slot2);
if (game.isOwner(chr)) {
game.broadcastToVisitors(PlayerShopPacket.getMatchCardSelect(turn, slot2, fs, turn), false);
} else {
game.getMCOwner().getClient().getSession().write(PlayerShopPacket.getMatchCardSelect(turn, slot2, fs, turn));
}
game.setTurn(0);
return;
}
if ((fs > 0) && (game.getCardId(fs + 1) == game.getCardId(slot2 + 1))) {
game.broadcastToVisitors(PlayerShopPacket.getMatchCardSelect(turn, slot2, fs, game.isOwner(chr) ? 2 : 3));
game.setPoints(game.getVisitorSlot(chr));
} else {
game.broadcastToVisitors(PlayerShopPacket.getMatchCardSelect(turn, slot2, fs, game.isOwner(chr) ? 0 : 1));
game.nextLoser();
}
game.setTurn(1);
game.setFirstSlot(0);
break;
case EXIT_AFTER_GAME:
case CANCEL_EXIT:
ips = chr.getPlayerShop();
if ((ips == null) || (!(ips instanceof MapleMiniGame))) {
break;
}
game = (MapleMiniGame) ips;
if (game.isOpen()) {
break;
}
game.setExitAfter(chr);
game.broadcastToVisitors(PlayerShopPacket.getMiniGameExitAfter(game.isExitAfter(chr)));
break;
default:
if (ServerProperties.ShowPacket()) {
FileoutputUtil.log("玩家互动未知的操作类型: 0x" + StringUtil.getLeftPaddedStr(Integer.toHexString(mode).toUpperCase(), '0', 2) + " " + slea.toString());
}
c.getSession().write(MaplePacketCreator.enableActions());
}
}
}