From b6a0e05498b2b1a64d9b407fb2416dbaa0faf407 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 28 Jan 2015 21:27:04 +0300 Subject: eathena: add support for creating vending shop. --- src/CMakeLists.txt | 2 + src/Makefile.am | 2 + src/gui/windows/shopwindow.cpp | 101 ++++++++++++++++++++++++++++----- src/gui/windows/shopwindow.h | 10 +++- src/listeners/vendingslotslistener.cpp | 36 ++++++++++++ src/listeners/vendingslotslistener.h | 38 +++++++++++++ src/net/eathena/vendinghandler.cpp | 4 +- 7 files changed, 175 insertions(+), 18 deletions(-) create mode 100644 src/listeners/vendingslotslistener.cpp create mode 100644 src/listeners/vendingslotslistener.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e10873bea..f39580294 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1145,6 +1145,8 @@ SET(SRCS listeners/updatestatuslistener.h listeners/uploadlistener.cpp listeners/uploadlistener.h + listeners/vendingslotslistener.cpp + listeners/vendingslotslistener.h utils/sdlpixel.h gui/widgets/widget.h listeners/weightlistener.h diff --git a/src/Makefile.am b/src/Makefile.am index 46a7b6877..11dc8364a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -223,6 +223,8 @@ manaplus_SOURCES += events/actionevent.h \ listeners/updatestatuslistener.h \ listeners/uploadlistener.cpp \ listeners/uploadlistener.h \ + listeners/vendingslotslistener.cpp \ + listeners/vendingslotslistener.h \ utils/sdlpixel.h \ gui/widgets/widget.h \ listeners/weightlistener.h \ diff --git a/src/gui/windows/shopwindow.cpp b/src/gui/windows/shopwindow.cpp index 9240b8e8c..5d013430a 100644 --- a/src/gui/windows/shopwindow.cpp +++ b/src/gui/windows/shopwindow.cpp @@ -58,7 +58,9 @@ #include "enums/being/attributes.h" #include "net/chathandler.h" +#include "net/serverfeatures.h" #include "net/tradehandler.h" +#include "net/vendinghandler.h" #include "resources/iteminfo.h" @@ -80,6 +82,7 @@ ShopWindow::ShopWindow() : Window(_("Personal Shop"), false, nullptr, "shop.xml"), ActionListener(), SelectionListener(), + VendingSlotsListener(), // TRANSLATORS: shop window button mCloseButton(new Button(this, _("Close"), "close", this)), mBuyShopItems(new ShopItems), @@ -94,21 +97,21 @@ ShopWindow::ShopWindow() : mAddButton(new Button(this, _("Add"), "add", this)), // TRANSLATORS: shop window label mDeleteButton(new Button(this, _("Delete"), "delete", this)), - // TRANSLATORS: shop window label - mAnnounceButton(new Button(this, _("Announce"), "announce", this)), - // TRANSLATORS: shop window checkbox - mAnnounceLinks(new CheckBox(this, _("Show links in announce"), false, - this, "link announce")), + mAnnounceButton(nullptr), + mPublishButton(nullptr), + mAnnounceLinks(nullptr), mTabs(nullptr), - mAcceptPlayer(""), - mTradeNick(""), + mAcceptPlayer(), + mTradeNick(), mSelectedItem(-1), mAnnonceTime(0), mLastRequestTimeList(0), mLastRequestTimeItem(0), mRandCounter(0), mTradeMoney(0), - isBuySelected(true) + mSellShopSize(0), + isBuySelected(true), + mHaveVending(serverFeatures->haveVending()) { mBuyShopItemList->postInit(); mSellShopItemList->postInit(); @@ -138,8 +141,6 @@ ShopWindow::ShopWindow() : // TRANSLATORS: shop window tab name mTabs->addButton(_("Sell"), "sell", false); - mAnnounceCounter[BUY] = 0; - mAnnounceCounter[SELL] = 0; loadList(); @@ -156,11 +157,27 @@ ShopWindow::ShopWindow() : placer(0, 0, mTabs, 8).setPadding(3); + if (isBuySelected) + { + // TRANSLATORS: shop window button + mPublishButton = new Button(this, _("Publish"), "publish", this); + placer(2, 6, mPublishButton); + } + else + { + // TRANSLATORS: shop window button + mAnnounceButton = new Button(this, _("Announce"), "announce", this); + // TRANSLATORS: shop window checkbox + mAnnounceLinks = new CheckBox(this, _("Show links in announce"), false, + this, "link announce"); + + placer(2, 6, mAnnounceButton); + placer(0, 7, mAnnounceLinks, 7); + } + placer(0, 1, mScrollArea, 8, 5).setPadding(3); placer(0, 6, mAddButton); placer(1, 6, mDeleteButton); - placer(2, 6, mAnnounceButton); - placer(0, 7, mAnnounceLinks, 7); placer(7, 7, mCloseButton); Layout &layout = getLayout(); @@ -251,11 +268,42 @@ void ShopWindow::action(const ActionEvent &event) isBuySelected = false; updateSelection(); } + else if (eventId == "publish") + { + std::vector &oldItems = mSellShopItems->items(); + std::vector items; + Inventory *const inv = PlayerInfo::getCartInventory(); + if (!inv) + return; + FOR_EACH (std::vector::iterator, it, oldItems) + { + ShopItem *const item = *it; + // +++ need add colors + Item *const cartItem = inv->findItem(item->getId(), 1); + if (!cartItem) + continue; + item->setInvIndex(cartItem->getInvIndex()); + const int amount = cartItem->getQuantity(); + if (!amount) + continue; + if (item->getQuantity() < amount) + item->setQuantity(amount); + items.push_back(item); + if (static_cast(items.size()) >= mSellShopSize) + break; + } + if (!items.empty()) + { + vendingHandler->createShop("test shop", true, items); + mSellShopSize = 0; + } + } if (mSelectedItem < 1) return; - const Inventory *const inv = PlayerInfo::getInventory(); + const Inventory *const inv = mHaveVending + ? PlayerInfo::getCartInventory() : PlayerInfo::getInventory(); if (!inv) return; @@ -310,6 +358,7 @@ void ShopWindow::updateButtonsAndLabels() { mAddButton->setEnabled(mSelectedItem != -1); bool allowDel(false); + const bool sellNotEmpty = mSellShopItems->getNumberOfElements() > 0; if (isBuySelected) { allowDel = mBuyShopItemList->getSelected() != -1 @@ -317,10 +366,22 @@ void ShopWindow::updateButtonsAndLabels() } else { - allowDel = mSellShopItemList->getSelected() != -1 - && mSellShopItems->getNumberOfElements() > 0; + allowDel = mSellShopItemList->getSelected() != -1 && sellNotEmpty; } mDeleteButton->setEnabled(allowDel); + if (mPublishButton + && !isBuySelected + && sellNotEmpty + && mSellShopSize > 0 + && localPlayer + && localPlayer->getHaveCart()) + { + mPublishButton->setEnabled(true); + } + else + { + mPublishButton->setEnabled(false); + } } void ShopWindow::setVisible(bool visible) @@ -795,6 +856,11 @@ void ShopWindow::processRequest(const std::string &nick, std::string data, void ShopWindow::updateTimes() { BLOCK_START("ShopWindow::updateTimes") + if (!mAnnounceButton) + { + BLOCK_END("ShopWindow::updateTimes") + return; + } if (mAnnonceTime + (2 * 60) < cur_time || mAnnonceTime > cur_time) { @@ -887,3 +953,8 @@ void ShopWindow::updateSelection() mScrollArea->setContent(mCurrentShopItemList); updateButtonsAndLabels(); } + +void ShopWindow::vendingSlotsChanged(const int slots) +{ + mSellShopSize = slots; +} diff --git a/src/gui/windows/shopwindow.h b/src/gui/windows/shopwindow.h index a3409bbe7..06f0a997d 100644 --- a/src/gui/windows/shopwindow.h +++ b/src/gui/windows/shopwindow.h @@ -27,6 +27,7 @@ #include "listeners/actionlistener.h" #include "listeners/selectionlistener.h" +#include "listeners/vendingslotslistener.h" class Button; class CheckBox; @@ -44,7 +45,8 @@ class TabStrip; */ class ShopWindow final : public Window, public ActionListener, - public SelectionListener + public SelectionListener, + public VendingSlotsListener { public: enum ShopMode @@ -137,6 +139,8 @@ class ShopWindow final : public Window, bool isShopEmpty() const A_WARN_UNUSED; + void vendingSlotsChanged(const int slots) override final; + private: void startTrade(); @@ -158,6 +162,7 @@ class ShopWindow final : public Window, Button *mAddButton; Button *mDeleteButton; Button *mAnnounceButton; + Button *mPublishButton; CheckBox *mAnnounceLinks; TabStrip *mTabs; std::string mAcceptPlayer; @@ -168,8 +173,9 @@ class ShopWindow final : public Window, int mLastRequestTimeItem; int mRandCounter; int mTradeMoney; - int mAnnounceCounter[2]; + int mSellShopSize; bool isBuySelected; + bool mHaveVending; }; extern ShopWindow *shopWindow; diff --git a/src/listeners/vendingslotslistener.cpp b/src/listeners/vendingslotslistener.cpp new file mode 100644 index 000000000..5a60e9807 --- /dev/null +++ b/src/listeners/vendingslotslistener.cpp @@ -0,0 +1,36 @@ +/* + * The ManaPlus Client + * Copyright (C) 2014-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 "listeners/vendingslotslistener.h" + +#include "debug.h" + +defineListener(VendingSlotsListener) + +void VendingSlotsListener::distributeEvent(const int slots) +{ + FOR_EACH (std::vector::iterator, + it, mListeners) + { + VendingSlotsListener *const listener = *it; + if (listener) + listener->vendingSlotsChanged(slots); + } +} diff --git a/src/listeners/vendingslotslistener.h b/src/listeners/vendingslotslistener.h new file mode 100644 index 000000000..98b4ae49a --- /dev/null +++ b/src/listeners/vendingslotslistener.h @@ -0,0 +1,38 @@ +/* + * The ManaPlus Client + * Copyright (C) 2014-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 LISTENERS_VENDINGSLOTSLISTENER_H +#define LISTENERS_VENDINGSLOTSLISTENER_H + +#include "listeners/baselistener.hpp" + +#include "localconsts.h" + +class VendingSlotsListener notfinal +{ + public: + virtual void vendingSlotsChanged(const int slots) = 0; + + static void distributeEvent(const int slots); + + defineListenerHeader(VendingSlotsListener) +}; + +#endif // LISTENERS_VENDINGSLOTSLISTENER_H diff --git a/src/net/eathena/vendinghandler.cpp b/src/net/eathena/vendinghandler.cpp index 3228cf0db..54f1b74c1 100644 --- a/src/net/eathena/vendinghandler.cpp +++ b/src/net/eathena/vendinghandler.cpp @@ -24,6 +24,8 @@ #include "being/being.h" +#include "listeners/vendingslotslistener.h" + #include "net/ea/eaprotocol.h" #include "net/eathena/messageout.h" @@ -92,7 +94,7 @@ void VendingHandler::handleMessage(Net::MessageIn &msg) void VendingHandler::processOpenReq(Net::MessageIn &msg) { - msg.readInt16("slots allowed"); + VendingSlotsListener::distributeEvent(msg.readInt16("slots allowed")); } void VendingHandler::processShowBoard(Net::MessageIn &msg) -- cgit v1.2.3-70-g09d2