diff options
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/net/eathena/pethandler.cpp | 167 | ||||
-rw-r--r-- | src/net/eathena/pethandler.h | 17 | ||||
-rw-r--r-- | src/net/eathena/petrecv.cpp | 204 | ||||
-rw-r--r-- | src/net/eathena/petrecv.h | 42 |
6 files changed, 259 insertions, 175 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a1527cd6..2a6f85bda 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1679,6 +1679,8 @@ SET(SRCS_EATHENA net/eathena/partyrecv.h net/eathena/pethandler.cpp net/eathena/pethandler.h + net/eathena/petrecv.cpp + net/eathena/petrecv.h net/eathena/playerhandler.cpp net/eathena/playerhandler.h net/eathena/protocol.h diff --git a/src/Makefile.am b/src/Makefile.am index 7e13324f1..350087d44 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1525,6 +1525,8 @@ manaplus_SOURCES += gui/windows/bankwindow.cpp \ net/eathena/partyrecv.h \ net/eathena/pethandler.cpp \ net/eathena/pethandler.h \ + net/eathena/petrecv.cpp \ + net/eathena/petrecv.h \ net/eathena/playerhandler.cpp \ net/eathena/playerhandler.h \ net/eathena/protocol.h \ diff --git a/src/net/eathena/pethandler.cpp b/src/net/eathena/pethandler.cpp index b80ee5eee..8911a7978 100644 --- a/src/net/eathena/pethandler.cpp +++ b/src/net/eathena/pethandler.cpp @@ -42,6 +42,7 @@ #include "net/eathena/menu.h" #include "net/eathena/messageout.h" +#include "net/eathena/petrecv.h" #include "net/eathena/protocol.h" #include "utils/gettext.h" @@ -55,8 +56,7 @@ namespace EAthena { PetHandler::PetHandler() : - MessageHandler(), - mRandCounter(1000) + MessageHandler() { static const uint16_t _messages[] = { @@ -79,31 +79,31 @@ void PetHandler::handleMessage(Net::MessageIn &msg) switch (msg.getId()) { case SMSG_PET_MESSAGE: - processPetMessage(msg); + PetRecv::processPetMessage(msg); break; case SMSG_PET_ROULETTE: - processPetRoulette(msg); + PetRecv::processPetRoulette(msg); break; case SMSG_PET_EGGS_LIST: - processEggsList(msg); + PetRecv::processEggsList(msg); break; case SMSG_PET_DATA: - processPetData(msg); + PetRecv::processPetData(msg); break; case SMSG_PET_STATUS: - processPetStatus(msg); + PetRecv::processPetStatus(msg); break; case SMSG_PET_FOOD: - processPetFood(msg); + PetRecv::processPetFood(msg); break; case SMSG_PET_CATCH_PROCESS: - processPetCatchProcess(msg); + PetRecv::processPetCatchProcess(msg); break; default: @@ -156,150 +156,6 @@ void PetHandler::setName(const std::string &name) const outMsg.writeString(name, 24, "name"); } -void PetHandler::processPetMessage(Net::MessageIn &msg) -{ - const BeingId id = msg.readBeingId("pet id"); - const int data = msg.readInt32("param"); - Being *const dstBeing = actorManager->findBeing(id); - if (!dstBeing) - return; - - const int hungry = data - (toInt(dstBeing->getSubType(), int) - - 100) * 100 - 50; - if (hungry >= 0 && hungry <= 4) - { - if (localChatTab && localPlayer) - { - std::string nick = strprintf(_("%s's pet"), - localPlayer->getName().c_str()); - localChatTab->chatLog(nick, strprintf("hungry level %d", hungry)); - } - PetInfo *const info = PlayerInfo::getPet(); - if (!info || info->id != id) - return; - info->hungry = hungry; - } -} - -void PetHandler::processPetRoulette(Net::MessageIn &msg) -{ - const uint8_t data = msg.readUInt8("data"); - switch (data) - { - case 0: - NotifyManager::notify(NotifyTypes::PET_CATCH_FAILED); - break; - case 1: - NotifyManager::notify(NotifyTypes::PET_CATCH_SUCCESS); - break; - default: - NotifyManager::notify(NotifyTypes::PET_CATCH_UNKNOWN, data); - break; - } -} - -void PetHandler::processEggsList(Net::MessageIn &msg) -{ - const int count = (msg.readInt16("len") - 4) / 2; - Inventory *const inv = PlayerInfo::getInventory(); - if (!inv) - return; - menu = MenuType::Eggs; - - if (count == 1) - { - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const Item *const item = inv->getItem(index); - inventoryHandler->selectEgg(item); - return; - } - SellDialog *const dialog = CREATEWIDGETR0(EggSelectionDialog); - - for (int f = 0; f < count; f ++) - { - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const Item *const item = inv->getItem(index); - - if (item) - dialog->addItem(item, 0); - } -} - -void PetHandler::processPetData(Net::MessageIn &msg) -{ - const int cmd = msg.readUInt8("type"); - const BeingId id = msg.readBeingId("pet id"); - Being *const dstBeing = actorManager->findBeing(id); - const int data = msg.readInt32("data"); - if (!cmd) // pre init - { - PetInfo *const info = new PetInfo; - info->id = id; - PlayerInfo::setPet(info); - PlayerInfo::setPetBeing(dstBeing); - return; - } - PetInfo *const info = PlayerInfo::getPet(); - if (!info) - return; - switch (cmd) - { - case 1: // intimacy - info->intimacy = data; - break; - case 2: // hunger - info->hungry = data; - break; - case 3: // accesory - info->equip = data; - break; - case 4: // performance - info->performance = data; - break; - case 5: // hair style - info->hairStyle = data; - break; - default: - break; - } -} - -void PetHandler::processPetStatus(Net::MessageIn &msg) -{ - const std::string name = msg.readString(24, "pet name"); - msg.readUInt8("rename flag"); - const int level = msg.readInt16("level"); - const int hungry = msg.readInt16("hungry"); - const int intimacy = msg.readInt16("intimacy"); - const int equip = msg.readInt16("equip"); - const int race = msg.readInt16("class"); - -// Being *const being = PlayerInfo::getPetBeing(); -// if (being) -// being->setLevel(level); - - PetInfo *const info = PlayerInfo::getPet(); - if (!info) - return; - info->name = name; - info->level = level; - info->hungry = hungry; - info->intimacy = intimacy; - info->equip = equip; - info->race = race; -} - -void PetHandler::processPetFood(Net::MessageIn &msg) -{ - // +++ need show notification message about success or fail - const int result = msg.readUInt8("result"); - msg.readInt16("food id"); - if (result) - NotifyManager::notify(NotifyTypes::PET_FEED_OK); - else - NotifyManager::notify(NotifyTypes::PET_FEED_ERROR); -} - void PetHandler::requestStatus() const { createOutPacket(CMSG_PET_MENU_ACTION); @@ -347,9 +203,4 @@ void PetHandler::startAi(const bool start A_UNUSED) const { } -void PetHandler::processPetCatchProcess(Net::MessageIn &msg A_UNUSED) -{ - NotifyManager::notify(NotifyTypes::PET_CATCH_PROCESS); -} - } // namespace EAthena diff --git a/src/net/eathena/pethandler.h b/src/net/eathena/pethandler.h index 46bdf8f90..d54901401 100644 --- a/src/net/eathena/pethandler.h +++ b/src/net/eathena/pethandler.h @@ -66,23 +66,6 @@ class PetHandler final : public MessageHandler, public Net::PetHandler void setDirection(const unsigned char type) const override final; void startAi(const bool start) const override final; - - protected: - void processPetMessage(Net::MessageIn &msg); - - static void processPetRoulette(Net::MessageIn &msg); - - static void processEggsList(Net::MessageIn &msg); - - static void processPetData(Net::MessageIn &msg); - - static void processPetStatus(Net::MessageIn &msg); - - static void processPetFood(Net::MessageIn &msg); - - static void processPetCatchProcess(Net::MessageIn &msg); - - int mRandCounter; }; } // namespace EAthena diff --git a/src/net/eathena/petrecv.cpp b/src/net/eathena/petrecv.cpp new file mode 100644 index 000000000..4d1dbe279 --- /dev/null +++ b/src/net/eathena/petrecv.cpp @@ -0,0 +1,204 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013-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/petrecv.h" + +#include "actormanager.h" +#include "notifymanager.h" + +#include "being/localplayer.h" +#include "being/petinfo.h" +#include "being/playerinfo.h" + +#include "enums/resources/notifytypes.h" + +#include "gui/windows/eggselectiondialog.h" + +#include "gui/widgets/createwidget.h" + +#include "gui/widgets/tabs/chat/chattab.h" + +#include "net/inventoryhandler.h" +#include "net/serverfeatures.h" + +#include "net/ea/eaprotocol.h" + +#include "net/eathena/menu.h" +#include "net/eathena/messageout.h" +#include "net/eathena/protocol.h" + +#include "utils/gettext.h" +#include "utils/stringutils.h" + +#include "debug.h" + +namespace EAthena +{ + +void PetRecv::processPetMessage(Net::MessageIn &msg) +{ + const BeingId id = msg.readBeingId("pet id"); + const int data = msg.readInt32("param"); + Being *const dstBeing = actorManager->findBeing(id); + if (!dstBeing) + return; + + const int hungry = data - (toInt(dstBeing->getSubType(), int) + - 100) * 100 - 50; + if (hungry >= 0 && hungry <= 4) + { + if (localChatTab && localPlayer) + { + std::string nick = strprintf(_("%s's pet"), + localPlayer->getName().c_str()); + localChatTab->chatLog(nick, strprintf("hungry level %d", hungry)); + } + PetInfo *const info = PlayerInfo::getPet(); + if (!info || info->id != id) + return; + info->hungry = hungry; + } +} + +void PetRecv::processPetRoulette(Net::MessageIn &msg) +{ + const uint8_t data = msg.readUInt8("data"); + switch (data) + { + case 0: + NotifyManager::notify(NotifyTypes::PET_CATCH_FAILED); + break; + case 1: + NotifyManager::notify(NotifyTypes::PET_CATCH_SUCCESS); + break; + default: + NotifyManager::notify(NotifyTypes::PET_CATCH_UNKNOWN, data); + break; + } +} + +void PetRecv::processEggsList(Net::MessageIn &msg) +{ + const int count = (msg.readInt16("len") - 4) / 2; + Inventory *const inv = PlayerInfo::getInventory(); + if (!inv) + return; + menu = MenuType::Eggs; + + if (count == 1) + { + const int index = msg.readInt16("index") - INVENTORY_OFFSET; + const Item *const item = inv->getItem(index); + inventoryHandler->selectEgg(item); + return; + } + SellDialog *const dialog = CREATEWIDGETR0(EggSelectionDialog); + + for (int f = 0; f < count; f ++) + { + const int index = msg.readInt16("index") - INVENTORY_OFFSET; + const Item *const item = inv->getItem(index); + + if (item) + dialog->addItem(item, 0); + } +} + +void PetRecv::processPetData(Net::MessageIn &msg) +{ + const int cmd = msg.readUInt8("type"); + const BeingId id = msg.readBeingId("pet id"); + Being *const dstBeing = actorManager->findBeing(id); + const int data = msg.readInt32("data"); + if (!cmd) // pre init + { + PetInfo *const info = new PetInfo; + info->id = id; + PlayerInfo::setPet(info); + PlayerInfo::setPetBeing(dstBeing); + return; + } + PetInfo *const info = PlayerInfo::getPet(); + if (!info) + return; + switch (cmd) + { + case 1: // intimacy + info->intimacy = data; + break; + case 2: // hunger + info->hungry = data; + break; + case 3: // accesory + info->equip = data; + break; + case 4: // performance + info->performance = data; + break; + case 5: // hair style + info->hairStyle = data; + break; + default: + break; + } +} + +void PetRecv::processPetStatus(Net::MessageIn &msg) +{ + const std::string name = msg.readString(24, "pet name"); + msg.readUInt8("rename flag"); + const int level = msg.readInt16("level"); + const int hungry = msg.readInt16("hungry"); + const int intimacy = msg.readInt16("intimacy"); + const int equip = msg.readInt16("equip"); + const int race = msg.readInt16("class"); + +// Being *const being = PlayerInfo::getPetBeing(); +// if (being) +// being->setLevel(level); + + PetInfo *const info = PlayerInfo::getPet(); + if (!info) + return; + info->name = name; + info->level = level; + info->hungry = hungry; + info->intimacy = intimacy; + info->equip = equip; + info->race = race; +} + +void PetRecv::processPetFood(Net::MessageIn &msg) +{ + // +++ need show notification message about success or fail + const int result = msg.readUInt8("result"); + msg.readInt16("food id"); + if (result) + NotifyManager::notify(NotifyTypes::PET_FEED_OK); + else + NotifyManager::notify(NotifyTypes::PET_FEED_ERROR); +} + +void PetRecv::processPetCatchProcess(Net::MessageIn &msg A_UNUSED) +{ + NotifyManager::notify(NotifyTypes::PET_CATCH_PROCESS); +} + +} // namespace EAthena diff --git a/src/net/eathena/petrecv.h b/src/net/eathena/petrecv.h new file mode 100644 index 000000000..81b2258fc --- /dev/null +++ b/src/net/eathena/petrecv.h @@ -0,0 +1,42 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013-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/>. + */ + +#ifndef NET_EATHENA_PETRECV_H +#define NET_EATHENA_PETRECV_H + +#include "net/eathena/messagehandler.h" + +#include "net/pethandler.h" + +namespace EAthena +{ + namespace PetRecv + { + void processPetMessage(Net::MessageIn &msg); + void processPetRoulette(Net::MessageIn &msg); + void processEggsList(Net::MessageIn &msg); + void processPetData(Net::MessageIn &msg); + void processPetStatus(Net::MessageIn &msg); + void processPetFood(Net::MessageIn &msg); + void processPetCatchProcess(Net::MessageIn &msg); + } // namespace PetRecv +} // namespace EAthena + +#endif // NET_EATHENA_PETRECV_H |