diff options
Diffstat (limited to 'src/game-server/state.cpp')
-rw-r--r-- | src/game-server/state.cpp | 313 |
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) |