From 99be9859a30e84e758ee3bfe7dcc3de33dfa2391 Mon Sep 17 00:00:00 2001 From: Jared Adams Date: Sat, 7 Nov 2009 11:47:24 -0700 Subject: More eAthena guild stuff Also some related chenges elsewhere --- mana.cbp | 10 +- src/CMakeLists.txt | 4 +- src/Makefile.am | 6 +- src/gui/inventorywindow.h | 2 +- src/gui/storagewindow.cpp | 2 +- src/gui/storagewindow.h | 2 +- src/gui/trade.cpp | 4 +- src/guild.cpp | 176 +++++++++++++++++++++++++++++++--- src/guild.h | 90 +++++++++++++++-- src/localplayer.cpp | 10 +- src/localplayer.h | 2 +- src/net/ea/guildhandler.cpp | 29 +++++- src/net/ea/guildhandler.h | 8 +- src/net/ea/inventoryhandler.cpp | 22 +++-- src/net/ea/inventoryhandler.h | 8 +- src/net/ea/protocol.h | 39 ++++++-- src/net/guildhandler.h | 6 +- src/net/inventoryhandler.h | 17 ++-- src/net/manaserv/guildhandler.cpp | 44 +++++---- src/net/manaserv/guildhandler.h | 4 +- src/net/manaserv/inventoryhandler.cpp | 25 +++-- src/net/manaserv/inventoryhandler.h | 8 +- src/player.cpp | 8 +- src/player.h | 7 -- 24 files changed, 400 insertions(+), 133 deletions(-) diff --git a/mana.cbp b/mana.cbp index 614524ef..a07cb273 100644 --- a/mana.cbp +++ b/mana.cbp @@ -421,14 +421,8 @@ - - - - + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec0430cf..b2bc22a8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -373,6 +373,8 @@ SET(SRCS graphics.cpp graphics.h guichanfwd.h + guild.cpp + guild.h imageparticle.cpp imageparticle.h inventory.cpp @@ -540,8 +542,6 @@ SET(SRCS_MANA net/manaserv/specialhandler.h net/manaserv/tradehandler.cpp net/manaserv/tradehandler.h - guild.cpp - guild.h ) diff --git a/src/Makefile.am b/src/Makefile.am index b91930a4..9bbcbc29 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -322,6 +322,8 @@ mana_SOURCES = gui/widgets/avatar.cpp \ graphics.cpp \ graphics.h \ guichanfwd.h \ + guild.cpp \ + guild.h \ imageparticle.cpp \ imageparticle.h \ inventory.cpp \ @@ -441,9 +443,7 @@ mana_SOURCES += \ net/manaserv/specialhandler.cpp \ net/manaserv/specialhandler.h \ net/manaserv/tradehandler.cpp \ - net/manaserv/tradehandler.h \ - guild.cpp \ - guild.h + net/manaserv/tradehandler.h endif if SERVER_EATHENA diff --git a/src/gui/inventorywindow.h b/src/gui/inventorywindow.h index d7e82bd1..e40ac325 100644 --- a/src/gui/inventorywindow.h +++ b/src/gui/inventorywindow.h @@ -53,7 +53,7 @@ class InventoryWindow : public Window, * Constructor. */ InventoryWindow(int invSize = Net::getInventoryHandler() - ->getInventorySize()); + ->getSize(Net::InventoryHandler::INVENTORY)); /** * Destructor. diff --git a/src/gui/storagewindow.cpp b/src/gui/storagewindow.cpp index b0ffa3ff..e6583bad 100644 --- a/src/gui/storagewindow.cpp +++ b/src/gui/storagewindow.cpp @@ -197,5 +197,5 @@ void StorageWindow::removeStore(Item *item, int amount) void StorageWindow::close() { - Net::getInventoryHandler()->closeStorage(); + Net::getInventoryHandler()->closeStorage(Net::InventoryHandler::STORAGE); } diff --git a/src/gui/storagewindow.h b/src/gui/storagewindow.h index 8c890c27..a67e0617 100644 --- a/src/gui/storagewindow.h +++ b/src/gui/storagewindow.h @@ -50,7 +50,7 @@ class StorageWindow : public Window, gcn::ActionListener, * Constructor. */ StorageWindow(int invSize = Net::getInventoryHandler() - ->getStorageSize()); + ->getSize(Net::InventoryHandler::STORAGE)); /** * Destructor. diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp index 15a4d7e8..5a659da9 100644 --- a/src/gui/trade.cpp +++ b/src/gui/trade.cpp @@ -58,9 +58,9 @@ TradeWindow::TradeWindow(): Window(_("Trade: You")), mMyInventory(new Inventory(Net::getInventoryHandler() - ->getInventorySize())), + ->getSize(Net::InventoryHandler::INVENTORY))), mPartnerInventory(new Inventory(Net::getInventoryHandler() - ->getInventorySize())), + ->getSize(Net::InventoryHandler::INVENTORY))), mStatus(PROPOSING) { setWindowName("Trade"); diff --git a/src/guild.cpp b/src/guild.cpp index be4a5204..3b30ec23 100644 --- a/src/guild.cpp +++ b/src/guild.cpp @@ -21,30 +21,114 @@ #include "guild.h" -Guild::Guild(short id, short rights): +GuildMember::GuildMember(int guildId, int id, const std::string &name): + mName(name), mId(id), mOnline(false) +{ + mGuild = Guild::getGuild(guildId); +}; + +GuildMember::GuildMember(int guildId, int id): + mId(id), mOnline(false) +{ + mGuild = Guild::getGuild(guildId); +}; + +GuildMember::GuildMember(int guildId, const std::string &name): + mName(name), mId(0), mOnline(false) +{ + mGuild = Guild::getGuild(guildId); +}; + +Guild::GuildMap Guild::guilds; + +Guild::Guild(short id): mId(id), mCanInviteUsers(false) { - // to invite, rights must be greater than 0 - if (rights > 0) - mCanInviteUsers = true; + guilds[id] = this; } -void Guild::addMember(const std::string &name) +void Guild::addMember(GuildMember *member) { - if (!isMember(name)) + if (member->mGuild > 0 && member->mGuild != this) + { + throw "Member in another guild!"; + } + + if (!isMember(member)) { - mMembers.push_back(name); + mMembers.push_back(member); + member->mGuild = this; + } +} + +GuildMember *Guild::getMember(int id) +{ + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while(itr != itr_end) + { + if((*itr)->mId == id) + { + return (*itr); + } + ++itr; + } + + return NULL; +} + +GuildMember *Guild::getMember(std::string name) +{ + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while(itr != itr_end) + { + if((*itr)->mName == name) + { + return (*itr); + } + ++itr; + } + + return NULL; +} + +void Guild::removeMember(GuildMember *member) +{ + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while(itr != itr_end) + { + if((*itr)->mId == member->mId && (*itr)->mName == member->mName) + { + mMembers.erase(itr); + } + ++itr; + } +} + +void Guild::removeMember(int id) +{ + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while(itr != itr_end) + { + if((*itr)->mId == id) + { + mMembers.erase(itr); + } + ++itr; } } void Guild::removeMember(const std::string &name) { - std::vector::iterator itr = mMembers.begin(), - itr_end = mMembers.end(); + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); while(itr != itr_end) { - if((*itr) == name) + if((*itr)->mName == name) { mMembers.erase(itr); } @@ -52,13 +136,70 @@ void Guild::removeMember(const std::string &name) } } +std::string Guild::getElementAt(int index) +{ + GuildMember *m = mMembers[index]; + if (m->mOnline) + { + return "* " + m->mName; + } + else + { + return m->mName; + } +} + +void Guild::setRights(short rights) +{ + // to invite, rights must be greater than 0 + if (rights > 0) + { + mCanInviteUsers = true; + } +} + +bool Guild::isMember(GuildMember *member) const +{ + if (member->mGuild > 0 && member->mGuild != this) + return false; + + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->mId == member->mId && (*itr)->mName == member->mName) + { + return true; + } + ++itr; + } + + return false; +} + +bool Guild::isMember(int id) const +{ + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->mId == id) + { + return true; + } + ++itr; + } + + return false; +} + bool Guild::isMember(const std::string &name) const { - std::vector::const_iterator itr = mMembers.begin(), - itr_end = mMembers.end(); + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); while (itr != itr_end) { - if ((*itr) == name) + if ((*itr)->mName == name) { return true; } @@ -67,3 +208,12 @@ bool Guild::isMember(const std::string &name) const return false; } + +Guild *Guild::getGuild(int id) +{ + GuildMap::iterator it = guilds.find(id); + if (it != guilds.end()) + return it->second; + + return new Guild(id); +} diff --git a/src/guild.h b/src/guild.h index b9e9e4b6..d59f6020 100644 --- a/src/guild.h +++ b/src/guild.h @@ -24,16 +24,47 @@ #include +#include #include #include +class Guild; + +class GuildMember +{ +public: + GuildMember(int guildId, int id, const std::string &name); + + GuildMember(int guildId, int id); + + GuildMember(int guildId, const std::string &name); + + int getID() const { return mId; } + + void setID(int id) { mId = id; } + + std::string getName() const { return mName; } + + void setName(std::string name) { mName = name; } + + Guild *getGuild() const { return mGuild; } + + bool getOnline() const { return mOnline; } + + void setOnline(bool online) { mOnline = online; } + +protected: + friend class Guild; + + std::string mName; + int mId; + Guild *mGuild; + bool mOnline; +}; + class Guild : public gcn::ListModel { public: - /** - * Constructor with guild id passed to it. - */ - Guild(short id, short rights); /** * Set the guild's name. @@ -46,7 +77,21 @@ public: /** * Adds member to the list. */ - void addMember(const std::string &name); + void addMember(GuildMember *member); + + /** + * Find a member by ID. + * + * @return the member with the given ID, or NULL if they don't exist. + */ + GuildMember *getMember(int id); + + /** + * Find a member by name. + * + * @return the member with the given name, or NULL if they don't exist. + */ + GuildMember *getMember(std::string name); /** * Get the name of the guild. @@ -66,11 +111,23 @@ public: return mId; } + /** + * Removes a member from the guild. + */ + void removeMember(GuildMember *member); + + /** + * Removes a member from the guild. + */ + void removeMember(int id); + /** * Removes a member from the guild. */ void removeMember(const std::string &name); + void clearMembers() { mMembers.clear(); } + /** * Get size of members list. * @return Returns the number of members in the guild. @@ -83,9 +140,7 @@ public: * Get member at \a index. * @return Returns the name of member. */ - std::string getElementAt(int index) { - return mMembers[index]; - } + std::string getElementAt(int index); /** * Get whether user can invite users to this guild. @@ -96,12 +151,29 @@ public: return mCanInviteUsers; } + void setRights(short rights); + + bool isMember(GuildMember *member) const; + + bool isMember(int id) const; + bool isMember(const std::string &name) const; + static Guild *getGuild(int id); + private: + typedef std::map GuildMap; + static GuildMap guilds; + + /** + * Constructor with guild id passed to it. + */ + Guild(short id); + + typedef std::vector MemberList; + MemberList mMembers; std::string mName; short mId; - std::vector mMembers; bool mCanInviteUsers; }; diff --git a/src/localplayer.cpp b/src/localplayer.cpp index e736a01c..d670b3b6 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -102,11 +102,13 @@ LocalPlayer::LocalPlayer(int id, int job, Map *map): mWalkingDir(0), mPathSetByMouse(false), mDestX(0), mDestY(0), - mInventory(new Inventory(Net::getInventoryHandler()->getInventorySize())), + mInventory(new Inventory(Net::getInventoryHandler() + ->getSize(Net::InventoryHandler::INVENTORY))), #ifdef MANASERV_SUPPORT mLocalWalkTime(-1), #endif - mStorage(new Inventory(Net::getInventoryHandler()->getStorageSize())), + mStorage(new Inventory(Net::getInventoryHandler() + ->getSize(Net::InventoryHandler::STORAGE))), mMessageTime(0) { // Variable to keep the local player from doing certain actions before a map @@ -350,8 +352,6 @@ void LocalPlayer::nextStep(unsigned char dir = 0) #endif } - -#ifdef MANASERV_SUPPORT bool LocalPlayer::checkInviteRights(const std::string &guildName) { Guild *guild = getGuild(guildName); @@ -389,6 +389,7 @@ void LocalPlayer::clearInventory() mInventory->clear(); } +#ifdef MANASERV_SUPPORT void LocalPlayer::setInvItem(int index, int id, int amount) { bool equipment = false; @@ -397,7 +398,6 @@ void LocalPlayer::setInvItem(int index, int id, int amount) equipment = true; mInventory->setItem(index, id, amount, equipment); } - #endif void LocalPlayer::pickUp(FloorItem *item) diff --git a/src/localplayer.h b/src/localplayer.h index 2c784ac4..819b086d 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -141,7 +141,6 @@ class LocalPlayer : public Player */ Inventory *getStorage() const { return mStorage; } -#ifdef MANASERV_SUPPORT /** * Check the player has permission to invite users to specific guild */ @@ -153,6 +152,7 @@ class LocalPlayer : public Player void inviteToGuild(Being *being); void clearInventory(); +#ifdef MANASERV_SUPPORT void setInvItem(int index, int id, int amount); #endif diff --git a/src/net/ea/guildhandler.cpp b/src/net/ea/guildhandler.cpp index f4cfc038..0cccd8f4 100644 --- a/src/net/ea/guildhandler.cpp +++ b/src/net/ea/guildhandler.cpp @@ -25,6 +25,7 @@ #include "net/ea/protocol.h" #include "localplayer.h" +#include "log.h" Net::GuildHandler *guildHandler; @@ -102,6 +103,20 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) // TODO } break; + + case SMSG_GUILD_POSITION_INFO: + { + int guildId = msg.readInt32(); + int emblem = msg.readInt32(); + int posMode = msg.readInt32(); + msg.readInt32(); // Unused + msg.readInt8(); // Unused + std::string guildName = msg.readString(24); + + logger->log("Guild position info: %d %d %d %s\n", guildId, + emblem, posMode, guildName.c_str()); + } + break; } } @@ -143,14 +158,20 @@ void GuildHandler::leave(int guildId) msg.writeString("", 30); // Message } -void GuildHandler::kick(int guildId, int playerId) +void GuildHandler::kick(GuildMember member) { - // TODO + MessageOut msg(CMSG_GUILD_EXPULSION); + msg.writeInt32(member.getGuild()->getId()); + msg.writeInt32(member.getID()); // Account ID + msg.writeInt32(0); // Char ID + msg.writeString("", 40); // Message } void GuildHandler::chat(int guildId, const std::string &text) { - // TODO + MessageOut msg(CMSG_GUILD_MESSAGE); + msg.writeInt16(text.size() + 4); + msg.writeString(text); } void GuildHandler::memberList(int guildId) @@ -158,7 +179,7 @@ void GuildHandler::memberList(int guildId) // TODO } -void GuildHandler::changeMemberPostion(int guildId, int playerId, int level) +void GuildHandler::changeMemberPostion(GuildMember member, int level) { // TODO } diff --git a/src/net/ea/guildhandler.h b/src/net/ea/guildhandler.h index e80e4818..f04a56bb 100644 --- a/src/net/ea/guildhandler.h +++ b/src/net/ea/guildhandler.h @@ -45,13 +45,13 @@ class GuildHandler : public Net::GuildHandler, public MessageHandler void leave(int guildId); - void kick(int guildId, int playerId); + void kick(GuildMember member); void chat(int guildId, const std::string &text); void memberList(int guildId); - void changeMemberPostion(int guildId, int playerId, int level); + void changeMemberPostion(GuildMember member, int level); void requestAlliance(int guildId, int otherGuildId); @@ -59,6 +59,10 @@ class GuildHandler : public Net::GuildHandler, public MessageHandler bool response); void endAlliance(int guildId, int otherGuildId); + + private: + // eAthena only supports one guild per player + Guild *mGuild; }; } diff --git a/src/net/ea/inventoryhandler.cpp b/src/net/ea/inventoryhandler.cpp index 8f2b4453..94118ae2 100644 --- a/src/net/ea/inventoryhandler.cpp +++ b/src/net/ea/inventoryhandler.cpp @@ -347,12 +347,12 @@ void InventoryHandler::moveItem(int oldIndex, int newIndex) // Not implemented for eAthena (possible?) } -void InventoryHandler::openStorage() +void InventoryHandler::openStorage(StorageType type) { // Doesn't apply to eAthena, since opening happens through NPCs? } -void InventoryHandler::closeStorage() +void InventoryHandler::closeStorage(StorageType type) { MessageOut outMsg(CMSG_CLOSE_STORAGE); } @@ -374,14 +374,20 @@ void InventoryHandler::moveItem(StorageType source, int slot, int amount, } } -size_t InventoryHandler::getInventorySize() const +size_t InventoryHandler::getSize(StorageType type) const { - return 100; -} + switch (type) + { + case INVENTORY: + return 100; + case STORAGE: + return 300; + case GUILD_STORAGE: + return 1000; + case CART: + return 0; + } -size_t InventoryHandler::getStorageSize() const -{ - return 300; } } // namespace EAthena diff --git a/src/net/ea/inventoryhandler.h b/src/net/ea/inventoryhandler.h index e61ee14b..83a2b440 100644 --- a/src/net/ea/inventoryhandler.h +++ b/src/net/ea/inventoryhandler.h @@ -50,16 +50,14 @@ class InventoryHandler : public MessageHandler, public Net::InventoryHandler void moveItem(int oldIndex, int newIndex); - void openStorage(); + void openStorage(StorageType type); - void closeStorage(); + void closeStorage(StorageType type); void moveItem(StorageType source, int slot, int amount, StorageType destination); - size_t getInventorySize() const; - - size_t getStorageSize() const; + size_t getSize(StorageType type) const; }; } // namespace EAthena diff --git a/src/net/ea/protocol.h b/src/net/ea/protocol.h index e6a417aa..75d0d30e 100644 --- a/src/net/ea/protocol.h +++ b/src/net/ea/protocol.h @@ -163,8 +163,31 @@ static const int STORAGE_OFFSET = 1; #define SMSG_ADMIN_KICK_ACK 0x00cd #define SMSG_GUILD_CREATE_RESPONSE 0x0167 +#define SMSG_GUILD_POSITION_INFO 0x016c +#define SMSG_GUILD_MEMBER_LOGIN 0x016d +#define SMSG_GUILD_MASTER_OR_MEMBER 0x014e +#define SMSG_GUILD_BASIC_INFO 0x01b6 +#define SMSG_GUILD_ALIANCE_INFO 0x014c +#define SMSG_GUILD_MEMBER_LIST 0x0154 +#define SMSG_GUILD_POS_NAME_LIST 0x0166 +#define SMSG_GUILD_POS_INFO_LIST 0x0160 +#define SMSG_GUILD_POSITION_CHANGED 0x0174 +#define SMSG_GUILD_MEMBER_POS_CHANGE 0x0156 +#define SMSG_GUILD_EMBLEM 0x0152 +#define SMSG_GUILD_SKILL_INFO 0x0162 +#define SMSG_GUILD_NOTICE 0x016f +#define SMSG_GUILD_INVITE 0x016a #define SMSG_GUILD_INVITE_ACK 0x0169 -#define SMSG_GUILD_INVITE 0x016A +#define SMSG_GUILD_LEAVE 0x015a +#define SMSG_GUILD_EXPULSION 0x015c +#define SMSG_GUILD_EXPULSION_LIST 0x0163 +#define SMSG_GUILD_MESSAGE 0x017f +#define SMSG_GUILD_SKILL_UP 0x010e +#define SMSG_GUILD_REQ_ALLIANCE 0x0171 +#define SMSG_GUILD_REQ_ALLIANCE_ACK 0x0173 +#define SMSG_GUILD_DEL_ALLIANCE 0x0184 +#define SMSG_GUILD_OPPOSITION_ACK 0x0181 +#define SMSG_GUILD_BROKEN 0x015e #define SMSG_MVP 0x010c @@ -246,22 +269,22 @@ static const int STORAGE_OFFSET = 1; #define CMSG_ADMIN_KICK 0x00CC #define CMSG_ADMIN_MUTE 0x0149 -#define CMSG_GUILD_CHECK_MASTER 0x014D -#define CMSG_GUILD_REQUEST_INFO 0x014F +#define CMSG_GUILD_CHECK_MASTER 0x014d +#define CMSG_GUILD_REQUEST_INFO 0x014f #define CMSG_GUILD_REQUEST_EMBLEM 0x0151 #define CMSG_GUILD_CHANGE_EMBLEM 0x0153 #define CMSG_GUILD_CHANGE_MEMBER_POS 0x0155 #define CMSG_GUILD_LEAVE 0x0159 -#define CMSG_GUILD_EXPULSION 0x015B -#define CMSG_GUILD_BREAK 0x015D +#define CMSG_GUILD_EXPULSION 0x015b +#define CMSG_GUILD_BREAK 0x015d #define CMSG_GUILD_CHANGE_POS_INFO 0x0161 #define CMSG_GUILD_CREATE 0x0165 #define CMSG_GUILD_INVITE 0x0168 -#define CMSG_GUILD_INVITE_REPLY 0x016B -#define CMSG_GUILD_CHANGE_NOTICE 0x016E +#define CMSG_GUILD_INVITE_REPLY 0x016b +#define CMSG_GUILD_CHANGE_NOTICE 0x016e #define CMSG_GUILD_ALLIANCE_REQUEST 0x0170 #define CMSG_GUILD_ALLIANCE_REPLY 0x0172 -#define CMSG_GUILD_MESSAGE 0x017E +#define CMSG_GUILD_MESSAGE 0x017e #define CMSG_GUILD_OPPOSITION 0x0180 #define CMSG_GUILD_ALLIANCE_DELETE 0x0183 diff --git a/src/net/guildhandler.h b/src/net/guildhandler.h index bba261bc..da44e6cd 100644 --- a/src/net/guildhandler.h +++ b/src/net/guildhandler.h @@ -22,6 +22,7 @@ #ifndef GUILDHANDLER_H #define GUILDHANDLER_H +#include "guild.h" #include "player.h" #include @@ -41,14 +42,13 @@ class GuildHandler virtual void leave(int guildId) = 0; - virtual void kick(int guildId, int playerId) = 0; + virtual void kick(GuildMember member) = 0; virtual void chat(int guildId, const std::string &text) = 0; virtual void memberList(int guildId) = 0; - virtual void changeMemberPostion(int guildId, int playerId, - int level) = 0; + virtual void changeMemberPostion(GuildMember member, int level) = 0; virtual void requestAlliance(int guildId, int otherGuildId) = 0; diff --git a/src/net/inventoryhandler.h b/src/net/inventoryhandler.h index 08caf926..520e390e 100644 --- a/src/net/inventoryhandler.h +++ b/src/net/inventoryhandler.h @@ -45,24 +45,23 @@ class InventoryHandler virtual void moveItem(int oldIndex, int newIndex) = 0; - virtual void openStorage() = 0; - - virtual void closeStorage() = 0; - - //void changeCart() = 0; - enum StorageType { INVENTORY, STORAGE, + GUILD_STORAGE, CART }; + virtual void openStorage(StorageType type) = 0; + + virtual void closeStorage(StorageType type) = 0; + + //void changeCart() = 0; + virtual void moveItem(StorageType source, int slot, int amount, StorageType destination) = 0; - virtual size_t getInventorySize() const = 0; - - virtual size_t getStorageSize() const = 0; + virtual size_t getSize(StorageType type) const = 0; }; } // namespace Net diff --git a/src/net/manaserv/guildhandler.cpp b/src/net/manaserv/guildhandler.cpp index e71f4d20..dfc0e8c5 100644 --- a/src/net/manaserv/guildhandler.cpp +++ b/src/net/manaserv/guildhandler.cpp @@ -111,10 +111,10 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) logger->log("Received CPMSG_GUILD_GET_MEMBERS_RESPONSE"); if(msg.readInt8() == ERRMSG_OK) { - std::string guildMember; + std::string name; bool online; - std::string guildName; Guild *guild; + GuildMember *member; short guildId = msg.readInt16(); guild = player_node->getGuild(guildId); @@ -122,16 +122,17 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) if (!guild) return; - guildName = guild->getName(); + guild->clearMembers(); while(msg.getUnreadLength()) { - guildMember = msg.readString(); + name = msg.readString(); online = msg.readInt8(); - if(guildMember != "") + if(name != "") { - guild->addMember(guildMember); - guildWindow->setOnline(guildName, guildMember, online); + member = new GuildMember(guildId, name); + member->setOnline(online); + guild->addMember(member); } } @@ -143,8 +144,9 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) { logger->log("Received CPMSG_GUILD_UPDATE_LIST"); short guildId = msg.readInt16(); - std::string guildMember = msg.readString(); + std::string name = msg.readString(); char eventId = msg.readInt8(); + GuildMember *member; Guild *guild = player_node->getGuild(guildId); if (guild) @@ -152,23 +154,29 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) switch(eventId) { case GUILD_EVENT_NEW_PLAYER: - guild->addMember(guildMember); - guildWindow->setOnline(guild->getName(), guildMember, - true); + member = new GuildMember(guildId, name); + member->setOnline(true); + guild->addMember(member); break; case GUILD_EVENT_LEAVING_PLAYER: - guild->removeMember(guildMember); + guild->removeMember(name); break; case GUILD_EVENT_ONLINE_PLAYER: - guildWindow->setOnline(guild->getName(), guildMember, - true); + member = guild->getMember(name); + if (member) + { + member->setOnline(true); + } break; case GUILD_EVENT_OFFLINE_PLAYER: - guildWindow->setOnline(guild->getName(), guildMember, - false); + member = guild->getMember(name); + if (member) + { + member->setOnline(false); + } break; default: @@ -292,7 +300,7 @@ void GuildHandler::leave(int guildId) chatServerConnection->send(msg); } -void GuildHandler::kick(int guildId, int playerId) +void GuildHandler::kick(GuildMember member) { // TODO } @@ -309,7 +317,7 @@ void GuildHandler::memberList(int guildId) chatServerConnection->send(msg); } -void GuildHandler::changeMemberPostion(int guildId, int playerId, int level) +void GuildHandler::changeMemberPostion(GuildMember member, int level) { /*MessageOut msg(PCMSG_GUILD_PROMOTE_MEMBER); msg.writeInt16(guildId); diff --git a/src/net/manaserv/guildhandler.h b/src/net/manaserv/guildhandler.h index d80f0b33..3beaf16f 100644 --- a/src/net/manaserv/guildhandler.h +++ b/src/net/manaserv/guildhandler.h @@ -45,13 +45,13 @@ public: void leave(int guildId); - void kick(int guildId, int playerId); + void kick(GuildMember member); void chat(int guildId, const std::string &text); void memberList(int guildId); - void changeMemberPostion(int guildId, int playerId, int level); + void changeMemberPostion(GuildMember member, int level); void requestAlliance(int guildId, int otherGuildId); diff --git a/src/net/manaserv/inventoryhandler.cpp b/src/net/manaserv/inventoryhandler.cpp index 0d0c1b34..e2a579fd 100644 --- a/src/net/manaserv/inventoryhandler.cpp +++ b/src/net/manaserv/inventoryhandler.cpp @@ -66,7 +66,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) case GPMSG_INVENTORY: while (msg.getUnreadLength()) { - int slot = msg.readInt8(); + unsigned int slot = msg.readInt8(); if (slot == 255) { player_node->setMoney(msg.readInt32()); @@ -78,7 +78,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) { player_node->mEquipment->setEquipment(slot, id); } - else if (slot >= 32 && slot < 32 + getInventorySize()) + else if (slot >= 32 && slot < 32 + getSize(INVENTORY)) { int amount = id ? msg.readInt8() : 0; player_node->setInvItem(slot - 32, id, amount); @@ -153,12 +153,12 @@ void InventoryHandler::moveItem(int oldIndex, int newIndex) gameServerConnection->send(msg); } -void InventoryHandler::openStorage() +void InventoryHandler::openStorage(StorageType type) { // TODO } -void InventoryHandler::closeStorage() +void InventoryHandler::closeStorage(StorageType type) { // TODO } @@ -169,14 +169,19 @@ void InventoryHandler::moveItem(StorageType source, int slot, int amount, // TODO } -size_t InventoryHandler::getInventorySize() const +size_t InventoryHandler::getSize(StorageType type) const { - return 50; -} + switch (type) + { + case INVENTORY: + return 50; + case STORAGE: + case GUILD_STORAGE: + return 300; + case CART: + return 0; + } -size_t InventoryHandler::getStorageSize() const -{ - return 300; } } // namespace ManaServ diff --git a/src/net/manaserv/inventoryhandler.h b/src/net/manaserv/inventoryhandler.h index 1f937df9..d3feca0a 100644 --- a/src/net/manaserv/inventoryhandler.h +++ b/src/net/manaserv/inventoryhandler.h @@ -49,16 +49,14 @@ class InventoryHandler : public MessageHandler, Net::InventoryHandler void moveItem(int oldIndex, int newIndex); - void openStorage(); + void openStorage(StorageType type); - void closeStorage(); + void closeStorage(StorageType type); void moveItem(StorageType source, int slot, int amount, StorageType destination); - size_t getInventorySize() const; - - size_t getStorageSize() const; + size_t getSize(StorageType type) const; }; } // namespace ManaServ diff --git a/src/player.cpp b/src/player.cpp index abcfffe9..7e390b84 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -22,9 +22,7 @@ #include "animatedsprite.h" #include "configuration.h" #include "game.h" -#ifdef MANASERV_SUPPORT #include "guild.h" -#endif #include "localplayer.h" #include "particle.h" #include "player.h" @@ -209,10 +207,10 @@ void Player::setSpriteColor(unsigned int slot, const std::string &color) setSprite(slot, mSpriteIDs[slot], color); } -#ifdef MANASERV_SUPPORT Guild* Player::addGuild(short guildId, short rights) { - Guild *guild = new Guild(guildId, rights); + Guild *guild = Guild::getGuild(guildId); + guild->setRights(rights); mGuilds.insert(std::pair(guildId, guild)); return guild; } @@ -254,8 +252,6 @@ short Player::getNumberOfGuilds() return mGuilds.size(); } -#endif - void Player::setInParty(bool inParty) { mInParty = inParty; diff --git a/src/player.h b/src/player.h index a1ba1b5c..5cdc35a7 100644 --- a/src/player.h +++ b/src/player.h @@ -26,9 +26,7 @@ class Graphics; class Map; -#ifdef MANASERV_SUPPORT class Guild; -#endif enum Gender { @@ -109,7 +107,6 @@ class Player : public Being virtual void setSpriteColor(unsigned int slot, const std::string &color = ""); -#ifdef MANASERV_SUPPORT /** * Adds a guild to the player. */ @@ -135,8 +132,6 @@ class Player : public Being */ short getNumberOfGuilds(); -#endif - /** * Set whether the player in the LocalPlayer's party. Players that are * in the same party as the local player get their name displayed in @@ -170,10 +165,8 @@ class Player : public Being std::vector mSpriteIDs; std::vector mSpriteColors; -#ifdef MANASERV_SUPPORT // Character guild information std::map mGuilds; -#endif bool mIsGM; -- cgit v1.2.3-60-g2f50