63#include <boost/heap/fibonacci_heap.hpp>
66#define DEFAULT_GRID_EXPIRY 300
67#define MAX_GRID_LOAD_TIME 50
68#define MAX_CREATURE_ATTACK_RADIUS (45.0f * sWorld->getRate(RATE_CREATURE_AGGRO))
78struct RespawnListContainer : boost::heap::fibonacci_heap<RespawnInfoWithHandle*, boost::heap::compare<CompareRespawnInfo>>
86 RespawnListContainer::handle_type
handle;
134_creatureToMoveLock(false), _gameObjectsToMoveLock(false), _dynamicObjectsToMoveLock(false), _areaTriggersToMoveLock(false),
135i_mapEntry(
sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId),
138m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()),
139i_gridExpiry(expiry), m_terrain(
sTerrainMgr.LoadTerrain(id)), m_forceEnabledNavMeshFilterFlags(0), m_forceDisabledNavMeshFilterFlags(0),
140i_scriptLock(false), _respawnTimes(
std::make_unique<
RespawnListContainer>()), _respawnCheckTimer(0), _vignetteUpdateTimer(5200, 5200)
181 if (obj->IsStoredInWorldObjectGridContainer())
424 Cell cell(cellCoord);
471 int32 oldValue = itr->second;
472 if (oldValue == value && !inserted)
478 if (worldStateTemplate)
479 sScriptMgr->OnWorldStateValueChange(worldStateTemplate, oldValue, value,
this);
484 updateWorldState.
Value = value;
485 updateWorldState.
Hidden = hidden;
486 updateWorldState.
Write();
490 if (worldStateTemplate && !worldStateTemplate->
AreaIds.empty())
492 bool isInAllowedArea = std::any_of(worldStateTemplate->
AreaIds.begin(), worldStateTemplate->
AreaIds.end(),
493 [playerAreaId = mapReference.GetSource()->GetAreaId()](
uint32 requiredAreaId) { return DB2Manager::IsInArea(playerAreaId, requiredAreaId); });
494 if (!isInAllowedArea)
498 mapReference.GetSource()->SendDirectMessage(updateWorldState.
GetRawPacket());
508 vignetteUpdate.
Write();
512 ref.GetSource()->SendDirectMessage(vignetteUpdate.
GetRawPacket());
522 vignetteUpdate.
Write();
527 if (ref.GetSource()->GetZoneId() == vignette->
ZoneID)
528 ref.GetSource()->SendDirectMessage(vignetteUpdate.
GetRawPacket());
553 if (obj->IsInWorld())
556 obj->UpdateObjectVisibility(
true);
567 TC_LOG_ERROR(
"maps",
"Map::Add: Object {} has invalid coordinates X:{} Y:{} grid cell [{}:{}]", obj->GetGUID().ToString(), obj->GetPositionX(), obj->GetPositionY(), cellCoord.
x_coord, cellCoord.
y_coord);
572 obj->setActive(
true);
574 Cell cell(cellCoord);
575 if (obj->isActiveObject())
580 TC_LOG_DEBUG(
"maps",
"Object {} enters grid[{}, {}]", obj->GetGUID().ToString(), cell.
GridX(), cell.
GridY());
588 if (obj->isActiveObject())
593 obj->SetIsNewObject(
true);
594 obj->UpdateObjectVisibilityOnCreate();
595 obj->SetIsNewObject(
false);
622 if (itr->GetSource()->GetTransport() != obj && itr->GetSource()->
InSamePhase(obj))
626 itr->GetSource()->m_visibleTransports.insert(obj->
GetGUID());
629 itr->GetSource()->SendDirectMessage(&packet);
665 Visit(cell, gridVisitor);
666 Visit(cell, worldVisitor);
674 if (oldZone == newZone)
680 ASSERT(oldZoneCount,
"A player left zone %u (went to %u) - but there were no players in the zone!", oldZone, newZone);
698 session->
Update(t_diff, updater);
742 std::vector<Unit*> toVisit;
746 toVisit.push_back(unit);
747 for (
Unit* unit : toVisit)
752 std::unordered_set<Unit*> toVisit;
753 for (std::pair<uint32, AuraApplication*> pair : player->
GetAppliedAuras())
755 if (
Unit* caster = pair.second->GetBase()->GetCaster())
757 toVisit.insert(caster);
759 for (
Unit* unit : toVisit)
764 std::vector<Unit*> toVisit;
771 toVisit.push_back(unit);
773 for (
Unit* unit : toVisit)
801 if (vignette->NeedUpdate)
804 vignette->FillPacket(vignetteUpdate.
Updated);
805 vignetteUpdate.
Write();
808 ref.GetSource()->SendDirectMessage(vignetteUpdate.
GetRawPacket());
810 vignette->NeedUpdate =
false;
830 zoneInfo.second.DefaultWeather.reset();
861 iter->GetSource()->ResetAllNotifies();
901 Visit(cell, grid_object_relocation);
902 Visit(cell, world_object_relocation);
938 Visit(cell, grid_notifier);
939 Visit(cell, world_notifier);
955 bool const inWorld = player->
IsInWorld();
975 obj->RemoveFromWorld();
976 if (obj->isActiveObject())
982 obj->UpdateObjectVisibilityOnDestroy();
984 obj->RemoveFromGrid();
1009 if (itr->GetSource()->GetTransport() != obj && itr->GetSource()->m_visibleTransports.count(obj->
GetGUID()))
1011 itr->GetSource()->SendDirectMessage(&packet);
1012 itr->GetSource()->m_visibleTransports.erase(obj->
GetGUID());
1019 TransportsContainer::iterator itr =
_transports.find(obj);
1035template <
typename T>
1038 Cell const& cur_cell =
object->GetCurrentCell();
1039 Cell xy_cell(object->GetPositionX(), object->GetPositionY());
1040 if (xy_cell != cur_cell)
1042 TC_LOG_DEBUG(
"maps",
"{} {} X: {} Y: {} ({}) is in grid[{}, {}]cell[{}, {}] instead of grid[{}, {}]cell[{}, {}]",
1043 objType, object->GetGUID().ToString(),
1044 object->GetPositionX(), object->GetPositionY(), (moved ?
"final" :
"original"),
1058 Cell new_cell(x, y);
1060 player->
Relocate(x, y, z, orientation);
1066 TC_LOG_DEBUG(
"maps",
"Player {} relocation grid[{}, {}]cell[{}, {}]->grid[{}, {}]cell[{}, {}]", player->
GetName(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1084 Cell new_cell(x, y);
1094 TC_LOG_DEBUG(
"maps",
"Creature {} added to moving list from grid[{}, {}]cell[{}, {}] to grid[{}, {}]cell[{}, {}].", creature->
GetGUID().
ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1115 Cell new_cell(x, y);
1126 TC_LOG_DEBUG(
"maps",
"GameObject {} added to moving list from grid[{}, {}]cell[{}, {}] to grid[{}, {}]cell[{}, {}].", go->
GetGUID().
ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1133 go->
Relocate(x, y, z, orientation);
1144 Cell new_cell(x, y);
1155 TC_LOG_DEBUG(
"maps",
"GameObject {} added to moving list from grid[{}, {}]cell[{}, {}] to grid[{}, {}]cell[{}, {}].", dynObj->
GetGUID().
ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1162 dynObj->
Relocate(x, y, z, orientation);
1174 Cell new_cell(x, y);
1185 TC_LOG_DEBUG(
"maps",
"AreaTrigger ({}) added to moving list from grid[{}, {}]cell[{}, {}] to grid[{}, {}]cell[{}, {}].", at->
GetGUID().
ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1192 at->
Relocate(x, y, z, orientation);
1384 if (dynObj->
FindMap() !=
this)
1456template <
typename T>
1459 Cell const& old_cell =
object->GetCurrentCell();
1466 TC_LOG_DEBUG(
"maps",
"{} {} moved in grid[{}, {}] from cell[{}, {}] to cell[{}, {}].", objType, object->GetGUID().ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
CellX(), new_cell.
CellY());
1469 object->RemoveFromGrid();
1475 TC_LOG_DEBUG(
"maps",
"{} {} moved in same grid[{}, {}]cell[{}, {}].", objType, object->GetGUID().ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY());
1483 if (object->isActiveObject())
1488 TC_LOG_DEBUG(
"maps",
"Active {} {} moved from grid[{}, {}]cell[{}, {}] to grid[{}, {}]cell[{}, {}].", objType, object->GetGUID().ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1491 object->RemoveFromGrid();
1498 if (c->GetCharmerOrOwnerGUID().IsPlayer())
1505 TC_LOG_DEBUG(
"maps",
"{} {} moved from grid[{}, {}]cell[{}, {}] to grid[{}, {}]cell[{}, {}].", objType, object->GetGUID().ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1508 object->RemoveFromGrid();
1517 TC_LOG_DEBUG(
"maps",
"{} {} attempted to move from grid[{}, {}]cell[{}, {}] to unloaded grid[{}, {}]cell[{}, {}].", objType, object->GetGUID().ToString(), old_cell.
GridX(), old_cell.
GridY(), old_cell.
CellX(), old_cell.
CellY(), new_cell.
GridX(), new_cell.
GridY(), new_cell.
CellX(), new_cell.
CellY());
1544 float resp_x, resp_y, resp_z, resp_o;
1546 Cell resp_cell(resp_x, resp_y);
1556 TC_LOG_DEBUG(
"maps",
"Creature {} moved from grid[{}, {}]cell[{}, {}] to respawn grid[{}, {}]cell[{}, {}].", c->
GetGUID().
ToString(), c->
GetCurrentCell().
GridX(), c->
GetCurrentCell().
GridY(), c->
GetCurrentCell().
CellX(), c->
GetCurrentCell().
CellY(), resp_cell.
GridX(), resp_cell.
GridY(), resp_cell.
CellX(), resp_cell.
CellY());
1562 c->
Relocate(resp_x, resp_y, resp_z, resp_o);
1575 float resp_x, resp_y, resp_z, resp_o;
1577 Cell resp_cell(resp_x, resp_y);
1584 TC_LOG_DEBUG(
"maps",
"GameObject {} moved from grid[{}, {}]cell[{}, {}] to respawn grid[{}, {}]cell[{}, {}].", go->
GetGUID().
ToString(), go->
GetCurrentCell().
GridX(), go->
GetCurrentCell().
GridY(), go->
GetCurrentCell().
CellX(), go->
GetCurrentCell().
CellY(), resp_cell.
GridX(), resp_cell.
GridY(), resp_cell.
CellX(), resp_cell.
CellY());
1590 go->
Relocate(resp_x, resp_y, resp_z, resp_o);
1663 TC_LOG_DEBUG(
"maps",
"Unloading grid[{}, {}] for map {} finished", x, y,
GetId());
1673 Player* player = itr->GetSource();
1677 TC_LOG_ERROR(
"maps",
"Map::UnloadAll: player {} is still in map {} during unload, this should not happen!", player->
GetName(),
GetId());
1702 RemoveFromMap<Transport>(transport,
true);
1707 for (
Corpse* corpse : cellCorpsePair.second)
1723 m_terrain->GetFullTerrainStatusForPosition(phaseShift,
GetId(), x, y, z, data, reqLiquidType, collisionHeight, &
_dynamicTree);
1727 float collisionHeight)
1729 return m_terrain->GetLiquidStatus(phaseShift,
GetId(), x, y, z, ReqLiquidType, data, collisionHeight);
1759 return m_terrain->GetStaticHeight(phaseShift,
GetId(), x, y, z, checkVMap, maxSearchDist);
1785 && !
VMAP::VMapFactory::createOrGetVMapManager()->
isInLineOfSight(
PhasingHandler::GetTerrainMapId(phaseShift,
GetId(),
m_terrain.get(), x1, y1), x1, y1, z1, x2, y2, z2, ignoreFlags))
1793bool Map::getObjectHitPos(
PhaseShift const& phaseShift,
float x1,
float y1,
float z1,
float x2,
float y2,
float z2,
float& rx,
float& ry,
float& rz,
float modifyDist)
1795 G3D::Vector3 startPos(x1, y1, z1);
1796 G3D::Vector3 dstPos(x2, y2, z2);
1798 G3D::Vector3 resultPos;
1841 uint32 instanceIdToCheck =
sMapMgr->FindInstanceIdForPlayer(mapid, player);
1842 if (
Map* boundMap =
sMapMgr->FindMap(mapid, instanceIdToCheck))
1868 transport->BuildCreateUpdateBlockForPlayer(&data, player);
1877 for (
WorldObject* passenger : transport->GetPassengers())
1878 if (player != passenger && player->
HaveAtClient(passenger))
1879 passenger->BuildCreateUpdateBlockForPlayer(&data, player);
1894 transport->BuildCreateUpdateBlockForPlayer(&transData, player);
1912 transport->BuildOutOfRangeUpdateBlock(&transData);
1928 if (!transport->IsInWorld())
1936 transport->BuildCreateUpdateBlockForPlayer(&transData, player);
1942 transport->BuildOutOfRangeUpdateBlock(&transData);
1956 TC_LOG_ERROR(
"maps",
"map::setNGrid() Invalid grid coordinates found: {}, {}!", x, y);
1975 for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter)
1977 iter->second.BuildPacket(&packet);
1978 iter->first->SendDirectMessage(&packet);
2000 bool alreadyExists =
false;
2009 for (
auto it = range.first; it != range.second; ++it)
2017 alreadyExists =
true;
2025 alreadyExists =
true;
2045 if (linkedTime == std::numeric_limits<time_t>::max())
2046 respawnTime = linkedTime;
2047 else if (
sObjectMgr->GetLinkedRespawnGuid(thisGUID) == thisGUID)
2048 respawnTime = now +
WEEK;
2050 respawnTime = std::max<time_t>(now, linkedTime) +
urand(5, 15);
2069 std::vector<WorldObject*> toUnload;
2074 toUnload.push_back(pair.second);
2078 toUnload.push_back(pair.second);
2087 return toUnload.size();
2105 auto it = bySpawnIdMap->find(info.
spawnId);
2106 if (it != bySpawnIdMap->end())
2114 ASSERT(bySpawnIdMap->find(info.
spawnId) == bySpawnIdMap->end(),
"Insertion of respawn info with id (%u," UI64FMTD ") into spawn id map failed - state desync.",
uint32(info.
type), info.
spawnId);
2121 bySpawnIdMap->emplace(ri->
spawnId, ri);
2127 data.reserve(data.size() + map.size());
2128 for (
auto const& pair : map)
2129 data.push_back(pair.second);
2145 auto it = map->find(spawnId);
2146 if (it == map->end())
2170 auto range = spawnMap->equal_range(info->
spawnId);
2171 auto it = std::find_if(range.first, range.second, [info](RespawnInfoMap::value_type
const& pair) { return (pair.second == info); });
2173 spawnMap->erase(it);
2208 if (!obj->
LoadFromDB(spawnId,
this,
true,
true))
2230 if (now < next->respawnTime)
2268 ASSERT(now < next->respawnTime);
2306 uint32 const playerCount = it->second;
2310 if (adjustFactor >= 1.0)
2313 if (respawnDelay <= timeMinimum)
2316 respawnDelay = std::max<uint32>(ceil(respawnDelay * adjustFactor), timeMinimum);
2334 if (!
GetPoolData().IsSpawnedObject(type, spawnId))
2353 TC_LOG_ERROR(
"maps",
"Tried to spawn non-existing (or system) spawn group {} on map {}. Blocked.", groupId,
GetId());
2359 std::vector<SpawnData const*> toSpawn;
2360 for (
auto& pair :
sObjectMgr->GetSpawnMetadataForGroup(groupId))
2369 if (force || ignoreRespawn)
2392 if (std::find(data->spawnDifficulties.begin(), data->spawnDifficulties.end(),
GetDifficultyID()) == data->spawnDifficulties.end())
2405 if (!creature->
LoadFromDB(data->spawnId,
this,
true, force))
2407 else if (spawnedObjects)
2408 spawnedObjects->push_back(creature);
2414 if (!gameobject->
LoadFromDB(data->spawnId,
this,
true))
2416 else if (spawnedObjects)
2417 spawnedObjects->push_back(gameobject);
2423 if (!areaTrigger->
LoadFromDB(data->spawnId,
this,
true,
false))
2425 else if (spawnedObjects)
2426 spawnedObjects->push_back(areaTrigger);
2442 TC_LOG_ERROR(
"maps",
"Tried to despawn non-existing (or system) spawn group {} on map {}. Blocked.", groupId,
GetId());
2446 for (
auto const& pair :
sObjectMgr->GetSpawnMetadataForGroup(groupId))
2450 if (deleteRespawnTimes)
2465 TC_LOG_ERROR(
"maps",
"Tried to set non-existing (or system) spawn group {} to {} on map {}. Blocked.", groupId, state ?
"active" :
"inactive",
GetId());
2479 TC_LOG_ERROR(
"maps",
"Tried to query state of non-existing spawn group {} on map {}.", groupId,
GetId());
2490 std::vector<uint32>
const* spawnGroups =
sObjectMgr->GetSpawnGroupsForMap(
GetId());
2494 for (
uint32 spawnGroupId : *spawnGroups)
2506 std::vector<uint32>
const* spawnGroups =
sObjectMgr->GetSpawnGroupsForMap(
GetId());
2510 for (
uint32 spawnGroupId : *spawnGroups)
2526 if (isActive == shouldBeActive)
2542 itr =
_guidGenerators.insert(std::make_pair(high, std::make_unique<ObjectGuidGenerator>(high))).first;
2544 return *itr->second;
2572 GridInfo* info = i->GetSource()->getGridInfoRef();
2601 else if (itr->second != on)
2613 bool on = itr->second;
2621 SwitchGridContainers<Creature>(obj->
ToCreature(), on);
2671 TC_LOG_ERROR(
"maps",
"Non-grid object (TypeId: {}) is in grid object remove list, ignored.", obj->
GetTypeId());
2685 if (!itr->GetSource()->IsGameMaster())
2693 itr->GetSource()->SendDirectMessage(data);
2705 cell_min.
dec_x(cell_range);
2706 cell_min.
dec_y(cell_range);
2707 cell_max.
inc_x(cell_range);
2708 cell_max.
inc_y(cell_range);
2712 Player* player = iter->GetSource();
2743 respawnLocation.emplace();
2744 creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
2750 respawnLocation.emplace();
2751 gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
2758 if (respawnLocation)
2766 TC_LOG_ERROR(
"maps",
"Active object {} added to grid[{}, {}] but spawn grid[{}, {}] was not loaded.",
2782 respawnLocation.emplace();
2783 creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
2789 respawnLocation.emplace();
2790 gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
2797 if (respawnLocation)
2805 TC_LOG_ERROR(
"maps",
"Active object {} removed from to grid[{}, {}] but spawn grid[{}, {}] was not loaded.",
2830 :
Map(id, expiry, InstanceId, SpawnMode),
2831 i_data(nullptr), i_script_id(0), i_scenario(nullptr), i_instanceLock(instanceLock)
2916 if (!entries.MapDifficulty->IsUsingEncounterLocks())
2926 pendingRaidLock.
WarningOnly = entries.Map->IsFlexLocking();
2928 if (!entries.Map->IsFlexLocking())
3017 if (!lockData->
Data.empty())
3048 ref.GetSource()->SendResetFailedNotify(
GetId());
3059 raidInstanceMessage.
Write();
3062 ref.GetSource()->SendDirectMessage(raidInstanceMessage.
GetRawPacket());
3071 pendingRaidLock.
Write();
3075 ref.GetSource()->SendDirectMessage(pendingRaidLock.
GetRawPacket());
3113 if (entries.IsInstanceIdBound())
3119 Player* player = mapReference.GetSource();
3125 std::string
const* oldData =
nullptr;
3126 uint32 playerCompletedEncounters = 0;
3133 bool isNewLock = !playerLock || playerLock->
IsNew() || playerLock->
IsExpired();
3163 if (entries.IsInstanceIdBound())
3165 instanceCompletedEncounters,
nullptr, {}));
3169 Player* player = mapReference.GetSource();
3175 std::string
const* oldData =
nullptr;
3179 bool isNewLock = !playerLock || playerLock->
IsNew() || playerLock->
IsExpired();
3183 instanceCompletedEncounters,
nullptr, {}));
3204 bool isNewLock = !playerLock || playerLock->
IsNew() || playerLock->
IsExpired();
3388 :
Map(id, expiry, InstanceId, spawnMode), m_bg(nullptr)
3449 if (
Player* player = itr->GetSource())
3450 if (!player->IsBeingTeleportedFar())
3451 player->TeleportTo(player->GetBattlegroundEntryPoint());
3511 if (bounds.first == bounds.second)
3514 std::unordered_multimap<ObjectGuid::LowType, Creature*>::const_iterator creatureItr = std::find_if(bounds.first, bounds.second, [](Map::CreatureBySpawnIdContainer::value_type
const& pair)
3516 return pair.second->IsAlive();
3519 return creatureItr != bounds.second ? creatureItr->second : bounds.first->second;
3525 if (bounds.first == bounds.second)
3528 std::unordered_multimap<ObjectGuid::LowType, GameObject*>::const_iterator creatureItr = std::find_if(bounds.first, bounds.second, [](Map::GameObjectBySpawnIdContainer::value_type
const& pair)
3530 return pair.second->isSpawned();
3533 return creatureItr != bounds.second ? creatureItr->second : bounds.first->second;
3539 if (bounds.first == bounds.second)
3542 return bounds.first->second;
3556 TC_LOG_ERROR(
"maps",
"Map {} attempt to save respawn time for nonexistant spawnid ({},{}).",
GetId(), type, spawnId);
3578 TC_LOG_ERROR(
"maps",
"Attempt to load saved respawn {} for ({},{}) failed - duplicate respawn? Skipped.", respawnTime,
uint32(type), spawnId);
3610 Field* fields = result->Fetch();
3613 time_t respawnTime = fields[2].
GetInt64();
3620 TC_LOG_ERROR(
"maps",
"Loading saved respawn time of {} for spawnid ({},{}) - spawn does not exist, ignoring", respawnTime,
uint32(type), spawnId);
3624 TC_LOG_ERROR(
"maps",
"Loading saved respawn time of {} for spawnid ({},{}) - invalid spawn type, ignoring", respawnTime,
uint32(type), spawnId);
3627 }
while (result->NextRow());
3670 std::unordered_map<ObjectGuid::LowType, std::unordered_set<uint32>> phases;
3671 std::unordered_map<ObjectGuid::LowType, std::vector<UF::ChrCustomizationChoice>> customizations;
3683 Field* fields = phaseResult->Fetch();
3687 phases[guid].insert(phaseId);
3689 }
while (phaseResult->NextRow());
3702 Field* fields = customizationResult->Fetch();
3704 std::vector<UF::ChrCustomizationChoice>& customizationsForCorpse = customizations[guid];
3706 customizationsForCorpse.emplace_back();
3711 }
while (customizationResult->NextRow());
3716 Field* fields = result->Fetch();
3721 TC_LOG_ERROR(
"misc",
"Corpse (guid: {}) have wrong corpse type ({}), not loading.", guid, type);
3726 if (!corpse->
LoadCorpseFromDB(GenerateLowGuid<HighGuid::Corpse>(), fields))
3732 for (
uint32 phaseId : phases[guid])
3739 }
while (result->NextRow());
3843 std::vector<ObjectGuid> corpses;
3847 if (p.second->IsExpired(now))
3848 corpses.push_back(p.first);
3853 std::vector<Corpse*> expiredBones;
3855 if (bones->IsExpired(now))
3856 expiredBones.push_back(bones);
3858 for (
Corpse* bones : expiredBones)
3871 if (
uint32 music = itr->second.MusicId)
3907 zoneDynamicInfo.
DefaultWeather->SendWeatherUpdateToPlayer(player);
3924 if (
Player* player = itr->GetSource())
3939 info.
DefaultWeather = std::make_unique<Weather>(zoneId, weatherData);
3950 if (zoneDynamicInfo)
3975 if (
Player* player = itr->GetSource())
3976 if (player->GetZoneId() == zoneId)
3987 return lightOverride.AreaLightId == areaLightId;
3991 if (overrideLightId)
4006 overrideLight.
Write();
4009 if (
Player* player = itr->GetSource())
4010 if (player->GetZoneId() == zoneId)
4011 player->SendDirectMessage(overrideLight.
GetRawPacket());
4020 if (
Player* player = itr->GetSource())
4022 if (player->IsInWorld())
4024 player->UpdateAreaDependentAuras(player->GetAreaId());
4025 player->UpdateZoneDependentAuras(player->GetZoneId());
4033 std::stringstream sstr;
4034 sstr << std::boolalpha
4042 std::stringstream sstr;
@ CHAR_SEL_CORPSE_CUSTOMIZATIONS
@ CHAR_DEL_CORPSES_FROM_MAP
@ CONDITION_SOURCE_TYPE_SPAWN_GROUP
DB2Storage< DifficultyEntry > sDifficultyStore("Difficulty.db2", &DifficultyLoadInfo::Instance)
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
@ DIFFICULTY_LFR_15TH_ANNIVERSARY
@ DIFFICULTY_MYTHIC_KEYSTONE
@ DIFFICULTY_3_MAN_SCENARIO_HC
@ DIFFICULTY_TIMEWALKING_RAID
@ DIFFICULTY_NORMAL_WARFRONT
@ DIFFICULTY_NORMAL_ISLAND
@ DIFFICULTY_FLAG_DISPLAY_MYTHIC
@ DIFFICULTY_FLAG_DISPLAY_HEROIC
@ IgnoreInstanceFarmLimit
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::unordered_set< uint32 > params[2]
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
#define ASSERT_NOTNULL(pointer)
#define MAX_NUMBER_OF_CELLS
#define TOTAL_NUMBER_OF_CELLS_PER_MAP
CoordPair< MAX_NUMBER_OF_GRIDS > GridCoord
#define MAX_NUMBER_OF_GRIDS
#define CENTER_GRID_CELL_ID
#define SIZE_OF_GRID_CELL
#define CENTER_GRID_OFFSET
NGrid< MAX_NUMBER_OF_CELLS, Player, AllWorldObjectTypes, AllGridObjectTypes > NGridType
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
@ MAP_OBJECT_CELL_MOVE_INACTIVE
@ MAP_OBJECT_CELL_MOVE_ACTIVE
@ MAP_OBJECT_CELL_MOVE_NONE
static void PushRespawnInfoFrom(std::vector< RespawnInfo const * > &data, RespawnInfoMap const &map)
GridState * si_GridStates[MAX_GRID_STATE]
std::unordered_map< ObjectGuid::LowType, RespawnInfo * > RespawnInfoMap
@ TRANSFER_ABORT_TOO_MANY_INSTANCES
@ TRANSFER_ABORT_DIFFICULTY
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
@ TRANSFER_ABORT_MAX_PLAYERS
@ TRANSFER_ABORT_ZONE_IN_COMBAT
@ TRANSFER_ABORT_LOCKED_TO_DIFFERENT_INSTANCE
@ TRANSFER_ABORT_NEED_GROUP
#define TC_METRIC_VALUE(category, value,...)
#define TC_METRIC_TAG(name, value)
#define DEFAULT_VISIBILITY_NOTIFY_PERIOD
#define MAX_VISIBILITY_DISTANCE
#define DEFAULT_VISIBILITY_DISTANCE
std::unordered_map< Player *, UpdateData > UpdateDataMapType
std::optional< T > Optional
Optional helper class to wrap optional values within.
uint32 urand(uint32 min, uint32 max)
@ LINEOFSIGHT_CHECK_GOBJECT
@ WS_TEAM_IN_INSTANCE_ALLIANCE
@ WS_TEAM_IN_INSTANCE_HORDE
@ SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE
@ SPAWNGROUP_FLAG_MANUAL_SPAWN
@ SPAWNGROUP_FLAG_DESPAWN_ON_CONDITION_FAILURE
@ SPAWNGROUP_FLAG_ESCORTQUESTNPC
@ SPAWN_TYPEMASK_CREATURE
@ SPAWN_TYPEMASK_GAMEOBJECT
@ SPELL_AURA_FORCE_WEATHER
bool LoadFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap, bool allowDuplicate)
TransferAbortParams CannotEnter(Player *player) override
BattlegroundMap(uint32 id, time_t, uint32 InstanceId, Difficulty spawnMode)
void RemoveAllPlayers() override
bool AddPlayerToMap(Player *player, bool initPlayer=true) override
void RemovePlayerFromMap(Player *, bool) override
virtual void InitVisibilityDistance() override
void SetBgMap(BattlegroundMap *map)
std::unordered_map< ObjectGuid, CombatReference * > const & GetPvECombatRefs() const
void ReplaceAllFlags(uint32 flags)
void SetClass(uint8 playerClass)
void SetGuildGUID(ObjectGuid guildGuid)
void SetDisplayId(uint32 displayId)
void SetCustomizations(Trinity::IteratorPair< Iter > customizations)
CorpseDynFlags GetCorpseDynamicFlags() const
void SetFactionTemplate(int32 factionTemplate)
void RemoveFromWorld() override
void SetOwnerGUID(ObjectGuid owner)
void SetPartyGUID(ObjectGuid partyGuid)
UF::UpdateField< UF::CorpseData, 0, TYPEID_CORPSE > m_corpseData
CellCoord const & GetCellCoord() const
void ReplaceAllCorpseDynamicFlags(CorpseDynFlags dynamicFlags)
ObjectGuid GetOwnerGUID() const override
bool LoadCorpseFromDB(ObjectGuid::LowType guid, Field *fields)
void SetCellCoord(CellCoord const &cellCoord)
bool Create(ObjectGuid::LowType guidlow, Map *map)
CorpseType GetType() const
void DeleteFromDB(CharacterDatabaseTransaction trans)
void GetRespawnPosition(float &x, float &y, float &z, float *ori=nullptr, float *dist=nullptr) const
bool LoadFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap, bool allowDuplicate)
bool isInLineOfSight(G3D::Vector3 const &startPos, G3D::Vector3 const &endPos, PhaseShift const &phaseShift) const
bool getObjectHitPos(G3D::Vector3 const &startPos, G3D::Vector3 const &endPos, G3D::Vector3 &resultHitPos, float modifyDist, PhaseShift const &phaseShift) const
Class used to access individual fields of database query result.
void GetRespawnPosition(float &x, float &y, float &z, float *ori=nullptr) const
bool LoadFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap, bool=true)
void RemoveFromWorld() override
ObjectGuid::LowType GetSpawnId() const
Transport * ToTransport()
void AddToWorld() override
PeriodicTimer & getRelocationTimer()
virtual void Update(Map &, NGridType &, GridInfo &, uint32 t_diff) const =0
void AddWorldObject(SPECIFIC_OBJECT *obj)
void AddGridObject(SPECIFIC_OBJECT *obj)
virtual InstanceLockData const * GetInstanceInitializationData() const
void SetInUse(bool inUse)
InstanceResetTimePoint GetExpiryTime() const
InstanceLockData * GetData()
Optional< SystemTimePoint > i_instanceExpireEvent
InstanceLock * i_instanceLock
TransferAbortParams CannotEnter(Player *player) override
void Update(uint32) override
InstanceResetResult Reset(InstanceResetMethod method)
TeamId GetTeamIdInInstance() const
InstanceScenario * i_scenario
void TrySetOwningGroup(Group *group)
void CreateInstanceLockForPlayer(Player *player)
InstanceMap(uint32 id, time_t, uint32 InstanceId, Difficulty SpawnMode, TeamId InstanceTeam, InstanceLock *instanceLock)
uint32 GetMaxPlayers() const
virtual void InitVisibilityDistance() override
uint32 GetScriptId() const
void RemovePlayerFromMap(Player *, bool) override
GroupInstanceReference i_owningGroupRef
bool AddPlayerToMap(Player *player, bool initPlayer=true) override
std::string const & GetScriptName() const
std::string GetDebugInfo() const override
void CreateInstanceData()
InstanceScript * GetInstanceScript()
void UpdateInstanceLock(UpdateBossStateSaveDataEvent const &updateSaveDataEvent)
std::string GetSaveData()
Optional< uint32 > GetEntranceLocationForCompletedEncounters(uint32 completedEncountersMask) const
void Load(char const *data)
virtual void OnPlayerLeave(Player *)
void UpdateCombatResurrection(uint32 diff)
void SetEntranceLocation(uint32 worldSafeLocationId)
std::string UpdateAdditionalSaveData(std::string const &oldData, UpdateAdditionalSaveDataEvent const &event)
virtual void OnPlayerEnter(Player *)
virtual void Update(uint32)
std::string UpdateBossStateSaveData(std::string const &oldData, UpdateBossStateSaveDataEvent const &event)
void SetCurrentCell(Cell const &cell)
MapObjectCellMoveState _moveState
void SetNewCellPosition(float x, float y, float z, float o)
Cell const & GetCurrentCell() const
MapReference const * nocheck_prev() const
MapEntry const * i_mapEntry
void DynamicObjectRelocation(DynamicObject *go, float x, float y, float z, float orientation)
std::map< WorldObject *, bool > i_objectsToSwitch
WorldObject * GetWorldObjectBySpawnId(SpawnObjectType type, ObjectGuid::LowType spawnId) const
std::unordered_map< uint32, uint32 > _zonePlayerCountMap
std::vector< Creature * > _creaturesToMove
void AddFarSpellCallback(FarSpellCallback &&callback)
void GameObjectRelocation(GameObject *go, float x, float y, float z, float orientation, bool respawnRelocationOnFail=true)
void AddGameObjectToMoveList(GameObject *go, float x, float y, float z, float ang)
void RemoveDynamicObjectFromMoveList(DynamicObject *go)
void CreatureRelocation(Creature *creature, float x, float y, float z, float ang, bool respawnRelocationOnFail=true)
ZLiquidStatus GetLiquidStatus(PhaseShift const &phaseShift, float x, float y, float z, Optional< map_liquidHeaderTypeFlags > ReqLiquidType={}, LiquidData *data=nullptr, float collisionHeight=2.03128f)
void SetZoneMusic(uint32 zoneId, uint32 musicId)
bool IsBattlegroundOrArena() const
void RemoveInfiniteAOIVignette(Vignettes::VignetteData *vignette)
bool UnloadGrid(NGridType &ngrid, bool pForce)
void SetSpawnGroupInactive(uint32 groupId)
std::unordered_map< ObjectGuid, Corpse * > _corpsesByPlayer
void UpdateSpawnGroupConditions()
void SetZoneWeather(uint32 zoneId, WeatherState weatherId, float intensity)
Pet * GetPet(ObjectGuid const &guid)
MapStoredObjectTypesContainer & GetObjectsStore()
TransportsContainer::iterator _transportsUpdateIter
void InitializeObject(T *obj)
bool SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn=false, bool force=false, std::vector< WorldObject * > *spawnedObjects=nullptr)
void SwitchGridContainers(T *obj, bool on)
void AddObjectToRemoveList(WorldObject *obj)
void SendZoneWeather(uint32 zoneId, Player *player) const
virtual void RemovePlayerFromMap(Player *, bool)
virtual bool AddPlayerToMap(Player *player, bool initPlayer=true)
void MoveAllGameObjectsInMoveList()
Creature * GetCreatureBySpawnId(ObjectGuid::LowType spawnId) const
void RemoveAreaTriggerFromMoveList(AreaTrigger *at)
void RemoveFromActiveHelper(WorldObject *obj)
void DeleteRespawnInfoFromDB(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans=nullptr)
size_t DespawnAll(SpawnObjectType type, ObjectGuid::LowType spawnId)
void AddAreaTriggerToMoveList(AreaTrigger *at, float x, float y, float z, float ang)
std::function< void(Map *)> FarSpellCallback
void SetSpawnGroupActive(uint32 groupId, bool state)
void LoadGrid(float x, float y)
bool IsUnderWater(PhaseShift const &phaseShift, float x, float y, float z)
void SendZoneDynamicInfo(uint32 zoneId, Player *player) const
void RemoveFromActive(WorldObject *obj)
MapDifficultyEntry const * GetMapDifficulty() const
PeriodicTimer _vignetteUpdateTimer
void AddInfiniteAOIVignette(Vignettes::VignetteData *vignette)
RespawnInfoMap * GetRespawnMapForType(SpawnObjectType type)
void EnsureGridCreated(GridCoord const &)
virtual TransferAbortParams CannotEnter(Player *)
void RemoveUpdateObject(Object *obj)
RespawnInfoMap _gameObjectRespawnTimesBySpawnId
NGridType * i_grids[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS]
void UpdatePersonalPhasesForPlayer(Player const *player)
Weather * GetOrGenerateZoneDefaultWeather(uint32 zoneId)
virtual void DelayedUpdate(uint32 diff)
Player * GetPlayer(ObjectGuid const &guid)
AreaTriggerBySpawnIdContainer & GetAreaTriggerBySpawnIdStore()
bool isInLineOfSight(PhaseShift const &phaseShift, float x1, float y1, float z1, float x2, float y2, float z2, LineOfSightChecks checks, VMAP::ModelIgnoreFlags ignoreFlags) const
bool IsNonRaidDungeon() const
time_t GetLinkedRespawnTime(ObjectGuid guid) const
void AddCorpse(Corpse *corpse)
bool IsBattleground() const
void UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone)
WorldStateValueContainer _worldStateValues
IntervalTimer _weatherUpdateTimer
bool CheckRespawn(RespawnInfo *info)
void ProcessRelocationNotifies(const uint32 diff)
void UnloadAllRespawnInfos()
void RemoveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans=nullptr, bool alwaysDeleteFromDB=false)
bool GetEntrancePos(int32 &mapid, float &x, float &y)
bool _dynamicObjectsToMoveLock
NGridType * getNGrid(uint32 x, uint32 y) const
std::shared_ptr< TerrainInfo > m_terrain
void AddToActiveHelper(WorldObject *obj)
bool _gameObjectsToMoveLock
bool IsMythicPlus() const
uint32 _respawnCheckTimer
Corpse * ConvertCorpseToBones(ObjectGuid const &ownerGuid, bool insignia=false)
bool IsRemovalGrid(float x, float y) const
std::unordered_map< uint32, std::unordered_set< Corpse * > > _corpsesByCell
MapRefManager m_mapRefManager
bool ActiveObjectsNearGrid(NGridType const &ngrid) const
void RemoveCreatureFromMoveList(Creature *c)
void GetZoneAndAreaId(PhaseShift const &phaseShift, uint32 &zoneid, uint32 &areaid, float x, float y, float z)
bool getObjectHitPos(PhaseShift const &phaseShift, float x1, float y1, float z1, float x2, float y2, float z2, float &rx, float &ry, float &rz, float modifyDist)
void ScriptsProcess()
Process queued scripts.
void Visit(Cell const &cell, TypeContainerVisitor< T, CONTAINER > &visitor)
ScriptScheduleMap m_scriptSchedule
void AddWorldObject(WorldObject *obj)
void GetFullTerrainStatusForPosition(PhaseShift const &phaseShift, float x, float y, float z, PositionFullTerrainStatus &data, Optional< map_liquidHeaderTypeFlags > reqLiquidType={}, float collisionHeight=2.03128f)
void ResetGridExpiry(NGridType &grid, float factor=1) const
DynamicMapTree _dynamicTree
std::vector< GameObject * > _gameObjectsToMove
void DeleteRespawnInfo(RespawnInfo *info, CharacterDatabaseTransaction dbTrans=nullptr)
bool IsTimewalking() const
void ApplyDynamicModeRespawnScaling(WorldObject const *obj, ObjectGuid::LowType spawnId, uint32 &respawnDelay, uint32 mode) const
bool GameObjectRespawnRelocation(GameObject *go, bool diffGridOnly)
float GetWaterOrGroundLevel(PhaseShift const &phaseShift, float x, float y, float z, float *ground=nullptr, bool swim=false, float collisionHeight=2.03128f)
SceneObject * GetSceneObject(ObjectGuid const &guid)
void DeleteRespawnTimesInDB()
int32 m_VisibilityNotifyPeriod
float GetMinHeight(PhaseShift const &phaseShift, float x, float y)
std::unordered_set< Corpse * > _corpseBones
void SetWorldStateValue(int32 worldStateId, int32 value, bool hidden)
void AreaTriggerRelocation(AreaTrigger *at, float x, float y, float z, float orientation)
MPSCQueue< FarSpellCallback > _farSpellCallbacks
int32 GetWorldStateValue(int32 worldStateId) const
AreaTrigger * GetAreaTriggerBySpawnId(ObjectGuid::LowType spawnId) const
time_t GetGORespawnTime(ObjectGuid::LowType spawnId) const
void EnsureGridLoadedForActiveObject(Cell const &, WorldObject const *object)
static bool CheckGridIntegrity(T *object, bool moved, char const *objType)
void SendInitSelf(Player *player)
void DoRespawn(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 gridId)
virtual void RemoveAllPlayers()
std::unordered_set< uint32 > _toggledSpawnGroupIds
bool isCellMarked(uint32 pCellId)
SpawnGroupTemplateData const * GetSpawnGroupData(uint32 groupId) const
bool GameObjectCellRelocation(GameObject *go, Cell new_cell)
void SendToPlayers(WorldPacket const *data) const
bool AreaTriggerCellRelocation(AreaTrigger *at, Cell new_cell)
time_t GetCreatureRespawnTime(ObjectGuid::LowType spawnId) const
MultiPersonalPhaseTracker & GetMultiPersonalPhaseTracker()
static TransferAbortParams PlayerCannotEnter(uint32 mapid, Player *player)
bool IsHeroicOrHigher() const
GameObject * GetGameObject(ObjectGuid const &guid)
void SetZoneOverrideLight(uint32 zoneId, uint32 areaLightId, uint32 overrideLightId, Milliseconds transitionTime)
virtual std::string GetDebugInfo() const
static void DeleteStateMachine()
void SaveRespawnInfoDB(RespawnInfo const &info, CharacterDatabaseTransaction dbTrans=nullptr)
bool IsSpawnGroupActive(uint32 groupId) const
MapRefManager::iterator m_mapRefIter
bool CreatureCellRelocation(Creature *creature, Cell new_cell)
std::unique_ptr< RespawnListContainer > _respawnTimes
Corpse * GetCorpse(ObjectGuid const &guid)
time_t GetRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId) const
virtual void Update(uint32)
uint32 GetZoneId(PhaseShift const &phaseShift, float x, float y, float z)
ZoneDynamicInfoMap _zoneDynamicInfo
bool _areaTriggersToMoveLock
DynamicObject * GetDynamicObject(ObjectGuid const &guid)
std::vector< Vignettes::VignetteData * > _infiniteAOIVignettes
std::vector< AreaTrigger * > _areaTriggersToMove
void RemoveGameObjectFromMoveList(GameObject *go)
void LoadGridForActiveObject(float x, float y, WorldObject const *object)
Conversation * GetConversation(ObjectGuid const &guid)
void RemoveWorldObject(WorldObject *obj)
std::set< WorldObject * > i_worldObjects
Difficulty GetDifficultyID() const
ActiveNonPlayers m_activeNonPlayers
void SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 entry, time_t respawnTime, uint32 gridId, CharacterDatabaseTransaction dbTrans=nullptr, bool startup=false)
void SendUpdateTransportVisibility(Player *player)
bool MapObjectCellRelocation(T *object, Cell new_cell, char const *objType)
void UpdateIteratorBack(Player *player)
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
bool Instanceable() const
ObjectGuidGenerator & GetGuidSequenceGenerator(HighGuid high)
void AddDynamicObjectToMoveList(DynamicObject *go, float x, float y, float z, float ang)
std::unordered_set< Object * > _updateObjects
void buildNGridLinkage(NGridType *pNGridType)
MapEntry const * GetEntry() const
std::set< WorldObject * > i_objectsToRemove
bool SpawnGroupDespawn(uint32 groupId, bool deleteRespawnTimes=false, size_t *count=nullptr)
MapStoredObjectTypesContainer _objectsStore
void AddToGrid(T *object, Cell const &cell)
void MoveAllDynamicObjectsInMoveList()
uint32 GetPlayersCountExceptGMs() const
void DeleteFromWorld(T *)
void UpdateAreaDependentAuras()
void SendInitTransports(Player *player)
float GetVisibilityRange() const
char const * GetMapName() const
float GetWaterLevel(PhaseShift const &phaseShift, float x, float y)
Corpse * GetCorpseByPlayer(ObjectGuid const &ownerGuid) const
void RemoveAllObjectsInRemoveList()
void MoveAllCreaturesInMoveList()
bool IsGridLoaded(uint32 gridId) const
uint32 GetAreaId(PhaseShift const &phaseShift, float x, float y, float z)
void InitSpawnGroupState()
void markCell(uint32 pCellId)
virtual void LoadGridObjects(NGridType *grid, Cell const &cell)
void VisitNearbyCellsOf(WorldObject *obj, TypeContainerVisitor< Trinity::ObjectUpdater, GridTypeMapContainer > &gridVisitor, TypeContainerVisitor< Trinity::ObjectUpdater, WorldTypeMapContainer > &worldVisitor)
WeatherState GetZoneWeather(uint32 zoneId) const
void AddCreatureToMoveList(Creature *c, float x, float y, float z, float ang)
void GridUnmarkNoUnload(uint32 x, uint32 y)
void MoveAllAreaTriggersInMoveList()
CreatureBySpawnIdContainer & GetCreatureBySpawnIdStore()
float GetGridHeight(PhaseShift const &phaseShift, float x, float y)
virtual void InitVisibilityDistance()
Map(uint32 id, time_t, uint32 InstanceId, Difficulty SpawnMode)
float GetStaticHeight(PhaseShift const &phaseShift, float x, float y, float z, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH)
RespawnInfo * GetRespawnInfo(SpawnObjectType type, ObjectGuid::LowType spawnId) const
void setGridObjectDataLoaded(bool pLoaded, uint32 x, uint32 y)
bool EnsureGridLoaded(Cell const &)
void RemoveFromMap(T *, bool)
std::vector< DynamicObject * > _dynamicObjectsToMove
uint32 GetInstanceId() const
TransportsContainer _transports
void SendRemoveTransports(Player *player)
PlayerList const & GetPlayers() const
void AddToActive(WorldObject *obj)
static void InitStateMachine()
SpawnedPoolData & GetPoolData()
AreaTrigger * GetAreaTrigger(ObjectGuid const &guid)
void PlayerRelocation(Player *, float x, float y, float z, float orientation)
RespawnInfoMap _creatureRespawnTimesBySpawnId
bool CreatureRespawnRelocation(Creature *c, bool diffGridOnly)
CreatureBySpawnIdContainer _creatureBySpawnIdStore
void AddObjectToSwitchList(WorldObject *obj, bool on)
bool AddRespawnInfo(RespawnInfo const &info)
ActiveNonPlayers::iterator m_activeNonPlayersIter
bool IsInWater(PhaseShift const &phaseShift, float x, float y, float z, LiquidData *data=nullptr)
void RemoveCorpse(Corpse *corpse)
Creature * GetCreature(ObjectGuid const &guid)
Transport * GetTransport(ObjectGuid const &guid)
std::map< HighGuid, std::unique_ptr< ObjectGuidGenerator > > _guidGenerators
GameObject * GetGameObjectBySpawnId(ObjectGuid::LowType spawnId) const
bool isGridObjectDataLoaded(uint32 x, uint32 y) const
void GridMarkNoUnload(uint32 x, uint32 y)
bool DynamicObjectCellRelocation(DynamicObject *go, Cell new_cell)
bool IsAlwaysActive() const
GameObjectBySpawnIdContainer _gameobjectBySpawnIdStore
void Respawn(RespawnInfo *info, CharacterDatabaseTransaction dbTrans=nullptr)
void setNGrid(NGridType *grid, uint32 x, uint32 y)
std::unique_ptr< SpawnedPoolData > _poolData
bool IsBattleArena() const
bool ShouldBeSpawnedOnGridLoad(SpawnObjectType type, ObjectGuid::LowType spawnId) const
bool isGridObjectDataLoaded() const
grid_state_t GetGridState(void) const
void decUnloadActiveLock()
uint32 GetWorldObjectCountInNGrid() const
void SetGridState(grid_state_t s)
void setUnloadExplicitLock(bool on)
GridType & GetGridType(const uint32 x, const uint32 y)
void incUnloadActiveLock()
GridInfo * getGridInfoRef()
void VisitAllGrids(TypeContainerVisitor< T, TypeMapContainer< TT > > &visitor)
void Set(ObjectGuid::LowType val)
LowType GetCounter() const
bool IsMOTransport() const
std::string ToString() const
static Creature * ToCreature(Object *o)
bool IsDestroyedObject() const
static GameObject * ToGameObject(Object *o)
void BuildDestroyUpdateBlock(UpdateData *data) const
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const
virtual void BuildUpdate(UpdateDataMapType &)
static ObjectGuid GetGUID(Object const *o)
void BuildOutOfRangeUpdateBlock(UpdateData *data) const
void SetDestroyedObject(bool destroyed)
static DynamicObject * ToDynObject(Object *o)
static uint32 GetTerrainMapId(PhaseShift const &phaseShift, uint32 mapId, TerrainInfo const *terrain, float x, float y)
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
static void SendToPlayer(Player const *player, PhaseShift const &phaseShift)
bool HaveAtClient(Object const *u) const
bool Satisfy(AccessRequirement const *ar, uint32 target_map, TransferAbortParams *params=nullptr, bool report=false)
bool IsBeingTeleportedFar() const
void SendDirectMessage(WorldPacket const *data) const
void Update(uint32 time) override
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
void UpdateZone(uint32 newZone, uint32 newArea)
void AddInstanceEnterTime(uint32 instanceId, time_t enterTime)
GuidUnorderedSet m_clientGUIDs
bool IsLoading() const override
bool CheckInstanceCount(uint32 instanceId) const
WorldSession * GetSession() const
void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const override
WorldObject * GetViewpoint() const
bool IsGameMaster() const
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
GuidUnorderedSet m_visibleTransports
MapReference & GetMapRef()
uint32 GetBattlegroundId() const
void AddToWorld() override
Group * GetGroup(Optional< uint8 > partyIndex)
void UpdateObjectVisibility(bool forced=true) override
void SetMap(Map *map) override
void RemoveFromWorld() override
Difficulty GetDifficultyID(MapEntry const *mapEntry) const
void setInt64(const uint8 index, const int64 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt16(const uint8 index, const uint16 value)
void setUInt64(const uint8 index, const uint64 value)
void link(TO *toObj, FROM *fromObj)
virtual void Update(uint32)
virtual void OnPlayerExit(Player *player)
virtual void OnPlayerEnter(Player *player)
uint32 GetExpectedMapId() const
Returns id of the map that transport is expected to be on, according to current path progress.
SPECIFIC_TYPE * Find(KEY_TYPE const &handle)
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
void UpdateObjectVisibility(bool forced=true) override
std::array< ObjectGuid, MAX_SUMMON_SLOT > m_SummonSlot
MotionMaster * GetMotionMaster()
void CleanupsBeforeDelete(bool finalCleanup=true) override
bool HasAuraType(AuraType auraType) const
void RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const *source=nullptr)
CombatManager & GetCombatManager()
AuraApplicationMap & GetAppliedAuras()
Vehicle * GetVehicleKit() const
bool BuildPacket(WorldPacket *packet)
static VMapManager2 * createOrGetVMapManager()
void RelocatePassengers()
Relocate passengers. Must be called after m_base::Relocate.
constexpr uint32 GetMapId() const
bool InSamePhase(PhaseShift const &phaseShift) const
void RemoveFromWorld() override
virtual void UpdateObjectVisibilityOnDestroy()
float GetGridActivationRange() const
PhaseShift & GetPhaseShift()
TransportBase * GetTransport() const
uint32 GetInstanceId() const
std::string const & GetName() const
virtual void SetMap(Map *map)
void UpdatePositionData()
bool IsStoredInWorldObjectGridContainer() const
bool IsAlwaysStoredInWorldObjectGridContainer() const
virtual void Update(uint32 diff)
virtual void UpdateObjectVisibility(bool forced=true)
virtual void CleanupsBeforeDelete(bool finalCleanup=true)
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
int32 TransitionMilliseconds
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * GetRawPacket() const
WorldPacket const * Write() override
std::vector< ObjectGuid > Removed
WorldPacket const * Write() override
Player session in the World.
bool Update(uint32 diff, PacketFilter &updater)
Update the WorldSession (triggered by World update)
void SendCalendarRaidLockoutAdded(InstanceLock const *lock)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
static float GetMaxVisibleDistanceInInstances()
static int32 GetVisibilityNotifyPeriodOnContinents()
static float GetMaxVisibleDistanceInBG()
static int32 GetVisibilityNotifyPeriodInArenas()
static int32 GetVisibilityNotifyPeriodInBG()
static int32 GetVisibilityNotifyPeriodInInstances()
static float GetMaxVisibleDistanceOnContinents()
static float GetMaxVisibleDistanceInArenas()
WeatherData const * GetWeatherData(uint32 zone_id)
static void SendFineWeatherUpdateToPlayer(Player *player)
@ CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE
@ CONFIG_INSTANCE_UNLOAD_DELAY
@ CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT
@ CONFIG_RESPAWN_MINCHECKINTERVALMS
@ CONFIG_CHECK_GOBJECT_LOS
@ CONFIG_DEATH_BONES_BG_OR_ARENA
@ CONFIG_INSTANCE_IGNORE_RAID
@ CONFIG_RESPAWN_DYNAMIC_ESCORTNPC
@ CONFIG_DEATH_BONES_WORLD
@ CONFIG_RESPAWN_DYNAMICRATE_CREATURE
@ CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
void RemoveObject(T *object)
TC_GAME_API Corpse * GetCorpse(WorldObject const &u, ObjectGuid const &guid)
auto MapEqualRange(M &map, typename M::key_type const &key)
constexpr IteratorPair< iterator, end_iterator > MakeIteratorPair(iterator first, end_iterator second)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
GridCoord ComputeGridCoord(float x, float y)
CellCoord ComputeCellCoord(float x, float y)
bool CanSee(Player const *player, VignetteData const &vignette)
bool DiffGrid(Cell const &cell) const
bool DiffCell(Cell const &cell) const
static CellArea CalculateCellArea(float x, float y, float radius)
struct Cell::@313::@314 Part
bool IsCoordValid() const
uint32 EntranceWorldSafeLocId
uint32 CompletedEncountersMask
void SetInterval(time_t interval)
time_t GetInterval() const
bool IsBattleground() const
bool GetEntrancePos(int32 &mapid, float &x, float &y) const
bool IsNonRaidDungeon() const
bool IsFlexLocking() const
bool IsBattlegroundOrArena() const
EnumFlag< MapFlags2 > GetFlags2() const
bool IsBattleArena() const
bool Instanceable() const
void Update(Map *map, uint32 diff)
void MarkAllPhasesForDeletion(ObjectGuid const &phaseOwner)
void LoadGrid(PhaseShift const &phaseShift, NGridType &grid, Map *map, Cell const &cell)
void UnregisterTrackedObject(WorldObject *object)
void UnloadGrid(NGridType &grid)
void OnOwnerPhaseChanged(WorldObject const *phaseOwner, NGridType *grid, Map *map, Cell const &cell)
bool Update(const uint32 diff)
void TReset(int32 diff, int32 period)
constexpr float GetPositionX() const
constexpr float GetPositionY() const
bool IsPositionValid() const
constexpr void Relocate(float x, float y)
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
void resetNotify(GridRefManager< T > &m)
void Visit(PlayerMapType &m)
void Visit(GridRefManager< T > &)
void Visit(CreatureMapType &m)
RespawnInfoWithHandle(RespawnInfo const &other)
RespawnListContainer::handle_type handle
ObjectGuid::LowType spawnId
uint32 ChrCustomizationChoiceID
uint32 ChrCustomizationOptionID
DungeonEncounterEntry const * DungeonEncounter
EnumFlag< VignetteFlags > GetFlags() const
VignetteEntry const * Data
void FillPacket(WorldPackets::Vignette::VignetteDataSet &dataSet) const
std::unordered_set< uint32 > AreaIds
uint32 TransitionMilliseconds
std::vector< LightOverride > LightOverrides
std::unique_ptr< Weather > DefaultWeather