summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Athay <ko2fan@gmail.com>2008-10-24 15:18:02 +0000
committerDavid Athay <ko2fan@gmail.com>2008-10-24 15:18:02 +0000
commit20fe6419f8d9564e7ab098ead53c6ef5da1519fa (patch)
tree5313713cd9f12ca3fc503db2ceaccaa73f12a355 /src
parentef9852cddecfc5abce38438ca2138defb1a9b1bf (diff)
downloadmanaserv-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.cpp13
-rw-r--r--src/game-server/accountconnection.cpp11
-rw-r--r--src/game-server/command.cpp10
-rw-r--r--src/game-server/gamehandler.cpp14
-rw-r--r--src/game-server/postman.hpp23
-rw-r--r--src/scripting/lua.cpp31
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 *)&registryKey);
+ 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 }
};