From 699835e4664fd4e22d7178b40897e0fd4b366a93 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 24 Aug 2015 17:16:48 +0300 Subject: Move receive code from buyingstorehandler into separate file. --- src/CMakeLists.txt | 2 + src/Makefile.am | 2 + src/net/eathena/buyingstorehandler.cpp | 192 ++-------------------------- src/net/eathena/buyingstorehandler.h | 21 ---- src/net/eathena/buyingstorerecv.cpp | 222 +++++++++++++++++++++++++++++++++ src/net/eathena/buyingstorerecv.h | 57 +++++++++ 6 files changed, 294 insertions(+), 202 deletions(-) create mode 100644 src/net/eathena/buyingstorerecv.cpp create mode 100644 src/net/eathena/buyingstorerecv.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4439abada..f3619eaa9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1542,6 +1542,8 @@ SET(SRCS_EATHENA net/eathena/beinghandler.h net/eathena/buyingstorehandler.cpp net/eathena/buyingstorehandler.h + net/eathena/buyingstorerecv.cpp + net/eathena/buyingstorerecv.h net/eathena/beingtype.h net/eathena/buysellhandler.cpp net/eathena/buysellhandler.h diff --git a/src/Makefile.am b/src/Makefile.am index 66217fd05..810e2529f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1388,6 +1388,8 @@ manaplus_SOURCES += gui/windows/bankwindow.cpp \ net/eathena/beinghandler.h \ net/eathena/buyingstorehandler.cpp \ net/eathena/buyingstorehandler.h \ + net/eathena/buyingstorerecv.cpp \ + net/eathena/buyingstorerecv.h \ net/eathena/beingtype.h \ net/eathena/buysellhandler.cpp \ net/eathena/buysellhandler.h \ diff --git a/src/net/eathena/buyingstorehandler.cpp b/src/net/eathena/buyingstorehandler.cpp index 4fcad8637..9b990fe7e 100644 --- a/src/net/eathena/buyingstorehandler.cpp +++ b/src/net/eathena/buyingstorehandler.cpp @@ -40,6 +40,7 @@ #include "net/ea/eaprotocol.h" +#include "net/eathena/buyingstorerecv.h" #include "net/eathena/messageout.h" #include "net/eathena/protocol.h" @@ -76,43 +77,43 @@ void BuyingStoreHandler::handleMessage(Net::MessageIn &msg) switch (msg.getId()) { case SMSG_BUYINGSTORE_OPEN: - processBuyingStoreOpen(msg); + BuyingStoreRecv::processBuyingStoreOpen(msg); break; case SMSG_BUYINGSTORE_CREATE_FAILED: - processBuyingStoreCreateFailed(msg); + BuyingStoreRecv::processBuyingStoreCreateFailed(msg); break; case SMSG_BUYINGSTORE_OWN_ITEMS: - processBuyingStoreOwnItems(msg); + BuyingStoreRecv::processBuyingStoreOwnItems(msg); break; case SMSG_BUYINGSTORE_SHOW_BOARD: - processBuyingStoreShowBoard(msg); + BuyingStoreRecv::processBuyingStoreShowBoard(msg); break; case SMSG_BUYINGSTORE_HIDE_BOARD: - processBuyingStoreHideBoard(msg); + BuyingStoreRecv::processBuyingStoreHideBoard(msg); break; case SMSG_BUYINGSTORE_ITEMS_LIST: - processBuyingStoreItemsList(msg); + BuyingStoreRecv::processBuyingStoreItemsList(msg); break; case SMSG_BUYINGSTORE_SELL_FAILED: - processBuyingStoreSellFailed(msg); + BuyingStoreRecv::processBuyingStoreSellFailed(msg); break; case SMSG_BUYINGSTORE_REPORT: - processBuyingStoreReport(msg); + BuyingStoreRecv::processBuyingStoreReport(msg); break; case SMSG_BUYINGSTORE_DELETE_ITEM: - processBuyingStoreDeleteItem(msg); + BuyingStoreRecv::processBuyingStoreDeleteItem(msg); break; case SMSG_BUYINGSTORE_SELLER_SELL_FAILED: - processBuyingStoreSellerSellFailed(msg); + BuyingStoreRecv::processBuyingStoreSellerSellFailed(msg); break; default: @@ -120,177 +121,6 @@ void BuyingStoreHandler::handleMessage(Net::MessageIn &msg) } } -void BuyingStoreHandler::processBuyingStoreOpen(Net::MessageIn &msg) -{ - BuyingStoreSlotsListener::distributeEvent(msg.readUInt8("slots")); -} - -void BuyingStoreHandler::processBuyingStoreCreateFailed(Net::MessageIn &msg) -{ - const int16_t result = msg.readInt16("result"); - const int weight = msg.readInt32("weight"); - switch (result) - { - case 1: - default: - NotifyManager::notify(NotifyTypes::BUYING_STORE_CREATE_FAILED); - break; - case 2: - NotifyManager::notify( - NotifyTypes::BUYING_STORE_CREATE_FAILED_WEIGHT, - weight); - break; - case 8: - NotifyManager::notify(NotifyTypes::BUYING_STORE_CREATE_EMPTY); - break; - } -} - -void BuyingStoreHandler::processBuyingStoreOwnItems(Net::MessageIn &msg) -{ - const int count = (msg.readInt16("len") - 12) / 9; - msg.readBeingId("account id"); - msg.readInt32("money limit"); - for (int f = 0; f < count; f ++) - { - msg.readInt32("price"); - msg.readInt16("amount"); - msg.readUInt8("item type"); - msg.readInt16("item id"); - } - PlayerInfo::enableVending(true); - BuyingStoreModeListener::distributeEvent(true); -} - -void BuyingStoreHandler::processBuyingStoreShowBoard(Net::MessageIn &msg) -{ - const BeingId id = msg.readBeingId("owner id"); - const std::string shopName = msg.readString(80, "shop name"); - Being *const dstBeing = actorManager->findBeing(id); - if (dstBeing) - dstBeing->setBuyBoard(shopName); -} - -void BuyingStoreHandler::processBuyingStoreHideBoard(Net::MessageIn &msg) -{ - const BeingId id = msg.readBeingId("owner id"); - Being *const dstBeing = actorManager->findBeing(id); - if (dstBeing) - dstBeing->setBuyBoard(std::string()); - if (dstBeing == localPlayer) - { - PlayerInfo::enableVending(false); - BuyingStoreModeListener::distributeEvent(false); - } -} - -void BuyingStoreHandler::processBuyingStoreItemsList(Net::MessageIn &msg) -{ - const int count = (msg.readInt16("len") - 16) / 9; - const BeingId id = msg.readBeingId("account id"); - const int storeId = msg.readInt32("store id"); - // +++ in future need use it too - msg.readInt32("money limit"); - - Being *const dstBeing = actorManager->findBeing(id); - if (!dstBeing) - return; - - SellDialog *const dialog = CREATEWIDGETR(BuyingStoreSellDialog, - dstBeing->getId(), - storeId); - dialog->setMoney(PlayerInfo::getAttribute(Attributes::MONEY)); - Inventory *const inv = PlayerInfo::getInventory(); - for (int f = 0; f < count; f ++) - { - const int price = msg.readInt32("price"); - const int amount = msg.readInt16("amount"); - const int itemType = msg.readUInt8("item type"); - const int itemId = msg.readInt16("item id"); - - if (!inv) - continue; - const Item *const item = inv->findItem(itemId, ItemColor_one); - if (!item) - continue; - // +++ need add colors support - dialog->addItem(itemId, itemType, ItemColor_one, amount, price); - } -} - -void BuyingStoreHandler::processBuyingStoreSellFailed(Net::MessageIn &msg) -{ - const int16_t result = msg.readInt16("result"); - switch (result) - { - case 3: - NotifyManager::notify( - NotifyTypes::BUYING_STORE_SELL_FAILED_MONEY_LIMIT); - break; - case 4: - NotifyManager::notify(NotifyTypes::BUYING_STORE_SELL_FAILED_EMPTY); - break; - default: - NotifyManager::notify(NotifyTypes::BUYING_STORE_SELL_FAILED); - break; - } -} - -void BuyingStoreHandler::processBuyingStoreSellerSellFailed(Net::MessageIn - &msg) -{ - const int16_t result = msg.readInt16("result"); - msg.readInt16("item id"); - switch (result) - { - case 5: - NotifyManager::notify( - NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED_DEAL); - break; - case 6: - NotifyManager::notify( - NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED_AMOUNT); - break; - case 7: - NotifyManager::notify( - NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED_BALANCE); - break; - default: - NotifyManager::notify( - NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED); - break; - } -} - -void BuyingStoreHandler::processBuyingStoreReport(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt16("item id"); - msg.readInt16("amount"); - msg.readInt32("money limit"); -} - -void BuyingStoreHandler::processBuyingStoreDeleteItem(Net::MessageIn &msg) -{ - Inventory *const inventory = localPlayer - ? PlayerInfo::getInventory() : nullptr; - - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const int amount = msg.readInt16("amount"); - msg.readInt32("price"); - - if (inventory) - { - if (Item *const item = inventory->getItem(index)) - { - item->increaseQuantity(-amount); - if (item->getQuantity() == 0) - inventory->removeItemAt(index); - ArrowsListener::distributeEvent(); - } - } -} - void BuyingStoreHandler::create(const std::string &name, const int maxMoney, const bool flag, diff --git a/src/net/eathena/buyingstorehandler.h b/src/net/eathena/buyingstorehandler.h index 53cc6fcef..3fc1dd603 100644 --- a/src/net/eathena/buyingstorehandler.h +++ b/src/net/eathena/buyingstorehandler.h @@ -52,27 +52,6 @@ class BuyingStoreHandler final : public MessageHandler, const int storeId, const Item *const item, const int amount) const override final; - - protected: - static void processBuyingStoreOpen(Net::MessageIn &msg); - - static void processBuyingStoreCreateFailed(Net::MessageIn &msg); - - static void processBuyingStoreOwnItems(Net::MessageIn &msg); - - static void processBuyingStoreShowBoard(Net::MessageIn &msg); - - static void processBuyingStoreHideBoard(Net::MessageIn &msg); - - static void processBuyingStoreItemsList(Net::MessageIn &msg); - - static void processBuyingStoreSellFailed(Net::MessageIn &msg); - - static void processBuyingStoreReport(Net::MessageIn &msg); - - static void processBuyingStoreDeleteItem(Net::MessageIn &msg); - - static void processBuyingStoreSellerSellFailed(Net::MessageIn &msg); }; } // namespace EAthena diff --git a/src/net/eathena/buyingstorerecv.cpp b/src/net/eathena/buyingstorerecv.cpp new file mode 100644 index 000000000..1a9d3897d --- /dev/null +++ b/src/net/eathena/buyingstorerecv.cpp @@ -0,0 +1,222 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "net/eathena/buyingstorerecv.h" + +#include "actormanager.h" +#include "inventory.h" +#include "notifymanager.h" +#include "shopitem.h" + +#include "being/localplayer.h" +#include "being/playerinfo.h" + +#include "enums/resources/notifytypes.h" + +#include "gui/windows/buyingstoreselldialog.h" + +#include "gui/widgets/createwidget.h" + +#include "listeners/arrowslistener.h" +#include "listeners/buyingstoremodelistener.h" +#include "listeners/buyingstoreslotslistener.h" + +#include "net/ea/eaprotocol.h" + +#include "net/eathena/messageout.h" +#include "net/eathena/protocol.h" + +#include "debug.h" + +namespace EAthena +{ + +void BuyingStoreRecv::processBuyingStoreOpen(Net::MessageIn &msg) +{ + BuyingStoreSlotsListener::distributeEvent(msg.readUInt8("slots")); +} + +void BuyingStoreRecv::processBuyingStoreCreateFailed(Net::MessageIn &msg) +{ + const int16_t result = msg.readInt16("result"); + const int weight = msg.readInt32("weight"); + switch (result) + { + case 1: + default: + NotifyManager::notify(NotifyTypes::BUYING_STORE_CREATE_FAILED); + break; + case 2: + NotifyManager::notify( + NotifyTypes::BUYING_STORE_CREATE_FAILED_WEIGHT, + weight); + break; + case 8: + NotifyManager::notify(NotifyTypes::BUYING_STORE_CREATE_EMPTY); + break; + } +} + +void BuyingStoreRecv::processBuyingStoreOwnItems(Net::MessageIn &msg) +{ + const int count = (msg.readInt16("len") - 12) / 9; + msg.readBeingId("account id"); + msg.readInt32("money limit"); + for (int f = 0; f < count; f ++) + { + msg.readInt32("price"); + msg.readInt16("amount"); + msg.readUInt8("item type"); + msg.readInt16("item id"); + } + PlayerInfo::enableVending(true); + BuyingStoreModeListener::distributeEvent(true); +} + +void BuyingStoreRecv::processBuyingStoreShowBoard(Net::MessageIn &msg) +{ + const BeingId id = msg.readBeingId("owner id"); + const std::string shopName = msg.readString(80, "shop name"); + Being *const dstBeing = actorManager->findBeing(id); + if (dstBeing) + dstBeing->setBuyBoard(shopName); +} + +void BuyingStoreRecv::processBuyingStoreHideBoard(Net::MessageIn &msg) +{ + const BeingId id = msg.readBeingId("owner id"); + Being *const dstBeing = actorManager->findBeing(id); + if (dstBeing) + dstBeing->setBuyBoard(std::string()); + if (dstBeing == localPlayer) + { + PlayerInfo::enableVending(false); + BuyingStoreModeListener::distributeEvent(false); + } +} + +void BuyingStoreRecv::processBuyingStoreItemsList(Net::MessageIn &msg) +{ + const int count = (msg.readInt16("len") - 16) / 9; + const BeingId id = msg.readBeingId("account id"); + const int storeId = msg.readInt32("store id"); + // +++ in future need use it too + msg.readInt32("money limit"); + + Being *const dstBeing = actorManager->findBeing(id); + if (!dstBeing) + return; + + SellDialog *const dialog = CREATEWIDGETR(BuyingStoreSellDialog, + dstBeing->getId(), + storeId); + dialog->setMoney(PlayerInfo::getAttribute(Attributes::MONEY)); + Inventory *const inv = PlayerInfo::getInventory(); + for (int f = 0; f < count; f ++) + { + const int price = msg.readInt32("price"); + const int amount = msg.readInt16("amount"); + const int itemType = msg.readUInt8("item type"); + const int itemId = msg.readInt16("item id"); + + if (!inv) + continue; + const Item *const item = inv->findItem(itemId, ItemColor_one); + if (!item) + continue; + // +++ need add colors support + dialog->addItem(itemId, itemType, ItemColor_one, amount, price); + } +} + +void BuyingStoreRecv::processBuyingStoreSellFailed(Net::MessageIn &msg) +{ + const int16_t result = msg.readInt16("result"); + switch (result) + { + case 3: + NotifyManager::notify( + NotifyTypes::BUYING_STORE_SELL_FAILED_MONEY_LIMIT); + break; + case 4: + NotifyManager::notify(NotifyTypes::BUYING_STORE_SELL_FAILED_EMPTY); + break; + default: + NotifyManager::notify(NotifyTypes::BUYING_STORE_SELL_FAILED); + break; + } +} + +void BuyingStoreRecv::processBuyingStoreSellerSellFailed(Net::MessageIn + &msg) +{ + const int16_t result = msg.readInt16("result"); + msg.readInt16("item id"); + switch (result) + { + case 5: + NotifyManager::notify( + NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED_DEAL); + break; + case 6: + NotifyManager::notify( + NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED_AMOUNT); + break; + case 7: + NotifyManager::notify( + NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED_BALANCE); + break; + default: + NotifyManager::notify( + NotifyTypes::BUYING_STORE_SELLER_SELL_FAILED); + break; + } +} + +void BuyingStoreRecv::processBuyingStoreReport(Net::MessageIn &msg) +{ + UNIMPLIMENTEDPACKET; + msg.readInt16("item id"); + msg.readInt16("amount"); + msg.readInt32("money limit"); +} + +void BuyingStoreRecv::processBuyingStoreDeleteItem(Net::MessageIn &msg) +{ + Inventory *const inventory = localPlayer + ? PlayerInfo::getInventory() : nullptr; + + const int index = msg.readInt16("index") - INVENTORY_OFFSET; + const int amount = msg.readInt16("amount"); + msg.readInt32("price"); + + if (inventory) + { + if (Item *const item = inventory->getItem(index)) + { + item->increaseQuantity(-amount); + if (item->getQuantity() == 0) + inventory->removeItemAt(index); + ArrowsListener::distributeEvent(); + } + } +} + +} // namespace EAthena diff --git a/src/net/eathena/buyingstorerecv.h b/src/net/eathena/buyingstorerecv.h new file mode 100644 index 000000000..da4e338e8 --- /dev/null +++ b/src/net/eathena/buyingstorerecv.h @@ -0,0 +1,57 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef NET_EATHENA_BUYINGSTORERECV_H +#define NET_EATHENA_BUYINGSTORERECV_H + +#ifdef EATHENA_SUPPORT + +#include "net/buyingstorehandler.h" + +#include "net/eathena/messagehandler.h" + +namespace EAthena +{ + namespace BuyingStoreRecv + { + void processBuyingStoreOpen(Net::MessageIn &msg); + + void processBuyingStoreCreateFailed(Net::MessageIn &msg); + + void processBuyingStoreOwnItems(Net::MessageIn &msg); + + void processBuyingStoreShowBoard(Net::MessageIn &msg); + + void processBuyingStoreHideBoard(Net::MessageIn &msg); + + void processBuyingStoreItemsList(Net::MessageIn &msg); + + void processBuyingStoreSellFailed(Net::MessageIn &msg); + + void processBuyingStoreReport(Net::MessageIn &msg); + + void processBuyingStoreDeleteItem(Net::MessageIn &msg); + + void processBuyingStoreSellerSellFailed(Net::MessageIn &msg); + } // namespace BuyingStoreRecv +} // namespace EAthena + +#endif // EATHENA_SUPPORT +#endif // NET_EATHENA_BUYINGSTORERECV_H -- cgit v1.2.3-60-g2f50