bool FlightPathMovementGenerator::DoUpdate(Player* owner, uint32 diff) { if (!owner) return false; if (!owner->isAlive()) return false; uint32 pointId = (uint32)owner->movespline->currentPathIdx(); if (pointId > i_currentNode) { bool departureEvent = true; do { DoEventIfAny(owner, (*i_path)[i_currentNode], departureEvent); if (pointId == i_currentNode) break; if (i_currentNode == _preloadTargetNode) PreloadEndGrid(); i_currentNode += (uint32)departureEvent; departureEvent = !departureEvent; } while (true); } return i_currentNode < (i_path->size() - 1); }
bool FlightPathMovementGenerator::DoUpdate(Player* player, uint32 /*diff*/) { uint32 pointId = (uint32)player->movespline->currentPathIdx(); if (pointId > i_currentNode) { bool departureEvent = true; do { DoEventIfAny(player, i_path[i_currentNode], departureEvent); while (!_pointsForPathSwitch.empty() && _pointsForPathSwitch.front().PathIndex <= i_currentNode) { _pointsForPathSwitch.pop_front(); player->m_taxi.NextTaxiDestination(); if (!_pointsForPathSwitch.empty()) { player->UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, _pointsForPathSwitch.front().Cost); player->ModifyMoney(-_pointsForPathSwitch.front().Cost); } } if (pointId == i_currentNode) break; if (i_currentNode == _preloadTargetNode) PreloadEndGrid(); i_currentNode += (uint32)departureEvent; departureEvent = !departureEvent; } while (true); } return i_currentNode < (i_path.size() - 1); }
bool FlightPathMovementGenerator::Update(Player &player, const uint32 &diff) { if (MovementInProgress()) { Traveller<Player> traveller(player); if (i_destinationHolder.UpdateTraveller(traveller, diff)) { i_destinationHolder.ResetUpdate(FLIGHT_TRAVEL_UPDATE); if (i_destinationHolder.HasArrived()) { DoEventIfAny(player,(*i_path)[i_currentNode], false); uint32 curMap = (*i_path)[i_currentNode].mapid; ++i_currentNode; if (MovementInProgress()) { DoEventIfAny(player,(*i_path)[i_currentNode], true); sLog->outStaticDebug("loading node %u for player %s", i_currentNode, player.GetName()); if ((*i_path)[i_currentNode].mapid == curMap) { // do not send movement, it was sent already i_destinationHolder.SetDestination(traveller, (*i_path)[i_currentNode].x, (*i_path)[i_currentNode].y, (*i_path)[i_currentNode].z, false); } // check if it's time to preload the flightmaster grid at path end if (i_currentNode == m_preloadTargetNode) PreloadEndGrid(); return true; } //else HasArrived() } else return true; } else return true; } // we have arrived at the end of the path return false; }
bool FlightPathMovementGenerator::Update(Player &player, const uint32 &diff) { if( MovementInProgress() ) { Traveller<Player> traveller(player); if( i_destinationHolder.UpdateTraveller(traveller, diff) ) { i_destinationHolder.ResetUpdate(FLIGHT_TRAVEL_UPDATE); if( i_destinationHolder.HasArrived() ) { uint32 curMap = i_mapIds[i_currentNode]; ++i_currentNode; if( MovementInProgress() ) { DEBUG_LOG("loading node %u for player %s", i_currentNode, player.GetName()); if(i_mapIds[i_currentNode]==curMap) { // do not send movement, it was sent already i_destinationHolder.SetDestination(traveller, i_path[i_currentNode].x, i_path[i_currentNode].y, i_path[i_currentNode].z, false); } // check if it's time to preload the flightmaster grid // at path end if (i_currentNode == m_preloadTargetNode) { PreloadEndGrid(); } return true; } //else HasArrived() } else return true; } else return true; } // we have arrived at the end of the path return false; }
bool FlightPathMovementGenerator::Update(Player &player, const uint32 diff) { uint32 pointId = (uint32)player.movespline->currentPathIdx(); if (pointId > i_currentNode) { bool departureEvent = true; do { DoEventIfAny(player, (*i_path)[i_currentNode], departureEvent); if (pointId == i_currentNode) break; if (i_currentNode == _preloadTargetNode) PreloadEndGrid(); i_currentNode += (uint32)departureEvent; departureEvent = !departureEvent; } while (true); } return i_currentNode < (i_path->size()-1); }
bool FlightPathMovementGenerator::DoUpdate(Player* player, uint32 /*diff*/) { // xinef: map was switched if (_mapSwitch) { DoInitialize(player); _mapSwitch = false; return true; } uint32 pointId = (uint32)player->movespline->currentPathIdx(); if (pointId > i_currentNode) { bool departureEvent = true; do { if (i_currentNode >= i_path.size()) { sLog->outMisc("TAXI NODE WAS GREATER THAN PATH SIZE, GUID: %u, POINTID: %u, NODESIZE: %lu, CURRENT: %u", player->GetGUIDLow(), pointId, i_path.size(), i_currentNode); player->CleanupAfterTaxiFlight(); return false; } if (i_path[i_currentNode]->mapid != player->GetMapId()) { sLog->outMisc("Player on different map, curmap: %u, pointmap: %u, nodesize: %lu, currentnode: %u", player->GetMapId(), i_path[i_currentNode]->mapid, i_path.size(), i_currentNode); player->CleanupAfterTaxiFlight(); return false; } DoEventIfAny(player, i_path[i_currentNode], departureEvent); // xinef: erase any previous points uint32 curSize = _pointsForPathSwitch.size(); while (!_pointsForPathSwitch.empty() && _pointsForPathSwitch.front() <= i_currentNode) _pointsForPathSwitch.pop_front(); // xinef: switch destination only once if (curSize != _pointsForPathSwitch.size()) player->m_taxi.NextTaxiDestination(); if (pointId == i_currentNode) break; if (i_currentNode == _preloadTargetNode && player->GetMapId() == _endMapId) PreloadEndGrid(); i_currentNode += (uint32)departureEvent; departureEvent = !departureEvent; // xinef: map should be switched, do not rely on client packets QQ if (i_currentNode + 1 < i_path.size() && i_path[i_currentNode+1]->mapid != player->GetMapId()) { ++i_currentNode; _mapSwitch = true; player->TeleportTo(i_path[i_currentNode]->mapid, i_path[i_currentNode]->x, i_path[i_currentNode]->y, i_path[i_currentNode]->z, player->GetOrientation(), TELE_TO_NOT_LEAVE_TAXI); return true; } // xinef: reached the end if (i_currentNode >= i_path.size() - 1) { player->CleanupAfterTaxiFlight(); player->SetFallInformation(time(NULL), player->GetPositionZ()); if (player->pvpInfo.IsHostile) player->CastSpell(player, 2479, true); return false; } } while (true); } return i_currentNode < (i_path.size() - 1); }