void Tile::moveCreature(Creature* creature, Cylinder* toCylinder, bool teleport /* = false*/) { Tile* newTile = toCylinder->getTile(); int32_t oldStackPos = __getIndexOfThing(creature); Position oldPos = getPosition(); Position newPos = newTile->getPosition(); Player* tmpPlayer = NULL; SpectatorVec list; SpectatorVec::iterator it; g_game.getSpectators(list, oldPos, false, true); g_game.getSpectators(list, newPos, true, true); std::vector<uint32_t> oldStackPosVector; for (it = list.begin(); it != list.end(); ++it) { if ((tmpPlayer = (*it)->getPlayer())) { oldStackPosVector.push_back(getClientIndexOfThing(tmpPlayer, creature)); } } //remove the creature __removeThing(creature, 0); // Switch the node ownership if (qt_node != newTile->qt_node) { qt_node->removeCreature(creature); newTile->qt_node->addCreature(creature); } //add the creature newTile->__addThing(creature); int32_t newStackPos = newTile->__getIndexOfThing(creature); if (!teleport) { if (oldPos.y > newPos.y) { creature->setDirection(NORTH); } else if (oldPos.y < newPos.y) { creature->setDirection(SOUTH); } if (oldPos.x < newPos.x) { creature->setDirection(EAST); } else if (oldPos.x > newPos.x) { creature->setDirection(WEST); } } //send to client uint32_t i = 0; for (it = list.begin(); it != list.end(); ++it) { if ((tmpPlayer = (*it)->getPlayer())) { tmpPlayer->sendCreatureMove(creature, newTile, newPos, this, oldPos, oldStackPosVector[i], teleport); ++i; } } //event method for (it = list.begin(); it != list.end(); ++it) { (*it)->onCreatureMove(creature, newTile, newPos, this, oldPos, teleport); } postRemoveNotification(creature, toCylinder, oldStackPos, true); newTile->postAddNotification(creature, this, newStackPos); }
void Tile::moveCreature(Creature* creature, Cylinder* toCylinder, bool forceTeleport/* = false*/) { Tile* newTile = toCylinder->getTile(); int32_t oldStackPos = __getIndexOfThing(creature); Position oldPos = getPosition(); Position newPos = newTile->getPosition(); bool teleport = false; if (forceTeleport || !newTile->ground || !Position::areInRange<1, 1, 0>(oldPos, newPos)) { teleport = true; } SpectatorVec list; g_game.getSpectators(list, oldPos, true); g_game.getSpectators(list, newPos, true); SpectatorVec::const_iterator end = list.end(); std::vector<uint32_t> oldStackPosVector; for (SpectatorVec::const_iterator it = list.begin(); it != end; ++it) { if (Player* tmpPlayer = (*it)->getPlayer()) { oldStackPosVector.push_back(getClientIndexOfThing(tmpPlayer, creature)); } } //remove the creature __removeThing(creature, 0); // Switch the node ownership if (qt_node != newTile->qt_node) { qt_node->removeCreature(creature); newTile->qt_node->addCreature(creature); } //add the creature newTile->__addThing(creature); int32_t newStackPos = newTile->__getIndexOfThing(creature); if (!teleport) { if (oldPos.y > newPos.y) { creature->setDirection(NORTH); } else if (oldPos.y < newPos.y) { creature->setDirection(SOUTH); } if (oldPos.x < newPos.x) { creature->setDirection(EAST); } else if (oldPos.x > newPos.x) { creature->setDirection(WEST); } } //send to client uint32_t i = 0; for (SpectatorVec::const_iterator it = list.begin(); it != end; ++it) { if (Player* tmpPlayer = (*it)->getPlayer()) { //Use the correct stackpos if (!creature->isInGhostMode() || tmpPlayer->isAccessPlayer()) { tmpPlayer->sendCreatureMove(creature, newTile, newPos, this, oldPos, oldStackPosVector[i], teleport); } ++i; } } //event method for (SpectatorVec::const_iterator it = list.begin(); it != end; ++it) { (*it)->onCreatureMove(creature, newTile, newPos, this, oldPos, teleport); } postRemoveNotification(creature, toCylinder, oldStackPos, true); newTile->postAddNotification(creature, this, newStackPos); }
void Tile::moveCreature(Creature* creature, Cylinder* toCylinder, bool forceTeleport/* = false*/) { Tile* newTile = toCylinder->getTile(); int32_t oldStackPos = __getIndexOfThing(creature); Position oldPos = getPosition(); Position newPos = newTile->getPosition(); bool teleport = forceTeleport || !newTile->ground || !Position::areInRange<1, 1, 0>(oldPos, newPos); SpectatorVec list; g_game.getSpectators(list, oldPos, true); g_game.getSpectators(list, newPos, true); std::vector<int32_t> oldStackPosVector; for (Creature* spectator : list) { if (Player* tmpPlayer = spectator->getPlayer()) { if (tmpPlayer->canSeeCreature(creature)) { oldStackPosVector.push_back(getClientIndexOfCreature(tmpPlayer, creature)); } else { oldStackPosVector.push_back(-1); } } } //remove the creature __removeThing(creature, 0); // Switch the node ownership if (qt_node != newTile->qt_node) { qt_node->removeCreature(creature); newTile->qt_node->addCreature(creature); } //add the creature newTile->__addThing(creature); int32_t newStackPos = newTile->__getIndexOfThing(creature); if (!teleport) { if (oldPos.y > newPos.y) { creature->setDirection(NORTH); } else if (oldPos.y < newPos.y) { creature->setDirection(SOUTH); } if (oldPos.x < newPos.x) { creature->setDirection(EAST); } else if (oldPos.x > newPos.x) { creature->setDirection(WEST); } } //send to client size_t i = 0; for (Creature* spectator : list) { if (Player* tmpPlayer = spectator->getPlayer()) { //Use the correct stackpos int32_t stackpos = oldStackPosVector[i++]; if (stackpos != -1) { tmpPlayer->sendCreatureMove(creature, newPos, newTile->getStackposOfCreature(tmpPlayer, creature), oldPos, stackpos, teleport); } } } //event method for (Creature* spectator : list) { spectator->onCreatureMove(creature, newTile, newPos, this, oldPos, teleport); } postRemoveNotification(creature, toCylinder, oldStackPos, true); newTile->postAddNotification(creature, this, newStackPos); }
void Tile::moveCreature(Creature* actor, Creature* creature, Cylinder* toCylinder, bool forceTeleport/* = false*/) { Tile* newTile = toCylinder->getTile(); SpectatorVec list; SpectatorVec::iterator it; g_game.getSpectators(list, pos, false, true); Position newPos = newTile->getPosition(); g_game.getSpectators(list, newPos, true, true); bool teleport = false; if(forceTeleport || !newTile->ground || !Position::areInRange<1,1,0>(pos, newPos)) teleport = true; std::vector<uint32_t> oldStackposVector; Player* tmpPlayer = NULL; for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer())) oldStackposVector.push_back(getClientIndexOfThing(tmpPlayer, creature)); } int32_t oldStackpos = __getIndexOfThing(creature); //remove the creature __removeThing(creature, 0); //switch the node ownership if(qt_node != newTile->qt_node) { qt_node->removeCreature(creature); newTile->qt_node->addCreature(creature); } //add the creature newTile->__addThing(actor, creature); int32_t newStackpos = newTile->__getIndexOfThing(creature); if(!teleport) { if(pos.y > newPos.y) creature->setDirection(NORTH); else if(pos.y < newPos.y) creature->setDirection(SOUTH); if(pos.x < newPos.x) creature->setDirection(EAST); else if(pos.x > newPos.x) creature->setDirection(WEST); } //send to client int32_t i = 0; for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer()) && tmpPlayer->canSeeCreature(creature)) tmpPlayer->sendCreatureMove(creature, newTile, newPos, this, pos, oldStackposVector[i++], teleport); } //event method for(it = list.begin(); it != list.end(); ++it) (*it)->onCreatureMove(creature, newTile, newPos, this, pos, teleport); postRemoveNotification(actor, creature, toCylinder, oldStackpos, true); newTile->postAddNotification(actor, creature, this, newStackpos); }