Guest User

Untitled

a guest
Jun 17th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 22.74 KB | None | 0 0
  1. diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
  2. index 754005f..b4eda16 100755
  3. --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
  4. +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
  5. @@ -46,25 +46,81 @@ BattlegroundDS::~BattlegroundDS()
  6.  
  7.  void BattlegroundDS::PostUpdateImpl(uint32 diff)
  8.  {
  9. -    if (getWaterFallTimer() < diff)
  10. +    if (m_knockback)
  11.      {
  12. -        if (isWaterFallActive())
  13. +        if (m_knockback <= diff)
  14.          {
  15. -            setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX));
  16. -            for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i)
  17. -                SpawnBGObject(i, getWaterFallTimer());
  18. -            setWaterFallActive(false);
  19. +            for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
  20. +            {
  21. +                Player *player = ObjectAccessor::FindPlayer(itr->first);
  22. +                if (!player)
  23. +                    continue;
  24. +
  25. +                if (player->GetDistance2d(1214.0f, 765.0f) <= 50.0f && player->GetPositionZ() > 13.0f)
  26. +                    player->KnockBackWithAngle(0.0f, 55.0f, 9.0f);
  27. +                else if (player->GetDistance2d(1369.0f, 817.0f) <= 50.0f && player->GetPositionZ() > 13.0f)
  28. +                    player->KnockBackWithAngle(M_PI, 55.0f, 9.0f);
  29. +            }
  30. +            m_knockback = 0;
  31.          }
  32.          else
  33. +            m_knockback -= diff;
  34. +    }
  35. +
  36. +    if (!m_knockback && m_teleport)
  37. +    {
  38. +        if (m_teleport <= diff)
  39. +        {
  40. +            for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
  41. +            {
  42. +                Player* player = ObjectAccessor::FindPlayer(itr->first);
  43. +                if (!player)
  44. +                    continue;
  45. +
  46. +                if (player->GetPositionZ() > 13.0f)
  47. +                    HandlePlayerUnderMap(player);
  48. +            }
  49. +            m_teleport = 5 * IN_MILLISECONDS;
  50. +        }
  51. +        else
  52. +            m_teleport -= diff;
  53. +    }
  54. +
  55. +    if (m_waterFall <= diff)
  56. +    {
  57. +        if (m_waterFallStatus == 0) // Add the water
  58. +        {
  59. +            DoorClose(BG_DS_OBJECT_WATER_2);
  60. +            m_waterFall = 7 * IN_MILLISECONDS;
  61. +            m_waterFallStatus = 1;
  62. +        }
  63. +        else if (m_waterFallStatus == 1) // Knockback, spawn the LOS object
  64. +        {
  65. +            for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
  66. +            {
  67. +                Player *player = ObjectAccessor::FindPlayer(itr->first);
  68. +                if (!player)
  69. +                    continue;
  70. +
  71. +                if (player->GetDistance2d(1291.56f, 790.837f) <= BG_DS_WATERFALL_RADIUS)
  72. +                    player->KnockbackFrom(1291.56f, 790.837f, 20.0f, 7.0f);
  73. +            }
  74. +            SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_IMMEDIATELY);
  75. +            GetBgMap()->SetDynLOSObjectState(m_dynamicLOSid, true);
  76. +            m_waterFall = BG_DS_WATERFALL_DURATION;
  77. +            m_waterFallStatus = 2;
  78. +        }
  79. +        else // remove LOS and water
  80.          {
  81. -            setWaterFallTimer(BG_DS_WATERFALL_DURATION);
  82. -            for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i)
  83. -                SpawnBGObject(i, RESPAWN_IMMEDIATELY);
  84. -            setWaterFallActive(true);
  85. +            DoorOpen(BG_DS_OBJECT_WATER_2);
  86. +            SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_ONE_DAY);
  87. +            GetBgMap()->SetDynLOSObjectState(m_dynamicLOSid, false);
  88. +            m_waterFall = urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX);
  89. +            m_waterFallStatus = 0;
  90.          }
  91.      }
  92.      else
  93. -        setWaterFallTimer(getWaterFallTimer() - diff);
  94. +        m_waterFall -= diff;
  95.  }
  96.  
  97.  void BattlegroundDS::StartingEventCloseDoors()
  98. @@ -81,11 +137,15 @@ void BattlegroundDS::StartingEventOpenDoors()
  99.      for (uint32 i = BG_DS_OBJECT_BUFF_1; i <= BG_DS_OBJECT_BUFF_2; ++i)
  100.          SpawnBGObject(i, 60);
  101.  
  102. -    setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX));
  103. -    setWaterFallActive(false);
  104. +    SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_ONE_DAY);
  105. +    SpawnBGObject(BG_DS_OBJECT_WATER_2, RESPAWN_IMMEDIATELY);
  106. +    DoorOpen(BG_DS_OBJECT_WATER_2);
  107.  
  108. -    for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i)
  109. -        SpawnBGObject(i, getWaterFallTimer());
  110. +    m_knockback = 15 * IN_MILLISECONDS;
  111. +    m_teleport = 5 * IN_MILLISECONDS;
  112. +    m_waterFallStatus = 0;
  113. +    m_waterFall = urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX);
  114. +    m_dynamicLOSid = GetBgMap()->AddDynLOSObject(1291.56f, 790.837f, BG_DS_WATERFALL_RADIUS);
  115.  }
  116.  
  117.  void BattlegroundDS::AddPlayer(Player* player)
  118. diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
  119. index 625eb1c..e75e247 100755
  120. --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
  121. +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
  122. @@ -36,8 +36,8 @@ enum BattlegroundDSObjects
  123.  {
  124.      BG_DS_OBJECT_TYPE_DOOR_1    = 192642,
  125.      BG_DS_OBJECT_TYPE_DOOR_2    = 192643,
  126. -    BG_DS_OBJECT_TYPE_WATER_1   = 194395,
  127. -    BG_DS_OBJECT_TYPE_WATER_2   = 191877,
  128. +    BG_DS_OBJECT_TYPE_WATER_1   = 194395, // LoS checker
  129. +    BG_DS_OBJECT_TYPE_WATER_2   = 191877, // Visual
  130.      BG_DS_OBJECT_TYPE_BUFF_1    = 184663,
  131.      BG_DS_OBJECT_TYPE_BUFF_2    = 184664
  132.  };
  133. @@ -47,6 +47,7 @@ enum BattlegroundDSData
  134.      BG_DS_WATERFALL_TIMER_MIN                    = 30000,
  135.      BG_DS_WATERFALL_TIMER_MAX                    = 60000,
  136.      BG_DS_WATERFALL_DURATION                     = 10000,
  137. +    BG_DS_WATERFALL_RADIUS                       = 4,
  138.  };
  139.  
  140.  class BattlegroundDSScore : public BattlegroundScore
  141. @@ -76,14 +77,11 @@ class BattlegroundDS : public Battleground
  142.          void HandleKillPlayer(Player* player, Player* killer);
  143.          bool HandlePlayerUnderMap(Player* player);
  144.      private:
  145. -        uint32 m_waterTimer;
  146. -        bool m_waterfallActive;
  147. -
  148.          virtual void PostUpdateImpl(uint32 diff);
  149. -    protected:
  150. -        bool isWaterFallActive() { return m_waterfallActive; };
  151. -        void setWaterFallActive(bool active) { m_waterfallActive = active; };
  152. -        void setWaterFallTimer(uint32 timer) { m_waterTimer = timer; };
  153. -        uint32 getWaterFallTimer() { return m_waterTimer; };
  154. +        uint8 m_waterFallStatus;
  155. +        uint32 m_waterFall;
  156. +        uint32 m_teleport;
  157. +        uint32 m_knockback;
  158. +        uint32 m_dynamicLOSid;
  159.  };
  160.  #endif
  161. diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
  162. index 0c44c5d..3027a43 100755
  163. --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
  164. +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
  165. @@ -46,6 +46,9 @@ BattlegroundRV::~BattlegroundRV()
  166.  
  167.  void BattlegroundRV::PostUpdateImpl(uint32 diff)
  168.  {
  169. +    if(GetStatus() != STATUS_IN_PROGRESS)
  170. +        return;
  171. +
  172.      if (getTimer() < diff)
  173.      {
  174.          switch (getState())
  175. @@ -65,6 +68,7 @@ void BattlegroundRV::PostUpdateImpl(uint32 diff)
  176.                      DoorOpen(i);
  177.                  setTimer(BG_RV_PILAR_TO_FIRE_TIMER);
  178.                  setState(BG_RV_STATE_OPEN_FIRE);
  179. +                SwitchDynLos();
  180.                  break;
  181.              case BG_RV_STATE_OPEN_FIRE:
  182.                  // FIXME: after 3.2.0 it's only decorative and should be opened only one time at battle start
  183. @@ -78,6 +82,7 @@ void BattlegroundRV::PostUpdateImpl(uint32 diff)
  184.                      DoorOpen(i);
  185.                  setTimer(BG_RV_PILAR_TO_FIRE_TIMER);
  186.                  setState(BG_RV_STATE_CLOSE_FIRE);
  187. +                SwitchDynLos();
  188.                  break;
  189.          }
  190.      }
  191. @@ -100,6 +105,16 @@ void BattlegroundRV::StartingEventOpenDoors()
  192.  
  193.      setState(BG_RV_STATE_OPEN_FENCES);
  194.      setTimer(BG_RV_FIRST_TIMER);
  195. +
  196. +    // Add all DynLoS to the map
  197. +    m_DynLos[0] = GetBgMap()->AddDynLOSObject(763.632385f, -306.162384f, 25.909504f, BG_RV_PILLAR_SMALL_RADIUS, BG_RV_PILLAR_SMALL_HEIGHT);
  198. +    m_DynLos[1] = GetBgMap()->AddDynLOSObject(763.611145f, -261.856750f, 25.909504f, BG_RV_PILLAR_SMALL_RADIUS, BG_RV_PILLAR_SMALL_HEIGHT);
  199. +    m_DynLos[2] = GetBgMap()->AddDynLOSObject(723.644287f, -284.493256f, 24.648525f, BG_RV_PILLAR_BIG_RADIUS, BG_RV_PILLAR_BIG_RADIUS);
  200. +    m_DynLos[3] = GetBgMap()->AddDynLOSObject(802.211609f, -284.493256f, 24.648525f, BG_RV_PILLAR_BIG_RADIUS, BG_RV_PILLAR_BIG_HEIGHT);
  201. +
  202. +    // Activate the small ones
  203. +    for (uint8 i = 0; i <= 1; i++)
  204. +        GetBgMap()->SetDynLOSObjectState(m_DynLos[i], true);
  205.  }
  206.  
  207.  void BattlegroundRV::AddPlayer(Player* player)
  208. @@ -146,6 +161,10 @@ void BattlegroundRV::HandleKillPlayer(Player* player, Player* killer)
  209.  
  210.  bool BattlegroundRV::HandlePlayerUnderMap(Player* player)
  211.  {
  212. +    // Wait for elevators to Go up, before start checking for UnderMaped players
  213. +    if(GetStartTime() < uint32(m_StartDelayTimes[BG_STARTING_EVENT_FIRST] + 20*IN_MILLISECONDS))
  214. +        return true;
  215. +
  216.      player->TeleportTo(GetMapId(), 763.5f, -284, 28.276f, 2.422f, false);
  217.      return true;
  218.  }
  219. @@ -221,3 +240,27 @@ bool BattlegroundRV::SetupBattleground()
  220.      }
  221.      return true;
  222.  }
  223. +
  224. +void BattlegroundRV::SwitchDynLos()
  225. +{
  226. +    // switch all DynLos to the opposite state
  227. +    for (uint8 i = 0; i <= 3; i++)
  228. +        GetBgMap()->SetDynLOSObjectState(m_DynLos[i], !GetBgMap()->GetDynLOSObjectState(m_DynLos[i]));
  229. +
  230. +    // Force every pillar to update their status to players
  231. +    for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
  232. +    {
  233. +        Player *player = ObjectAccessor::FindPlayer(itr->first);
  234. +        if (!player)
  235. +            continue;
  236. +
  237. +        if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_1))
  238. +            pilar->SendUpdateToPlayer(player);
  239. +        if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_2))
  240. +            pilar->SendUpdateToPlayer(player);
  241. +        if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_3))
  242. +            pilar->SendUpdateToPlayer(player);
  243. +        if(GameObject* pilar = GetBGObject(BG_RV_OBJECT_PILAR_4))
  244. +            pilar->SendUpdateToPlayer(player);
  245. +    }
  246. +}
  247. \ No newline at end of file
  248. diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
  249. index 70417c1..9cd34de 100755
  250. --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
  251. +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
  252. @@ -91,6 +91,11 @@ enum BattlegroundRVData
  253.      BG_RV_WORLD_STATE                            = 0xe1a,
  254.  };
  255.  
  256. +#define BG_RV_PILLAR_SMALL_RADIUS  2.0f
  257. +#define BG_RV_PILLAR_SMALL_HEIGHT  5.0f
  258. +#define BG_RV_PILLAR_BIG_RADIUS    4.0f
  259. +#define BG_RV_PILLAR_BIG_HEIGHT    8.25f
  260. +
  261.  class BattlegroundRVScore : public BattlegroundScore
  262.  {
  263.      public:
  264. @@ -122,8 +127,10 @@ class BattlegroundRV : public Battleground
  265.          uint32 State;
  266.  
  267.          virtual void PostUpdateImpl(uint32 diff);
  268. +        virtual void SwitchDynLos();
  269.  
  270.      protected:
  271. +        uint32 m_DynLos[4];
  272.          uint32 getTimer() { return Timer; };
  273.          void setTimer(uint32 timer) { Timer = timer; };
  274.  
  275. diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
  276. index d467992..93f9652 100755
  277. --- a/src/server/game/Entities/Object/Object.cpp
  278. +++ b/src/server/game/Entities/Object/Object.cpp
  279. @@ -1360,7 +1360,7 @@ bool WorldObject::IsWithinLOSInMap(const WorldObject* obj) const
  280.  
  281.      float ox, oy, oz;
  282.      obj->GetPosition(ox, oy, oz);
  283. -    return(IsWithinLOS(ox, oy, oz));
  284. +    return (IsWithinLOS(ox, oy, oz) && GetMap()->IsInDynLOS(GetPositionX(), GetPositionY(), GetPositionZ(), ox, oy, oz));
  285.  }
  286.  
  287.  bool WorldObject::IsWithinLOS(float ox, float oy, float oz) const
  288. @@ -1368,7 +1368,7 @@ bool WorldObject::IsWithinLOS(float ox, float oy, float oz) const
  289.      float x, y, z;
  290.      GetPosition(x, y, z);
  291.      VMAP::IVMapManager* vMapManager = VMAP::VMapFactory::createOrGetVMapManager();
  292. -    return vMapManager->isInLineOfSight(GetMapId(), x, y, z+2.0f, ox, oy, oz+2.0f);
  293. +    return (vMapManager->isInLineOfSight(GetMapId(), x, y, z+2.0f, ox, oy, oz+2.0f) && GetMap()->IsInDynLOS(GetPositionX(), GetPositionY(), GetPositionZ(), ox, oy, oz));
  294.  }
  295.  
  296.  bool WorldObject::GetDistanceOrder(WorldObject const* obj1, WorldObject const* obj2, bool is3D /* = true */) const
  297. @@ -2665,9 +2665,18 @@ void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float
  298.          // move back a bit
  299.          destx -= CONTACT_DISTANCE * cos(angle);
  300.          desty -= CONTACT_DISTANCE * sin(angle);
  301. -        dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_positionY - desty)*(pos.m_positionY - desty));
  302.      }
  303.  
  304. +    while (!GetMap()->IsInDynLOS(pos.m_positionX, pos.m_positionY, pos.m_positionZ, destx, desty, destz))
  305. +    {
  306. +        destx -= 2.0f * cos(angle);
  307. +        desty -= 2.0f * sin(angle);
  308. +        col = true;
  309. +    }
  310. +
  311. +    if (col)
  312. +        dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_positionY - desty)*(pos.m_positionY - desty));
  313. +
  314.      float step = dist/10.0f;
  315.  
  316.      for (uint8 j = 0; j < 10; ++j)
  317. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  318. index 510813a..95bbca1 100755
  319. --- a/src/server/game/Entities/Player/Player.cpp
  320. +++ b/src/server/game/Entities/Player/Player.cpp
  321. @@ -2299,6 +2299,22 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
  322.      return true;
  323.  }
  324.  
  325. +void Player::KnockBackWithAngle(float angle, float horizontalSpeed, float verticalSpeed)
  326. +{
  327. +    float vsin = sin(angle);
  328. +    float vcos = cos(angle);
  329. +
  330. +    // Effect propertly implemented only for players
  331. +    WorldPacket data(SMSG_MOVE_KNOCK_BACK, 8+4+4+4+4+4);
  332. +    data.append(GetPackGUID());
  333. +    data << uint32(0);                                  // Sequence
  334. +    data << float(vcos);                                // x direction
  335. +    data << float(vsin);                                // y direction
  336. +    data << float(horizontalSpeed);                     // Horizontal speed
  337. +    data << float(-verticalSpeed);                      // Z Movement speed (vertical)
  338. +    GetSession()->SendPacket(&data);
  339. +}
  340. +
  341.  bool Player::TeleportToBGEntryPoint()
  342.  {
  343.      if (m_bgData.joinPos.m_mapId == MAPID_INVALID)
  344. diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
  345. index 8ee7d1a..8f29e7f 100755
  346. --- a/src/server/game/Entities/Player/Player.h
  347. +++ b/src/server/game/Entities/Player/Player.h
  348. @@ -1091,6 +1091,7 @@ class Player : public Unit, public GridObject<Player>
  349.          void RemoveFromWorld();
  350.  
  351.          bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0);
  352. +        void KnockBackWithAngle(float angle, float horizontalSpeed, float verticalSpeed);
  353.          bool TeleportTo(WorldLocation const &loc, uint32 options = 0)
  354.          {
  355.              return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options);
  356. diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
  357. index 34a7b60..2842255 100755
  358. --- a/src/server/game/Maps/Map.cpp
  359. +++ b/src/server/game/Maps/Map.cpp
  360. @@ -220,9 +220,14 @@ i_scriptLock(false)
  361.          }
  362.      }
  363.  
  364. +    for (std::map<uint32, DynamicLOSObject*>::iterator i = m_dynamicLOSObjects.begin(); i != m_dynamicLOSObjects.end(); ++i)
  365. +        delete i->second;
  366. +
  367.      //lets initialize visibility distance for map
  368.      Map::InitVisibilityDistance();
  369.  
  370. +    m_dynamicLOSCounter = 0;
  371. +
  372.      sScriptMgr->OnCreateMap(this);
  373.  }
  374.  
  375. @@ -2632,3 +2637,151 @@ void Map::UpdateIteratorBack(Player* player)
  376.      if (m_mapRefIter == player->GetMapRef())
  377.          m_mapRefIter = m_mapRefIter->nocheck_prev();
  378.  }
  379. +
  380. +/*
  381. + * ****************** *
  382. + * DYNAMIC LOS SYSTEM *
  383. + * ****************** *
  384. + */
  385. +uint32 Map::AddDynLOSObject(float x, float y, float radius)
  386. +{
  387. +    DynamicLOSObject* obj = new DynamicLOSObject();
  388. +    obj->SetCoordinates(x, y);
  389. +    obj->SetRadius(radius);
  390. +
  391. +    // Add the dynamic object to the map
  392. +    m_dynamicLOSObjects[++m_dynamicLOSCounter] = obj;
  393. +
  394. +    return m_dynamicLOSCounter;
  395. +}
  396. +
  397. +uint32 Map::AddDynLOSObject(float x, float y, float z, float radius, float height)
  398. +{
  399. +    DynamicLOSObject* obj = new DynamicLOSObject();
  400. +    obj->SetCoordinates(x, y);
  401. +    obj->SetZ(z);
  402. +    obj->SetHeight(height);
  403. +    obj->SetRadius(radius);
  404. +
  405. +    // Add the dynamic object to the map
  406. +    m_dynamicLOSObjects[++m_dynamicLOSCounter] = obj;
  407. +
  408. +    return m_dynamicLOSCounter;
  409. +}
  410. +
  411. +void Map::SetDynLOSObjectState(uint32 id, bool state)
  412. +{
  413. +    std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.find(id);
  414. +    if (iter != m_dynamicLOSObjects.end())
  415. +        iter->second->SetActiveState(state);
  416. +}
  417. +
  418. +bool Map::GetDynLOSObjectState(uint32 id)
  419. +{
  420. +    std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.find(id);
  421. +    if (iter != m_dynamicLOSObjects.end())
  422. +        return (iter->second->IsActive());
  423. +    return false;
  424. +}
  425. +
  426. +bool Map::IsInDynLOS(float x, float y, float z, float x2, float y2, float z2)
  427. +{
  428. +    if (!m_dynamicLOSCounter)
  429. +        return true;
  430. +
  431. +    for (std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.begin(); iter != m_dynamicLOSObjects.end(); ++iter)
  432. +        if (iter->second->IsActive() && iter->second->IsBetween(x, y, z, x2, y2, z2))
  433. +            return false;
  434. +
  435. +    return true;
  436. +}
  437. +
  438. +DynamicLOSObject::DynamicLOSObject()
  439. +{
  440. +    _x = 0.0f;
  441. +    _y = 0.0f;
  442. +    _z = 0.0f;
  443. +    _height = 0.0f;
  444. +    _radius = 0.0f;
  445. +    _active = false;
  446. +}
  447. +
  448. +bool DynamicLOSObject::IsBetween(float x, float y, float z, float x2, float y2, float z2)
  449. +{
  450. +    if (IsInside(x, y) || IsInside(x2, y2))
  451. +    {
  452. +        if(HasHeightInfo() && IsOverOrUnder(z2))
  453. +            return false;
  454. +
  455. +        return true;
  456. +    }
  457. +
  458. +    // For a real handling of Z coord is necessary to do some research from this point
  459. +    // 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;
  460. +    // both may be able to attack each other, even when the plattaform height should prevent that.
  461. +    if ((std::max(x, x2) < (_x - _radius))
  462. +        || (std::min(x, x2) > (_x + _radius))
  463. +        || (std::max(y, y2) < (_y - _radius))
  464. +        || (std::min(y, y2) > (_y + _radius)))
  465. +        return false;
  466. +
  467. +
  468. +    float angleToMe = atan2(_x - x, _y - y);
  469. +    angleToMe = (angleToMe >= 0) ? angleToMe : 2 * M_PI + angleToMe;
  470. +
  471. +    float angleToDest = atan2(x2 - x, y2 - y);
  472. +    angleToDest = (angleToDest >= 0) ? angleToDest : 2 * M_PI + angleToDest;
  473. +
  474. +    return (fabs(sin(angleToMe - angleToDest)) * GetDistance(x, y) < _radius);
  475. +}
  476. +
  477. +bool DynamicLOSObject::IsInside(float x, float y)
  478. +{
  479. +    return (((x-_x)*(x-_x)+(y-_y)*(y-_y))<(_radius*_radius));
  480. +}
  481. +
  482. +bool DynamicLOSObject::IsOverOrUnder(float z)
  483. +{
  484. +    return ((z < _z+_height) && (z > _z));
  485. +}
  486. +
  487. +float DynamicLOSObject::GetDistance(float x, float y)
  488. +{
  489. +    return sqrtf((x-_x)*(x-_x)+(y-_y)*(y-_y));
  490. +}
  491. +
  492. +bool DynamicLOSObject::IsActive()
  493. +{
  494. +    return _active;
  495. +}
  496. +
  497. +void DynamicLOSObject::SetActiveState(bool state)
  498. +{
  499. +    _active = state;
  500. +}
  501. +
  502. +void DynamicLOSObject::SetCoordinates(float x, float y)
  503. +{
  504. +    _x = x;
  505. +    _y = y;
  506. +}
  507. +
  508. +void DynamicLOSObject::SetRadius(float r)
  509. +{
  510. +    _radius = r;
  511. +}
  512. +
  513. +void DynamicLOSObject::SetZ(float z)
  514. +{
  515. +    _z = z;
  516. +}
  517. +
  518. +void DynamicLOSObject::SetHeight(float h)
  519. +{
  520. +    _height = h;
  521. +}
  522. +
  523. +bool DynamicLOSObject::HasHeightInfo()
  524. +{
  525. +    return (_z != 0 || _height != 0);
  526. +}
  527. diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
  528. index 542d911..a419609 100755
  529. --- a/src/server/game/Maps/Map.h
  530. +++ b/src/server/game/Maps/Map.h
  531. @@ -200,6 +200,30 @@ public:
  532.  #pragma pack(push, 1)
  533.  #endif
  534.  
  535. +class DynamicLOSObject
  536. +{
  537. +    public:
  538. +        DynamicLOSObject();
  539. +        bool IsBetween(float x, float y, float z, float x2, float y2, float z2);
  540. +        bool IsInside(float x, float y);
  541. +        bool IsOverOrUnder(float z);
  542. +        float GetDistance(float x, float y);
  543. +        bool IsActive();
  544. +        void SetActiveState(bool state);
  545. +        void SetCoordinates(float x, float y);
  546. +        void SetZ(float z);
  547. +        void SetRadius(float r);
  548. +        void SetHeight(float h);
  549. +        bool HasHeightInfo();
  550. +    private:
  551. +        float _x;
  552. +        float _y;
  553. +        float _z;
  554. +        float _height;
  555. +        float _radius;
  556. +        bool _active;
  557. +};
  558. +
  559.  struct InstanceTemplate
  560.  {
  561.      uint32 Parent;
  562. @@ -424,6 +448,21 @@ class Map : public GridRefManager<NGridType>
  563.  
  564.          InstanceMap* ToInstanceMap(){ if (IsDungeon())  return reinterpret_cast<InstanceMap*>(this); else return NULL;  }
  565.          const InstanceMap* ToInstanceMap() const { if (IsDungeon())  return (const InstanceMap*)((InstanceMap*)this); else return NULL;  }
  566. +    /*
  567. +     **********************
  568. +     * DYNAMIC LOS SYSTEM *
  569. +     **********************
  570. +    */
  571. +    public:
  572. +        uint32 AddDynLOSObject(float x, float y, float radius);
  573. +        uint32 AddDynLOSObject(float x, float y, float z, float radius, float height);
  574. +        void SetDynLOSObjectState(uint32 id, bool state);
  575. +        bool GetDynLOSObjectState(uint32 id);
  576. +        bool IsInDynLOS(float x, float y, float z, float x2, float y2, float z2);
  577. +    private:
  578. +        std::map<uint32, DynamicLOSObject*> m_dynamicLOSObjects;
  579. +        uint32 m_dynamicLOSCounter;
  580. +    /* END */
  581.      private:
  582.          void LoadMapAndVMap(int gx, int gy);
  583.          void LoadVMap(int gx, int gy);
  584. diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
  585. index ae2612e..77366d4 100755
  586. --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
  587. +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
  588. @@ -361,7 +361,16 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
  589.      {
  590.          plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
  591.  
  592. -        if (movementInfo.pos.GetPositionZ() < -500.0f)
  593. +        float underMapValueZ;
  594. +
  595. +        switch (plMover->GetMapId())
  596. +        {
  597. +            case 617: underMapValueZ = 3.0f; break; // Dalaran Sewers
  598. +            case 618: underMapValueZ = 28.0f; break; // Ring of Valor
  599. +            default: underMapValueZ = -500.0f; break;
  600. +        }
  601. +
  602. +        if (movementInfo.pos.GetPositionZ() < underMapValueZ)
  603.          {
  604.              if (!(plMover->InBattleground()
  605.                  && plMover->GetBattleground()
Add Comment
Please, Sign In to add comment