diff options
author | Bertram <bertram@cegetel.net> | 2010-03-03 23:36:37 +0100 |
---|---|---|
committer | Bertram <bertram@cegetel.net> | 2010-03-03 23:36:37 +0100 |
commit | 8cc31b582f372238ce6bd2c86888d312cf1fe5b2 (patch) | |
tree | 8db5f864348d08a05b8533c7ede58e76741a98f8 /src/net | |
parent | b1845e9e081df1fc77d9bcbed3ab95792d6ba682 (diff) | |
parent | d564943867452ad76e6d313a28870e640715dded (diff) | |
download | mana-client-8cc31b582f372238ce6bd2c86888d312cf1fe5b2.tar.gz mana-client-8cc31b582f372238ce6bd2c86888d312cf1fe5b2.tar.bz2 mana-client-8cc31b582f372238ce6bd2c86888d312cf1fe5b2.tar.xz mana-client-8cc31b582f372238ce6bd2c86888d312cf1fe5b2.zip |
Merge branch 'master' of gitorious.org:mana/mana
Conflicts:
src/being.cpp
Diffstat (limited to 'src/net')
-rw-r--r-- | src/net/ea/beinghandler.cpp | 19 | ||||
-rw-r--r-- | src/net/ea/generalhandler.cpp | 14 | ||||
-rw-r--r-- | src/net/ea/gui/guildtab.cpp | 117 | ||||
-rw-r--r-- | src/net/ea/gui/guildtab.h | 52 | ||||
-rw-r--r-- | src/net/ea/guildhandler.cpp | 330 | ||||
-rw-r--r-- | src/net/ea/guildhandler.h | 6 | ||||
-rw-r--r-- | src/net/ea/inventoryhandler.cpp | 88 | ||||
-rw-r--r-- | src/net/ea/inventoryhandler.h | 31 | ||||
-rw-r--r-- | src/net/ea/partyhandler.cpp | 19 | ||||
-rw-r--r-- | src/net/ea/playerhandler.cpp | 2 | ||||
-rw-r--r-- | src/net/guildhandler.h | 4 | ||||
-rw-r--r-- | src/net/inventoryhandler.h | 1 | ||||
-rw-r--r-- | src/net/manaserv/guildhandler.cpp | 10 | ||||
-rw-r--r-- | src/net/manaserv/guildhandler.h | 4 | ||||
-rw-r--r-- | src/net/manaserv/partyhandler.cpp | 3 |
15 files changed, 607 insertions, 93 deletions
diff --git a/src/net/ea/beinghandler.cpp b/src/net/ea/beinghandler.cpp index 8803fafb..dbfc0f3b 100644 --- a/src/net/ea/beinghandler.cpp +++ b/src/net/ea/beinghandler.cpp @@ -25,6 +25,7 @@ #include "beingmanager.h" #include "client.h" #include "effectmanager.h" +#include "guild.h" #include "localplayer.h" #include "log.h" #include "npc.h" @@ -106,7 +107,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) int param1; int stunMode; Uint32 statusEffects; - int type; + int type, guild; Uint16 status; Being *srcBeing, *dstBeing; Player *player; @@ -179,9 +180,19 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) hairColor = msg.readInt16(); shoes = msg.readInt16(); // clothes color - "abused" as shoes gloves = msg.readInt16(); // head dir - "abused" as gloves - msg.readInt16(); // guild - msg.readInt16(); // unknown - msg.readInt16(); // unknown + guild = msg.readInt32(); // guild + if (player) + { + if (guild == 0) + { + player->clearGuilds(); + } + else + { + player->addGuild(Guild::getGuild(guild)); + } + } + msg.readInt16(); // guild emblem msg.readInt16(); // manner dstBeing->setStatusEffectBlock(32, msg.readInt16()); // opt3 msg.readInt8(); // karma diff --git a/src/net/ea/generalhandler.cpp b/src/net/ea/generalhandler.cpp index f7d495a6..6ca853fb 100644 --- a/src/net/ea/generalhandler.cpp +++ b/src/net/ea/generalhandler.cpp @@ -49,6 +49,7 @@ #include "net/ea/tradehandler.h" #include "net/ea/specialhandler.h" +#include "net/ea/gui/guildtab.h" #include "net/ea/gui/partytab.h" #include "net/messagein.h" @@ -68,6 +69,7 @@ namespace EAthena { ServerInfo charServer; ServerInfo mapServer; +extern Guild *eaGuild; extern Party *eaParty; GeneralHandler::GeneralHandler(): @@ -226,12 +228,14 @@ void GeneralHandler::guiWindowsLoaded() void GeneralHandler::guiWindowsUnloaded() { + socialWindow->removeTab(eaGuild); socialWindow->removeTab(eaParty); - if (partyTab) - { - delete partyTab; - partyTab = 0; - } + + delete guildTab; + guildTab = 0; + + delete partyTab; + partyTab = 0; } void GeneralHandler::clearHandlers() diff --git a/src/net/ea/gui/guildtab.cpp b/src/net/ea/gui/guildtab.cpp new file mode 100644 index 00000000..e88c289e --- /dev/null +++ b/src/net/ea/gui/guildtab.cpp @@ -0,0 +1,117 @@ +/* + * The Mana Client + * Copyright (C) 2008-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * + * This file is part of The Mana 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/ea/gui/guildtab.h" + +#include "commandhandler.h" +#include "guild.h" +#include "localplayer.h" + +#include "gui/palette.h" + +#include "net/net.h" +#include "net/guildhandler.h" + +#include "resources/iteminfo.h" +#include "resources/itemdb.h" + +#include "utils/dtor.h" +#include "utils/gettext.h" +#include "utils/stringutils.h" + +namespace EAthena { + +extern Guild *eaGuild; + +GuildTab::GuildTab() : + ChatTab(_("Guild")) +{ + setTabColor(&guiPalette->getColor(Palette::GUILD)); +} + +GuildTab::~GuildTab() +{ +} + +void GuildTab::handleInput(const std::string &msg) +{ + Net::getGuildHandler()->chat(eaGuild->getId(), msg); +} + +void GuildTab::showHelp() +{ + chatLog(_("/help > Display this help.")); + chatLog(_("/invite > Invite a player to your guild")); + chatLog(_("/leave > Leave the guild you are in")); + chatLog(_("/kick > Kick some one from the guild you are in")); +} + +bool GuildTab::handleCommand(const std::string &type, const std::string &args) +{ + if (type == "help") + { + if (args == "invite") + { + chatLog(_("Command: /invite <nick>")); + chatLog(_("This command invites <nick> to the guild you're in.")); + chatLog(_("If the <nick> has spaces in it, enclose it in " + "double quotes (\").")); + } + else if (args == "leave") + { + chatLog(_("Command: /leave")); + chatLog(_("This command causes the player to leave the guild.")); + } + else + return false; + } + else if (type == "create" || type == "new") + { + if (args.empty()) + chatLog(_("Guild name is missing."), BY_SERVER); + else + Net::getGuildHandler()->create(args); + } + else if (type == "invite") + { + Net::getGuildHandler()->invite(eaGuild->getId(), args); + } + else if (type == "leave") + { + Net::getGuildHandler()->leave(eaGuild->getId()); + } + else if (type == "kick") + { + Net::getGuildHandler()->kick(eaGuild->getMember(args)); + } + else + return false; + + return true; +} + +void GuildTab::getAutoCompleteList(std::vector<std::string> &names) const +{ + if (eaGuild) + eaGuild->getNames(names); +} + +} // namespace EAthena diff --git a/src/net/ea/gui/guildtab.h b/src/net/ea/gui/guildtab.h new file mode 100644 index 00000000..58c8f539 --- /dev/null +++ b/src/net/ea/gui/guildtab.h @@ -0,0 +1,52 @@ +/* + * The Mana Client + * Copyright (C) 2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * + * This file is part of The Mana 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 EA_GUILDTAB_H +#define EA_GUILDTAB_H + +#include "gui/widgets/chattab.h" + +namespace EAthena { + +/** + * A tab for a guild chat channel. + */ +class GuildTab : public ChatTab +{ + public: + GuildTab(); + ~GuildTab(); + + void showHelp(); + + bool handleCommand(const std::string &type, const std::string &args); + + protected: + void handleInput(const std::string &msg); + + void getAutoCompleteList(std::vector<std::string> &names) const; +}; + +extern GuildTab *guildTab; + +} // namespace EAthena + +#endif // EA_GUILDTAB_H diff --git a/src/net/ea/guildhandler.cpp b/src/net/ea/guildhandler.cpp index 66576da4..bb2fdff7 100644 --- a/src/net/ea/guildhandler.cpp +++ b/src/net/ea/guildhandler.cpp @@ -20,26 +20,55 @@ #include "net/ea/guildhandler.h" +#include "guild.h" #include "localplayer.h" #include "log.h" -#include "gui/widgets/chattab.h" +#include "gui/socialwindow.h" #include "net/ea/messagein.h" #include "net/ea/protocol.h" +#include "net/ea/gui/guildtab.h" + #include "utils/gettext.h" extern Net::GuildHandler *guildHandler; namespace EAthena { +GuildTab *guildTab = 0; +Guild *eaGuild; + GuildHandler::GuildHandler() { static const Uint16 _messages[] = { SMSG_GUILD_CREATE_RESPONSE, - SMSG_GUILD_INVITE_ACK, + SMSG_GUILD_POSITION_INFO, + SMSG_GUILD_MEMBER_LOGIN, + SMSG_GUILD_MASTER_OR_MEMBER, + SMSG_GUILD_BASIC_INFO, + SMSG_GUILD_ALIANCE_INFO, + SMSG_GUILD_MEMBER_LIST, + SMSG_GUILD_POS_NAME_LIST, + SMSG_GUILD_POS_INFO_LIST, + SMSG_GUILD_POSITION_CHANGED, + SMSG_GUILD_MEMBER_POS_CHANGE, + SMSG_GUILD_EMBLEM, + SMSG_GUILD_SKILL_INFO, + SMSG_GUILD_NOTICE, SMSG_GUILD_INVITE, + SMSG_GUILD_INVITE_ACK, + SMSG_GUILD_LEAVE, + SMSG_GUILD_EXPULSION, + SMSG_GUILD_EXPULSION_LIST, + SMSG_GUILD_MESSAGE, + SMSG_GUILD_SKILL_UP, + SMSG_GUILD_REQ_ALLIANCE, + SMSG_GUILD_REQ_ALLIANCE_ACK, + SMSG_GUILD_DEL_ALLIANCE, + SMSG_GUILD_OPPOSITION_ACK, + SMSG_GUILD_BROKEN, 0 }; handledMessages = _messages; @@ -47,6 +76,12 @@ GuildHandler::GuildHandler() guildHandler = this; } +GuildHandler::~GuildHandler() +{ + delete guildTab; + guildTab = 0; +} + void GuildHandler::handleMessage(Net::MessageIn &msg) { switch (msg.getId()) @@ -73,53 +108,280 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) } } break; - case SMSG_GUILD_INVITE_ACK: + + case SMSG_GUILD_POSITION_INFO: { - int flag = msg.readInt8(); + int guildId = msg.readInt32(); + int emblem = msg.readInt32(); + int posMode = msg.readInt32(); + msg.readInt32(); // Unused + msg.readInt8(); // Unused + std::string guildName = msg.readString(24); - if (flag == 0) + logger->log("Guild position info: %d %d %d %s\n", guildId, + emblem, posMode, guildName.c_str()); + } + break; + + case SMSG_GUILD_MEMBER_LOGIN: + msg.readInt32(); // Account ID + msg.readInt32(); // Char ID + msg.readInt32(); // Flag + break; + + case SMSG_GUILD_MASTER_OR_MEMBER: + msg.readInt32(); // Type (0x57 for member, 0xd7 for master) + break; + + case SMSG_GUILD_BASIC_INFO: + { + int guildID = msg.readInt32(); // Guild ID + msg.readInt32(); // Guild level + msg.readInt32(); // 'Connect member' (number online?) + msg.readInt32(); // 'Max member' + msg.readInt32(); // Average level + msg.readInt32(); // Exp + msg.readInt32(); // Next exp + msg.skip(16); // unused + std::string name = msg.readString(24); // Name + msg.readString(24); // Master's name + msg.readString(20); // Castles (ie: "Six Castles" or "None Taken") + + Guild *g = Guild::getGuild(guildID); + g->setName(name); + } + break; + + case SMSG_GUILD_ALIANCE_INFO: + { + int length = msg.readInt16(); + int count = (length - 4) / 32; + + for (int i = 0; i < count; i++) { - // Fail (already in guild, busy, etc) + msg.readInt32(); // 'Opposition' + msg.readInt32(); // Other guild ID + msg.readString(24); // Other guild name } - else if (flag == 1) + } + break; + + case SMSG_GUILD_MEMBER_LIST: + { + int length = msg.readInt16(); + int count = (length - 4) / 104; + + eaGuild->clearMembers(); + + for (int i = 0; i < count; i++) { - // Rejected + int id = msg.readInt32(); // Account ID + msg.readInt32(); // Char ID + msg.readInt16(); // Hair + msg.readInt16(); // Hair color + msg.readInt16(); // Gender + msg.readInt16(); // Class + msg.readInt16(); // Level + msg.readInt32(); // Exp + int online = msg.readInt32(); // Online + msg.readInt32(); // Position + msg.skip(50); // unused + std::string name = msg.readString(24); // Name + + GuildMember *m = eaGuild->addMember(id, name); + m->setOnline(online); } - else if (flag == 2) + } + break; + + case SMSG_GUILD_POS_NAME_LIST: + { + int length = msg.readInt16(); + int count = (length - 4) / 28; + + for (int i = 0; i < count; i++) { - // Accepted + msg.readInt32(); // ID + msg.readString(24); // Position name } - else if (flag == 3) + } + break; + + case SMSG_GUILD_POS_INFO_LIST: + { + int length = msg.readInt16(); + int count = (length - 4) / 16; + + for (int i = 0; i < count; i++) { - // Guild full + msg.readInt32(); // ID + msg.readInt32(); // Mode + msg.readInt32(); // Same ID + msg.readInt32(); // Exp mode } } break; + case SMSG_GUILD_POSITION_CHANGED: + msg.readInt16(); // Always 44 + msg.readInt32(); // ID + msg.readInt32(); // Mode + msg.readInt32(); // Same ID + msg.readInt32(); // Exp mode + msg.readString(24); // Name + break; + + case SMSG_GUILD_MEMBER_POS_CHANGE: + msg.readInt16(); // Always 16 + msg.readInt32(); // Account ID + msg.readInt32(); // Char ID + msg.readInt32(); // Position + break; + + case SMSG_GUILD_EMBLEM: + { + int length = msg.readInt16(); + + msg.readInt32(); // Guild ID + msg.readInt32(); // Emblem ID + msg.skip(length - 12); // Emblem data (unknown format) + } + break; + + case SMSG_GUILD_SKILL_INFO: + { + int length = msg.readInt16(); + int count = (length - 6) / 37; + + msg.readInt16(); // 'Skill point' + + for (int i = 0; i < count; i++) + { + msg.readInt16(); // ID + msg.readInt16(); // 'Info' (unknown atm) + msg.readInt16(); // unused + msg.readInt16(); // Level + msg.readInt16(); // SP + msg.readInt16(); // 'Range' + msg.skip(24); // unused + msg.readInt8(); // Can be increased + } + } + break; + + case SMSG_GUILD_NOTICE: + msg.readString(60); // Mes1 + msg.readString(120); // Mes2 + break; + case SMSG_GUILD_INVITE: { int guildId = msg.readInt32(); std::string guildName = msg.readString(24); - printf("Guild invite for %d (%s)\n", guildId, guildName.c_str()); + socialWindow->showGuildInvite(guildName, guildId, ""); + } + break; + + case SMSG_GUILD_INVITE_ACK: + { + int flag = msg.readInt8(); + + switch (flag) + { + case 0: + guildTab->chatLog(_("Could not inivte user to guild."), + BY_SERVER); + break; + + case 1: + guildTab->chatLog(_("User rejected guild invite."), + BY_SERVER); + break; + + case 2: + guildTab->chatLog(_("User is now part of your guild."), + BY_SERVER); + break; + + case 3: + guildTab->chatLog(_("Your guild is full."), + BY_SERVER); + break; - // TODO + default: + guildTab->chatLog(_("Unknown guild invite response."), + BY_SERVER); + break; + } } break; - case SMSG_GUILD_POSITION_INFO: + case SMSG_GUILD_LEAVE: + msg.readString(24); // Name + msg.readString(40); // Message + break; + + case SMSG_GUILD_EXPULSION: + msg.readString(24); // Name (of expulsed?) + msg.readString(40); // Message + msg.skip(24); // unused ("dummy") + break; + + case SMSG_GUILD_EXPULSION_LIST: { - int guildId = msg.readInt32(); - int emblem = msg.readInt32(); - int posMode = msg.readInt32(); - msg.readInt32(); // Unused - msg.readInt8(); // Unused - std::string guildName = msg.readString(24); + int length = msg.readInt16(); + int count = (length - 4) / 88; - logger->log("Guild position info: %d %d %d %s\n", guildId, - emblem, posMode, guildName.c_str()); + for (int i = 0; i < count; i++) + { + msg.readString(24); // Name (of expulsed?) + msg.readString(24); // 'Acc' (name of expulser?) + msg.readString(24); // Message + } + } + break; + + case SMSG_GUILD_MESSAGE: + { + int msgLength = msg.readInt16() - 4; + if (msgLength <= 0) + { + return; + } + guildTab->chatLog(msg.readString(msgLength)); } break; + + case SMSG_GUILD_SKILL_UP: + msg.readInt16(); // Skill ID + msg.readInt16(); // Level + msg.readInt16(); // SP + msg.readInt16(); // 'Range' + msg.readInt8(); // unused? (always 1) + break; + + case SMSG_GUILD_REQ_ALLIANCE: + msg.readInt32(); // Account ID + msg.readString(24); // Name + break; + + case SMSG_GUILD_REQ_ALLIANCE_ACK: + msg.readInt32(); // Flag + break; + + case SMSG_GUILD_DEL_ALLIANCE: + msg.readInt32(); // Guild ID + msg.readInt32(); // Flag + break; + + case SMSG_GUILD_OPPOSITION_ACK: + msg.readInt8(); // Flag + break; + + case SMSG_GUILD_BROKEN: + msg.readInt32(); // Flag + break; } } @@ -136,7 +398,7 @@ void GuildHandler::create(const std::string &name) void GuildHandler::invite(int guildId, const std::string &name) { - // TODO + // TODO? } void GuildHandler::invite(int guildId, Player *player) @@ -165,13 +427,13 @@ void GuildHandler::leave(int guildId) msg.writeString("", 30); // Message } -void GuildHandler::kick(GuildMember member) +void GuildHandler::kick(GuildMember *member, std::string reason) { MessageOut msg(CMSG_GUILD_EXPULSION); - msg.writeInt32(member.getGuild()->getId()); - msg.writeInt32(member.getID()); // Account ID + msg.writeInt32(member->getGuild()->getId()); + msg.writeInt32(member->getID()); // Account ID msg.writeInt32(0); // Char ID - msg.writeString("", 40); // Message + msg.writeString(reason, 40); // Message } void GuildHandler::chat(int guildId, const std::string &text) @@ -183,10 +445,18 @@ void GuildHandler::chat(int guildId, const std::string &text) void GuildHandler::memberList(int guildId) { - // TODO + // TODO four types of info requests: + // 0 = basic info + alliance info + // 1 = position name list + member list + // 2 = position name list + position info list + // 3 = skill info + // 4 = expulsion list + + MessageOut msg(CMSG_GUILD_REQUEST_INFO); + msg.writeInt32(1); // Request member list } -void GuildHandler::changeMemberPostion(GuildMember member, 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 8b1753c7..df43a2a1 100644 --- a/src/net/ea/guildhandler.h +++ b/src/net/ea/guildhandler.h @@ -32,6 +32,8 @@ class GuildHandler : public Net::GuildHandler, public MessageHandler public: GuildHandler(); + ~GuildHandler(); + void handleMessage(Net::MessageIn &msg); void create(const std::string &name); @@ -44,13 +46,13 @@ class GuildHandler : public Net::GuildHandler, public MessageHandler void leave(int guildId); - void kick(GuildMember member); + void kick(GuildMember *member, std::string reason = ""); void chat(int guildId, const std::string &text); void memberList(int guildId); - void changeMemberPostion(GuildMember member, int level); + void changeMemberPostion(GuildMember *member, int level); void requestAlliance(int guildId, int otherGuildId); diff --git a/src/net/ea/inventoryhandler.cpp b/src/net/ea/inventoryhandler.cpp index 1a0e296c..60288ed3 100644 --- a/src/net/ea/inventoryhandler.cpp +++ b/src/net/ea/inventoryhandler.cpp @@ -107,6 +107,20 @@ InventoryHandler::InventoryHandler() }; handledMessages = _messages; inventoryHandler = this; + + mStorage = 0; + mStorageWindow = 0; +} + +InventoryHandler::~InventoryHandler() +{ + if (mStorageWindow) + { + mStorageWindow->close(); + mStorageWindow = 0; + } + + delete mStorage; } void InventoryHandler::handleMessage(Net::MessageIn &msg) @@ -115,7 +129,6 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) int index, amount, itemId, equipType, arrow; int identified, cards[4], itemType; Inventory *inventory = player_node->getInventory(); - Inventory *storage = player_node->getStorage(); switch (msg.getId()) { @@ -129,6 +142,10 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) inventory->clear(); } + else + { + mInventoryItems.clear(); + } msg.readInt16(); // length number = (msg.getLength() - 4) / 18; @@ -157,20 +174,15 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) if (msg.getId() == SMSG_PLAYER_INVENTORY) { - inventory->setItem(index, itemId, amount, false); - // Trick because arrows are not considered equipment - if (arrow & 0x8000) - { - if (Item *item = inventory->getItem(index)) - item->setEquipment(true); - } + bool isEquipment = arrow & 0x8000; - //const Item *item = inventory->getItem(index); + inventory->setItem(index, itemId, amount, isEquipment); } else { - storage->setItem(index, itemId, amount, false); + mInventoryItems.push_back(InventoryItem(index, itemId, + amount, false)); } } break; @@ -201,7 +213,8 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) cards[0], cards[1], cards[2], cards[3]); } - storage->setItem(index, itemId, amount, false); + mInventoryItems.push_back(InventoryItem(index, itemId, amount, + false)); } break; @@ -280,15 +293,27 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) * server. It always comes after the two SMSG_PLAYER_STORAGE_... * packets that update storage contents. */ - player_node->setInStorage(true); - msg.readInt16(); // Storage capacity - msg.readInt16(); // Used count + { + msg.readInt16(); // Used count + int size = msg.readInt16(); // Max size + + if (!mStorage) + mStorage = new Inventory(size); + + InventoryItems::iterator it = mInventoryItems.begin(); + InventoryItems::iterator it_end = mInventoryItems.end(); + for (; it != it_end; it++) + mStorage->setItem((*it).slot, (*it).id, (*it).quantity, + (*it).equip); + mInventoryItems.clear(); + + if (!mStorageWindow) + mStorageWindow = new StorageWindow(mStorage); + } break; case SMSG_PLAYER_STORAGE_ADD: - /* - * Move an item into storage - */ + // Move an item into storage index = msg.readInt16() - STORAGE_OFFSET; amount = msg.readInt32(); itemId = msg.readInt16(); @@ -298,37 +323,38 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) for (int i = 0; i < 4; i++) cards[i] = msg.readInt16(); - if (Item *item = storage->getItem(index)) + if (Item *item = mStorage->getItem(index)) { item->setId(itemId); item->increaseQuantity(amount); } else { - storage->setItem(index, itemId, amount, false); + mStorage->setItem(index, itemId, amount, false); } break; case SMSG_PLAYER_STORAGE_REMOVE: - /* - * Move an item out of storage - */ + // Move an item out of storage index = msg.readInt16() - STORAGE_OFFSET; amount = msg.readInt16(); - if (Item *item = storage->getItem(index)) + if (Item *item = mStorage->getItem(index)) { item->increaseQuantity(-amount); if (item->getQuantity() == 0) - storage->removeItemAt(index); + mStorage->removeItemAt(index); } break; case SMSG_PLAYER_STORAGE_CLOSE: - /* - * Storage access has been closed - */ - storage->clear(); - player_node->setInStorage(false); + // Storage access has been closed + + // Storage window deletes itself + mStorageWindow = 0; + + mStorage->clear(); + delete mStorage; + mStorage = 0; break; case SMSG_PLAYER_EQUIPMENT: @@ -482,9 +508,9 @@ size_t InventoryHandler::getSize(StorageType type) const case INVENTORY: return 100; case STORAGE: - return 300; + return 0; case GUILD_STORAGE: - return 1000; + return 0; default: return 0; } diff --git a/src/net/ea/inventoryhandler.h b/src/net/ea/inventoryhandler.h index a2d0d388..2699e584 100644 --- a/src/net/ea/inventoryhandler.h +++ b/src/net/ea/inventoryhandler.h @@ -26,11 +26,15 @@ #include "inventory.h" #include "localplayer.h" +#include "gui/storagewindow.h" + #include "net/inventoryhandler.h" #include "net/net.h" #include "net/ea/messagehandler.h" +#include <list> + namespace EAthena { class EquipBackend : public Equipment::Backend { @@ -89,11 +93,35 @@ class EquipBackend : public Equipment::Backend { int mEquipment[EQUIPMENT_SIZE]; }; +/** + * Used to cache storage data until we get size data for it. + */ +class InventoryItem +{ + public: + int slot; + int id; + int quantity; + bool equip; + + InventoryItem(int slot, int id, int quantity, bool equip) + { + this->slot = slot; + this->id = id; + this->quantity = quantity; + this->equip = equip; + } +}; + +typedef std::list<InventoryItem> InventoryItems; + class InventoryHandler : public MessageHandler, public Net::InventoryHandler { public: InventoryHandler(); + ~InventoryHandler(); + void handleMessage(Net::MessageIn &msg); void equipItem(const Item *item); @@ -121,6 +149,9 @@ class InventoryHandler : public MessageHandler, public Net::InventoryHandler private: EquipBackend mEquips; + InventoryItems mInventoryItems; + Inventory *mStorage; + StorageWindow *mStorageWindow; }; } // namespace EAthena diff --git a/src/net/ea/partyhandler.cpp b/src/net/ea/partyhandler.cpp index 157898dc..922e59d1 100644 --- a/src/net/ea/partyhandler.cpp +++ b/src/net/ea/partyhandler.cpp @@ -68,11 +68,8 @@ PartyHandler::PartyHandler(): PartyHandler::~PartyHandler() { - if (partyTab) - { - delete partyTab; - partyTab = 0; - } + delete partyTab; + partyTab = 0; } void PartyHandler::handleMessage(Net::MessageIn &msg) @@ -104,11 +101,12 @@ void PartyHandler::handleMessage(Net::MessageIn &msg) bool leader = msg.readInt8() == 0; bool online = msg.readInt8() == 0; - PartyMember *member = new PartyMember(PARTY_ID, id, nick); + PartyMember *member = eaParty->addMember(id, nick); member->setLeader(leader); member->setOnline(online); - eaParty->addMember(member); } + + player_node->setParty(eaParty); } break; case SMSG_PARTY_INVITE_RESPONSE: @@ -270,6 +268,13 @@ void PartyHandler::handleMessage(Net::MessageIn &msg) m->setHp(hp); m->setMaxHp(maxhp); } + + // The server only sends this when the member is in range, so + // lets make sure they get the party hilight. + if (Being *b = beingManager->findBeing(id)) + { + static_cast<Player*>(b)->setParty(eaParty); + } } break; case SMSG_PARTY_UPDATE_COORDS: diff --git a/src/net/ea/playerhandler.cpp b/src/net/ea/playerhandler.cpp index 46919488..89e55f92 100644 --- a/src/net/ea/playerhandler.cpp +++ b/src/net/ea/playerhandler.cpp @@ -86,8 +86,6 @@ namespace { NpcDialog::closeAll(); SellDialog::closeAll(); - if (storageWindow->isVisible()) - storageWindow->close(); viewport->closePopupMenu(); } } deathListener; diff --git a/src/net/guildhandler.h b/src/net/guildhandler.h index 85b4cc8a..75683944 100644 --- a/src/net/guildhandler.h +++ b/src/net/guildhandler.h @@ -42,13 +42,13 @@ class GuildHandler virtual void leave(int guildId) = 0; - virtual void kick(GuildMember member) = 0; + virtual void kick(GuildMember *member, std::string reason = "") = 0; virtual void chat(int guildId, const std::string &text) = 0; virtual void memberList(int guildId) = 0; - virtual void changeMemberPostion(GuildMember member, 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 e3d0064d..9d0a5bc8 100644 --- a/src/net/inventoryhandler.h +++ b/src/net/inventoryhandler.h @@ -61,6 +61,7 @@ class InventoryHandler virtual void moveItem(StorageType source, int slot, int amount, StorageType destination) = 0; + // TODO: fix/remove me virtual size_t getSize(StorageType type) const = 0; virtual ~InventoryHandler() {} diff --git a/src/net/manaserv/guildhandler.cpp b/src/net/manaserv/guildhandler.cpp index 0dfe8cde..253efb01 100644 --- a/src/net/manaserv/guildhandler.cpp +++ b/src/net/manaserv/guildhandler.cpp @@ -131,9 +131,8 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) online = msg.readInt8(); if (name != "") { - member = new GuildMember(guildId, name); + member = guild->addMember(name); member->setOnline(online); - guild->addMember(member); } } } @@ -153,9 +152,8 @@ void GuildHandler::handleMessage(Net::MessageIn &msg) switch(eventId) { case GUILD_EVENT_NEW_PLAYER: - member = new GuildMember(guildId, name); + member = guild->addMember(name); member->setOnline(true); - guild->addMember(member); break; case GUILD_EVENT_LEAVING_PLAYER: @@ -296,7 +294,7 @@ void GuildHandler::leave(int guildId) chatServerConnection->send(msg); } -void GuildHandler::kick(GuildMember member) +void GuildHandler::kick(GuildMember *member, std::string reason) { // TODO } @@ -313,7 +311,7 @@ void GuildHandler::memberList(int guildId) chatServerConnection->send(msg); } -void GuildHandler::changeMemberPostion(GuildMember member, 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 8fdd40a4..1b6d51b5 100644 --- a/src/net/manaserv/guildhandler.h +++ b/src/net/manaserv/guildhandler.h @@ -45,13 +45,13 @@ public: void leave(int guildId); - void kick(GuildMember member); + void kick(GuildMember *member, std::string reason = ""); void chat(int guildId, const std::string &text); void memberList(int guildId); - void changeMemberPostion(GuildMember member, int level); + void changeMemberPostion(GuildMember *member, int level); void requestAlliance(int guildId, int otherGuildId); diff --git a/src/net/manaserv/partyhandler.cpp b/src/net/manaserv/partyhandler.cpp index 9ec8d2b8..ec153fa8 100644 --- a/src/net/manaserv/partyhandler.cpp +++ b/src/net/manaserv/partyhandler.cpp @@ -109,8 +109,7 @@ void PartyHandler::handleMessage(Net::MessageIn &msg) if (id == player_node->getId()) player_node->setParty(mParty); - PartyMember *member = new PartyMember(PARTY_ID, id, name); - mParty->addMember(member); + mParty->addMember(id, name); } break; case CPMSG_PARTY_MEMBER_LEFT: |