AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
FlightPathMovementGenerator Class Reference

#include "WaypointMovementGenerator.h"

Inheritance diagram for FlightPathMovementGenerator:
MovementGeneratorMedium< Player, FlightPathMovementGenerator > PathMovementBase< Player, TaxiPathNodeList > MovementGenerator

Classes

struct  TaxiNodeChangeInfo
 node index where preloading starts More...
 

Public Member Functions

 FlightPathMovementGenerator (uint32 startNode=0)
 
bool LoadPath (Player *player)
 
void DoInitialize (Player *)
 
void DoReset (Player *)
 
void DoFinalize (Player *)
 
bool DoUpdate (Player *, uint32)
 
MovementGeneratorType GetMovementGeneratorType () override
 
TaxiPathNodeList const & GetPath ()
 
uint32 GetPathAtMapEnd () const
 
bool HasArrived () const
 
void SetCurrentNodeAfterTeleport ()
 
void SkipCurrentNode ()
 
void DoEventIfAny (Player *player, TaxiPathNodeEntry const *node, bool departure)
 
bool GetResetPos (Player *, float &x, float &y, float &z)
 
void InitEndGridInfo ()
 
void PreloadEndGrid ()
 
- Public Member Functions inherited from MovementGeneratorMedium< Player, FlightPathMovementGenerator >
void Initialize (Unit *u) override
 
void Finalize (Unit *u) override
 
void Reset (Unit *u) override
 
bool Update (Unit *u, uint32 time_diff) override
 
- Public Member Functions inherited from MovementGenerator
virtual ~MovementGenerator ()
 
virtual uint32 GetSplineId () const
 
virtual void unitSpeedChanged ()
 
virtual void Pause (uint32)
 
virtual void Resume (uint32)
 
virtual bool GetResetPosition (float &, float &, float &)
 
- Public Member Functions inherited from PathMovementBase< Player, TaxiPathNodeList >
 PathMovementBase ()
 
 PathMovementBase (TaxiPathNodeList path)
 
virtual ~PathMovementBase ()
 
uint32 GetCurrentNode () const
 

Private Attributes

float _endGridX
 
float _endGridY
 X coord of last node location.
 
uint32 _endMapId
 Y coord of last node location.
 
uint32 _preloadTargetNode
 map Id of last node location
 
std::deque< TaxiNodeChangeInfo_pointsForPathSwitch
 

Additional Inherited Members

- Protected Attributes inherited from PathMovementBase< Player, TaxiPathNodeList >
TaxiPathNodeList i_path
 
uint32 i_currentNode
 

Detailed Description

FlightPathMovementGenerator generates movement of the player for the paths and hence generates ground and activities for the player.

Constructor & Destructor Documentation

◆ FlightPathMovementGenerator()

FlightPathMovementGenerator::FlightPathMovementGenerator ( uint32  startNode = 0)
inlineexplicit
104 {
105 i_currentNode = startNode;
106 _endGridX = 0.0f;
107 _endGridY = 0.0f;
108 _endMapId = 0;
110 }
float _endGridY
X coord of last node location.
Definition WaypointMovementGenerator.h:133
uint32 _preloadTargetNode
map Id of last node location
Definition WaypointMovementGenerator.h:135
float _endGridX
Definition WaypointMovementGenerator.h:132
uint32 _endMapId
Y coord of last node location.
Definition WaypointMovementGenerator.h:134
uint32 i_currentNode
Definition WaypointMovementGenerator.h:46

References _endGridX, _endGridY, _endMapId, _preloadTargetNode, and PathMovementBase< Player, TaxiPathNodeList >::i_currentNode.

Member Function Documentation

◆ DoEventIfAny()

void FlightPathMovementGenerator::DoEventIfAny ( Player player,
TaxiPathNodeEntry const *  node,
bool  departure 
)
774{
775 if (uint32 eventid = departure ? node->departureEventID : node->arrivalEventID)
776 {
777 LOG_DEBUG("maps.script", "Taxi {} event {} of node {} of path {} for player {}", departure ? "departure" : "arrival", eventid, node->index, node->path, player->GetName());
778 player->GetMap()->ScriptsStart(sEventScripts, eventid, player, player);
779 }
780}
std::uint32_t uint32
Definition Define.h:107
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
ScriptMapMap sEventScripts
Definition ObjectMgr.cpp:61
void ScriptsStart(std::map< uint32, std::multimap< uint32, ScriptInfo > > const &scripts, uint32 id, Object *source, Object *target)
Put scripts in the execution queue.
Definition MapScripts.cpp:31
Map * GetMap() const
Definition Object.h:630

References TaxiPathNodeEntry::arrivalEventID, TaxiPathNodeEntry::departureEventID, WorldObject::GetMap(), WorldObject::GetName(), TaxiPathNodeEntry::index, LOG_DEBUG, TaxiPathNodeEntry::path, Map::ScriptsStart(), and sEventScripts.

Referenced by DoUpdate().

◆ DoFinalize()

void FlightPathMovementGenerator::DoFinalize ( Player player)
658{
659 // remove flag to prevent send object build movement packets for flight state and crash (movement generator already not at top of stack)
661
663 player->Dismount();
665 player->UpdatePvPState(); // to account for cases such as flying into a PvP territory, as it does not flag on the way in
666
667 if (player->m_taxi.empty())
668 {
669 // update z position to ground and orientation for landing point
670 // this prevent cheating with landing point at lags
671 // when client side flight end early in comparison server side
672 player->StopMoving();
673
674 // When the player reaches the last flight point, teleport to destination taxi node location
675 player->SetFallInformation(GameTime::GetGameTime().count(), player->GetPositionZ());
676 }
677
679}
@ PLAYER_FLAGS_TAXI_BENCHMARK
Definition Player.h:476
@ UNIT_STATE_IN_FLIGHT
Definition UnitDefines.h:181
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:277
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:259
bool empty() const
Definition PlayerTaxi.h:76
void ClearTaxiDestinations()
Definition PlayerTaxi.h:61
void RemovePlayerFlag(PlayerFlags flags)
Definition Player.h:1126
void SetFallInformation(uint32 time, float z)
Definition Player.h:2382
void UpdatePvPState()
Definition PlayerUpdates.cpp:1437
PlayerTaxi m_taxi
Definition Player.h:1159
void ClearUnitState(uint32 f)
Definition Unit.h:738
void Dismount()
Definition Unit.cpp:10547
void StopMoving()
Definition Unit.cpp:13010
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:750
Seconds GetGameTime()
Definition GameTime.cpp:38
float GetPositionZ() const
Definition Position.h:123

References PlayerTaxi::ClearTaxiDestinations(), Unit::ClearUnitState(), Unit::Dismount(), PlayerTaxi::empty(), GameTime::GetGameTime(), Position::GetPositionZ(), Player::m_taxi, PLAYER_FLAGS_TAXI_BENCHMARK, Player::RemovePlayerFlag(), Unit::RemoveUnitFlag(), Player::SetFallInformation(), Unit::StopMoving(), UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_IN_FLIGHT, and Player::UpdatePvPState().

◆ DoInitialize()

void FlightPathMovementGenerator::DoInitialize ( Player player)
652{
653 Reset(player);
655}
void InitEndGridInfo()
Definition WaypointMovementGenerator.cpp:791
void Reset(Unit *u) override
Definition MovementGenerator.h:70

References InitEndGridInfo(), and MovementGeneratorMedium< Player, FlightPathMovementGenerator >::Reset().

◆ DoReset()

void FlightPathMovementGenerator::DoReset ( Player player)
684{
685 uint32 end = GetPathAtMapEnd();
686 uint32 currentNodeId = GetCurrentNode();
687
688 if (currentNodeId == end)
689 {
690 LOG_DEBUG("movement.flightpath", "FlightPathMovementGenerator::DoReset: trying to start a flypath from the end point. {}", player->GetGUID().ToString());
691 return;
692 }
693
694 if (player->pvpInfo.EndTimer)
695 player->UpdatePvP(false, true); // PvP flag timer immediately ends when starting taxi
696
699
700 Movement::MoveSplineInit init(player);
701 // Providing a starting vertex since the taxi paths do not provide such
702 init.Path().push_back(G3D::Vector3(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()));
703 for (uint32 i = currentNodeId; i != end; ++i)
704 {
705 G3D::Vector3 vertice(i_path[i]->x, i_path[i]->y, i_path[i]->z);
706 init.Path().push_back(vertice);
707 }
708 init.SetFirstPointId(GetCurrentNode());
709 init.SetFly();
710 init.SetVelocity(PLAYER_FLIGHT_SPEED);
711 init.Launch();
712}
#define PLAYER_FLIGHT_SPEED
Definition WaypointMovementGenerator.cpp:681
uint32 GetPathAtMapEnd() const
Definition WaypointMovementGenerator.cpp:545
Definition MoveSplineInit.h:63
std::string ToString() const
Definition ObjectGuid.cpp:47
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
TaxiPathNodeList i_path
Definition WaypointMovementGenerator.h:45
uint32 GetCurrentNode() const
Definition WaypointMovementGenerator.h:42
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1530
PvPInfo pvpInfo
Definition Player.h:1873
void AddUnitState(uint32 f)
Definition Unit.h:736
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:749
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122
time_t EndTimer
‍Marks if player is in an FFAPvP area (such as Gurubashi Arena)
Definition Player.h:351

References Unit::AddUnitState(), PvPInfo::EndTimer, PathMovementBase< Player, TaxiPathNodeList >::GetCurrentNode(), Object::GetGUID(), GetPathAtMapEnd(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), PathMovementBase< Player, TaxiPathNodeList >::i_path, Movement::MoveSplineInit::Launch(), LOG_DEBUG, Movement::MoveSplineInit::Path(), PLAYER_FLIGHT_SPEED, Player::pvpInfo, Movement::MoveSplineInit::SetFirstPointId(), Movement::MoveSplineInit::SetFly(), Unit::SetUnitFlag(), Movement::MoveSplineInit::SetVelocity(), ObjectGuid::ToString(), UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_IN_FLIGHT, and Player::UpdatePvP().

◆ DoUpdate()

bool FlightPathMovementGenerator::DoUpdate ( Player player,
uint32   
)
715{
716 // skipping the first spline path point because it's our starting point and not a taxi path point
717 uint32 pointId = player->movespline->currentPathIdx() <= 0 ? 0 : player->movespline->currentPathIdx() - 1;
718 if (pointId > i_currentNode && i_currentNode < i_path.size() - 1)
719 {
720 bool departureEvent = true;
721 do
722 {
723 ASSERT(i_currentNode < i_path.size(), "Point Id: {}\n{}", pointId, player->GetGUID().ToString());
724
725 DoEventIfAny(player, i_path[i_currentNode], departureEvent);
726 while (!_pointsForPathSwitch.empty() && _pointsForPathSwitch.front().PathIndex <= i_currentNode)
727 {
728 _pointsForPathSwitch.pop_front();
729 player->m_taxi.NextTaxiDestination();
730 if (!_pointsForPathSwitch.empty())
731 {
733 player->ModifyMoney(-_pointsForPathSwitch.front().Cost);
734 }
735 }
736
737 if (pointId == i_currentNode)
738 {
739 break;
740 }
741
743 {
745 }
746
747 i_currentNode += departureEvent ? 1 : 0;
748 departureEvent = !departureEvent;
749 } while (i_currentNode < i_path.size() - 1);
750 }
751
752 return i_currentNode < (i_path.size() - 1);
753}
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition DBCEnums.h:176
#define ASSERT
Definition Errors.h:68
std::deque< TaxiNodeChangeInfo > _pointsForPathSwitch
Definition WaypointMovementGenerator.h:143
void PreloadEndGrid()
Definition WaypointMovementGenerator.cpp:814
void DoEventIfAny(Player *player, TaxiPathNodeEntry const *node, bool departure)
Definition WaypointMovementGenerator.cpp:773
int32 currentPathIdx() const
Definition MoveSpline.cpp:318
uint32 NextTaxiDestination()
Definition PlayerTaxi.h:66
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2174
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11680
Movement::MoveSpline * movespline
Definition Unit.h:2113

References _pointsForPathSwitch, _preloadTargetNode, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, ASSERT, Movement::MoveSpline::currentPathIdx(), DoEventIfAny(), Object::GetGUID(), PathMovementBase< Player, TaxiPathNodeList >::i_currentNode, PathMovementBase< Player, TaxiPathNodeList >::i_path, Player::m_taxi, Player::ModifyMoney(), Unit::movespline, PlayerTaxi::NextTaxiDestination(), PreloadEndGrid(), ObjectGuid::ToString(), and Player::UpdateAchievementCriteria().

◆ GetMovementGeneratorType()

MovementGeneratorType FlightPathMovementGenerator::GetMovementGeneratorType ( )
inlineoverridevirtual

Implements MovementGenerator.

116{ return FLIGHT_MOTION_TYPE; }
@ FLIGHT_MOTION_TYPE
Definition MotionMaster.h:47

References FLIGHT_MOTION_TYPE.

◆ GetPath()

TaxiPathNodeList const & FlightPathMovementGenerator::GetPath ( )
inline

◆ GetPathAtMapEnd()

uint32 FlightPathMovementGenerator::GetPathAtMapEnd ( ) const
546{
547 if (i_currentNode >= i_path.size())
548 {
549 return i_path.size();
550 }
551
552 uint32 curMapId = i_path[i_currentNode]->mapid;
553 for (uint32 i = i_currentNode; i < i_path.size(); ++i)
554 {
555 if (i_path[i]->mapid != curMapId)
556 {
557 return i;
558 }
559 }
560
561 return i_path.size();
562}

References PathMovementBase< Player, TaxiPathNodeList >::i_currentNode, and PathMovementBase< Player, TaxiPathNodeList >::i_path.

Referenced by DoReset().

◆ GetResetPos()

bool FlightPathMovementGenerator::GetResetPos ( Player ,
float &  x,
float &  y,
float &  z 
)
783{
785 x = node->x;
786 y = node->y;
787 z = node->z;
788 return true;
789}
Definition DBCStructure.h:1973
float y
Definition DBCStructure.h:1979
float x
Definition DBCStructure.h:1978
float z
Definition DBCStructure.h:1980

References PathMovementBase< Player, TaxiPathNodeList >::i_currentNode, PathMovementBase< Player, TaxiPathNodeList >::i_path, TaxiPathNodeEntry::x, TaxiPathNodeEntry::y, and TaxiPathNodeEntry::z.

◆ HasArrived()

bool FlightPathMovementGenerator::HasArrived ( ) const
inline

◆ InitEndGridInfo()

void FlightPathMovementGenerator::InitEndGridInfo ( )

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.

Number of nodes in path.

MapId of last node

792{
795 uint32 nodeCount = i_path.size();
796 _endMapId = i_path[nodeCount - 1]->mapid;
797
798 // pussywizard:
799 {
800 _preloadTargetNode = nodeCount - 1;
801 for (uint8 i = 3; i > 0; --i)
802 if (nodeCount >= i && _endMapId == i_path[nodeCount - i]->mapid)
803 {
804 _preloadTargetNode = nodeCount - i;
805 break;
806 }
807 //_preloadTargetNode = nodeCount - 3; // pussywizard: this can be on other map
808 }
809
810 _endGridX = i_path[nodeCount - 1]->x;
811 _endGridY = i_path[nodeCount - 1]->y;
812}
std::uint8_t uint8
Definition Define.h:109

References _endGridX, _endGridY, _endMapId, _preloadTargetNode, and PathMovementBase< Player, TaxiPathNodeList >::i_path.

Referenced by DoInitialize().

◆ LoadPath()

bool FlightPathMovementGenerator::LoadPath ( Player player)
572{
573 i_path.clear();
574 _pointsForPathSwitch.clear();
575 auto fail = [&]()
576 {
577 i_path.clear();
578 _pointsForPathSwitch.clear();
579 return false;
580 };
581
582 std::deque<uint32> const& taxi = player->m_taxi.GetPath();
583 float discount = player->GetReputationPriceDiscount(player->m_taxi.GetFlightMasterFactionTemplate());
584 for (uint32 src = 0, dst = 1; dst < taxi.size(); src = dst++)
585 {
586 uint32 path, cost;
587 sObjectMgr->GetTaxiPath(taxi[src], taxi[dst], path, cost);
588 if (path >= sTaxiPathNodesByPath.size())
589 return fail();
590
591 TaxiPathNodeList const& nodes = sTaxiPathNodesByPath[path];
592 if (nodes.empty())
593 return fail();
594
595 TaxiPathNodeEntry const* start = nodes[0];
596 TaxiPathNodeEntry const* end = nodes[nodes.size() - 1];
597 bool passedPreviousSegmentProximityCheck = false;
598 bool addedPathNode = false;
599 for (uint32 i = 0; i < nodes.size(); ++i)
600 {
601 if (passedPreviousSegmentProximityCheck || !src || i_path.empty() || IsNodeIncludedInShortenedPath(i_path[i_path.size() - 1], nodes[i]))
602 {
603 if ((!src || (IsNodeIncludedInShortenedPath(start, nodes[i]) && i >= 2)) &&
604 (dst == taxi.size() - 1 || (IsNodeIncludedInShortenedPath(end, nodes[i]) && i < nodes.size() - 1)))
605 {
606 passedPreviousSegmentProximityCheck = true;
607 i_path.push_back(nodes[i]);
608 addedPathNode = true;
609 }
610 }
611 else
612 {
613 i_path.pop_back();
614 --_pointsForPathSwitch.back().PathIndex;
615 }
616 }
617
618 if (!addedPathNode || i_path.empty())
619 return fail();
620
621 _pointsForPathSwitch.push_back({ uint32(i_path.size() - 1), int32(ceil(cost * discount)) });
622 }
623
624 // TODO: fixes crash, but can be handled in a better way once we will know how to reproduce it.
625 if (GetCurrentNode() >= i_path.size())
626 {
627 std::string paths;
628 std::deque<uint32> const& taxi = player->m_taxi.GetPath();
629 for (uint32 src = 0, dst = 1; dst < taxi.size(); src = dst++)
630 {
631 uint32 path, cost;
632 sObjectMgr->GetTaxiPath(taxi[src], taxi[dst], path, cost);
633 paths += std::to_string(path) + " ";
634 }
635
636 LOG_ERROR("movement.flightpath", "Failed to build correct path for player: {}. Current node: {}, max nodes: {}. Paths: {}. Player pos: {}.", player->GetGUID().ToString(), GetCurrentNode(), i_path.size(), paths, player->GetPosition().ToString());
637
638 // Lets choose the second last element so that a player would still have some flight.
639 if (i_path.size() >= 2)
640 i_currentNode = uint32(i_path.size() - 2);
641 else
642 i_currentNode = 0;
643 }
644
645 if (i_path.empty())
646 return fail();
647
648 return true;
649}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition DBCStores.cpp:187
std::vector< TaxiPathNodeEntry const * > TaxiPathNodeList
Definition DBCStructure.h:2245
std::int32_t int32
Definition Define.h:103
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sObjectMgr
Definition ObjectMgr.h:1730
bool IsNodeIncludedInShortenedPath(TaxiPathNodeEntry const *p1, TaxiPathNodeEntry const *p2)
Definition WaypointMovementGenerator.cpp:566
std::deque< uint32 > const & GetPath() const
Definition PlayerTaxi.h:75
FactionTemplateEntry const * GetFlightMasterFactionTemplate() const
Definition PlayerTaxi.cpp:235
float GetReputationPriceDiscount(Creature const *creature) const
Definition Player.cpp:12576
void GetPosition(float &x, float &y) const
Definition Position.h:126

References _pointsForPathSwitch, PathMovementBase< Player, TaxiPathNodeList >::GetCurrentNode(), PlayerTaxi::GetFlightMasterFactionTemplate(), Object::GetGUID(), PlayerTaxi::GetPath(), Position::GetPosition(), Player::GetReputationPriceDiscount(), PathMovementBase< Player, TaxiPathNodeList >::i_currentNode, PathMovementBase< Player, TaxiPathNodeList >::i_path, IsNodeIncludedInShortenedPath(), LOG_ERROR, Player::m_taxi, sObjectMgr, sTaxiPathNodesByPath, and ObjectGuid::ToString().

Referenced by MotionMaster::MoveTaxiFlight().

◆ PreloadEndGrid()

void FlightPathMovementGenerator::PreloadEndGrid ( )
815{
816 // used to preload the final grid where the flightmaster is
817 Map* endMap = sMapMgr->FindBaseNonInstanceMap(_endMapId);
818
819 // Load the grid
820 if (endMap)
821 {
822 LOG_DEBUG("misc", "Preloading grid ({}, {}) for map {} at node index {}/{}", _endGridX, _endGridY, _endMapId, _preloadTargetNode, (uint32)(i_path.size() - 1));
823 endMap->LoadGrid(_endGridX, _endGridY);
824 }
825 else
826 {
827 LOG_DEBUG("misc", "Unable to determine map to preload flightmaster grid");
828 }
829}
#define sMapMgr
Definition MapMgr.h:220
Definition Map.h:166
void LoadGrid(float x, float y)
Definition Map.cpp:213

References _endGridX, _endGridY, _endMapId, _preloadTargetNode, PathMovementBase< Player, TaxiPathNodeList >::i_path, Map::LoadGrid(), LOG_DEBUG, and sMapMgr.

Referenced by DoUpdate().

◆ SetCurrentNodeAfterTeleport()

void FlightPathMovementGenerator::SetCurrentNodeAfterTeleport ( )
756{
757 if (i_path.empty() || i_currentNode >= i_path.size())
758 {
759 return;
760 }
761
762 uint32 map0 = i_path[i_currentNode]->mapid;
763 for (std::size_t i = i_currentNode + 1; i < i_path.size(); ++i)
764 {
765 if (i_path[i]->mapid != map0)
766 {
767 i_currentNode = i;
768 return;
769 }
770 }
771}

References PathMovementBase< Player, TaxiPathNodeList >::i_currentNode, and PathMovementBase< Player, TaxiPathNodeList >::i_path.

◆ SkipCurrentNode()

void FlightPathMovementGenerator::SkipCurrentNode ( )
inline

Member Data Documentation

◆ _endGridX

float FlightPathMovementGenerator::_endGridX
private

◆ _endGridY

float FlightPathMovementGenerator::_endGridY
private

X coord of last node location.

Referenced by FlightPathMovementGenerator(), InitEndGridInfo(), and PreloadEndGrid().

◆ _endMapId

uint32 FlightPathMovementGenerator::_endMapId
private

Y coord of last node location.

Referenced by FlightPathMovementGenerator(), InitEndGridInfo(), and PreloadEndGrid().

◆ _pointsForPathSwitch

std::deque<TaxiNodeChangeInfo> FlightPathMovementGenerator::_pointsForPathSwitch
private

Referenced by DoUpdate(), and LoadPath().

◆ _preloadTargetNode

uint32 FlightPathMovementGenerator::_preloadTargetNode
private

map Id of last node location

Referenced by DoUpdate(), FlightPathMovementGenerator(), InitEndGridInfo(), and PreloadEndGrid().


The documentation for this class was generated from the following files: