void BeingHandler::handleBeingEnterMessage(Net::MessageIn &msg) { int type = msg.readInt8(); int id = msg.readInt16(); Being::Action action = (Being::Action)msg.readInt8(); int px = msg.readInt16(); int py = msg.readInt16(); BeingDirection direction = (BeingDirection)msg.readInt8(); Being *being; if (!Game::instance()->getCurrentMap()->containsPixel(px, py)) { logger->log("Warning: Received GPMSG_BEING_ENTER for being id %i " "with position outside the map boundaries " "(x = %i, y = %i)", id, px, py); return; } switch (type) { case OBJECT_CHARACTER: { std::string name = msg.readString(); if (player_node->getName() == name) { being = player_node; being->setId(id); } else { being = actorSpriteManager->createBeing(id, ActorSprite::PLAYER, 0); being->setName(name); } int hs = msg.readInt8(), hc = msg.readInt8(); being->setSprite(SPRITE_HAIR, hs * -1, ColorDB::get(hc)); being->setGender(msg.readInt8() == GENDER_MALE ? GENDER_MALE : GENDER_FEMALE); handleLooks(being, msg); } break; case OBJECT_MONSTER: case OBJECT_NPC: { int subtype = msg.readInt16(); being = actorSpriteManager->createBeing(id, type == OBJECT_MONSTER ? ActorSprite::MONSTER : ActorSprite::NPC, subtype); std::string name = msg.readString(); if (name.length() > 0) being->setName(name); } break; default: return; } being->setPosition(px, py); being->setDestination(px, py); being->setDirection(direction); being->setAction(action); }
void BeingHandler::handleBeingsMoveMessage(Net::MessageIn &msg) { while (msg.getUnreadLength()) { int id = msg.readInt16(); int flags = msg.readInt8(); Being *being = actorSpriteManager->findBeing(id); int sx = 0, sy = 0, dx = 0, dy = 0, speed = 0; if ((!flags & (MOVING_POSITION | MOVING_DESTINATION))) continue; if (flags & MOVING_POSITION) { sx = msg.readInt16(); sy = msg.readInt16(); } if (flags & MOVING_DESTINATION) { dx = msg.readInt16(); dy = msg.readInt16(); speed = msg.readInt8(); } if (!being) continue; if (speed) { /* * The being's speed is transfered in tiles per second * 10 * to keep it transferable in a Byte. * We set it back to tiles per second and in a float. */ float speedTilesSeconds = (float) speed / 10; being->setMoveSpeed(Vector(speedTilesSeconds, speedTilesSeconds, 0)); } // Ignore messages from the server for the local player if (being == player_node) continue; // If the position differs too much from the actual one, we resync // the being position if (flags & MOVING_POSITION) { if (!being->getMap()->containsPixel(sx, sy)) { logger->log("Warning: Received GPMSG_BEINGS_MOVE for being id " "%i with position outside the map boundaries " "(x = %i, y = %i)", id, sx, sy); continue; } Vector serverPos(sx, sy); if (serverPos.length() - being->getPosition().length() > POSITION_DIFF_TOLERANCE) being->setPosition(serverPos); } if (flags & MOVING_DESTINATION) { if (!being->getMap()->containsPixel(dx, dy)) { logger->log("Warning: Received GPMSG_BEINGS_MOVE for being id " "%i with destination outside the map boundaries " "(x = %i, y = %i)", id, dx, dy); continue; } being->setDestination(dx, dy); } } }