summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-23 11:35:06 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-23 11:35:06 +0000
commit203ed8e40105c17d300b12ee461327cb4416acf2 (patch)
treecdbc670b1724500e696da4dc787f094c8f512283
parent6667a394a60e85f8bc34eb88c83350f4c28e9d34 (diff)
downloadmanaserv-203ed8e40105c17d300b12ee461327cb4416acf2.tar.gz
manaserv-203ed8e40105c17d300b12ee461327cb4416acf2.tar.xz
manaserv-203ed8e40105c17d300b12ee461327cb4416acf2.zip
Changed delayed events to an explicit interface.
-rw-r--r--ChangeLog9
-rw-r--r--src/game-server/command.cpp15
-rw-r--r--src/game-server/monster.cpp6
-rw-r--r--src/game-server/spawnarea.cpp3
-rw-r--r--src/game-server/state.cpp96
-rw-r--r--src/game-server/state.hpp44
-rw-r--r--src/game-server/trigger.cpp5
-rw-r--r--src/scripting/lua.cpp6
8 files changed, 114 insertions, 70 deletions
diff --git a/ChangeLog b/ChangeLog
index 0e6f2fb..cfb7e89 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-09-23 Guillaume Melquiond <guillaume.melquiond@gmail.com>
+
+ * src/game-server/state.hpp, src/game-server/state.cpp: Changed
+ delayed events to an explicit interface.
+ * src/scripting/lua.cpp, src/game-server/command.cpp,
+ src/game-server/state.cpp, src/game-server/spawnarea.cpp,
+ src/game-server/state.hpp, src/game-server/monster.cpp,
+ src/game-server/trigger.cpp: Updated to new interface.
+
2007-09-22 Guillaume Melquiond <guillaume.melquiond@gmail.com>
* src/chat-server/chatchannelmanager.hpp,
diff --git a/src/game-server/command.cpp b/src/game-server/command.cpp
index 43bfe70..55ef4d1 100644
--- a/src/game-server/command.cpp
+++ b/src/game-server/command.cpp
@@ -179,8 +179,7 @@ static Command handle(char const *name, int level,
static void warp(Character *, Character *q, MapComposite *m, int x, int y)
{
- DelayedEvent e = { EVENT_WARP, x, y, m };
- GameState::enqueueEvent(q, e);
+ GameState::warp(q, m, x, y);
}
static void item(Character *, Character *q, ItemClass *it, int nb)
@@ -198,8 +197,7 @@ static void drop(Character *from, ItemClass *it, int nb)
Item *item = new Item(it, nb);
item->setMap(from->getMap());
item->setPosition(from->getPosition());
- DelayedEvent e = { EVENT_INSERT };
- GameState::enqueueEvent(item, e);
+ GameState::insert(item);
}
static void spawn(Character *from, MonsterClass *specy, int nb)
@@ -213,8 +211,7 @@ static void spawn(Character *from, MonsterClass *specy, int nb)
monster->setMap(map);
monster->setPosition(pos);
monster->clearDestination();
- DelayedEvent e = { EVENT_INSERT };
- GameState::enqueueEvent(monster, e);
+ GameState::insert(monster);
}
}
@@ -222,16 +219,14 @@ static void goto_(Character *from, Character *ch)
{
MapComposite *m = ch->getMap();
Point const &pos = ch->getPosition();
- DelayedEvent e = { EVENT_WARP, pos.x, pos.y, m };
- GameState::enqueueEvent(from, e);
+ GameState::warp(from, m, pos.x, pos.y);
}
static void recall(Character *from, Character *ch)
{
MapComposite *m = from->getMap();
Point const &pos = from->getPosition();
- DelayedEvent e = { EVENT_WARP, pos.x, pos.y, m };
- GameState::enqueueEvent(ch, e);
+ GameState::warp(ch, m, pos.x, pos.y);
}
static void reload(Character *, std::string const &db)
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index c8a3457..1d4bc28 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -117,8 +117,7 @@ void Monster::update()
mCountDown--;
if (mCountDown <= 0)
{
- DelayedEvent e = { EVENT_REMOVE};
- GameState::enqueueEvent(this, e);
+ GameState::enqueueRemove(this);
}
return;
}
@@ -278,8 +277,7 @@ void Monster::died()
Item *item = new Item(drop, 1);
item->setMap(getMap());
item->setPosition(getPosition());
- DelayedEvent e = { EVENT_INSERT };
- GameState::enqueueEvent(item, e);
+ GameState::enqueueInsert(item);
}
}
diff --git a/src/game-server/spawnarea.cpp b/src/game-server/spawnarea.cpp
index fc6e40c..d160f71 100644
--- a/src/game-server/spawnarea.cpp
+++ b/src/game-server/spawnarea.cpp
@@ -93,8 +93,7 @@ SpawnArea::update()
being->setMap(map);
being->setPosition(position);
being->clearDestination();
- DelayedEvent e = { EVENT_INSERT };
- GameState::enqueueEvent(being, e);
+ GameState::enqueueInsert(being);
mNumBeings++;
}
diff --git a/src/game-server/state.cpp b/src/game-server/state.cpp
index 8545820..b9185e9 100644
--- a/src/game-server/state.cpp
+++ b/src/game-server/state.cpp
@@ -42,6 +42,22 @@
#include "scripting/script.hpp"
#include "utils/logger.h"
+enum
+{
+ EVENT_REMOVE = 0,
+ EVENT_INSERT,
+ EVENT_WARP
+};
+
+/**
+ * Event expected to happen at next update.
+ */
+struct DelayedEvent
+{
+ unsigned short type, x, y;
+ MapComposite *map;
+};
+
typedef std::map< Object *, DelayedEvent > DelayedEvents;
/**
@@ -400,7 +416,6 @@ void GameState::update()
switch (e.type)
{
case EVENT_REMOVE:
- {
remove(o);
if (o->getType() == OBJECT_CHARACTER)
{
@@ -409,40 +424,16 @@ void GameState::update()
gameHandler->kill(ch);
}
delete o;
- } break;
+ break;
case EVENT_INSERT:
- {
insert(o);
- } break;
+ break;
case EVENT_WARP:
- {
- remove(o);
- Point pos(e.x, e.y);
- o->setMap(e.map);
- o->setPosition(pos);
-
assert(o->getType() == OBJECT_CHARACTER);
- Character *p = static_cast< Character * >(o);
- p->clearDestination();
- /* Force update of persistent data on map change, so that
- characters can respawn at the start of the map after a death or
- a disconnection. */
- accountHandler->sendCharacterData(p);
-
- if (e.map->getMap())
- {
- insert(o);
- }
- else
- {
- MessageOut msg(GAMSG_REDIRECT);
- msg.writeLong(p->getDatabaseID());
- accountHandler->send(msg);
- gameHandler->prepareServerChange(p);
- }
- } break;
+ warp(static_cast< Character * >(o), e.map, e.x, e.y);
+ break;
}
}
delayedEvents.clear();
@@ -525,7 +516,34 @@ void GameState::remove(Thing *ptr)
map->remove(ptr);
}
-void GameState::enqueueEvent(Object *ptr, DelayedEvent const &e)
+void GameState::warp(Character *ptr, MapComposite *map, int x, int y)
+{
+ remove(ptr);
+ ptr->setMap(map);
+ ptr->setPosition(Point(x, y));
+ ptr->clearDestination();
+ /* Force update of persistent data on map change, so that
+ characters can respawn at the start of the map after a death or
+ a disconnection. */
+ accountHandler->sendCharacterData(ptr);
+
+ if (map->isActive())
+ {
+ insert(ptr);
+ }
+ else
+ {
+ MessageOut msg(GAMSG_REDIRECT);
+ msg.writeLong(ptr->getDatabaseID());
+ accountHandler->send(msg);
+ gameHandler->prepareServerChange(ptr);
+ }
+}
+
+/**
+ * Enqueues an event. It will be executed at end of update.
+ */
+static void enqueueEvent(Object *ptr, DelayedEvent const &e)
{
std::pair< DelayedEvents::iterator, bool > p =
delayedEvents.insert(std::make_pair(ptr, e));
@@ -536,6 +554,24 @@ void GameState::enqueueEvent(Object *ptr, DelayedEvent const &e)
}
}
+void GameState::enqueueInsert(Object *ptr)
+{
+ DelayedEvent e = { EVENT_INSERT, 0, 0, 0 };
+ enqueueEvent(ptr, e);
+}
+
+void GameState::enqueueRemove(Object *ptr)
+{
+ DelayedEvent e = { EVENT_REMOVE, 0, 0, 0 };
+ enqueueEvent(ptr, e);
+}
+
+void GameState::enqueueWarp(Character *ptr, MapComposite *m, int x, int y)
+{
+ DelayedEvent e = { EVENT_WARP, x, y, m };
+ enqueueEvent(ptr, e);
+}
+
void GameState::sayAround(Object *obj, std::string const &text)
{
MessageOut msg(GPMSG_SAY);
diff --git a/src/game-server/state.hpp b/src/game-server/state.hpp
index 356d5ba..0765984 100644
--- a/src/game-server/state.hpp
+++ b/src/game-server/state.hpp
@@ -29,19 +29,7 @@
class MapComposite;
class Thing;
class Object;
-
-enum
-{
- EVENT_REMOVE = 0,
- EVENT_INSERT,
- EVENT_WARP
-};
-
-struct DelayedEvent
-{
- unsigned short type, x, y;
- MapComposite *map;
-};
+class Character;
namespace GameState
{
@@ -52,20 +40,42 @@ namespace GameState
/**
* Inserts an object in the game world.
- * No update may be in progress.
+ * @note No update may be in progress.
*/
void insert(Thing *);
/**
* Removes an object from the game world.
- * No update may be in progress.
+ * @note No update may be in progress.
+ * @note The object is not destroyed by this call.
*/
void remove(Thing *);
/**
- * Enqueues an event. It will be executed at end of update.
+ * Warps a character between places of the game world.
+ * @note No update may be in progress.
+ * @note The character is destroyed, if needed.
+ */
+ void warp(Character *, MapComposite *, int x, int y);
+
+ /**
+ * Enqueues an insert event.
+ * @note The event will be executed at end of update.
+ */
+ void enqueueInsert(Object *);
+
+ /**
+ * Enqueues a remove event.
+ * @note The event will be executed at end of update.
+ * @note The object will be destroyed at that time.
+ */
+ void enqueueRemove(Object *);
+
+ /**
+ * Enqueues a warp event.
+ * @note The event will be executed at end of update.
*/
- void enqueueEvent(Object *, DelayedEvent const &);
+ void enqueueWarp(Character *, MapComposite *, int x, int y);
/**
* Says something around an object.
diff --git a/src/game-server/trigger.cpp b/src/game-server/trigger.cpp
index 3320506..c0c9bd8 100644
--- a/src/game-server/trigger.cpp
+++ b/src/game-server/trigger.cpp
@@ -23,17 +23,16 @@
#include "game-server/trigger.hpp"
+#include "game-server/character.hpp"
#include "game-server/mapcomposite.hpp"
#include "game-server/movingobject.hpp"
-#include "game-server/object.hpp"
#include "game-server/state.hpp"
void WarpAction::process(Object *obj)
{
if (obj->getType() == OBJECT_CHARACTER)
{
- DelayedEvent e = { EVENT_WARP, mX, mY, mMap };
- GameState::enqueueEvent(obj, e);
+ GameState::enqueueWarp(static_cast< Character * >(obj), mMap, mX, mY);
}
}
diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp
index 3eb3ecf..f33393a 100644
--- a/src/scripting/lua.cpp
+++ b/src/scripting/lua.cpp
@@ -214,8 +214,7 @@ static int LuaChr_Warp(lua_State *s)
LOG_WARN("LuaChr_Warp called with a non-existing map.");
return 0;
}
- DelayedEvent e = { EVENT_WARP, lua_tointeger(s, 3), lua_tointeger(s, 4), m };
- GameState::enqueueEvent(q, e);
+ GameState::enqueueWarp(q, m, lua_tointeger(s, 3), lua_tointeger(s, 4));
return 0;
}
@@ -284,8 +283,7 @@ static int LuaChr_InvChange(lua_State *s)
Item *item = new Item(ic, nb);
item->setMap(q->getMap());
item->setPosition(q->getPosition());
- DelayedEvent e = { EVENT_INSERT };
- GameState::enqueueEvent(item, e);
+ GameState::enqueueInsert(item);
}
}
}