aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r--src/server/game/Maps/Map.cpp126
1 files changed, 114 insertions, 12 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 7546b298ff6..3bc765b229d 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -1131,6 +1131,7 @@ void Map::PlayerRelocation(Player* player, float x, float y, float z, float orie
AddToGrid(player, new_cell);
}
+ player->UpdatePositionData();
player->UpdateObjectVisibility(false);
}
@@ -1165,6 +1166,7 @@ void Map::CreatureRelocation(Creature* creature, float x, float y, float z, floa
if (creature->IsVehicle())
creature->GetVehicleKit()->RelocatePassengers();
creature->UpdateObjectVisibility(false);
+ creature->UpdatePositionData();
RemoveCreatureFromMoveList(creature);
}
@@ -1195,6 +1197,7 @@ void Map::GameObjectRelocation(GameObject* go, float x, float y, float z, float
{
go->Relocate(x, y, z, orientation);
go->UpdateModelPosition();
+ go->UpdatePositionData();
go->UpdateObjectVisibility(false);
RemoveGameObjectFromMoveList(go);
}
@@ -1227,6 +1230,7 @@ void Map::DynamicObjectRelocation(DynamicObject* dynObj, float x, float y, float
else
{
dynObj->Relocate(x, y, z, orientation);
+ dynObj->UpdatePositionData();
dynObj->UpdateObjectVisibility(false);
RemoveDynamicObjectFromMoveList(dynObj);
}
@@ -1372,6 +1376,7 @@ void Map::MoveAllCreaturesInMoveList()
if (c->IsVehicle())
c->GetVehicleKit()->RelocatePassengers();
//CreatureRelocationNotify(c, new_cell, new_cell.cellCoord());
+ c->UpdatePositionData();
c->UpdateObjectVisibility(false);
}
else
@@ -1426,6 +1431,7 @@ void Map::MoveAllGameObjectsInMoveList()
// update pos
go->Relocate(go->_newPosition);
go->UpdateModelPosition();
+ go->UpdatePositionData();
go->UpdateObjectVisibility(false);
}
else
@@ -1470,6 +1476,7 @@ void Map::MoveAllDynamicObjectsInMoveList()
{
// update pos
dynObj->Relocate(dynObj->_newPosition);
+ dynObj->UpdatePositionData();
dynObj->UpdateObjectVisibility(false);
}
else
@@ -1790,6 +1797,7 @@ bool Map::CreatureRespawnRelocation(Creature* c, bool diffGridOnly)
c->Relocate(resp_x, resp_y, resp_z, resp_o);
c->GetMotionMaster()->Initialize(); // prevent possible problems with default move generators
//CreatureRelocationNotify(c, resp_cell, resp_cell.GetCellCoord());
+ c->UpdatePositionData();
c->UpdateObjectVisibility(false);
return true;
}
@@ -1815,6 +1823,7 @@ bool Map::GameObjectRespawnRelocation(GameObject* go, bool diffGridOnly)
if (GameObjectCellRelocation(go, resp_cell))
{
go->Relocate(resp_x, resp_y, resp_z, resp_o);
+ go->UpdatePositionData();
go->UpdateObjectVisibility(false);
return true;
}
@@ -2491,7 +2500,7 @@ uint8 GridMap::getTerrainType(float x, float y) const
}
// Get water state on map
-inline ZLiquidStatus GridMap::getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data)
+inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data)
{
// Check water type (if no water return)
if (!_liquidGlobalFlags && !_liquidFlags)
@@ -2616,7 +2625,7 @@ float Map::GetWaterOrGroundLevel(PhaseShift const& phaseShift, float x, float y,
LiquidData liquid_status;
- ZLiquidStatus res = getLiquidStatus(phaseShift, x, y, ground_z, MAP_ALL_LIQUIDS, &liquid_status);
+ ZLiquidStatus res = GetLiquidStatus(phaseShift, x, y, ground_z, MAP_ALL_LIQUIDS, &liquid_status);
return res ? liquid_status.level : ground_z;
}
@@ -2805,11 +2814,6 @@ uint32 Map::GetAreaId(PhaseShift const& phaseShift, float x, float y, float z, b
return areaId;
}
-uint32 Map::GetAreaId(PhaseShift const& phaseShift, float x, float y, float z)
-{
- return GetAreaId(phaseShift, x, y, z, nullptr);
-}
-
uint32 Map::GetZoneId(PhaseShift const& phaseShift, float x, float y, float z)
{
uint32 areaId = GetAreaId(phaseShift, x, y, z);
@@ -2836,7 +2840,7 @@ uint8 Map::GetTerrainType(PhaseShift const& phaseShift, float x, float y)
return 0;
}
-ZLiquidStatus Map::getLiquidStatus(PhaseShift const& phaseShift, float x, float y, float z, uint8 ReqLiquidType, LiquidData* data)
+ZLiquidStatus Map::GetLiquidStatus(PhaseShift const& phaseShift, float x, float y, float z, uint8 ReqLiquidType, LiquidData* data)
{
ZLiquidStatus result = LIQUID_MAP_NO_WATER;
VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
@@ -2846,7 +2850,7 @@ ZLiquidStatus Map::getLiquidStatus(PhaseShift const& phaseShift, float x, float
uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, this, x, y);
if (vmgr->GetLiquidLevel(terrainMapId, x, y, z, ReqLiquidType, liquid_level, ground_level, liquid_type))
{
- TC_LOG_DEBUG("maps", "getLiquidStatus(): vmap liquid level: %f ground: %f type: %u", liquid_level, ground_level, liquid_type);
+ TC_LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: %f ground: %f type: %u", liquid_level, ground_level, liquid_type);
// Check water level and ground level
if (liquid_level > ground_level && z > ground_level - 2)
{
@@ -2904,7 +2908,7 @@ ZLiquidStatus Map::getLiquidStatus(PhaseShift const& phaseShift, float x, float
if (GridMap* gmap = GetGrid(terrainMapId, x, y))
{
LiquidData map_data;
- ZLiquidStatus map_result = gmap->getLiquidStatus(x, y, z, ReqLiquidType, &map_data);
+ ZLiquidStatus map_result = gmap->GetLiquidStatus(x, y, z, ReqLiquidType, &map_data);
// Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER:
if (map_result != LIQUID_MAP_NO_WATER && (map_data.level > ground_level))
{
@@ -2922,6 +2926,104 @@ ZLiquidStatus Map::getLiquidStatus(PhaseShift const& phaseShift, float x, float
return result;
}
+void Map::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x, float y, float z, PositionFullTerrainStatus& data, uint8 reqLiquidType)
+{
+ VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
+ VMAP::AreaAndLiquidData vmapData;
+ uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, this, x, y);
+ vmgr->getAreaAndLiquidData(terrainMapId, x, y, z, reqLiquidType, vmapData);
+ if (vmapData.areaInfo)
+ data.areaInfo = boost::in_place(vmapData.areaInfo->adtId, vmapData.areaInfo->rootId, vmapData.areaInfo->groupId, vmapData.areaInfo->mogpFlags);
+
+ GridMap* gmap = GetGrid(terrainMapId, x, y);
+ float mapHeight = gmap->getHeight(x, y);
+
+ // area lookup
+ AreaTableEntry const* areaEntry = nullptr;
+ if (vmapData.areaInfo && (z + 2.0f <= mapHeight || mapHeight <= vmapData.floorZ))
+ if (WMOAreaTableEntry const* wmoEntry = sDB2Manager.GetWMOAreaTable(vmapData.areaInfo->rootId, vmapData.areaInfo->adtId, vmapData.areaInfo->groupId))
+ areaEntry = sAreaTableStore.LookupEntry(wmoEntry->AreaTableID);
+
+ if (areaEntry)
+ {
+ data.floorZ = vmapData.floorZ;
+ data.areaId = areaEntry->ID;
+ }
+ else
+ {
+ data.floorZ = mapHeight;
+ if (gmap)
+ data.areaId = gmap->getArea(x, y);
+ else
+ data.areaId = 0;
+
+ if (!data.areaId)
+ data.areaId = i_mapEntry->AreaTableID;
+
+ if (data.areaId)
+ areaEntry = sAreaTableStore.LookupEntry(data.areaId);
+ }
+
+ // liquid processing
+ data.liquidStatus = LIQUID_MAP_NO_WATER;
+ if (vmapData.liquidInfo && vmapData.liquidInfo->level > vmapData.floorZ && z + 2.0f > vmapData.floorZ)
+ {
+ uint32 liquidType = vmapData.liquidInfo->type;
+ if (GetId() == 530 && liquidType == 2) // gotta love blizzard hacks
+ liquidType = 15;
+
+ uint32 liquidFlagType = 0;
+ if (LiquidTypeEntry const* liquidData = sLiquidTypeStore.LookupEntry(liquidType))
+ liquidFlagType = liquidData->SoundBank;
+
+ if (liquidType && liquidType < 21 && areaEntry)
+ {
+ uint32 overrideLiquid = areaEntry->LiquidTypeID[liquidFlagType];
+ if (!overrideLiquid && areaEntry->ParentAreaID)
+ {
+ AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(areaEntry->ParentAreaID);
+ if (zoneEntry)
+ overrideLiquid = zoneEntry->LiquidTypeID[liquidFlagType];
+ }
+
+ if (LiquidTypeEntry const* overrideData = sLiquidTypeStore.LookupEntry(overrideLiquid))
+ {
+ liquidType = overrideLiquid;
+ liquidFlagType = overrideData->SoundBank;
+ }
+ }
+
+ data.liquidInfo = boost::in_place();
+ data.liquidInfo->level = vmapData.liquidInfo->level;
+ data.liquidInfo->depth_level = vmapData.floorZ;
+ data.liquidInfo->entry = liquidType;
+ data.liquidInfo->type_flags = 1 << liquidFlagType;
+
+ float delta = vmapData.liquidInfo->level - z;
+ if (delta > 2.0f)
+ data.liquidStatus = LIQUID_MAP_UNDER_WATER;
+ else if (delta > 0.0f)
+ data.liquidStatus = LIQUID_MAP_IN_WATER;
+ else if (delta > -0.1f)
+ data.liquidStatus = LIQUID_MAP_WATER_WALK;
+ else
+ data.liquidStatus = LIQUID_MAP_ABOVE_WATER;
+ }
+ // look up liquid data from grid map
+ if (gmap && (data.liquidStatus == LIQUID_MAP_ABOVE_WATER || data.liquidStatus == LIQUID_MAP_NO_WATER))
+ {
+ LiquidData gridMapLiquid;
+ ZLiquidStatus gridMapStatus = gmap->GetLiquidStatus(x, y, z, reqLiquidType, &gridMapLiquid);
+ if (gridMapStatus != LIQUID_MAP_NO_WATER && (gridMapLiquid.level > vmapData.floorZ))
+ {
+ if (GetId() == 530 && gridMapLiquid.entry == 2)
+ gridMapLiquid.entry = 15;
+ data.liquidInfo = gridMapLiquid;
+ data.liquidStatus = gridMapStatus;
+ }
+ }
+}
+
float Map::GetWaterLevel(PhaseShift const& phaseShift, float x, float y)
{
if (GridMap* gmap = GetGrid(PhasingHandler::GetTerrainMapId(phaseShift, this, x, y), x, y))
@@ -2959,12 +3061,12 @@ bool Map::IsInWater(PhaseShift const& phaseShift, float x, float y, float pZ, Li
{
LiquidData liquid_status;
LiquidData* liquid_ptr = data ? data : &liquid_status;
- return (getLiquidStatus(phaseShift, x, y, pZ, MAP_ALL_LIQUIDS, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0;
+ return (GetLiquidStatus(phaseShift, x, y, pZ, MAP_ALL_LIQUIDS, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0;
}
bool Map::IsUnderWater(PhaseShift const& phaseShift, float x, float y, float z)
{
- return (getLiquidStatus(phaseShift, x, y, z, MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN) & LIQUID_MAP_UNDER_WATER) != 0;
+ return (GetLiquidStatus(phaseShift, x, y, z, MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN) & LIQUID_MAP_UNDER_WATER) != 0;
}
bool Map::CheckGridIntegrity(Creature* c, bool moved) const