summaryrefslogtreecommitdiff
path: root/src/game-server/gamehandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/gamehandler.cpp')
-rw-r--r--src/game-server/gamehandler.cpp101
1 files changed, 56 insertions, 45 deletions
diff --git a/src/game-server/gamehandler.cpp b/src/game-server/gamehandler.cpp
index 55588b61..b01c5002 100644
--- a/src/game-server/gamehandler.cpp
+++ b/src/game-server/gamehandler.cpp
@@ -153,7 +153,7 @@ static Actor *findActorNear(Actor *p, int id)
return 0;
}
-static Being *findBeingNear(Actor *p, int id)
+static Entity *findBeingNear(Actor *p, int id)
{
MapComposite *map = p->getMap();
const Point &ppos = p->getPosition();
@@ -161,7 +161,7 @@ static Being *findBeingNear(Actor *p, int id)
const int pixelDist = DEFAULT_TILE_LENGTH * TILES_TO_BE_NEAR;
for (BeingIterator i(map->getAroundPointIterator(ppos, pixelDist)); i; ++i)
{
- Being *b = *i;
+ Actor *b = static_cast<Actor *>(*i);
if (b->getPublicID() != id)
continue;
return ppos.inRangeOf(b->getPosition(), pixelDist) ? b : 0;
@@ -169,7 +169,7 @@ static Being *findBeingNear(Actor *p, int id)
return 0;
}
-static Being *findCharacterNear(Actor *p, int id)
+static Entity *findCharacterNear(Actor *p, int id)
{
MapComposite *map = p->getMap();
const Point &ppos = p->getPosition();
@@ -178,7 +178,7 @@ static Being *findCharacterNear(Actor *p, int id)
for (CharacterIterator i(map->getAroundPointIterator(ppos,
pixelDist)); i; ++i)
{
- Being *c = *i;
+ Actor *c = static_cast<Actor *>(*i);
if (c->getPublicID() != id)
continue;
@@ -337,7 +337,7 @@ void GameHandler::sendTo(GameClient *client, MessageOut &msg)
client->send(msg);
}
-void GameHandler::addPendingCharacter(const std::string &token, Being *ch)
+void GameHandler::addPendingCharacter(const std::string &token, Entity *ch)
{
/* First, check if the character is already on the map. This may happen if
a client just lost its connection, and logged to the account server
@@ -348,7 +348,7 @@ void GameHandler::addPendingCharacter(const std::string &token, Being *ch)
i_end = clients.end(); i != i_end; ++i)
{
GameClient *c = static_cast< GameClient * >(*i);
- Being *old_ch = c->character;
+ Entity *old_ch = c->character;
const int oldId = old_ch->getComponent<CharacterComponent>()
->getDatabaseID();
if (old_ch && oldId == id)
@@ -377,7 +377,7 @@ void GameHandler::addPendingCharacter(const std::string &token, Being *ch)
mTokenCollector.addPendingConnect(token, ch);
}
-void GameHandler::tokenMatched(GameClient *computer, Being *character)
+void GameHandler::tokenMatched(GameClient *computer, Entity *character)
{
computer->character = character;
computer->status = CLIENT_CONNECTED;
@@ -421,19 +421,19 @@ void GameHandler::deletePendingClient(GameClient *computer)
computer->disconnect(msg);
}
-void GameHandler::deletePendingConnect(Being *character)
+void GameHandler::deletePendingConnect(Entity *character)
{
delete character;
}
-Being *GameHandler::getCharacterByNameSlow(const std::string &name) const
+Entity *GameHandler::getCharacterByNameSlow(const std::string &name) const
{
for (NetComputers::const_iterator i = clients.begin(),
i_end = clients.end(); i != i_end; ++i)
{
GameClient *c = static_cast< GameClient * >(*i);
- Being *ch = c->character;
- if (ch && ch->getName() == name &&
+ Entity *ch = c->character;
+ if (ch && ch->getComponent<BeingComponent>()->getName() == name &&
c->status == CLIENT_CONNECTED)
{
return ch;
@@ -455,11 +455,11 @@ void GameHandler::handleSay(GameClient &client, MessageIn &message)
}
if (!client.character->getComponent<CharacterComponent>()->isMuted())
{
- GameState::sayAround(client.character, say);
+ GameState::sayAround(static_cast<Actor *>(client.character), say);
}
else
{
- GameState::sayTo(client.character, NULL,
+ GameState::sayTo(static_cast<Actor *>(client.character), nullptr,
"You are not allowed to talk right now.");
}
}
@@ -467,15 +467,12 @@ void GameHandler::handleSay(GameClient &client, MessageIn &message)
void GameHandler::handleNpc(GameClient &client, MessageIn &message)
{
int id = message.readInt16();
- Actor *actor = findActorNear(client.character, id);
+ Actor *actor = findActorNear(static_cast<Actor *>(client.character), id);
if (!actor || actor->getType() != OBJECT_NPC)
{
sendNpcError(client, id, "Not close enough to NPC\n");
return;
}
-
- Being *npc = static_cast<Being*>(actor);
-
switch (message.getId())
{
case PGMSG_NPC_SELECT:
@@ -488,7 +485,7 @@ void GameHandler::handleNpc(GameClient &client, MessageIn &message)
Npc::stringReceived(client.character, message.readString());
break;
case PGMSG_NPC_TALK:
- Npc::start(npc, client.character);
+ Npc::start(actor, client.character);
break;
case PGMSG_NPC_TALK_NEXT:
default:
@@ -501,7 +498,7 @@ void GameHandler::handlePickup(GameClient &client, MessageIn &message)
{
const int x = message.readInt16();
const int y = message.readInt16();
- const Point ppos = client.character->getPosition();
+ const Point ppos = static_cast<Actor *>(client.character)->getPosition();
// TODO: use a less arbitrary value.
if (std::abs(x - ppos.x) + std::abs(y - ppos.y) < 48)
@@ -510,8 +507,8 @@ void GameHandler::handlePickup(GameClient &client, MessageIn &message)
Point ipos(x, y);
for (FixedActorIterator i(map->getAroundPointIterator(ipos, 0)); i; ++i)
{
- Actor *o = *i;
- Point opos = o->getPosition();
+ Entity *o = *i;
+ Point opos = static_cast<Actor *>(o)->getPosition();
if (o->getType() == OBJECT_ITEM && opos.x == x && opos.y == y)
{
@@ -553,7 +550,7 @@ void GameHandler::handlePickup(GameClient &client, MessageIn &message)
void GameHandler::handleUseItem(GameClient &client, MessageIn &message)
{
- if (client.character->getAction() == DEAD)
+ if (client.character->getComponent<BeingComponent>()->getAction() == DEAD)
return;
const int slot = message.readInt16();
@@ -587,7 +584,7 @@ void GameHandler::handleDrop(GameClient &client, MessageIn &message)
{
int nb = inv.removeFromSlot(slot, amount);
MapComposite *map = client.character->getMap();
- Point pos = client.character->getPosition();
+ Point pos = static_cast<Actor *>(client.character)->getPosition();
Entity *item = Item::create(map, pos, ic, amount - nb);
@@ -625,7 +622,8 @@ void GameHandler::handleWalk(GameClient &client, MessageIn &message)
const int y = message.readInt16();
Point dst(x, y);
- client.character->setDestination(dst);
+ client.character->getComponent<BeingComponent>()->setDestination(
+ *client.character, dst);
}
void GameHandler::handleEquip(GameClient &client, MessageIn &message)
@@ -672,28 +670,32 @@ void GameHandler::handleMoveItem(GameClient &client, MessageIn &message)
void GameHandler::handleAttack(GameClient &client, MessageIn &message)
{
int id = message.readInt16();
- LOG_DEBUG("Character " << client.character->getPublicID()
+ Actor *actor = static_cast<Actor *>(client.character);
+ LOG_DEBUG("Character " << actor->getPublicID()
<< " attacked being " << id);
- Being *being = findBeingNear(client.character, id);
+ Actor *being = static_cast<Actor *>(findBeingNear(actor, id));
if (being && being->getType() != OBJECT_NPC)
{
client.character->getComponent<CombatComponent>()->setTarget(being);
- client.character->setAction(ATTACK);
+ client.character->getComponent<BeingComponent>()->setAction(*actor,
+ ATTACK);
}
}
void GameHandler::handleUseSpecialOnBeing(GameClient &client, MessageIn &message)
{
- if (client.character->getAction() == DEAD)
+ if (client.character->getComponent<BeingComponent>()->getAction() == DEAD)
return;
+ Actor *actor = static_cast<Actor *>(client.character);
+
const int specialID = message.readInt8();
const int targetID = message.readInt16(); // 0 when no target is selected
- Being *being = 0;
+ Entity *being = 0;
if (targetID != 0)
- being = findBeingNear(client.character, targetID);
- LOG_DEBUG("Character " << client.character->getPublicID()
+ being = findBeingNear(actor, targetID);
+ LOG_DEBUG("Character " << actor->getPublicID()
<< " tries to use his special attack " << specialID);
auto *characterComponent = client.character
->getComponent<CharacterComponent>();
@@ -702,14 +704,15 @@ void GameHandler::handleUseSpecialOnBeing(GameClient &client, MessageIn &message
void GameHandler::handleUseSpecialOnPoint(GameClient &client, MessageIn &message)
{
- if (client.character->getAction() == DEAD)
+ if (client.character->getComponent<BeingComponent>()->getAction() == DEAD)
return;
const int specialID = message.readInt8();
const int x = message.readInt16();
const int y = message.readInt16();
- LOG_DEBUG("Character " << client.character->getPublicID()
+ LOG_DEBUG("Character "
+ << static_cast<Actor *>(client.character)->getPublicID()
<< " tries to use his special attack " << specialID);
auto *characterComponent = client.character
->getComponent<CharacterComponent>();
@@ -718,8 +721,10 @@ void GameHandler::handleUseSpecialOnPoint(GameClient &client, MessageIn &message
void GameHandler::handleActionChange(GameClient &client, MessageIn &message)
{
+ auto *beingComponent = client.character->getComponent<BeingComponent>();
+
const BeingAction action = (BeingAction) message.readInt8();
- const BeingAction current = (BeingAction) client.character->getAction();
+ const BeingAction current = (BeingAction) beingComponent->getAction();
bool logActionChange = true;
switch (action)
@@ -727,14 +732,14 @@ void GameHandler::handleActionChange(GameClient &client, MessageIn &message)
case STAND:
if (current == SIT)
{
- client.character->setAction(STAND);
+ beingComponent->setAction(*client.character, STAND);
logActionChange = false;
}
break;
case SIT:
if (current == STAND)
{
- client.character->setAction(SIT);
+ beingComponent->setAction(*client.character, SIT);
logActionChange = false;
}
break;
@@ -761,7 +766,8 @@ void GameHandler::handleActionChange(GameClient &client, MessageIn &message)
void GameHandler::handleDirectionChange(GameClient &client, MessageIn &message)
{
const BeingDirection direction = (BeingDirection) message.readInt8();
- client.character->setDirection(direction);
+ client.character->getComponent<BeingComponent>()
+ ->setDirection(*client.character, direction);
}
void GameHandler::handleDisconnect(GameClient &client, MessageIn &message)
@@ -804,7 +810,7 @@ void GameHandler::handleTradeRequest(GameClient &client, MessageIn &message)
if (t->request(client.character, id))
return;
- Being *q = findCharacterNear(client.character, id);
+ Entity *q = findCharacterNear(static_cast<Actor *>(client.character), id);
if (!q || characterComponent->isBusy())
{
client.send(MessageOut(GPMSG_TRADE_CANCEL));
@@ -815,7 +821,8 @@ void GameHandler::handleTradeRequest(GameClient &client, MessageIn &message)
// log transaction
std::string str;
- str = "User requested trade with " + q->getName();
+ str = "User requested trade with " + q->getComponent<BeingComponent>()
+ ->getName();
accountHandler->sendTransaction(characterComponent->getDatabaseID(),
TRANS_TRADE_REQUEST, str);
}
@@ -952,16 +959,18 @@ void GameHandler::handlePartyInvite(GameClient &client, MessageIn &message)
const int visualRange = Configuration::getValue("game_visualRange", 448);
std::string invitee = message.readString();
- if (invitee == client.character->getName())
+ if (invitee == client.character->getComponent<BeingComponent>()->getName())
return;
for (CharacterIterator it(map->getWholeMapIterator()); it; ++it)
{
- if ((*it)->getName() == invitee)
+ if ((*it)->getComponent<BeingComponent>()->getName() == invitee)
{
// calculate if the invitee is within the visual range
- const int xInviter = client.character->getPosition().x;
- const int yInviter = client.character->getPosition().y;
+ const int xInviter =
+ static_cast<Actor *>(client.character)->getPosition().x;
+ const int yInviter =
+ static_cast<Actor *>(client.character)->getPosition().y;
const int xInvitee = (*it)->getPosition().x;
const int yInvitee = (*it)->getPosition().y;
const int dx = std::abs(xInviter - xInvitee);
@@ -969,7 +978,8 @@ void GameHandler::handlePartyInvite(GameClient &client, MessageIn &message)
if (visualRange > std::max(dx, dy))
{
MessageOut out(GCMSG_PARTY_INVITE);
- out.writeString(client.character->getName());
+ out.writeString(client.character
+ ->getComponent<BeingComponent>()->getName());
out.writeString(invitee);
accountHandler->send(out);
return;
@@ -988,7 +998,8 @@ void GameHandler::handleTriggerEmoticon(GameClient &client, MessageIn &message)
{
const int id = message.readInt16();
if (emoteManager->isIdAvailable(id))
- client.character->triggerEmote(id);
+ client.character->getComponent<BeingComponent>()->triggerEmote(
+ *client.character, id);
}
void GameHandler::sendNpcError(GameClient &client, int id,