diff options
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 126 |
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 |