Guest User

Untitled

a guest
Jan 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.14 KB | None | 0 0
  1. diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Ob
  2. index c55892c..6201569 100755
  3. --- a/src/server/game/Entities/Object/Object.cpp
  4. +++ b/src/server/game/Entities/Object/Object.cpp
  5. @@ -1347,7 +1347,7 @@ bool WorldObject::IsWithinLOSInMap(const WorldObject* obj) cons
  6.  
  7. float ox, oy, oz;
  8. obj->GetPosition(ox, oy, oz);
  9. - return(IsWithinLOS(ox, oy, oz));
  10. + return (IsWithinLOS(ox, oy, oz) && GetMap()->IsInDynLOS(GetPositionX(), GetPosit
  11. }
  12.  
  13. bool WorldObject::IsWithinLOS(float ox, float oy, float oz) const
  14. @@ -1355,7 +1355,7 @@ bool WorldObject::IsWithinLOS(float ox, float oy, float oz) con
  15. float x, y, z;
  16. GetPosition(x, y, z);
  17. VMAP::IVMapManager* vMapManager = VMAP::VMapFactory::createOrGetVMapManager();
  18. - return vMapManager->isInLineOfSight(GetMapId(), x, y, z+2.0f, ox, oy, oz+2.0f);
  19. + return (vMapManager->isInLineOfSight(GetMapId(), x, y, z+2.0f, ox, oy, oz+2.0f)
  20. }
  21.  
  22. bool WorldObject::GetDistanceOrder(WorldObject const* obj1, WorldObject const* obj2,
  23. @@ -2661,9 +2661,18 @@ void WorldObject::MovePositionToFirstCollision(Position &pos,
  24. // move back a bit
  25. destx -= CONTACT_DISTANCE * cos(angle);
  26. desty -= CONTACT_DISTANCE * sin(angle);
  27. - dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_pos
  28. }
  29.  
  30. + while (!GetMap()->IsInDynLOS(pos.m_positionX, pos.m_positionY, pos.m_positionZ,
  31. + {
  32. + destx -= 2.0f * cos(angle);
  33. + desty -= 2.0f * sin(angle);
  34. + col = true;
  35. + }
  36. +
  37. + if (col)
  38. + dist = sqrt((pos.m_positionX - destx)*(pos.m_positionX - destx) + (pos.m_pos
  39. +
  40. float step = dist/10.0f;
  41.  
  42. for (uint8 j = 0; j < 10; ++j)
  43. diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
  44. index 89049f3..8aa8327 100755
  45. --- a/src/server/game/Maps/Map.cpp
  46. +++ b/src/server/game/Maps/Map.cpp
  47. @@ -219,9 +219,14 @@ i_scriptLock(false), _creatureToMoveLock(false)
  48. }
  49. }
  50.  
  51. + for (std::map<uint32, DynamicLOSObject*>::iterator i = m_dynamicLOSObjects.begin
  52. + delete i->second;
  53. +
  54. //lets initialize visibility distance for map
  55. Map::InitVisibilityDistance();
  56.  
  57. + m_dynamicLOSCounter = 0;
  58. +
  59. sScriptMgr->OnCreateMap(this);
  60. }
  61.  
  62. @@ -2717,3 +2722,179 @@ void Map::UpdateIteratorBack(Player* player)
  63. if (m_mapRefIter == player->GetMapRef())
  64. m_mapRefIter = m_mapRefIter->nocheck_prev();
  65. }
  66. +
  67. +/*
  68. + * ****************** *
  69. + * DYNAMIC LOS SYSTEM *
  70. + * ****************** *
  71. + */
  72. +
  73. +
  74. +uint32 Map::AddDynLOSObject(float x, float y, float radius)
  75. +{
  76. + DynamicLOSObject* obj = new DynamicLOSObject();
  77. + obj->SetCoordinates(x, y);
  78. + obj->SetRadius(radius);
  79. +
  80. +
  81. + // Add the dynamic object to the map
  82. + m_dynamicLOSObjects[++m_dynamicLOSCounter] = obj;
  83. +
  84. +
  85. + return m_dynamicLOSCounter;
  86. +}
  87. +
  88. +
  89. +uint32 Map::AddDynLOSObject(float x, float y, float z, float radius, float height)
  90. +{
  91. + DynamicLOSObject* obj = new DynamicLOSObject();
  92. + obj->SetCoordinates(x, y);
  93. + obj->SetZ(z);
  94. + obj->SetHeight(height);
  95. + obj->SetRadius(radius);
  96. +
  97. +
  98. + // Add the dynamic object to the map
  99. + m_dynamicLOSObjects[++m_dynamicLOSCounter] = obj;
  100. +
  101. +
  102. + return m_dynamicLOSCounter;
  103. +}
  104. +
  105. +
  106. +void Map::SetDynLOSObjectState(uint32 id, bool state)
  107. +{
  108. + std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.find(id
  109. + if (iter != m_dynamicLOSObjects.end())
  110. + iter->second->SetActiveState(state);
  111. +}
  112. +
  113. +
  114. +bool Map::GetDynLOSObjectState(uint32 id)
  115. +{
  116. + std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.find(id
  117. + if (iter != m_dynamicLOSObjects.end())
  118. + return (iter->second->IsActive());
  119. + return false;
  120. +}
  121. +
  122. +
  123. +bool Map::IsInDynLOS(float x, float y, float z, float x2, float y2, float z2)
  124. +{
  125. + if (!m_dynamicLOSCounter)
  126. + return true;
  127. +
  128. +
  129. + for (std::map<uint32, DynamicLOSObject*>::iterator iter = m_dynamicLOSObjects.be
  130. + if (iter->second->IsActive() && iter->second->IsBetween(x, y, z, x2, y2, z2)
  131. + return false;
  132. +
  133. +
  134. + return true;
  135. +}
  136. +
  137. +
  138. +DynamicLOSObject::DynamicLOSObject()
  139. +{
  140. + _x = 0.0f;
  141. + _y = 0.0f;
  142. + _z = 0.0f;
  143. + _height = 0.0f;
  144. + _radius = 0.0f;
  145. + _active = false;
  146. +}
  147. +
  148. +
  149. +bool DynamicLOSObject::IsBetween(float x, float y, float z, float x2, float y2, floa
  150. +{
  151. + if (IsInside(x, y) || IsInside(x2, y2))
  152. + {
  153. + if (HasHeightInfo() && IsOverOrUnder(z2))
  154. + return false;
  155. +
  156. +
  157. + return true;
  158. + }
  159. +
  160. +
  161. + // For a real handling of Z coord is necessary to do some research from this poi
  162. + // i.e. A player over a huge round plattaform, placed near the edge; and other p
  163. + // both may be able to attack each other, even when the plattaform height should
  164. + if ((std::max(x, x2) < (_x - _radius))
  165. + || (std::min(x, x2) > (_x + _radius))
  166. + || (std::max(y, y2) < (_y - _radius))
  167. + || (std::min(y, y2) > (_y + _radius)))
  168. + return false;
  169. +
  170. +
  171. + float angleToMe = atan2(_x - x, _y - y);
  172. + angleToMe = (angleToMe >= 0) ? angleToMe : 2 * M_PI + angleToMe;
  173. +
  174. +
  175. + float angleToDest = atan2(x2 - x, y2 - y);
  176. + angleToDest = (angleToDest >= 0) ? angleToDest : 2 * M_PI + angleToDest;
  177. +
  178. +
  179. + return (fabs(sin(angleToMe - angleToDest)) * GetDistance(x, y) < _radius);
  180. +}
  181. +
  182. +
  183. +bool DynamicLOSObject::IsInside(float x, float y)
  184. +{
  185. + return (((x-_x)*(x-_x)+(y-_y)*(y-_y))<(_radius*_radius));
  186. +}
  187. +
  188. +
  189. +bool DynamicLOSObject::IsOverOrUnder(float z)
  190. +{
  191. + return ((z < _z+_height) && (z > _z));
  192. +}
  193. +
  194. +
  195. +float DynamicLOSObject::GetDistance(float x, float y)
  196. +{
  197. + return sqrtf((x-_x)*(x-_x)+(y-_y)*(y-_y));
  198. +}
  199. +
  200. +
  201. +bool DynamicLOSObject::IsActive()
  202. +{
  203. + return _active;
  204. +}
  205. +
  206. +
  207. +void DynamicLOSObject::SetActiveState(bool state)
  208. +{
  209. + _active = state;
  210. +}
  211. +
  212. +
  213. +void DynamicLOSObject::SetCoordinates(float x, float y)
  214. +{
  215. + _x = x;
  216. + _y = y;
  217. +}
  218. +
  219. +
  220. +void DynamicLOSObject::SetRadius(float r)
  221. +{
  222. + _radius = r;
  223. +}
  224. +
  225. +
  226. +void DynamicLOSObject::SetZ(float z)
  227. +{
  228. + _z = z;
  229. +}
  230. +
  231. +
  232. +void DynamicLOSObject::SetHeight(float h)
  233. +{
  234. + _height = h;
  235. +}
  236. +
  237. +
  238. +bool DynamicLOSObject::HasHeightInfo()
  239. +{
  240. + return (_z != 0 || _height != 0);
  241. +}
  242. diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
  243. index fd58fd0..7ab550f 100755
  244. --- a/src/server/game/Maps/Map.h
  245. +++ b/src/server/game/Maps/Map.h
  246. @@ -200,6 +200,30 @@ public:
  247. #pragma pack(push, 1)
  248. #endif
  249.  
  250. +class DynamicLOSObject
  251. +{
  252. + public:
  253. + DynamicLOSObject();
  254. + bool IsBetween(float x, float y, float z, float x2, float y2, float z2);
  255. + bool IsInside(float x, float y);
  256. + bool IsOverOrUnder(float z);
  257. + float GetDistance(float x, float y);
  258. + bool IsActive();
  259. + void SetActiveState(bool state);
  260. + void SetCoordinates(float x, float y);
  261. + void SetZ(float z);
  262. + void SetRadius(float r);
  263. + void SetHeight(float h);
  264. + bool HasHeightInfo();
  265. + private:
  266. + float _x;
  267. + float _y;
  268. + float _z;
  269. + float _height;
  270. + float _radius;
  271. + bool _active;
  272. +};
  273. +
  274. struct InstanceTemplate
  275. {
  276. uint32 Parent;
  277. @@ -425,6 +449,22 @@ class Map : public GridRefManager<NGridType>
  278.  
  279. InstanceMap* ToInstanceMap(){ if (IsDungeon()) return reinterpret_cast<Inst
  280. const InstanceMap* ToInstanceMap() const { if (IsDungeon()) return (const I
  281. +
  282. + /*
  283. + **********************
  284. + * DYNAMIC LOS SYSTEM *
  285. + **********************
  286. + */
  287. + public:
  288. + uint32 AddDynLOSObject(float x, float y, float radius);
  289. + uint32 AddDynLOSObject(float x, float y, float z, float radius, float height
  290. + void SetDynLOSObjectState(uint32 id, bool state);
  291. + bool GetDynLOSObjectState(uint32 id);
  292. + bool IsInDynLOS(float x, float y, float z, float x2, float y2, float z2);
  293. + private:
  294. + std::map<uint32, DynamicLOSObject*> m_dynamicLOSObjects;
  295. + uint32 m_dynamicLOSCounter;
  296. + /* END */
  297. private:
  298. void LoadMapAndVMap(int gx, int gy);
  299. void LoadVMap(int gx, int gy);
Add Comment
Please, Sign In to add comment