diff options
author | David Athay <ko2fan@gmail.com> | 2008-10-24 15:18:02 +0000 |
---|---|---|
committer | David Athay <ko2fan@gmail.com> | 2008-10-24 15:18:02 +0000 |
commit | 20fe6419f8d9564e7ab098ead53c6ef5da1519fa (patch) | |
tree | 5313713cd9f12ca3fc503db2ceaccaa73f12a355 /src | |
parent | ef9852cddecfc5abce38438ca2138defb1a9b1bf (diff) | |
download | manaserv-20fe6419f8d9564e7ab098ead53c6ef5da1519fa.tar.gz manaserv-20fe6419f8d9564e7ab098ead53c6ef5da1519fa.tar.bz2 manaserv-20fe6419f8d9564e7ab098ead53c6ef5da1519fa.tar.xz manaserv-20fe6419f8d9564e7ab098ead53c6ef5da1519fa.zip |
Added post callback for getting post.
Added GM command for changing player attributes. Changed GM command to
@ as '/' was already being used by client for local commands.
Diffstat (limited to 'src')
-rw-r--r-- | src/account-server/dalstorage.cpp | 13 | ||||
-rw-r--r-- | src/game-server/accountconnection.cpp | 11 | ||||
-rw-r--r-- | src/game-server/command.cpp | 10 | ||||
-rw-r--r-- | src/game-server/gamehandler.cpp | 14 | ||||
-rw-r--r-- | src/game-server/postman.hpp | 23 | ||||
-rw-r--r-- | src/scripting/lua.cpp | 31 |
6 files changed, 84 insertions, 18 deletions
diff --git a/src/account-server/dalstorage.cpp b/src/account-server/dalstorage.cpp index 04efe8a3..60a8967f 100644 --- a/src/account-server/dalstorage.cpp +++ b/src/account-server/dalstorage.cpp @@ -1292,3 +1292,16 @@ void DALStorage::checkBannedAccounts() LOG_ERROR("(DALStorage::checkBannedAccounts) SQL query failure: " << e.what()); } } + +void DALStorage::storePost(Letter *letter) +{ + +} + +Letter* DALStorage::getStoredPost(int playerId) +{ + Character *sender; + Character *receiver; + Letter *letter = new Letter(0, sender, receiver); + return letter; +} diff --git a/src/game-server/accountconnection.cpp b/src/game-server/accountconnection.cpp index c5da8e2a..94371c35 100644 --- a/src/game-server/accountconnection.cpp +++ b/src/game-server/accountconnection.cpp @@ -123,7 +123,7 @@ void AccountConnection::processMessage(MessageIn &msg) { break; } - +/* // create the message MessageOut out(GPMSG_GET_POST_RESPONSE); @@ -148,6 +148,12 @@ void AccountConnection::processMessage(MessageIn &msg) // send post to character gameHandler->sendTo(character, out); + */ + std::string sender = msg.readString(); + std::string letter = msg.readString(); + + postMan->gotPost(character, sender, letter); + } break; case CGMSG_STORE_POST_RESPONSE: @@ -273,6 +279,9 @@ void AccountConnection::sendPost(Character *c, MessageIn &msg) void AccountConnection::getPost(Character *c) { + // let the postman know to expect some post for this character + postMan->addCharacter(c); + // send message to account server with id of retrieving player LOG_DEBUG("Sending GCMSG_REQUEST_POST"); MessageOut out(GCMSG_REQUEST_POST); diff --git a/src/game-server/command.cpp b/src/game-server/command.cpp index 4c9ae116..ad013ff3 100644 --- a/src/game-server/command.cpp +++ b/src/game-server/command.cpp @@ -262,6 +262,11 @@ static void ban(Character *from, Character *ch, std::string const &duration) accountHandler->banCharacter(ch, d); } +static void attribute(Character*, Character *ch, int attr, int value) +{ + ch->setAttribute(attr, value); +} + /** * List of remote commands. */ @@ -276,6 +281,7 @@ static Command const commands[] = handle("recall", AL_GM, recall), handle("reload", AL_ADMIN, reload), handle("ban", AL_GM, ban), + handle("attribute", AL_GM, attribute), }; /** @@ -295,8 +301,10 @@ void runCommand(Character *ch, std::string const &text) Command const *c = NULL; std::string::size_type npos = std::string::npos; std::string::size_type pos = text.find(' '); - std::string s(text, 1, pos == npos ? npos : pos - 1); // Skip slash. + // remove the first letter which signifies it was a command + std::string s(text, 1, pos == npos ? npos : pos - 1); + // check for valid command for (int i = 0; i < (int)(sizeof(commands) / sizeof(commands[0])); ++i) { if (s == commands[i].name) diff --git a/src/game-server/gamehandler.cpp b/src/game-server/gamehandler.cpp index d4068664..907bee14 100644 --- a/src/game-server/gamehandler.cpp +++ b/src/game-server/gamehandler.cpp @@ -190,7 +190,7 @@ void GameHandler::processMessage(NetComputer *comp, MessageIn &message) std::string say = message.readString(); if (say.empty()) break; - if (say[0] == '/') + if (say[0] == '@') { // Handle special command. extern void runCommand(Character *, std::string const &); @@ -460,11 +460,6 @@ void GameHandler::processMessage(NetComputer *comp, MessageIn &message) handleSendPost(&computer, message); } break; - case PGMSG_GET_POST: - { - handleGetPost(&computer, message); - } break; - default: LOG_WARN("Invalid message type"); result.writeShort(XXMSG_INVALID); @@ -608,10 +603,3 @@ void GameHandler::handleSendPost(GameClient *client, MessageIn &message) postMan->addCharacter(client->character); accountHandler->sendPost(client->character, message); } - -void GameHandler::handleGetPost(GameClient *client, MessageIn &message) -{ - // add the character so that the post man knows them - postMan->addCharacter(client->character); - accountHandler->getPost(client->character); -} diff --git a/src/game-server/postman.hpp b/src/game-server/postman.hpp index 45963cf9..3961b0bc 100644 --- a/src/game-server/postman.hpp +++ b/src/game-server/postman.hpp @@ -28,6 +28,13 @@ class Character; +struct PostCallback +{ + void (*handler)(Character *, std::string const &sender, + std::string const &letter, void *data); + void *data; +}; + class PostMan { public: @@ -51,8 +58,24 @@ public: } } + void getPost(Character *player, PostCallback &f) + { + mCallbacks.insert(std::pair<Character*, PostCallback>(player, f)); + accountHandler->getPost(player); + } + + void gotPost(Character *player, std::string sender, std::string letter) + { + std::map<Character*, PostCallback>::iterator itr = mCallbacks.find(player); + if (itr != mCallbacks.end()) + { + itr->second.handler(player, sender, letter, itr->second.data); + } + } + private: std::map<int, Character*> mCharacters; + std::map<Character*, PostCallback> mCallbacks; }; extern PostMan *postMan; diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp index f5365623..7f421c67 100644 --- a/src/scripting/lua.cpp +++ b/src/scripting/lua.cpp @@ -42,6 +42,7 @@ extern "C" { #include "game-server/monster.hpp" #include "game-server/monstermanager.hpp" #include "game-server/npc.hpp" +#include "game-server/postman.hpp" #include "game-server/quest.hpp" #include "game-server/state.hpp" #include "game-server/trigger.hpp" @@ -80,6 +81,9 @@ class LuaScript: public Script static void getQuestCallback(Character *, std::string const &, std::string const &, void *); + static void getPostCallback(Character *, std::string const &, + std::string const &, void *); + void processDeathEvent(Being* thing); private: @@ -638,6 +642,23 @@ void LuaScript::getQuestCallback(Character *q, std::string const &name, } /** + * Called when the server has recovered the post for a user + */ +void LuaScript::getPostCallback(Character *q, std::string const &sender, + std::string const &letter, void *data) +{ + // get the script + LuaScript *s = static_cast<LuaScript*>(data); + assert(s->nbArgs == -1); + lua_getglobal(s->mState, "post_reply"); + lua_pushlightuserdata(s->mState, q); + lua_pushstring(s->mState, sender.c_str()); + lua_pushstring(s->mState, letter.c_str()); + s->nbArgs = 3; + s->execute(); +} + +/** * Callback for getting a quest variable. Starts a recovery and returns * immediatly, if the variable is not known yet. * tmw.chr_get_chest(character, string): nil or string @@ -807,7 +828,7 @@ static int LuaGetBeingsInCircle(lua_State *s) /** * Gets the post for the character */ -static int LuaGetPost(lua_State *s) +static int LuaChr_GetPost(lua_State *s) { if (lua_isuserdata(s, 1)) { @@ -815,7 +836,11 @@ static int LuaGetPost(lua_State *s) if (c) { - accountHandler->getPost(c); + lua_pushlightuserdata(s, (void *)®istryKey); + lua_gettable(s, LUA_REGISTRYINDEX); + Script *t = static_cast<Script *>(lua_touserdata(s, -1)); + PostCallback f = { &LuaScript::getPostCallback, t }; + postMan->getPost(c, f); } } @@ -868,6 +893,7 @@ LuaScript::LuaScript(): { "chr_inv_count", &LuaChr_InvCount }, { "chr_get_quest", &LuaChr_GetQuest }, { "chr_set_quest", &LuaChr_SetQuest }, + { "chr_get_post", &LuaChr_GetPost }, { "monster_create", &LuaMonster_Create }, { "being_walk", &LuaBeing_Walk }, { "being_say", &LuaBeing_Say }, @@ -879,7 +905,6 @@ LuaScript::LuaScript(): { "trigger_create", &LuaTrigger_Create }, { "chatmessage", &LuaChatmessage }, { "get_beings_in_circle", &LuaGetBeingsInCircle }, - { "get_post", &LuaGetPost }, { "note_on_death", &LuaNoteOnDeath }, { NULL, NULL } }; |