summaryrefslogtreecommitdiff
path: root/src/net/eathena/buyingstorerecv.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-24 17:16:48 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-24 17:16:48 +0300
commit699835e4664fd4e22d7178b40897e0fd4b366a93 (patch)
tree30ae84a635517b5eae5da6baa5ce03602d690664 /src/net/eathena/buyingstorerecv.cpp
parentaf0c242bf6a09b0e45ddfd04214bcc76925debbb (diff)
downloadplus-699835e4664fd4e22d7178b40897e0fd4b366a93.tar.gz
plus-699835e4664fd4e22d7178b40897e0fd4b366a93.tar.bz2
plus-699835e4664fd4e22d7178b40897e0fd4b366a93.tar.xz
plus-699835e4664fd4e22d7178b40897e0fd4b366a93.zip
Move receive code from buyingstorehandler into separate file.
Diffstat (limited to 'src/net/eathena/buyingstorerecv.cpp')
-rw-r--r--src/net/eathena/buyingstorerecv.cpp222
1 files changed, 222 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+ */
+
+#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