summaryrefslogtreecommitdiff
path: root/src/game-server/state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/state.cpp')
-rw-r--r--src/game-server/state.cpp313
1 files changed, 185 insertions, 128 deletions
diff --git a/src/game-server/state.cpp b/src/game-server/state.cpp
index 6fdfb6f5..58d848de 100644
--- a/src/game-server/state.cpp
+++ b/src/game-server/state.cpp
@@ -22,11 +22,12 @@
#include "common/configuration.h"
#include "game-server/accountconnection.h"
+#include "game-server/effect.h"
+#include "game-server/combatcomponent.h"
#include "game-server/gamehandler.h"
#include "game-server/inventory.h"
#include "game-server/item.h"
#include "game-server/itemmanager.h"
-#include "game-server/effect.h"
#include "game-server/map.h"
#include "game-server/mapcomposite.h"
#include "game-server/mapmanager.h"
@@ -37,7 +38,6 @@
#include "scripting/script.h"
#include "scripting/scriptmanager.h"
#include "utils/logger.h"
-#include "utils/point.h"
#include "utils/speedconv.h"
#include <cassert>
@@ -54,11 +54,12 @@ enum
*/
struct DelayedEvent
{
- unsigned short type, x, y;
+ unsigned short type;
+ Point point;
MapComposite *map;
};
-typedef std::map< Actor *, DelayedEvent > DelayedEvents;
+typedef std::map< Entity *, DelayedEvent > DelayedEvents;
/**
* The current world time in ticks since server start.
@@ -78,9 +79,10 @@ static std::map< std::string, std::string > mScriptVariables;
/**
* Sets message fields describing character look.
*/
-static void serializeLooks(Character *ch, MessageOut &msg)
+static void serializeLooks(Entity *ch, MessageOut &msg)
{
- const EquipData &equipData = ch->getPossessions().getEquipment();
+ const EquipData &equipData = ch->getComponent<CharacterComponent>()
+ ->getPossessions().getEquipment();
// We'll use a set to check whether we already sent the update for the given
// item instance.
@@ -104,9 +106,7 @@ static void serializeLooks(Character *ch, MessageOut &msg)
// When the insertion succeeds, its the first time
// we encounter the item, so we can send the look change.
// We also send empty slots for unequipment handling.
- lookChanges.insert(
- std::make_pair<unsigned, unsigned>(it->first,
- it->second.itemId));
+ lookChanges.insert(std::make_pair(it->first, it->second.itemId));
}
}
@@ -128,23 +128,28 @@ static void serializeLooks(Character *ch, MessageOut &msg)
/**
* Informs a player of what happened around the character.
*/
-static void informPlayer(MapComposite *map, Character *p)
+static void informPlayer(MapComposite *map, Entity *p)
{
MessageOut moveMsg(GPMSG_BEINGS_MOVE);
MessageOut damageMsg(GPMSG_BEINGS_DAMAGE);
- const Point &pold = p->getOldPosition(), ppos = p->getPosition();
- int pid = p->getPublicID(), pflags = p->getUpdateFlags();
+ const Point &pold = p->getComponent<BeingComponent>()->getOldPosition();
+ const Point &ppos = p->getComponent<ActorComponent>()->getPosition();
+ int pid = p->getComponent<ActorComponent>()->getPublicID();
+ int pflags = p->getComponent<ActorComponent>()->getUpdateFlags();
int visualRange = Configuration::getValue("game_visualRange", 448);
// Inform client about activities of other beings near its character
for (BeingIterator it(map->getAroundBeingIterator(p, visualRange));
it; ++it)
{
- Being *o = *it;
+ Entity *o = *it;
- const Point &oold = o->getOldPosition(), opos = o->getPosition();
+ const Point &oold =
+ o->getComponent<BeingComponent>()->getOldPosition();
+ const Point &opos = o->getComponent<ActorComponent>()->getPosition();
int otype = o->getType();
- int oid = o->getPublicID(), oflags = o->getUpdateFlags();
+ int oid = o->getComponent<ActorComponent>()->getPublicID();
+ int oflags = o->getComponent<ActorComponent>()->getUpdateFlags();
int flags = 0;
// Check if the character p and the moving object o are around.
@@ -166,8 +171,11 @@ static void informPlayer(MapComposite *map, Character *p)
{
MessageOut AttackMsg(GPMSG_BEING_ATTACK);
AttackMsg.writeInt16(oid);
- AttackMsg.writeInt8(o->getDirection());
- AttackMsg.writeInt8(static_cast< Being * >(o)->getAttackId());
+ AttackMsg.writeInt8(
+ o->getComponent<BeingComponent>()->getDirection());
+ CombatComponent *combatComponent =
+ o->getComponent<CombatComponent>();
+ AttackMsg.writeInt8(combatComponent->getAttackId());
gameHandler->sendTo(p, AttackMsg);
}
@@ -176,7 +184,8 @@ static void informPlayer(MapComposite *map, Character *p)
{
MessageOut ActionMsg(GPMSG_BEING_ACTION_CHANGE);
ActionMsg.writeInt16(oid);
- ActionMsg.writeInt8(static_cast< Being * >(o)->getAction());
+ ActionMsg.writeInt8(
+ o->getComponent<BeingComponent>()->getAction());
gameHandler->sendTo(p, ActionMsg);
}
@@ -185,18 +194,21 @@ static void informPlayer(MapComposite *map, Character *p)
{
MessageOut LooksMsg(GPMSG_BEING_LOOKS_CHANGE);
LooksMsg.writeInt16(oid);
- Character * c = static_cast<Character * >(o);
- serializeLooks(c, LooksMsg);
- LooksMsg.writeInt16(c->getHairStyle());
- LooksMsg.writeInt16(c->getHairColor());
- LooksMsg.writeInt16(c->getGender());
+ serializeLooks(o, LooksMsg);
+ auto *characterComponent =
+ o->getComponent<CharacterComponent>();
+ LooksMsg.writeInt16(characterComponent->getHairStyle());
+ LooksMsg.writeInt16(characterComponent->getHairColor());
+ LooksMsg.writeInt16(
+ o->getComponent<BeingComponent>()->getGender());
gameHandler->sendTo(p, LooksMsg);
}
// Send emote messages.
if (oflags & UPDATEFLAG_EMOTE)
{
- int emoteId = o->getLastEmote();
+ int emoteId =
+ o->getComponent<BeingComponent>()->getLastEmote();
if (emoteId > -1)
{
MessageOut EmoteMsg(GPMSG_BEING_EMOTE);
@@ -211,15 +223,17 @@ static void informPlayer(MapComposite *map, Character *p)
{
MessageOut DirMsg(GPMSG_BEING_DIR_CHANGE);
DirMsg.writeInt16(oid);
- DirMsg.writeInt8(o->getDirection());
+ DirMsg.writeInt8(
+ o->getComponent<BeingComponent>()->getDirection());
gameHandler->sendTo(p, DirMsg);
}
// Send damage messages.
if (o->canFight())
{
- Being *victim = static_cast< Being * >(o);
- const Hits &hits = victim->getHitsTaken();
+ CombatComponent *combatComponent =
+ o->getComponent<CombatComponent>();
+ const Hits &hits = combatComponent->getHitsTaken();
for (Hits::const_iterator j = hits.begin(),
j_end = hits.end(); j != j_end; ++j)
{
@@ -250,34 +264,41 @@ static void informPlayer(MapComposite *map, Character *p)
MessageOut enterMsg(GPMSG_BEING_ENTER);
enterMsg.writeInt8(otype);
enterMsg.writeInt16(oid);
- enterMsg.writeInt8(static_cast< Being *>(o)->getAction());
+ enterMsg.writeInt8(o->getComponent<BeingComponent>()->getAction());
enterMsg.writeInt16(opos.x);
enterMsg.writeInt16(opos.y);
- enterMsg.writeInt8(o->getDirection());
- enterMsg.writeInt8(o->getGender());
+ enterMsg.writeInt8(
+ o->getComponent<BeingComponent>()->getDirection());
+ enterMsg.writeInt8(o->getComponent<BeingComponent>()->getGender());
switch (otype)
{
case OBJECT_CHARACTER:
{
- Character *q = static_cast< Character * >(o);
- enterMsg.writeString(q->getName());
- enterMsg.writeInt8(q->getHairStyle());
- enterMsg.writeInt8(q->getHairColor());
- serializeLooks(q, enterMsg);
+ auto *characterComponent =
+ o->getComponent<CharacterComponent>();
+ enterMsg.writeString(
+ o->getComponent<BeingComponent>()->getName());
+ enterMsg.writeInt8(characterComponent->getHairStyle());
+ enterMsg.writeInt8(characterComponent->getHairColor());
+ serializeLooks(o, enterMsg);
} break;
case OBJECT_MONSTER:
{
- Monster *q = static_cast< Monster * >(o);
- enterMsg.writeInt16(q->getSpecy()->getId());
- enterMsg.writeString(q->getName());
+ MonsterComponent *monsterComponent =
+ o->getComponent<MonsterComponent>();
+ enterMsg.writeInt16(monsterComponent->getSpecy()->getId());
+ enterMsg.writeString(
+ o->getComponent<BeingComponent>()->getName());
} break;
case OBJECT_NPC:
{
- NPC *q = static_cast< NPC * >(o);
- enterMsg.writeInt16(q->getNPC());
- enterMsg.writeString(q->getName());
+ NpcComponent *npcComponent =
+ o->getComponent<NpcComponent>();
+ enterMsg.writeInt16(npcComponent->getNpcId());
+ enterMsg.writeString(
+ o->getComponent<BeingComponent>()->getName());
} break;
default:
@@ -313,7 +334,8 @@ static void informPlayer(MapComposite *map, Character *p)
// to get it within a byte with decimal precision.
// For instance, a value of 4.5 will be sent as 45.
moveMsg.writeInt8((unsigned short)
- (o->getModifiedAttribute(ATTR_MOVE_SPEED_TPS) * 10));
+ (o->getComponent<BeingComponent>()
+ ->getModifiedAttribute(ATTR_MOVE_SPEED_TPS) * 10));
}
}
@@ -325,27 +347,33 @@ static void informPlayer(MapComposite *map, Character *p)
gameHandler->sendTo(p, damageMsg);
// Inform client about status change.
- p->sendStatus();
+ p->getComponent<CharacterComponent>()->sendStatus(*p);
// Inform client about health change of party members
for (CharacterIterator i(map->getWholeMapIterator()); i; ++i)
{
- Character *c = *i;
+ Entity *c = *i;
// Make sure its not the same character
if (c == p)
continue;
// make sure they are in the same party
- if (c->getParty() == p->getParty())
+ if (c->getComponent<CharacterComponent>()->getParty() ==
+ p->getComponent<CharacterComponent>()->getParty())
{
- int cflags = c->getUpdateFlags();
+ int cflags = c->getComponent<ActorComponent>()->getUpdateFlags();
if (cflags & UPDATEFLAG_HEALTHCHANGE)
{
+ auto *beingComponent = c->getComponent<BeingComponent>();
+
MessageOut healthMsg(GPMSG_BEING_HEALTH_CHANGE);
- healthMsg.writeInt16(c->getPublicID());
- healthMsg.writeInt16(c->getModifiedAttribute(ATTR_HP));
- healthMsg.writeInt16(c->getModifiedAttribute(ATTR_MAX_HP));
+ healthMsg.writeInt16(
+ c->getComponent<ActorComponent>()->getPublicID());
+ healthMsg.writeInt16(
+ beingComponent->getModifiedAttribute(ATTR_HP));
+ healthMsg.writeInt16(
+ beingComponent->getModifiedAttribute(ATTR_MAX_HP));
gameHandler->sendTo(p, healthMsg);
}
}
@@ -356,12 +384,13 @@ static void informPlayer(MapComposite *map, Character *p)
for (FixedActorIterator it(map->getAroundBeingIterator(p, visualRange));
it; ++it)
{
- assert((*it)->getType() == OBJECT_ITEM ||
- (*it)->getType() == OBJECT_EFFECT);
+ Entity *o = *it;
+
+ assert(o->getType() == OBJECT_ITEM ||
+ o->getType() == OBJECT_EFFECT);
- Actor *o = *it;
- Point opos = o->getPosition();
- int oflags = o->getUpdateFlags();
+ Point opos = o->getComponent<ActorComponent>()->getPosition();
+ int oflags = o->getComponent<ActorComponent>()->getUpdateFlags();
bool willBeInRange = ppos.inRangeOf(opos, visualRange);
bool wereInRange = pold.inRangeOf(opos, visualRange) &&
!((pflags | oflags) & UPDATEFLAG_NEW_ON_MAP);
@@ -372,20 +401,22 @@ static void informPlayer(MapComposite *map, Character *p)
{
case OBJECT_ITEM:
{
- Item *o = static_cast< Item * >(*it);
+ ItemComponent *item = o->getComponent<ItemComponent>();
+ ItemClass *itemClass = item->getItemClass();
+
if (oflags & UPDATEFLAG_NEW_ON_MAP)
{
/* Send a specific message to the client when an item appears
out of nowhere, so that a sound/animation can be performed. */
MessageOut appearMsg(GPMSG_ITEM_APPEAR);
- appearMsg.writeInt16(o->getItemClass()->getDatabaseID());
+ appearMsg.writeInt16(itemClass->getDatabaseID());
appearMsg.writeInt16(opos.x);
appearMsg.writeInt16(opos.y);
gameHandler->sendTo(p, appearMsg);
}
else
{
- itemMsg.writeInt16(willBeInRange ? o->getItemClass()->getDatabaseID() : 0);
+ itemMsg.writeInt16(willBeInRange ? itemClass->getDatabaseID() : 0);
itemMsg.writeInt16(opos.x);
itemMsg.writeInt16(opos.y);
}
@@ -393,21 +424,23 @@ static void informPlayer(MapComposite *map, Character *p)
break;
case OBJECT_EFFECT:
{
- Effect *o = static_cast< Effect * >(*it);
- o->show();
+ EffectComponent *e = o->getComponent<EffectComponent>();
+ e->setShown();
// Don't show old effects
if (!(oflags & UPDATEFLAG_NEW_ON_MAP))
break;
- Being *b = o->getBeing();
- if (b)
+
+ if (Entity *b = e->getBeing())
{
+ auto *actorComponent =
+ b->getComponent<ActorComponent>();
MessageOut effectMsg(GPMSG_CREATE_EFFECT_BEING);
- effectMsg.writeInt16(o->getEffectId());
- effectMsg.writeInt16(b->getPublicID());
+ effectMsg.writeInt16(e->getEffectId());
+ effectMsg.writeInt16(actorComponent->getPublicID());
gameHandler->sendTo(p, effectMsg);
} else {
MessageOut effectMsg(GPMSG_CREATE_EFFECT_POS);
- effectMsg.writeInt16(o->getEffectId());
+ effectMsg.writeInt16(e->getEffectId());
effectMsg.writeInt16(opos.x);
effectMsg.writeInt16(opos.y);
gameHandler->sendTo(p, effectMsg);
@@ -456,11 +489,11 @@ void GameState::update(int tick)
for (ActorIterator it(map->getWholeMapIterator()); it; ++it)
{
- Actor *a = *it;
- a->clearUpdateFlags();
+ Entity *a = *it;
+ a->getComponent<ActorComponent>()->clearUpdateFlags();
if (a->canFight())
{
- static_cast< Being * >(a)->clearHitsTaken();
+ a->getComponent<CombatComponent>()->clearHitsTaken();
}
}
}
@@ -474,16 +507,15 @@ void GameState::update(int tick)
it_end = delayedEvents.end(); it != it_end; ++it)
{
const DelayedEvent &e = it->second;
- Actor *o = it->first;
+ Entity *o = it->first;
switch (e.type)
{
case EVENT_REMOVE:
remove(o);
if (o->getType() == OBJECT_CHARACTER)
{
- Character *ch = static_cast< Character * >(o);
- ch->disconnected();
- gameHandler->kill(ch);
+ o->getComponent<CharacterComponent>()->disconnected(*o);
+ gameHandler->kill(o);
}
delete o;
break;
@@ -494,7 +526,7 @@ void GameState::update(int tick)
case EVENT_WARP:
assert(o->getType() == OBJECT_CHARACTER);
- warp(static_cast< Character * >(o), e.map, e.x, e.y);
+ warp(o, e.map, e.point);
break;
}
}
@@ -517,9 +549,9 @@ bool GameState::insert(Entity *ptr)
}
// Check that coordinates are actually valid.
- Actor *obj = static_cast< Actor * >(ptr);
+ Entity *obj = static_cast< Entity * >(ptr);
Map *mp = map->getMap();
- Point pos = obj->getPosition();
+ Point pos = obj->getComponent<ActorComponent>()->getPosition();
if ((int)pos.x / mp->getTileWidth() >= mp->getWidth() ||
(int)pos.y / mp->getTileHeight() >= mp->getHeight())
{
@@ -527,7 +559,7 @@ bool GameState::insert(Entity *ptr)
<< pos.y << " outside map " << map->getID() << '.');
// Set an arbitrary small position.
pos = Point(100, 100);
- obj->setPosition(pos);
+ obj->getComponent<ActorComponent>()->setPosition(*ptr, pos);
}
if (!map->insert(obj))
@@ -544,28 +576,31 @@ bool GameState::insert(Entity *ptr)
{
case OBJECT_ITEM:
LOG_DEBUG("Item inserted: "
- << static_cast<Item*>(obj)->getItemClass()->getDatabaseID());
+ << obj->getComponent<ItemComponent>()->getItemClass()->getDatabaseID());
break;
case OBJECT_NPC:
- LOG_DEBUG("NPC inserted: " << static_cast<NPC*>(obj)->getNPC());
+ LOG_DEBUG("NPC inserted: " << obj->getComponent<NpcComponent>()->getNpcId());
break;
case OBJECT_CHARACTER:
LOG_DEBUG("Player inserted: "
- << static_cast<Being*>(obj)->getName());
+ << obj->getComponent<BeingComponent>()->getName());
break;
case OBJECT_EFFECT:
LOG_DEBUG("Effect inserted: "
- << static_cast<Effect*>(obj)->getEffectId());
+ << obj->getComponent<EffectComponent>()->getEffectId());
break;
case OBJECT_MONSTER:
+ {
+ MonsterComponent *monsterComponent =
+ obj->getComponent<MonsterComponent>();
LOG_DEBUG("Monster inserted: "
- << static_cast<Monster*>(obj)->getSpecy()->getId());
+ << monsterComponent->getSpecy()->getId());
break;
-
+ }
case OBJECT_ACTOR:
case OBJECT_OTHER:
default:
@@ -573,7 +608,8 @@ bool GameState::insert(Entity *ptr)
break;
}
- obj->raiseUpdateFlags(UPDATEFLAG_NEW_ON_MAP);
+ obj->getComponent<ActorComponent>()->raiseUpdateFlags(
+ UPDATEFLAG_NEW_ON_MAP);
if (obj->getType() != OBJECT_CHARACTER)
return true;
@@ -584,11 +620,11 @@ bool GameState::insert(Entity *ptr)
mapChangeMessage.writeString(map->getName());
mapChangeMessage.writeInt16(pos.x);
mapChangeMessage.writeInt16(pos.y);
- gameHandler->sendTo(static_cast< Character * >(obj), mapChangeMessage);
+ gameHandler->sendTo(ptr, mapChangeMessage);
// update the online state of the character
- accountHandler->updateOnlineStatus(
- static_cast< Character * >(obj)->getDatabaseID(), true);
+ accountHandler->updateOnlineStatus(ptr->getComponent<CharacterComponent>()
+ ->getDatabaseID(), true);
return true;
}
@@ -618,28 +654,31 @@ void GameState::remove(Entity *ptr)
{
case OBJECT_ITEM:
LOG_DEBUG("Item removed: "
- << static_cast<Item*>(ptr)->getItemClass()->getDatabaseID());
+ << ptr->getComponent<ItemComponent>()->getItemClass()->getDatabaseID());
break;
case OBJECT_NPC:
- LOG_DEBUG("NPC removed: " << static_cast<NPC*>(ptr)->getNPC());
+ LOG_DEBUG("NPC removed: " << ptr->getComponent<NpcComponent>()->getNpcId());
break;
case OBJECT_CHARACTER:
LOG_DEBUG("Player removed: "
- << static_cast<Being*>(ptr)->getName());
+ << ptr->getComponent<BeingComponent>()->getName());
break;
case OBJECT_EFFECT:
LOG_DEBUG("Effect removed: "
- << static_cast<Effect*>(ptr)->getEffectId());
+ << ptr->getComponent<EffectComponent>()->getEffectId());
break;
case OBJECT_MONSTER:
+ {
+ MonsterComponent *monsterComponent =
+ ptr->getComponent<MonsterComponent>();
LOG_DEBUG("Monster removed: "
- << static_cast<Monster*>(ptr)->getSpecy()->getId());
+ << monsterComponent->getSpecy()->getId());
break;
-
+ }
case OBJECT_ACTOR:
case OBJECT_OTHER:
default:
@@ -651,22 +690,24 @@ void GameState::remove(Entity *ptr)
{
if (ptr->getType() == OBJECT_CHARACTER)
{
- static_cast< Character * >(ptr)->cancelTransaction();
+ auto *characterComponent =
+ ptr->getComponent<CharacterComponent>();
+ characterComponent->cancelTransaction();
// remove characters online status
accountHandler->updateOnlineStatus(
- static_cast< Character * >(ptr)->getDatabaseID(), false);
+ characterComponent->getDatabaseID(), false);
}
- Actor *obj = static_cast< Actor * >(ptr);
MessageOut msg(GPMSG_BEING_LEAVE);
- msg.writeInt16(obj->getPublicID());
- Point objectPos = obj->getPosition();
+ msg.writeInt16(ptr->getComponent<ActorComponent>()->getPublicID());
+ Point objectPos = ptr->getComponent<ActorComponent>()->getPosition();
- for (CharacterIterator p(map->getAroundActorIterator(obj, visualRange));
+ for (CharacterIterator p(map->getAroundActorIterator(ptr, visualRange));
p; ++p)
{
- if (*p != obj && objectPos.inRangeOf((*p)->getPosition(),
+ if (*p != ptr && objectPos.inRangeOf(
+ (*p)->getComponent<ActorComponent>()->getPosition(),
visualRange))
{
gameHandler->sendTo(*p, msg);
@@ -675,16 +716,17 @@ void GameState::remove(Entity *ptr)
}
else if (ptr->getType() == OBJECT_ITEM)
{
- Item *obj = static_cast< Item * >(ptr);
- Point pos = obj->getPosition();
+ Point pos = ptr->getComponent<ActorComponent>()->getPosition();
MessageOut msg(GPMSG_ITEMS);
msg.writeInt16(0);
msg.writeInt16(pos.x);
msg.writeInt16(pos.y);
- for (CharacterIterator p(map->getAroundActorIterator(obj, visualRange)); p; ++p)
+ for (CharacterIterator p(map->getAroundActorIterator(ptr, visualRange)); p; ++p)
{
- if (pos.inRangeOf((*p)->getPosition(), visualRange))
+ const Point &point =
+ (*p)->getComponent<ActorComponent>()->getPosition();
+ if (pos.inRangeOf(point, visualRange))
{
gameHandler->sendTo(*p, msg);
}
@@ -694,27 +736,31 @@ void GameState::remove(Entity *ptr)
map->remove(ptr);
}
-void GameState::warp(Character *ptr, MapComposite *map, int x, int y)
+void GameState::warp(Entity *ptr, MapComposite *map, const Point &point)
{
remove(ptr);
+
ptr->setMap(map);
- ptr->setPosition(Point(x, y));
- ptr->clearDestination();
+ ptr->getComponent<ActorComponent>()->setPosition(*ptr, point);
+ ptr->getComponent<BeingComponent>()->clearDestination(*ptr);
/* 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);
+ auto *characterComponent =
+ ptr->getComponent<CharacterComponent>();
+
// If the player has just left, The character pointer is also about
// to be deleted. So we don't have to do anything else.
- if (!ptr->isConnected())
+ if (!characterComponent->isConnected())
return;
if (map->isActive())
{
if (!insert(ptr))
{
- ptr->disconnected();
+ characterComponent->disconnected(*ptr);
gameHandler->kill(ptr);
delete ptr;
}
@@ -722,7 +768,7 @@ void GameState::warp(Character *ptr, MapComposite *map, int x, int y)
else
{
MessageOut msg(GAMSG_REDIRECT);
- msg.writeInt32(ptr->getDatabaseID());
+ msg.writeInt32(characterComponent->getDatabaseID());
accountHandler->send(msg);
gameHandler->prepareServerChange(ptr);
}
@@ -731,7 +777,7 @@ void GameState::warp(Character *ptr, MapComposite *map, int x, int y)
/**
* Enqueues an event. It will be executed at end of update.
*/
-static void enqueueEvent(Actor *ptr, const DelayedEvent &e)
+static void enqueueEvent(Entity *ptr, const DelayedEvent &e)
{
std::pair< DelayedEvents::iterator, bool > p =
delayedEvents.insert(std::make_pair(ptr, e));
@@ -742,47 +788,58 @@ static void enqueueEvent(Actor *ptr, const DelayedEvent &e)
}
}
-void GameState::enqueueInsert(Actor *ptr)
+void GameState::enqueueInsert(Entity *ptr)
{
- DelayedEvent e = { EVENT_INSERT, 0, 0, 0 };
- enqueueEvent(ptr, e);
+ DelayedEvent event;
+ event.type = EVENT_INSERT;
+ event.map = 0;
+ enqueueEvent(ptr, event);
}
-void GameState::enqueueRemove(Actor *ptr)
+void GameState::enqueueRemove(Entity *ptr)
{
- DelayedEvent e = { EVENT_REMOVE, 0, 0, 0 };
- enqueueEvent(ptr, e);
+ DelayedEvent event;
+ event.type = EVENT_REMOVE;
+ event.map = 0;
+ enqueueEvent(ptr, event);
}
-void GameState::enqueueWarp(Character *ptr, MapComposite *m, int x, int y)
+void GameState::enqueueWarp(Entity *ptr,
+ MapComposite *map,
+ const Point &point)
{
// When the player has just disconnected, better not wait for the pointer
// to become invalid.
- if (!ptr->isConnected())
+ if (!ptr->getComponent<CharacterComponent>()->isConnected())
{
- warp(ptr, m, x, y);
+ warp(ptr, map, point);
return;
}
- DelayedEvent e = { EVENT_WARP, x, y, m };
- enqueueEvent(ptr, e);
+ DelayedEvent event;
+ event.type = EVENT_WARP;
+ event.point = point;
+ event.map = map;
+ enqueueEvent(ptr, event);
}
-void GameState::sayAround(Actor *obj, const std::string &text)
+void GameState::sayAround(Entity *entity, const std::string &text)
{
- Point speakerPosition = obj->getPosition();
+ Point speakerPosition = entity->getComponent<ActorComponent>()->getPosition();
int visualRange = Configuration::getValue("game_visualRange", 448);
- for (CharacterIterator i(obj->getMap()->getAroundActorIterator(obj, visualRange)); i; ++i)
+ for (CharacterIterator i(entity->getMap()->getAroundActorIterator(entity, visualRange)); i; ++i)
{
- if (speakerPosition.inRangeOf((*i)->getPosition(), visualRange))
+ const Point &point =
+ (*i)->getComponent<ActorComponent>()->getPosition();
+ if (speakerPosition.inRangeOf(point, visualRange))
{
- sayTo(*i, obj, text);
+ sayTo(*i, entity, text);
}
}
}
-void GameState::sayTo(Actor *destination, Actor *source, const std::string &text)
+void GameState::sayTo(Entity *destination, Entity *source, const std::string &text)
{
if (destination->getType() != OBJECT_CHARACTER)
return; //only characters will read it anyway
@@ -798,11 +855,11 @@ void GameState::sayTo(Actor *destination, Actor *source, const std::string &text
}
else
{
- msg.writeInt16(static_cast< Actor * >(source)->getPublicID());
+ msg.writeInt16(source->getComponent<ActorComponent>()->getPublicID());
}
msg.writeString(text);
- gameHandler->sendTo(static_cast< Character * >(destination), msg);
+ gameHandler->sendTo(destination, msg);
}
void GameState::sayToAll(const std::string &text)