void FlightPathMovementGenerator::Reset(Player & player) { float playerFlightSpeed = 32.0f; // Percentage from SPELL_AURA_MOD_TAXI_FLIGHT_SPEED Unit::AuraEffectList const& mIncreaseTaxiFlightSpeed = player.GetAuraEffectsByType(SPELL_AURA_MOD_TAXI_FLIGHT_SPEED); for (Unit::AuraEffectList::const_iterator i = mIncreaseTaxiFlightSpeed.begin(); i != mIncreaseTaxiFlightSpeed.end(); ++i) AddPct(playerFlightSpeed, (*i)->GetAmount()); player.getHostileRefManager().setOnlineOfflineState(false); player.AddUnitState(UNIT_STATE_IN_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); Movement::MoveSplineInit init(player); uint32 end = GetPathAtMapEnd(); for (uint32 i = GetCurrentNode(); i != end; ++i) { G3D::Vector3 vertice((*i_path)[i].x, (*i_path)[i].y, (*i_path)[i].z); init.Path().push_back(vertice); } init.SetFirstPointId(GetCurrentNode()); init.SetFly(); init.SetSmooth(); init.SetWalk(true); init.SetVelocity(playerFlightSpeed); init.Launch(); }
void FlightPathMovementGenerator::Finalize(Player & player) { // remove flag to prevent send object build movement packets for flight state and crash (movement generator already not at top of stack) player.clearUnitState(UNIT_STAT_IN_FLIGHT); float x, y, z; i_destinationHolder.GetLocationNow(player.GetBaseMap(), x, y, z); player.Anti__SetLastTeleTime(time(NULL)); player.SetPosition(x, y, z, player.GetOrientation()); player.Unmount(); player.RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); if(player.m_taxi.empty()) { player.getHostileRefManager().setOnlineOfflineState(true); if(player.pvpInfo.inHostileArea) player.CastSpell(&player, 2479, true); // update z position to ground and orientation for landing point // this prevent cheating with landing point at lags // when client side flight end early in comparison server side player.StopMoving(); } }
bool ChatHandler::HandleCombatStopCommand(const char* args) { Player* target = NULL; if (args && strlen(args) > 0) { target = sObjectAccessor->FindPlayerByName(args); if (!target) { SendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); return false; } } if (!target) if (!extractPlayerTarget((char*)args, &target)) return false; // check online security if (HasLowerSecurity(target, 0)) return false; target->CombatStop(); target->getHostileRefManager().deleteReferences(); return true; }
void FlightPathMovementGenerator::Reset(Player & player) { player.getHostileRefManager().setOnlineOfflineState(false); player.addUnitState(UNIT_STAT_TAXI_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); Traveller<Player> traveller(player); // 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); player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(), SplineFlags(SPLINEFLAG_WALKMODE|SPLINEFLAG_FLYING)); }
void FlightPathMovementGenerator::Initialize(Player &player) { player.getHostileRefManager().setOnlineOfflineState(false); player.addUnitState(UNIT_STAT_IN_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); LoadPath(player); Traveller<Player> traveller(player); // 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); player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MONSTER_MOVE_SPLINE_FLY); }
void FlightPathMovementGenerator::Initialize(Player &player) { player.getHostileRefManager().setOnlineOfflineState(false); player.AddUnitState(UNIT_STAT_IN_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); Traveller<Player> traveller(player); // 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); // For preloading end grid InitEndGridInfo(); player.SendMonsterMoveByPath(GetPath(), GetCurrentNode(), GetPathAtMapEnd()); }
void Initialize(Player &u) { if (m_displayId) { if (!m_previewDisplayId) m_previewDisplayId = u.GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID); u.Mount(m_displayId); } u.getHostileRefManager().setOnlineOfflineState(false); u.addUnitState(UNIT_STAT_TAXI_FLIGHT); u.SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); _Initialize(u); };
bool ChatHandler::HandleCombatStopCommand(const char* args) { Player* target; if (!extractPlayerTarget((char*)args, &target)) return false; // check online security if (HasLowerSecurity(target, 0)) return false; target->CombatStop(); target->getHostileRefManager().deleteReferences(); return true; }
void FlightPathMovementGenerator::Reset(Player & player) { player.getHostileRefManager().setOnlineOfflineState(false); player.addUnitState(UNIT_STAT_TAXI_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); Traveller<Player> traveller(player); // 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); TaxiPathNodeList path = GetPath(); uint32 pathEndPoint = GetPathAtMapEnd(); uint32 traveltime = uint32(PLAYER_FLIGHT_SPEED * path.GetTotalLength(GetCurrentNode(),pathEndPoint)); player.SendMonsterMoveByPath(path,GetCurrentNode(),pathEndPoint, SplineFlags(SPLINEFLAG_WALKMODE|SPLINEFLAG_FLYING), traveltime ); }
void FlightPathMovementGenerator::Finalize(Player & player) { // Random handlers when path is finished - best would be to add FlightPathMovementGenerator::Finalize to sub-script class (Feanor) switch( i_pathId ) { case 632: { if( player.GetQuestStatus(10525) == QUEST_STATUS_INCOMPLETE ) player.CompleteQuest(10525); player.SetDisplayId(player.GetNativeDisplayId()); break; } case 811: { if( player.GetQuestStatus(12028) == QUEST_STATUS_INCOMPLETE ) player.CompleteQuest(12028); player.SetDisplayId(player.GetNativeDisplayId()); break; } } // remove flag to prevent send object build movement packets for flight state and crash (movement generator already not at top of stack) player.clearUnitState(UNIT_STAT_IN_FLIGHT); float x, y, z; i_destinationHolder.GetLocationNow(player.GetBaseMap(), x, y, z); player.SetPosition(x, y, z, player.GetOrientation()); // Quest path (teleport player back to start) if( i_pathId == 632 ) player.TeleportTo( player.GetMapId(), i_path.GetNodes(0)->x, i_path.GetNodes(0)->y, i_path.GetNodes(0)->z, player.GetOrientation() ); player.Unmount(); player.RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); if(player.m_taxi.empty()) { player.getHostileRefManager().setOnlineOfflineState(true); if(player.pvpInfo.inHostileArea) player.CastSpell(&player, 2479, true); // update z position to ground and orientation for landing point // this prevent cheating with landing point at lags // when client side flight end early in comparison server side player.StopMoving(); } }
void FlightPathMovementGenerator::Initialize(Player &player) { // Random handlers used for quests etc. - best would be to add FlightPathMovementGenerator::Initialize to sub-script class (Feanor) if( player.m_taxi.GetTaxiDestination() == 158 || player.m_taxi.GetTaxiDestination() == 243 ) player.SetDisplayId(16587); player.getHostileRefManager().setOnlineOfflineState(false); player.addUnitState(UNIT_STAT_IN_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); LoadPath(player); Traveller<Player> traveller(player); // 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); player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(), SplineFlags(SPLINEFLAG_WALKMODE|SPLINEFLAG_FLYING)); }
void FlightPathMovementGenerator::DoFinalize(Player& player) { // remove flag to prevent send object build movement packets for flight state and crash (movement generator already not at top of stack) player.ClearUnitState(UNIT_STATE_IN_FLIGHT); player.Dismount(); player.RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); if (player.m_taxi.empty()) { player.getHostileRefManager().setOnlineOfflineState(true); // update z position to ground and orientation for landing point // this prevent cheating with landing point at lags // when client side flight end early in comparison server side player.StopMoving(); } }
void FlightPathMovementGenerator::Initialize(Player &player) { player.getHostileRefManager().setOnlineOfflineState(false); player.AddUnitState(UNIT_STAT_IN_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); Traveller<Player> traveller(player); // 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); // For preloading end grid InitEndGridInfo(); TaxiPathNodeList path = GetPath(); uint32 pathEndPoint = GetPathAtMapEnd(); uint32 traveltime = uint32(32.0f*path.GetTotalLength(GetCurrentNode(),pathEndPoint)); player.SetUnitMovementFlags(SPLINEFLAG_WALKING|SPLINEFLAG_FLYING); player.SendMonsterMoveByPath(path,GetCurrentNode(),pathEndPoint, traveltime); }
void Finalize(Player &u) { // remove flag to prevent send object build movement packets for flight state and crash (movement generator already not at top of stack) if (m_displayId) u.Unmount(); u.clearUnitState(UNIT_STAT_TAXI_FLIGHT); u.RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); u.getHostileRefManager().setOnlineOfflineState(true); if(u.pvpInfo.inHostileArea) u.CastSpell(&u, 2479, true); _Finalize(u); if (m_previewDisplayId) { u.Mount(m_previewDisplayId); } };
void FlightPathMovementGenerator::Reset(Player& player) { player.getHostileRefManager().setOnlineOfflineState(false); player.addUnitState(UNIT_STAT_TAXI_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); Movement::MoveSplineInit init(player); uint32 end = GetPathAtMapEnd(); for (uint32 i = GetCurrentNode(); i != end; ++i) { G3D::Vector3 vertice((*i_path)[i].x, (*i_path)[i].y, (*i_path)[i].z); init.Path().push_back(vertice); } init.SetFirstPointId(GetCurrentNode()); init.SetFly(); init.SetVelocity(PLAYER_FLIGHT_SPEED); init.Launch(); }
void FlightPathMovementGenerator::Finalize(Player & player) { // remove flag to prevent send object build movement packets for flight state and crash (movement generator already not at top of stack) player.clearUnitState(UNIT_FLAG_DISABLE_MOVE | UNIT_STAT_IN_FLIGHT); float x, y, z; i_destinationHolder.GetLocationNow(player.GetBaseMap(), x, y, z); player.SetPosition(x, y, z, player.GetOrientation()); player.Unmount(); if (player.m_taxi.empty()) { player.getHostileRefManager().setOnlineOfflineState(true); if (player.pvpInfo.inHostileArea) player.CastSpell(&player, 2479, true); player.SetUnitMovementFlags(MOVEFLAG_WALK_MODE); player.StopMoving(); } }
void FlightPathMovementGenerator::Initialize(Player &player) { player.getHostileRefManager().setOnlineOfflineState(false); player.addUnitState(UNIT_STAT_IN_FLIGHT); player.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); LoadPath(player); Traveller<Player> traveller(player); // 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); player.SendMonsterMoveByPath(GetPath(), GetCurrentNode(), GetPathAtMapEnd()); // Storage to preload flightmaster grid at end of flight. For multi-stop flights, this will // be reinitialized for each flightmaster at the end of each spline (or stop) in the flight. uint32 nodeCount = i_mapIds.size(); // Get the number of nodes in the path. i_path and i_mapIds are the // same size when loaded in ObjectMgr::GetTaxiPathNodes, called from LoadPath() m_endMapId = i_mapIds[nodeCount -1]; // Get the map ID from the last node m_preloadTargetNode = nodeCount - 3; // 2 nodes before the final node, we pre-load the grid m_endGridX = i_path[nodeCount -1].x; // Get the X position from the last node m_endGridY = i_path[nodeCount -1].y; // Get tye Y position from the last node }
void BattleGround::EndBattleGround(Team winner) { this->RemoveFromBGFreeSlotQueue(); uint32 loser_rating = 0; uint32 winner_rating = 0; WorldPacket data; int32 winmsg_id = 0; if (winner == ALLIANCE) { winmsg_id = LANG_BG_A_WINS; PlaySoundToAll(SOUND_ALLIANCE_WINS); // alliance wins sound } else if (winner == HORDE) { winmsg_id = LANG_BG_H_WINS; PlaySoundToAll(SOUND_HORDE_WINS); // horde wins sound } SetWinner(winner); SetStatus(STATUS_WAIT_LEAVE); // we must set it this way, because end time is sent in packet! m_EndTime = TIME_TO_AUTOREMOVE; for (BattleGroundPlayerMap::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { Team team = itr->second.PlayerTeam; if (itr->second.OfflineRemoveTime) continue; Player* plr = sObjectMgr.GetPlayer(itr->first); if (!plr) { sLog.outError("BattleGround:EndBattleGround %s not found!", itr->first.GetString().c_str()); continue; } // should remove spirit of redemption if (plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); if (!plr->isAlive()) { plr->ResurrectPlayer(1.0f); plr->SpawnCorpseBones(); } else { // needed cause else in av some creatures will kill the players at the end plr->CombatStop(); plr->getHostileRefManager().deleteReferences(); } // this line is obsolete - team is set ALWAYS // if(!team) team = plr->GetTeam(); if (team == winner) { RewardMark(plr, ITEM_WINNER_COUNT); RewardQuestComplete(plr); } else RewardMark(plr, ITEM_LOSER_COUNT); plr->CombatStopWithPets(true); BlockMovement(plr); sBattleGroundMgr.BuildPvpLogDataPacket(&data, this); plr->GetSession()->SendPacket(&data); BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID()); sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetBattleGroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime()); plr->GetSession()->SendPacket(&data); } if (winmsg_id) SendMessageToAll(winmsg_id, CHAT_MSG_BG_SYSTEM_NEUTRAL); }
void BattleGround::EndBattleGround(uint32 winner) { this->RemoveFromBGFreeSlotQueue(); uint32 loser_rating = 0; uint32 winner_rating = 0; WorldPacket data; Player *Source = NULL; const char *winmsg = ""; if(winner == ALLIANCE) { winmsg = GetMangosString(LANG_BG_A_WINS); PlaySoundToAll(SOUND_ALLIANCE_WINS); // alliance wins sound SetWinner(WINNER_ALLIANCE); } else if(winner == HORDE) { winmsg = GetMangosString(LANG_BG_H_WINS); PlaySoundToAll(SOUND_HORDE_WINS); // horde wins sound SetWinner(WINNER_HORDE); } else { SetWinner(3); } SetStatus(STATUS_WAIT_LEAVE); m_EndTime = 0; for(std::map<uint64, BattleGroundPlayer>::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { Player *plr = sObjectMgr.GetPlayer(itr->first); if(!plr) { sLog.outError("BattleGround: Player (GUID: %u) not found!", GUID_LOPART(itr->first)); continue; } // should remove spirit of redemption if(plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); if(!plr->isAlive()) { plr->ResurrectPlayer(1.0f); plr->SpawnCorpseBones(); } else { //needed cause else in av some creatures will kill the players at the end plr->CombatStop(); plr->getHostileRefManager().deleteReferences(); } uint32 team = itr->second.Team; if(!team) team = plr->GetTeam(); if(team == winner) { if(!Source) Source = plr; RewardMark(plr,ITEM_WINNER_COUNT); RewardQuestComplete(plr); } else RewardMark(plr,ITEM_LOSER_COUNT); plr->CombatStopWithPets(true); BlockMovement(plr); sBattleGroundMgr.BuildPvpLogDataPacket(&data, this); plr->GetSession()->SendPacket(&data); uint32 bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID()); sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetTeam(), plr->GetBattleGroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime()); plr->GetSession()->SendPacket(&data); } // inform invited players about the removal sBattleGroundMgr.m_BattleGroundQueues[BattleGroundMgr::BGQueueTypeId(GetTypeID())].BGEndedRemoveInvites(this); if(Source) { ChatHandler(Source).FillMessageData(&data, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, Source->GetGUID(), winmsg); SendPacketToAll(&data); } }