From a93722a53e2d50466dfd5512c4a6a1c3dfc60fb1 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 28 Jan 2012 21:00:12 +0300 Subject: Add support for processing player statuses in evol server. --- src/being.cpp | 37 +++++++++++++++++------------- src/being.h | 6 +++++ src/commandhandler.cpp | 4 ++++ src/game.cpp | 6 +++++ src/gui/shopwindow.cpp | 13 +++++++++++ src/gui/whoisonline.cpp | 36 ++++++++++++++++++++++++++--- src/gui/whoisonline.h | 47 ++++++++++++++++---------------------- src/localplayer.cpp | 23 ++++++++++++++++++- src/localplayer.h | 2 ++ src/net/ea/playerhandler.cpp | 5 ++++ src/net/ea/playerhandler.h | 2 ++ src/net/manaserv/playerhandler.cpp | 5 ++++ src/net/manaserv/playerhandler.h | 2 ++ src/net/playerhandler.h | 2 ++ src/net/tmwa/playerhandler.cpp | 33 +++++++++++++++++++++----- src/net/tmwa/playerhandler.h | 1 + src/net/tmwa/protocol.h | 1 + 17 files changed, 172 insertions(+), 53 deletions(-) diff --git a/src/being.cpp b/src/being.cpp index 39d0bd450..9edfaad7b 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -2517,26 +2517,31 @@ void Being::saveComment(const std::string &name, resman->saveTextFile(dir, "comment.txt", name + "\n" + comment); } +void Being::setState(Uint8 state) +{ + mAdvanced = true; + bool shop = (state & FLAG_SHOP); + bool away = (state & FLAG_AWAY); + bool inactive = (state & FLAG_INACTIVE); + bool needUpdate = (shop != mShop || away != mAway + || inactive != mInactive); + + mShop = shop; + mAway = away; + mInactive = inactive; + + if (needUpdate) + { + updateName(); + addToCache(); + } +} + void Being::setEmote(Uint8 emotion, int emote_time) { if ((emotion & FLAG_SPECIAL) == FLAG_SPECIAL) { - mAdvanced = true; - bool shop = (emotion & FLAG_SHOP); - bool away = (emotion & FLAG_AWAY); - bool inactive = (emotion & FLAG_INACTIVE); - bool needUpdate = (shop != mShop || away != mAway - || inactive != mInactive); - - mShop = shop; - mAway = away; - mInactive = inactive; - - if (needUpdate) - { - updateName(); - addToCache(); - } + setState(emotion); } else { diff --git a/src/being.h b/src/being.h index 6052644c9..f34c192cb 100644 --- a/src/being.h +++ b/src/being.h @@ -102,6 +102,7 @@ class Being : public ActorSprite, public ConfigListener FLAG_SHOP = 1, FLAG_AWAY = 2, FLAG_INACTIVE = 4, + FLAG_GENDER = 128, FLAG_SPECIAL = 128 + 64 }; @@ -546,6 +547,8 @@ class Being : public ActorSprite, public ConfigListener */ void setEmote(Uint8 emotion, int emote_time); + void setState(Uint8 state); + /** * Get the current Emoticon type displayed above * the being. @@ -749,6 +752,9 @@ class Being : public ActorSprite, public ConfigListener bool isShopEnabled() { return mShop; } + void enableShop(bool b) + { mShop = b; } + /** * Sets the attack range. */ diff --git a/src/commandhandler.cpp b/src/commandhandler.cpp index 0f1e60a25..7a588dc09 100644 --- a/src/commandhandler.cpp +++ b/src/commandhandler.cpp @@ -54,6 +54,7 @@ #include "net/guildhandler.h" #include "net/net.h" #include "net/partyhandler.h" +#include "net/playerhandler.h" #include "net/tradehandler.h" #ifdef DEBUG_DUMP_LEAKS @@ -748,7 +749,10 @@ void CommandHandler::handlePseudoAway(const std::string &args, ChatTab *tab A_UNUSED) { if (player_node) + { player_node->setPseudoAway(args); + player_node->updateStatus(); + } } void CommandHandler::handleFollow(const std::string &args, ChatTab *tab) diff --git a/src/game.cpp b/src/game.cpp index aa9ba1536..e48b37ebc 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -287,6 +287,9 @@ static void createGuiWindows() if (setupWindow) setupWindow->externalUpdate(); + if (player_node) + player_node->updateStatus(); + Mana::Event::trigger(CHANNEL_GAME, Mana::Event(EVENT_GUIWINDOWSLOADED)); } @@ -1077,6 +1080,7 @@ bool Game::handleSwitchKeys(SDL_Event &event, bool &used) if (player_node) { player_node->changeAwayMode(); + player_node->updateStatus(); setValidSpeed(); } break; @@ -1585,6 +1589,8 @@ void Game::handleActive(SDL_Event &event) player_node->setHalfAway(true); } } + if (player_node) + player_node->updateStatus(); } if (player_node) player_node->updateName(); diff --git a/src/gui/shopwindow.cpp b/src/gui/shopwindow.cpp index b6b87edb7..1a27b8b0c 100644 --- a/src/gui/shopwindow.cpp +++ b/src/gui/shopwindow.cpp @@ -55,6 +55,7 @@ #include "net/net.h" #include "net/chathandler.h" #include "net/npchandler.h" +#include "net/playerhandler.h" #include "net/tradehandler.h" #include "resources/iteminfo.h" @@ -206,11 +207,15 @@ void ShopWindow::action(const gcn::ActionEvent &event) && mBuyShopItemList->getSelected() >= 0) { mBuyShopItems->del(mBuyShopItemList->getSelected()); + if (isShopEmpty() && player_node) + player_node->updateStatus(); } else if (event.getId() == "delete sell" && mSellShopItemList && mSellShopItemList->getSelected() >= 0) { mSellShopItems->del(mSellShopItemList->getSelected()); + if (isShopEmpty() && player_node) + player_node->updateStatus(); } else if (event.getId() == "announce buy" && mBuyShopItems && mBuyShopItems->getNumberOfElements() > 0) @@ -306,8 +311,12 @@ void ShopWindow::addBuyItem(Item *item, int amount, int price) { if (!mBuyShopItems || !item) return; + bool emp = isShopEmpty(); mBuyShopItems->addItemNoDup(item->getId(), item->getColor(), amount, price); + if (emp && player_node) + player_node->updateStatus(); + updateButtonsAndLabels(); } @@ -315,8 +324,12 @@ void ShopWindow::addSellItem(Item *item, int amount, int price) { if (!mBuyShopItems || !item) return; + bool emp = isShopEmpty(); mSellShopItems->addItemNoDup(item->getId(), item->getColor(), amount, price); + if (emp && player_node) + player_node->updateStatus(); + updateButtonsAndLabels(); } diff --git a/src/gui/whoisonline.cpp b/src/gui/whoisonline.cpp index 34cfc1a57..e38f6ad73 100644 --- a/src/gui/whoisonline.cpp +++ b/src/gui/whoisonline.cpp @@ -402,7 +402,8 @@ void WhoIsOnline::loadWebList() if (!mShowLevel) level = 0; - OnlinePlayer *player = new OnlinePlayer(nick, -1, level, -1); + OnlinePlayer *player = new OnlinePlayer(nick, 0, level, + GENDER_UNSPECIFIED, -1); mOnlinePlayers.insert(player); mOnlineNicks.insert(nick); @@ -709,11 +710,40 @@ void WhoIsOnline::optionChanged(const std::string &name) void OnlinePlayer::setText(std::string color) { - mText = strprintf("@@%s|##%s%s", mNick.c_str(), + mText = strprintf("@@%s|##%s%s ", mNick.c_str(), color.c_str(), mNick.c_str()); + if (actorSpriteManager) + { + Being *being = actorSpriteManager->findBeingByName( + mNick, Being::PLAYER); + if (being) + being->setState(mStatus); + } + if (mLevel > 0) - mText += strprintf(" (%d)", mLevel); + mText += strprintf("%d", mLevel); + + if (mGender == GENDER_FEMALE) + mText += "\u2640"; + else if (mGender == GENDER_MALE) + mText += "\u2642"; + + if (mStatus > 0) + { + if (mStatus & Being::FLAG_SHOP) + mText += "$"; + if (mStatus & Being::FLAG_AWAY) + { + // TRANSLATORS: this away status writed in player nick + mText += _("A"); + } + if (mStatus & Being::FLAG_INACTIVE) + { + // TRANSLATORS: this inactive status writed in player nick + mText += _("I"); + } + } if (mVersion > 0) mText += strprintf(" - %d", mVersion); diff --git a/src/gui/whoisonline.h b/src/gui/whoisonline.h index ef25257da..feaec3ab4 100644 --- a/src/gui/whoisonline.h +++ b/src/gui/whoisonline.h @@ -45,57 +45,50 @@ struct SDL_Thread; class OnlinePlayer { public: - OnlinePlayer(std::string nick, int status, int level, int version) : + OnlinePlayer(std::string nick, unsigned char status, + unsigned char level, unsigned char gender, + unsigned char version) : mNick(nick), mText(""), mStatus(status), mLevel(level), - mVersion(version) + mVersion(version), + mGender(gender) { } const std::string getNick() const - { - return mNick; - } + { return mNick; } - int getStaus() const - { - return mStatus; - } + unsigned char getStaus() const + { return mStatus; } - int getVersion() const - { - return mVersion; - } + unsigned char getVersion() const + { return mVersion; } - int getLevel() const - { - return mLevel; - } + unsigned char getLevel() const + { return mLevel; } const std::string getText() - { - return mText; - } + { return mText; } void setText(std::string str); - void setLevel(int level) - { - mLevel = level; - } + void setLevel(unsigned char level) + { mLevel = level; } private: std::string mNick; std::string mText; - int mStatus; + unsigned char mStatus; + + unsigned char mLevel; - int mLevel; + unsigned char mVersion; - int mVersion; + unsigned char mGender; }; /** diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 3df4a3214..bd69d785f 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -354,7 +354,8 @@ void LocalPlayer::logic() } } - if (mEnableAdvert && !mBlockAdvert && mAdvertTime < cur_time) + if (serverVersion < 4 && mEnableAdvert && !mBlockAdvert + && mAdvertTime < cur_time) { Uint8 smile = FLAG_SPECIAL; if (mTradebot && shopWindow && !shopWindow->isShopEmpty()) @@ -3442,6 +3443,7 @@ void LocalPlayer::setAway(const std::string &message) if (!message.empty()) config.setValue("afkMessage", message); changeAwayMode(); + updateStatus(); } void LocalPlayer::setPseudoAway(const std::string &message) @@ -4207,11 +4209,30 @@ const char *LocalPlayer::getVarItem(const char **arr, unsigned index, return arr[sz]; } +void LocalPlayer::updateStatus() +{ + if (serverVersion >= 4 && mEnableAdvert) + { + Uint8 status = 0; + if (mTradebot && shopWindow && !shopWindow->isShopEmpty()) + status += FLAG_SHOP; + + if (mAwayMode || mPseudoAwayMode) + status += FLAG_AWAY; + + if (mInactive) + status += FLAG_INACTIVE; + + Net::getPlayerHandler()->updateStatus(status); + } +} + void AwayListener::action(const gcn::ActionEvent &event) { if (event.getId() == "ok" && player_node && player_node->getAway()) { player_node->changeAwayMode(); + player_node->updateStatus(); if (outfitWindow) outfitWindow->unwearAwayOutfit(); if (miniStatusWindow) diff --git a/src/localplayer.h b/src/localplayer.h index ed181e3d0..ede073abf 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -477,6 +477,8 @@ class LocalPlayer : public Being, public ActorSpriteListener, bool checAttackPermissions(Being *target); + void updateStatus(); + std::string getInvertDirectionString(); std::string getCrazyMoveTypeString(); diff --git a/src/net/ea/playerhandler.cpp b/src/net/ea/playerhandler.cpp index 6a841415f..90c635428 100644 --- a/src/net/ea/playerhandler.cpp +++ b/src/net/ea/playerhandler.cpp @@ -645,4 +645,9 @@ int PlayerHandler::getAttackLocation() const { return EA_ATK; } + +void PlayerHandler::updateStatus() +{ + +} } // namespace Ea diff --git a/src/net/ea/playerhandler.h b/src/net/ea/playerhandler.h index d0402ecfc..7bf569349 100644 --- a/src/net/ea/playerhandler.h +++ b/src/net/ea/playerhandler.h @@ -68,6 +68,8 @@ class PlayerHandler : public Net::PlayerHandler void processPlayerStatUpdate6(Net::MessageIn &msg); void processPlayerArrowMessage(Net::MessageIn &msg); + + void updateStatus(); }; } // namespace Ea diff --git a/src/net/manaserv/playerhandler.cpp b/src/net/manaserv/playerhandler.cpp index 5ebf840bc..aa79d4d41 100644 --- a/src/net/manaserv/playerhandler.cpp +++ b/src/net/manaserv/playerhandler.cpp @@ -448,4 +448,9 @@ void PlayerHandler::requestOnlineList() } +void PlayerHandler::updateStatus(Uint8 status) +{ + +} + } // namespace ManaServ diff --git a/src/net/manaserv/playerhandler.h b/src/net/manaserv/playerhandler.h index 0255406a8..23d2f5e32 100644 --- a/src/net/manaserv/playerhandler.h +++ b/src/net/manaserv/playerhandler.h @@ -74,6 +74,8 @@ class PlayerHandler : public MessageHandler, public Net::PlayerHandler Vector getDefaultWalkSpeed() const; + void updateStatus(Uint8 status); + private: void handleMapChangeMessage(Net::MessageIn &msg); }; diff --git a/src/net/playerhandler.h b/src/net/playerhandler.h index f62acc0c9..6ae912102 100644 --- a/src/net/playerhandler.h +++ b/src/net/playerhandler.h @@ -73,6 +73,8 @@ class PlayerHandler virtual Vector getDefaultWalkSpeed() const = 0; virtual void requestOnlineList() = 0; + + virtual void updateStatus(Uint8 status) = 0; }; } // namespace Net diff --git a/src/net/tmwa/playerhandler.cpp b/src/net/tmwa/playerhandler.cpp index 3d48fb341..621a747b0 100644 --- a/src/net/tmwa/playerhandler.cpp +++ b/src/net/tmwa/playerhandler.cpp @@ -22,6 +22,7 @@ #include "net/tmwa/playerhandler.h" +#include "configuration.h" #include "logger.h" #include "net/messagein.h" @@ -227,8 +228,8 @@ void PlayerHandler::processOnlineList(Net::MessageIn &msg) return; } - const char *start = msg.readBytes(size); - const char *buf = start; + char *start = (char*)msg.readBytes(size); + char *buf = start; int addVal = 1; if (serverVersion >= 4) @@ -236,9 +237,9 @@ void PlayerHandler::processOnlineList(Net::MessageIn &msg) while (buf - start + 1 < size && *(buf + addVal)) { - char status = 0; - char ver = 0; - char level = 0; + unsigned char status = 0; + unsigned char ver = 0; + unsigned char level = 0; if (serverVersion >= 4) { status = *buf; @@ -248,7 +249,20 @@ void PlayerHandler::processOnlineList(Net::MessageIn &msg) ver = *buf; } buf ++; - arr.push_back(new OnlinePlayer(buf, status, level, ver)); + + int gender = GENDER_UNSPECIFIED; + if (serverVersion >= 4) + { + if (config.getBoolValue("showgender")) + { + if (status & Being::FLAG_GENDER) + gender = GENDER_MALE; + else + gender = GENDER_FEMALE; + } + } + arr.push_back(new OnlinePlayer((char*)buf, + status, level, gender, ver)); buf += strlen(buf) + 1; } @@ -257,4 +271,11 @@ void PlayerHandler::processOnlineList(Net::MessageIn &msg) delete [] start; } +void PlayerHandler::updateStatus(Uint8 status) +{ + MessageOut outMsg(CMSG_SET_STATUS); + outMsg.writeInt8(status); + outMsg.writeInt8(0); +} + } // namespace TmwAthena diff --git a/src/net/tmwa/playerhandler.h b/src/net/tmwa/playerhandler.h index 0fa524d51..14aa191f6 100644 --- a/src/net/tmwa/playerhandler.h +++ b/src/net/tmwa/playerhandler.h @@ -53,6 +53,7 @@ class PlayerHandler : public MessageHandler, public Ea::PlayerHandler void changeAction(Being::Action action); void processOnlineList(Net::MessageIn &msg); void requestOnlineList(); + void updateStatus(Uint8 status); void respawn(); }; diff --git a/src/net/tmwa/protocol.h b/src/net/tmwa/protocol.h index ddc642101..256f1dce4 100644 --- a/src/net/tmwa/protocol.h +++ b/src/net/tmwa/protocol.h @@ -336,5 +336,6 @@ enum #define CMSG_ONLINE_LIST 0x0210 #define SMSG_ONLINE_LIST 0x0211 #define SMSG_NPC_COMMAND 0x0212 +#define CMSG_SET_STATUS 0x0213 #endif -- cgit v1.2.3-70-g09d2