From 203ed8e40105c17d300b12ee461327cb4416acf2 Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Sun, 23 Sep 2007 11:35:06 +0000 Subject: Changed delayed events to an explicit interface. --- ChangeLog | 9 ++++ src/game-server/command.cpp | 15 +++---- src/game-server/monster.cpp | 6 +-- src/game-server/spawnarea.cpp | 3 +- src/game-server/state.cpp | 96 +++++++++++++++++++++++++++++-------------- src/game-server/state.hpp | 44 ++++++++++++-------- src/game-server/trigger.cpp | 5 +-- src/scripting/lua.cpp | 6 +-- 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 + + * 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 * 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); } } } -- cgit