From f8b20db91cf8fcaed0c3b8107644bdb101add6b8 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 30 Aug 2015 19:28:14 +0300 Subject: Move receive code from vendinghandler into separate file. --- src/CMakeLists.txt | 2 + src/Makefile.am | 4 +- src/net/eathena/vendinghandler.cpp | 123 +++-------------------------- src/net/eathena/vendinghandler.h | 19 ----- src/net/eathena/vendingrecv.cpp | 154 +++++++++++++++++++++++++++++++++++++ src/net/eathena/vendingrecv.h | 47 +++++++++++ 6 files changed, 216 insertions(+), 133 deletions(-) create mode 100644 src/net/eathena/vendingrecv.cpp create mode 100644 src/net/eathena/vendingrecv.h (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 515e5f781..73324d9ef 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1725,6 +1725,8 @@ SET(SRCS_EATHENA net/eathena/traderecv.h net/eathena/vendinghandler.cpp net/eathena/vendinghandler.h + net/eathena/vendingrecv.cpp + net/eathena/vendingrecv.h ) IF (WIN32) diff --git a/src/Makefile.am b/src/Makefile.am index c9f26ae83..fadf967fc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1570,7 +1570,9 @@ manaplus_SOURCES += gui/windows/bankwindow.cpp \ net/eathena/traderecv.cpp \ net/eathena/traderecv.h \ net/eathena/vendinghandler.cpp \ - net/eathena/vendinghandler.h + net/eathena/vendinghandler.h \ + net/eathena/vendingrecv.cpp \ + net/eathena/vendingrecv.h endif manaplus_SOURCES += \ diff --git a/src/net/eathena/vendinghandler.cpp b/src/net/eathena/vendinghandler.cpp index 1db5cd5fc..5d0724f12 100644 --- a/src/net/eathena/vendinghandler.cpp +++ b/src/net/eathena/vendinghandler.cpp @@ -38,6 +38,7 @@ #include "net/eathena/messageout.h" #include "net/eathena/protocol.h" +#include "net/eathena/vendingrecv.h" #include "debug.h" @@ -46,8 +47,6 @@ extern Net::VendingHandler *vendingHandler; namespace EAthena { -BuyDialog *VendingHandler::mBuyDialog = nullptr; - VendingHandler::VendingHandler() : MessageHandler() { @@ -65,7 +64,7 @@ VendingHandler::VendingHandler() : }; handledMessages = _messages; vendingHandler = this; - mBuyDialog = nullptr; + VendingRecv::mBuyDialog = nullptr; } void VendingHandler::handleMessage(Net::MessageIn &msg) @@ -73,35 +72,35 @@ void VendingHandler::handleMessage(Net::MessageIn &msg) switch (msg.getId()) { case SMSG_VENDING_OPEN_REQ: - processOpenReq(msg); + VendingRecv::processOpenReq(msg); break; case SMSG_VENDING_SHOW_BOARD: - processShowBoard(msg); + VendingRecv::processShowBoard(msg); break; case SMSG_VENDING_HIDE_BOARD: - processHideBoard(msg); + VendingRecv::processHideBoard(msg); break; case SMSG_VENDING_ITEMS_LIST: - processItemsList(msg); + VendingRecv::processItemsList(msg); break; case SMSG_VENDING_BUY_ACK: - processBuyAck(msg); + VendingRecv::processBuyAck(msg); break; case SMSG_VENDING_OPEN: - processOpen(msg); + VendingRecv::processOpen(msg); break; case SMSG_VENDING_REPORT: - processReport(msg); + VendingRecv::processReport(msg); break; case SMSG_VENDING_OPEN_STATUS: - processOpenStatus(msg); + VendingRecv::processOpenStatus(msg); break; default: @@ -109,108 +108,6 @@ void VendingHandler::handleMessage(Net::MessageIn &msg) } } -void VendingHandler::processOpenReq(Net::MessageIn &msg) -{ - VendingSlotsListener::distributeEvent(msg.readInt16("slots allowed")); -} - -void VendingHandler::processShowBoard(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->setSellBoard(shopName); -} - -void VendingHandler::processHideBoard(Net::MessageIn &msg) -{ - const BeingId id = msg.readBeingId("owner id"); - Being *const dstBeing = actorManager->findBeing(id); - if (dstBeing) - dstBeing->setSellBoard(std::string()); - if (dstBeing == localPlayer) - { - PlayerInfo::enableVending(false); - VendingModeListener::distributeEvent(false); - } -} - -void VendingHandler::processItemsList(Net::MessageIn &msg) -{ - const int count = (msg.readInt16("len") - 12) / 22; - const BeingId id = msg.readBeingId("id"); - Being *const being = actorManager->findBeing(id); - if (!being) - return; - int cards[4]; - CREATEWIDGETV(mBuyDialog, BuyDialog, being->getName()); - mBuyDialog->setMoney(PlayerInfo::getAttribute(Attributes::MONEY)); - msg.readInt32("vender id"); - for (int f = 0; f < count; f ++) - { - const int value = msg.readInt32("price"); - const int amount = msg.readInt16("amount"); - const int index = msg.readInt16("inv index"); - const int type = msg.readUInt8("item type"); - const int itemId = msg.readInt16("item id"); - msg.readUInt8("identify"); - msg.readUInt8("attribute"); - msg.readUInt8("refine"); - for (int d = 0; d < 4; d ++) - cards[d] = msg.readInt16("card"); - - const ItemColor color = ItemColorManager::getColorFromCards(&cards[0]); - ShopItem *const item = mBuyDialog->addItem(itemId, type, - color, amount, value); - if (item) - item->setInvIndex(index); - } - mBuyDialog->sort(); -} - -void VendingHandler::processBuyAck(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt16("inv index"); - msg.readInt16("amount"); - msg.readUInt8("flag"); -} - -void VendingHandler::processOpen(Net::MessageIn &msg) -{ - const int count = (msg.readInt16("len") - 8) / 22; - msg.readInt32("id"); - for (int f = 0; f < count; f ++) - { - msg.readInt32("price"); - msg.readInt16("inv index"); - msg.readInt16("amount"); - msg.readUInt8("item type"); - msg.readInt16("item id"); - msg.readUInt8("identify"); - msg.readUInt8("attribute"); - msg.readUInt8("refine"); - for (int d = 0; d < 4; d ++) - msg.readInt16("card"); - } - PlayerInfo::enableVending(true); - VendingModeListener::distributeEvent(true); -} - -void VendingHandler::processReport(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt16("inv index"); - msg.readInt16("amount"); -} - -void VendingHandler::processOpenStatus(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readUInt8("result"); -} - void VendingHandler::close() const { createOutPacket(CMSG_VENDING_CLOSE); diff --git a/src/net/eathena/vendinghandler.h b/src/net/eathena/vendinghandler.h index 5fb9a3ef5..15a794719 100644 --- a/src/net/eathena/vendinghandler.h +++ b/src/net/eathena/vendinghandler.h @@ -55,25 +55,6 @@ class VendingHandler final : public MessageHandler, void createShop(const std::string &name, const bool flag, std::vector &items) const override final; - - protected: - static void processOpenReq(Net::MessageIn &msg); - - static void processShowBoard(Net::MessageIn &msg); - - static void processHideBoard(Net::MessageIn &msg); - - static void processItemsList(Net::MessageIn &msg); - - static void processBuyAck(Net::MessageIn &msg); - - static void processOpen(Net::MessageIn &msg); - - static void processReport(Net::MessageIn &msg); - - static void processOpenStatus(Net::MessageIn &msg); - - static BuyDialog *mBuyDialog; }; } // namespace EAthena diff --git a/src/net/eathena/vendingrecv.cpp b/src/net/eathena/vendingrecv.cpp new file mode 100644 index 000000000..d1a81fdb4 --- /dev/null +++ b/src/net/eathena/vendingrecv.cpp @@ -0,0 +1,154 @@ +/* + * 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/vendingrecv.h" + +#include "actormanager.h" +#include "itemcolormanager.h" +#include "shopitem.h" + +#include "being/localplayer.h" +#include "being/playerinfo.h" + +#include "gui/windows/buydialog.h" + +#include "gui/widgets/createwidget.h" + +#include "listeners/vendingmodelistener.h" +#include "listeners/vendingslotslistener.h" + +#include "net/ea/eaprotocol.h" + +#include "net/eathena/messageout.h" +#include "net/eathena/protocol.h" + +#include "debug.h" + +namespace EAthena +{ + +namespace VendingRecv +{ + BuyDialog *mBuyDialog = nullptr; +} // namespace VendingRecv + +void VendingRecv::processOpenReq(Net::MessageIn &msg) +{ + VendingSlotsListener::distributeEvent(msg.readInt16("slots allowed")); +} + +void VendingRecv::processShowBoard(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->setSellBoard(shopName); +} + +void VendingRecv::processHideBoard(Net::MessageIn &msg) +{ + const BeingId id = msg.readBeingId("owner id"); + Being *const dstBeing = actorManager->findBeing(id); + if (dstBeing) + dstBeing->setSellBoard(std::string()); + if (dstBeing == localPlayer) + { + PlayerInfo::enableVending(false); + VendingModeListener::distributeEvent(false); + } +} + +void VendingRecv::processItemsList(Net::MessageIn &msg) +{ + const int count = (msg.readInt16("len") - 12) / 22; + const BeingId id = msg.readBeingId("id"); + Being *const being = actorManager->findBeing(id); + if (!being) + return; + int cards[4]; + CREATEWIDGETV(mBuyDialog, BuyDialog, being->getName()); + mBuyDialog->setMoney(PlayerInfo::getAttribute(Attributes::MONEY)); + msg.readInt32("vender id"); + for (int f = 0; f < count; f ++) + { + const int value = msg.readInt32("price"); + const int amount = msg.readInt16("amount"); + const int index = msg.readInt16("inv index"); + const int type = msg.readUInt8("item type"); + const int itemId = msg.readInt16("item id"); + msg.readUInt8("identify"); + msg.readUInt8("attribute"); + msg.readUInt8("refine"); + for (int d = 0; d < 4; d ++) + cards[d] = msg.readInt16("card"); + + const ItemColor color = ItemColorManager::getColorFromCards(&cards[0]); + ShopItem *const item = mBuyDialog->addItem(itemId, type, + color, amount, value); + if (item) + item->setInvIndex(index); + } + mBuyDialog->sort(); +} + +void VendingRecv::processBuyAck(Net::MessageIn &msg) +{ + UNIMPLIMENTEDPACKET; + msg.readInt16("inv index"); + msg.readInt16("amount"); + msg.readUInt8("flag"); +} + +void VendingRecv::processOpen(Net::MessageIn &msg) +{ + const int count = (msg.readInt16("len") - 8) / 22; + msg.readInt32("id"); + for (int f = 0; f < count; f ++) + { + msg.readInt32("price"); + msg.readInt16("inv index"); + msg.readInt16("amount"); + msg.readUInt8("item type"); + msg.readInt16("item id"); + msg.readUInt8("identify"); + msg.readUInt8("attribute"); + msg.readUInt8("refine"); + for (int d = 0; d < 4; d ++) + msg.readInt16("card"); + } + PlayerInfo::enableVending(true); + VendingModeListener::distributeEvent(true); +} + +void VendingRecv::processReport(Net::MessageIn &msg) +{ + UNIMPLIMENTEDPACKET; + msg.readInt16("inv index"); + msg.readInt16("amount"); +} + +void VendingRecv::processOpenStatus(Net::MessageIn &msg) +{ + UNIMPLIMENTEDPACKET; + msg.readUInt8("result"); +} + +} // namespace EAthena diff --git a/src/net/eathena/vendingrecv.h b/src/net/eathena/vendingrecv.h new file mode 100644 index 000000000..74c3f9c78 --- /dev/null +++ b/src/net/eathena/vendingrecv.h @@ -0,0 +1,47 @@ +/* + * 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_VENDINGRECV_H +#define NET_EATHENA_VENDINGRECV_H + +#include "net/vendinghandler.h" + +#include "net/eathena/messagehandler.h" + +class BuyDialog; + +namespace EAthena +{ + namespace VendingRecv + { + extern BuyDialog *mBuyDialog; + + void processOpenReq(Net::MessageIn &msg); + void processShowBoard(Net::MessageIn &msg); + void processHideBoard(Net::MessageIn &msg); + void processItemsList(Net::MessageIn &msg); + void processBuyAck(Net::MessageIn &msg); + void processOpen(Net::MessageIn &msg); + void processReport(Net::MessageIn &msg); + void processOpenStatus(Net::MessageIn &msg); + } // namespace VendingRecv +} // namespace EAthena + +#endif // NET_EATHENA_VENDINGRECV_H -- cgit v1.2.3-60-g2f50