Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
- index 754005f..b4eda16 100755
- --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
- +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
- @@ -46,25 +46,81 @@ BattlegroundDS::~BattlegroundDS()
- void BattlegroundDS::PostUpdateImpl(uint32 diff)
- {
- - if (getWaterFallTimer() < diff)
- + if (m_knockback)
- {
- - if (isWaterFallActive())
- + if (m_knockback <= diff)
- {
- - setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX));
- - for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i)
- - SpawnBGObject(i, getWaterFallTimer());
- - setWaterFallActive(false);
- + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
- + {
- + Player *player = ObjectAccessor::FindPlayer(itr->first);
- + if (!player)
- + continue;
- +
- + if (player->GetDistance2d(1214.0f, 765.0f) <= 50.0f && player->GetPositionZ() > 13.0f)
- + player->KnockBackWithAngle(0.0f, 55.0f, 9.0f);
- + else if (player->GetDistance2d(1369.0f, 817.0f) <= 50.0f && player->GetPositionZ() > 13.0f)
- + player->KnockBackWithAngle(M_PI, 55.0f, 9.0f);
- + }
- + m_knockback = 0;
- }
- else
- + m_knockback -= diff;
- + }
- +
- + if (!m_knockback && m_teleport)
- + {
- + if (m_teleport <= diff)
- + {
- + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
- + {
- + Player* player = ObjectAccessor::FindPlayer(itr->first);
- + if (!player)
- + continue;
- +
- + if (player->GetPositionZ() > 13.0f)
- + HandlePlayerUnderMap(player);
- + }
- + m_teleport = 5 * IN_MILLISECONDS;
- + }
- + else
- + m_teleport -= diff;
- + }
- +
- + if (m_waterFall <= diff)
- + {
- + if (m_waterFallStatus == 0) // Add the water
- + {
- + DoorClose(BG_DS_OBJECT_WATER_2);
- + m_waterFall = 7 * IN_MILLISECONDS;
- + m_waterFallStatus = 1;
- + }
- + else if (m_waterFallStatus == 1) // Knockback, spawn the LOS object
- + {
- + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
- + {
- + Player *player = ObjectAccessor::FindPlayer(itr->first);
- + if (!player)
- + continue;
- +
- + if (player->GetDistance2d(1291.56f, 790.837f) <= BG_DS_WATERFALL_RADIUS)
- + player->KnockbackFrom(1291.56f, 790.837f, 20.0f, 7.0f);
- + }
- + SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_IMMEDIATELY);
- + GetBgMap()->SetDynLOSObjectState(m_dynamicLOSid, true);
- + m_waterFall = BG_DS_WATERFALL_DURATION;
- + m_waterFallStatus = 2;
- + }
- + else // remove LOS and water
- {
- - setWaterFallTimer(BG_DS_WATERFALL_DURATION);
- - for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i)
- - SpawnBGObject(i, RESPAWN_IMMEDIATELY);
- - setWaterFallActive(true);
- + DoorOpen(BG_DS_OBJECT_WATER_2);
- + SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_ONE_DAY);
- + GetBgMap()->SetDynLOSObjectState(m_dynamicLOSid, false);
- + m_waterFall = urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX);
- + m_waterFallStatus = 0;
- }
- }
- else
- - setWaterFallTimer(getWaterFallTimer() - diff);
- + m_waterFall -= diff;
- }
- void BattlegroundDS::StartingEventCloseDoors()
- @@ -81,11 +137,15 @@ void BattlegroundDS::StartingEventOpenDoors()
- for (uint32 i = BG_DS_OBJECT_BUFF_1; i <= BG_DS_OBJECT_BUFF_2; ++i)
- SpawnBGObject(i, 60);
- - setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX));
- - setWaterFallActive(false);
- + SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_ONE_DAY);
- + SpawnBGObject(BG_DS_OBJECT_WATER_2, RESPAWN_IMMEDIATELY);
- + DoorOpen(BG_DS_OBJECT_WATER_2);
- - for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i)
- - SpawnBGObject(i, getWaterFallTimer());
- + m_knockback = 15 * IN_MILLISECONDS;
- + m_teleport = 5 * IN_MILLISECONDS;
- + m_waterFallStatus = 0;
- + m_waterFall = urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX);
- + m_dynamicLOSid = GetBgMap()->AddDynLOSObject(1291.56f, 790.837f, BG_DS_WATERFALL_RADIUS);
- }
- void BattlegroundDS::AddPlayer(Player* player)
- diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
- index 625eb1c..e75e247 100755
- --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
- +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
- @@ -36,8 +36,8 @@ enum BattlegroundDSObjects
- {
- BG_DS_OBJECT_TYPE_DOOR_1 = 192642,
- BG_DS_OBJECT_TYPE_DOOR_2 = 192643,
- - BG_DS_OBJECT_TYPE_WATER_1 = 194395,
- - BG_DS_OBJECT_TYPE_WATER_2 = 191877,
- + BG_DS_OBJECT_TYPE_WATER_1 = 194395, // LoS checker
- + BG_DS_OBJECT_TYPE_WATER_2 = 191877, // Visual
- BG_DS_OBJECT_TYPE_BUFF_1 = 184663,
- BG_DS_OBJECT_TYPE_BUFF_2 = 184664
- };
- @@ -47,6 +47,7 @@ enum BattlegroundDSData
- BG_DS_WATERFALL_TIMER_MIN = 30000,
- BG_DS_WATERFALL_TIMER_MAX = 60000,
- BG_DS_WATERFALL_DURATION = 10000,
- + BG_DS_WATERFALL_RADIUS = 4,
- };
- class BattlegroundDSScore : public BattlegroundScore
- @@ -76,14 +77,11 @@ class BattlegroundDS : public Battleground
- void HandleKillPlayer(Player* player, Player* killer);
- bool HandlePlayerUnderMap(Player* player);
- private:
- - uint32 m_waterTimer;
- - bool m_waterfallActive;
- -
- virtual void PostUpdateImpl(uint32 diff);
- - protected:
- - bool isWaterFallActive() { return m_waterfallActive; };
- - void setWaterFallActive(bool active) { m_waterfallActive = active; };
- - void setWaterFallTimer(uint32 timer) { m_waterTimer = timer; };
- - uint32 getWaterFallTimer() { return m_waterTimer; };
- + uint8 m_waterFallStatus;
- + uint32 m_waterFall;
- + uint32 m_teleport;
- + uint32 m_knockback;
- + uint32 m_dynamicLOSid;
- };
- #endif
- diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
- index 0c44c5d..3027a43 100755
- --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
- +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
- @@ -46,6 +46,9 @@ BattlegroundRV::~BattlegroundRV()
- void BattlegroundRV::PostUpdateImpl(uint32 diff)
- {
- + if(GetStatus() != STATUS_IN_PROGRESS)
- + return;
- +
- if (getTimer() < diff)
- {
- switch (getState())
- @@ -65,6 +68,7 @@ void BattlegroundRV::PostUpdateImpl(uint32 diff)
- DoorOpen(i);
- setTimer(BG_RV_PILAR_TO_FIRE_TIMER);
- setState(BG_RV_STATE_OPEN_FIRE);
- + SwitchDynLos();
- break;
- case BG_RV_STATE_OPEN_FIRE:
- // FIXME: after 3.2.0 it's only decorative and should be opened only one time at battle start
- @@ -78,6 +82,7 @@ void BattlegroundRV::PostUpdateImpl(uint32 diff)
- DoorOpen(i);
- setTimer(BG_RV_PILAR_TO_FIRE_TIMER);
- setState(BG_RV_STATE_CLOSE_FIRE);
- + SwitchDynLos();
- break;
- }
- }
- @@ -100,6 +105,16 @@ void BattlegroundRV::StartingEventOpenDoors()
- setState(BG_RV_STATE_OPEN_FENCES);
- setTimer(BG_RV_FIRST_TIMER);
- +
- + // Add all DynLoS to the map
- + m_DynLos[0] = GetBgMap()->AddDynLOSObject(763.632385f, -306.162384f, 25.909504f, BG_RV_PILLAR_SMALL_RADIUS, BG_RV_PILLAR_SMALL_HEIGHT);
- + m_DynLos[1] = GetBgMap()->AddDynLOSObject(763.611145f, -261.856750f, 25.909504f, BG_RV_PILLAR_SMALL_RADIUS, BG_RV_PILLAR_SMALL_HEIGHT);
- + m_DynLos[2] = GetBgMap()->AddDynLOSObject(723.644287f, -284.493256f, 24.648525f, BG_RV_PILLAR_BIG_RADIUS, BG_RV_PILLAR_BIG_RADIUS);
- + m_DynLos[3] = GetBgMap()->AddDynLOSObject(802.211609f, -284.493256f, 24.648525f, BG_RV_PILLAR_BIG_RADIUS, BG_RV_PILLAR_BIG_HEIGHT);
- +
- + // Activate the small ones
- + for (uint8 i = 0; i <= 1; i++)
- + GetBgMap()->SetDynLOSObjectState(m_DynLos[i], true);
- }
- void BattlegroundRV::AddPlayer(Player* player)
- @@ -146,6 +161,10 @@ void BattlegroundRV::HandleKillPlayer(Player* player, Player* killer)
- bool BattlegroundRV::HandlePlayerUnderMap(Player* player)
- {
- + // Wait for elevators to Go up, before start checking for UnderMaped players
- + if(GetStartTime() < uint32(m_StartDelayTimes[BG_STARTING_EVENT_FIRST] + 20*IN_MILLISECONDS))
- + return true;
- +
- player->TeleportTo(GetMapId(), 763.5f, -284, 28.276f, 2.422f, false);
- return true;
- }
- @@ -221,3 +240,27 @@ bool BattlegroundRV::SetupBattleground()
- }
- return true;
- }
- +
- +void BattlegroundRV::SwitchDynLos()
- +{
- + // switch all DynLos to the opposite state
- + for (uint8 i = 0; i <= 3; i++)
- + GetBgMap()->SetDynLOSObjectState(m_DynLos[i], !GetBgMap()->GetDynLOSObjectState(m_DynLos[i]));
- +
- + // Force every pillar to update their status to players
- + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
- + {
- + Player *player = ObjectAccessor::FindPlayer(itr->first);
- + if (!player)
- + continue;
- +
- + if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_1))
- + pilar->SendUpdateToPlayer(player);
- + if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_2))
- + pilar->SendUpdateToPlayer(player);
- + if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_3))
- + pilar->SendUpdateToPlayer(player);
- + if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_4))
- + pilar->SendUpdateToPlayer(player);
- + }
- +}
- \ No newline at end of file
- diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
- index 70417c1..9cd34de 100755
- --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
- +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
- @@ -91,6 +91,11 @@ enum BattlegroundRVData
- BG_RV_WORLD_STATE = 0xe1a,
- };
- +#define BG_RV_PILLAR_SMALL_RADIUS 2.0f
- +#define BG_RV_PILLAR_SMALL_HEIGHT 5.0f
- +#define BG_RV_PILLAR_BIG_RADIUS 4.0f
- +#define BG_RV_PILLAR_BIG_HEIGHT 8.25f
- +
- class BattlegroundRVScore : public BattlegroundScore
- {
- public:
- @@ -122,8 +127,10 @@ class BattlegroundRV : public Battleground
- uint32 State;
- virtual void PostUpdateImpl(uint32 diff);
- + virtual void SwitchDynLos();
- protected:
- + uint32 m_DynLos[4];
- uint32 getTimer() { return Timer; };
- void setTimer(uint32 timer) { Timer = timer; };
- diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
- index d467992..93f9652 100755
- --- a/src/server/game/Entities/Object/Object.cpp
- +++ b/src/server/game/Entities/Object/Object.cpp
- @@ -1360,7 +1360,7 @@ bool WorldObject::IsWithinLOSInMap(const WorldObject* obj) const
- float ox, oy, oz;
- obj->GetPosition(ox, oy, oz);
- - return(IsWithinLOS(ox, oy, oz));
- + return (IsWithinLOS(ox, oy, oz) && GetMap()->IsInDynLOS(GetPositionX(), GetPositionY(), GetPositionZ(), ox, oy, oz));
- }
- bool WorldObject::IsWithinLOS(float ox, float oy, float oz) const
- @@ -1368,7 +1368,7 @@ bool WorldObject::IsWithinLOS(float ox, float oy, float oz) const
- float x, y, z;
- GetPosition(x, y, z);
- VMAP::IVMapManager* vMapManager = VMAP::VMapFactory::createOrGetVMapManager();
- - return vMapManager->isInLineOfSight(GetMapId(), x, y, z+2.0f, ox, oy, oz+2.0f);
- + return (vMapManager->isInLineOfSight(GetMapId(), x, y, z+2.0f, ox, oy, oz+2.0f) && GetMap()->IsInDynLOS(GetPositionX(), GetPositionY(), GetPositionZ(), ox, oy, oz));
- }
- bool WorldObject::GetDistanceOrder(WorldObject const* obj1, WorldObject const* obj2, bool is3D /* = true */) const
- @@ -2665,9 +2665,18 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float
- // move back a bit
- destx -= CONTACT_DISTANCE * cos(angle);
- desty -= CONTACT_DISTANCE * sin(angle);
- - dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_positionY - desty)*(pos.m_positionY - desty));
- }
- + while (!GetMap()->IsInDynLOS(pos.m_positionX, pos.m_positionY, pos.m_positionZ, destx, desty, destz))
- + {
- + destx -= 2.0f * cos(angle);
- + desty -= 2.0f * sin(angle);
- + col = true;
- + }
- +
- + if (col)
- + dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_positionY - desty)*(pos.m_positionY - desty));
- +
- float step = dist/10.0f;
- for (uint8 j = 0; j < 10; ++j)
- diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
- index 510813a..95bbca1 100755
- --- a/src/server/game/Entities/Player/Player.cpp
- +++ b/src/server/game/Entities/Player/Player.cpp
- @@ -2299,6 +2299,22 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
- return true;
- }
- +void Player::KnockBackWithAngle(float angle, float horizontalSpeed, float verticalSpeed)
- +{
- + float vsin = sin(angle);
- + float vcos = cos(angle);
- +
- + // Effect propertly implemented only for players
- + WorldPacket data(SMSG_MOVE_KNOCK_BACK, 8+4+4+4+4+4);
- + data.append(GetPackGUID());
- + data << uint32(0); // Sequence
- + data << float(vcos); // x direction
- + data << float(vsin); // y direction
- + data << float(horizontalSpeed); // Horizontal speed
- + data << float(-verticalSpeed); // Z Movement speed (vertical)
- + GetSession()->SendPacket(&data);
- +}
- +
- bool Player::TeleportToBGEntryPoint()
- {
- if (m_bgData.joinPos.m_mapId == MAPID_INVALID)
- diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
- index 8ee7d1a..8f29e7f 100755
- --- a/src/server/game/Entities/Player/Player.h
- +++ b/src/server/game/Entities/Player/Player.h
- @@ -1091,6 +1091,7 @@ class Player : public Unit, public GridObject<Player>
- void RemoveFromWorld();
- bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0);
- + void KnockBackWithAngle(float angle, float horizontalSpeed, float verticalSpeed);
- bool TeleportTo(WorldLocation const &loc, uint32 options = 0)
- {
- return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options);
- diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
- index 34a7b60..2842255 100755
- --- a/src/server/game/Maps/Map.cpp
- +++ b/src/server/game/Maps/Map.cpp
- @@ -220,9 +220,14 @@ i_scriptLock(false)
- }
- }
- + for (std::map<uint32, DynamicLOSObject*>::iterator i = m_dynamicLOSObjects.begin(); i != m_dynamicLOSObjects.end(); ++i)
- + delete i->second;
- +
- //lets initialize visibility distance for map
- Map::InitVisibilityDistance();
- + m_dynamicLOSCounter = 0;
- +
- sScriptMgr->OnCreateMap(this);
- }
- @@ -2632,3 +2637,151 @@ void Map::UpdateIteratorBack(Player* player)
- if (m_mapRefIter == player->GetMapRef())
- m_mapRefIter = m_mapRefIter->nocheck_prev();
- }
- +
- +/*
- + * ****************** *
- + * DYNAMIC LOS SYSTEM *
- + * ****************** *
- + */
- +uint32 Map::AddDynLOSObject(float x, float y, float radius)
- +{
- + DynamicLOSObject* obj = new DynamicLOSObject();
- + obj->SetCoordinates(x, y);
- + obj->SetRadius(radius);
- +
- + // Add the dynamic object to the map
- + m_dynamicLOSObjects[++m_dynamicLOSCounter] = obj;
- +
- + return m_dynamicLOSCounter;
- +}
- +
- +uint32 Map::AddDynLOSObject(float x, float y, float z, float radius, float height)
- +{
- + DynamicLOSObject* obj = new DynamicLOSObject();
- + obj->SetCoordinates(x, y);
- + obj->SetZ(z);
- + obj->SetHeight(height);
- + obj->SetRadius(radius);
- +
- + // Add the dynamic object to the map
- + m_dynamicLOSObjects[++m_dynamicLOSCounter] = obj;
- +
- + return m_dynamicLOSCounter;
- +}
- +
- +void Map::SetDynLOSObjectState(uint32 id, bool state)
- +{
- + std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.find(id);
- + if (iter != m_dynamicLOSObjects.end())
- + iter->second->SetActiveState(state);
- +}
- +
- +bool Map::GetDynLOSObjectState(uint32 id)
- +{
- + std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.find(id);
- + if (iter != m_dynamicLOSObjects.end())
- + return (iter->second->IsActive());
- + return false;
- +}
- +
- +bool Map::IsInDynLOS(float x, float y, float z, float x2, float y2, float z2)
- +{
- + if (!m_dynamicLOSCounter)
- + return true;
- +
- + for (std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.begin(); iter != m_dynamicLOSObjects.end(); ++iter)
- + if (iter->second->IsActive() && iter->second->IsBetween(x, y, z, x2, y2, z2))
- + return false;
- +
- + return true;
- +}
- +
- +DynamicLOSObject::DynamicLOSObject()
- +{
- + _x = 0.0f;
- + _y = 0.0f;
- + _z = 0.0f;
- + _height = 0.0f;
- + _radius = 0.0f;
- + _active = false;
- +}
- +
- +bool DynamicLOSObject::IsBetween(float x, float y, float z, float x2, float y2, float z2)
- +{
- + if (IsInside(x, y) || IsInside(x2, y2))
- + {
- + if(HasHeightInfo() && IsOverOrUnder(z2))
- + return false;
- +
- + return true;
- + }
- +
- + // For a real handling of Z coord is necessary to do some research from this point
- + // i.e. A player over a huge round plattaform, placed near the edge; and other player placed down the plattaform at the oposing extreme just next to the edge;
- + // both may be able to attack each other, even when the plattaform height should prevent that.
- + if ((std::max(x, x2) < (_x - _radius))
- + || (std::min(x, x2) > (_x + _radius))
- + || (std::max(y, y2) < (_y - _radius))
- + || (std::min(y, y2) > (_y + _radius)))
- + return false;
- +
- +
- + float angleToMe = atan2(_x - x, _y - y);
- + angleToMe = (angleToMe >= 0) ? angleToMe : 2 * M_PI + angleToMe;
- +
- + float angleToDest = atan2(x2 - x, y2 - y);
- + angleToDest = (angleToDest >= 0) ? angleToDest : 2 * M_PI + angleToDest;
- +
- + return (fabs(sin(angleToMe - angleToDest)) * GetDistance(x, y) < _radius);
- +}
- +
- +bool DynamicLOSObject::IsInside(float x, float y)
- +{
- + return (((x-_x)*(x-_x)+(y-_y)*(y-_y))<(_radius*_radius));
- +}
- +
- +bool DynamicLOSObject::IsOverOrUnder(float z)
- +{
- + return ((z < _z+_height) && (z > _z));
- +}
- +
- +float DynamicLOSObject::GetDistance(float x, float y)
- +{
- + return sqrtf((x-_x)*(x-_x)+(y-_y)*(y-_y));
- +}
- +
- +bool DynamicLOSObject::IsActive()
- +{
- + return _active;
- +}
- +
- +void DynamicLOSObject::SetActiveState(bool state)
- +{
- + _active = state;
- +}
- +
- +void DynamicLOSObject::SetCoordinates(float x, float y)
- +{
- + _x = x;
- + _y = y;
- +}
- +
- +void DynamicLOSObject::SetRadius(float r)
- +{
- + _radius = r;
- +}
- +
- +void DynamicLOSObject::SetZ(float z)
- +{
- + _z = z;
- +}
- +
- +void DynamicLOSObject::SetHeight(float h)
- +{
- + _height = h;
- +}
- +
- +bool DynamicLOSObject::HasHeightInfo()
- +{
- + return (_z != 0 || _height != 0);
- +}
- diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
- index 542d911..a419609 100755
- --- a/src/server/game/Maps/Map.h
- +++ b/src/server/game/Maps/Map.h
- @@ -200,6 +200,30 @@ public:
- #pragma pack(push, 1)
- #endif
- +class DynamicLOSObject
- +{
- + public:
- + DynamicLOSObject();
- + bool IsBetween(float x, float y, float z, float x2, float y2, float z2);
- + bool IsInside(float x, float y);
- + bool IsOverOrUnder(float z);
- + float GetDistance(float x, float y);
- + bool IsActive();
- + void SetActiveState(bool state);
- + void SetCoordinates(float x, float y);
- + void SetZ(float z);
- + void SetRadius(float r);
- + void SetHeight(float h);
- + bool HasHeightInfo();
- + private:
- + float _x;
- + float _y;
- + float _z;
- + float _height;
- + float _radius;
- + bool _active;
- +};
- +
- struct InstanceTemplate
- {
- uint32 Parent;
- @@ -424,6 +448,21 @@ class Map : public GridRefManager<NGridType>
- InstanceMap* ToInstanceMap(){ if (IsDungeon()) return reinterpret_cast<InstanceMap*>(this); else return NULL; }
- const InstanceMap* ToInstanceMap() const { if (IsDungeon()) return (const InstanceMap*)((InstanceMap*)this); else return NULL; }
- + /*
- + **********************
- + * DYNAMIC LOS SYSTEM *
- + **********************
- + */
- + public:
- + uint32 AddDynLOSObject(float x, float y, float radius);
- + uint32 AddDynLOSObject(float x, float y, float z, float radius, float height);
- + void SetDynLOSObjectState(uint32 id, bool state);
- + bool GetDynLOSObjectState(uint32 id);
- + bool IsInDynLOS(float x, float y, float z, float x2, float y2, float z2);
- + private:
- + std::map<uint32, DynamicLOSObject*> m_dynamicLOSObjects;
- + uint32 m_dynamicLOSCounter;
- + /* END */
- private:
- void LoadMapAndVMap(int gx, int gy);
- void LoadVMap(int gx, int gy);
- diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
- index ae2612e..77366d4 100755
- --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
- +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
- @@ -361,7 +361,16 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
- {
- plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
- - if (movementInfo.pos.GetPositionZ() < -500.0f)
- + float underMapValueZ;
- +
- + switch (plMover->GetMapId())
- + {
- + case 617: underMapValueZ = 3.0f; break; // Dalaran Sewers
- + case 618: underMapValueZ = 28.0f; break; // Ring of Valor
- + default: underMapValueZ = -500.0f; break;
- + }
- +
- + if (movementInfo.pos.GetPositionZ() < underMapValueZ)
- {
- if (!(plMover->InBattleground()
- && plMover->GetBattleground()
Add Comment
Please, Sign In to add comment