diff options
-rw-r--r-- | sql/base/auth_database.sql | 19 | ||||
-rw-r--r-- | sql/updates/auth/master/2025_10_22_00_auth.sql | 23 | ||||
-rw-r--r-- | src/common/Collision/BoundingIntervalHierarchyWrapper.h | 77 | ||||
-rw-r--r-- | src/common/Collision/DynamicTree.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSpline.cpp | 10 |
5 files changed, 80 insertions, 53 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index c630452e0ed..b80a48aa279 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1313,7 +1313,14 @@ INSERT INTO `build_auth_key` VALUES (63834,'Mac','x64','WoWC',0xC1D16D8E2893A07529F54B150D1E9478), (63834,'Win','A64','WoW',0x9ABF336240A8D5D8A53807CA03009809), (63834,'Win','x64','WoW',0xA7E739F0FDF745A879791DECE8066BF2), -(63834,'Win','x64','WoWC',0x67808AA1E78AAFDD345070F4AB40DD5C); +(63834,'Win','x64','WoWC',0x67808AA1E78AAFDD345070F4AB40DD5C), +(63906,'Mac','A64','WoW',0x2498B74093269B1CC2A597BF368BF808), +(63906,'Mac','A64','WoWC',0x1A6B72DA01501C0B1FCE84BF42F2952D), +(63906,'Mac','x64','WoW',0x3CD6B638DED480F69E9DB88B9C8E52B9), +(63906,'Mac','x64','WoWC',0x6C931FF70F78BAD0707EA57157D40718), +(63906,'Win','A64','WoW',0x5ECAB6CD8F056268F02B3ACC984A5769), +(63906,'Win','x64','WoW',0xA58FDAC26513D567C1F128339126C602), +(63906,'Win','x64','WoWC',0xCB2C6E16508E82C2529F1C6CD2E6E6D9); /*!40000 ALTER TABLE `build_auth_key` ENABLE KEYS */; UNLOCK TABLES; @@ -1724,7 +1731,8 @@ INSERT INTO `build_info` VALUES (63660,11,2,5,NULL), (63704,11,2,5,NULL), (63796,11,2,5,NULL), -(63834,11,2,5,NULL); +(63834,11,2,5,NULL), +(63906,11,2,5,NULL); /*!40000 ALTER TABLE `build_info` ENABLE KEYS */; UNLOCK TABLES; @@ -3337,7 +3345,7 @@ CREATE TABLE `realmlist` ( `timezone` tinyint unsigned NOT NULL DEFAULT '0', `allowedSecurityLevel` tinyint unsigned NOT NULL DEFAULT '0', `population` float NOT NULL DEFAULT '0', - `gamebuild` int unsigned NOT NULL DEFAULT '63834', + `gamebuild` int unsigned NOT NULL DEFAULT '63906', `Region` tinyint unsigned NOT NULL DEFAULT '1', `Battlegroup` tinyint unsigned NOT NULL DEFAULT '1', PRIMARY KEY (`id`), @@ -3352,7 +3360,7 @@ CREATE TABLE `realmlist` ( LOCK TABLES `realmlist` WRITE; /*!40000 ALTER TABLE `realmlist` DISABLE KEYS */; INSERT INTO `realmlist` VALUES -(1,'Trinity','127.0.0.1','127.0.0.1',NULL,NULL,'255.255.255.0',8085,0,0,1,0,0,63834,1,1); +(1,'Trinity','127.0.0.1','127.0.0.1',NULL,NULL,'255.255.255.0',8085,0,0,1,0,0,63906,1,1); /*!40000 ALTER TABLE `realmlist` ENABLE KEYS */; UNLOCK TABLES; @@ -3875,7 +3883,8 @@ INSERT INTO `updates` VALUES ('2025_09_20_00_auth.sql','752B003BBEBDDD3E1BBFB342AD154EB50D5E6DC9','RELEASED','2025-09-20 01:31:35',0), ('2025_10_10_00_auth.sql','D2CCA4D100F71481C1AD347EE00D025BF873B2F2','RELEASED','2025-10-10 00:02:43',0), ('2025_10_11_00_auth.sql','9D39A17F4B14666677A409232A73986076FC4108','RELEASED','2025-10-11 12:34:55',0), -('2025_10_15_00_auth.sql','AD32FF4A48BFC671ED2F17409D4283E2CD3577E1','RELEASED','2025-10-15 09:56:37',0); +('2025_10_15_00_auth.sql','AD32FF4A48BFC671ED2F17409D4283E2CD3577E1','RELEASED','2025-10-15 09:56:37',0), +('2025_10_22_00_auth.sql','A363CDF2B9EDED18DA077351CB2B0DC3A9E5E752','RELEASED','2025-10-22 10:32:36',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/master/2025_10_22_00_auth.sql b/sql/updates/auth/master/2025_10_22_00_auth.sql new file mode 100644 index 00000000000..562b1f7b0e5 --- /dev/null +++ b/sql/updates/auth/master/2025_10_22_00_auth.sql @@ -0,0 +1,23 @@ +DELETE FROM `build_info` WHERE `build` IN (63906); +INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES +(63906,11,2,5,NULL); + +DELETE FROM `build_auth_key` WHERE `build`=63906 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build`=63906 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC'; +DELETE FROM `build_auth_key` WHERE `build`=63906 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build`=63906 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC'; +DELETE FROM `build_auth_key` WHERE `build`=63906 AND `platform`='Win' AND `arch`='A64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build`=63906 AND `platform`='Win' AND `arch`='x64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build`=63906 AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC'; +INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES +(63906,'Mac','A64','WoW',0x2498B74093269B1CC2A597BF368BF808), +(63906,'Mac','A64','WoWC',0x1A6B72DA01501C0B1FCE84BF42F2952D), +(63906,'Mac','x64','WoW',0x3CD6B638DED480F69E9DB88B9C8E52B9), +(63906,'Mac','x64','WoWC',0x6C931FF70F78BAD0707EA57157D40718), +(63906,'Win','A64','WoW',0x5ECAB6CD8F056268F02B3ACC984A5769), +(63906,'Win','x64','WoW',0xA58FDAC26513D567C1F128339126C602), +(63906,'Win','x64','WoWC',0xCB2C6E16508E82C2529F1C6CD2E6E6D9); + +UPDATE `realmlist` SET `gamebuild`=63906 WHERE `gamebuild`=63834; + +ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '63906'; diff --git a/src/common/Collision/BoundingIntervalHierarchyWrapper.h b/src/common/Collision/BoundingIntervalHierarchyWrapper.h index 30ff03733eb..85048da58bc 100644 --- a/src/common/Collision/BoundingIntervalHierarchyWrapper.h +++ b/src/common/Collision/BoundingIntervalHierarchyWrapper.h @@ -15,13 +15,11 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef _BIH_WRAP -#define _BIH_WRAP +#ifndef TRINITYCORE_BOUNDING_INTERVAL_HIERARCHY_WRAPPER_H +#define TRINITYCORE_BOUNDING_INTERVAL_HIERARCHY_WRAPPER_H #include "BoundingIntervalHierarchy.h" -#include <G3D/Table.h> -#include <G3D/Array.h> -#include <G3D/Set.h> +#include <unordered_map> template<class T, class BoundsFunc = BoundsTrait<T> > class BIHWrap @@ -29,58 +27,68 @@ class BIHWrap template<class RayCallback> struct MDLCallback { - const T* const* objects; + std::size_t objects_size; + T const* const* objects; RayCallback& _callback; - uint32 objects_size; - MDLCallback(RayCallback& callback, const T* const* objects_array, uint32 objects_size ) : objects(objects_array), _callback(callback), objects_size(objects_size) { } + MDLCallback(RayCallback& callback, T const* const* objects_array, std::size_t objects_size ) : objects_size(objects_size), objects(objects_array), _callback(callback) { } /// Intersect ray - bool operator() (const G3D::Ray& ray, uint32 idx, float& maxDist, bool /*stopAtFirst*/) + bool operator() (G3D::Ray const& ray, std::size_t idx, float& maxDist, bool /*stopAtFirst*/) { if (idx >= objects_size) return false; - if (const T* obj = objects[idx]) + if (T const* obj = objects[idx]) return _callback(ray, *obj, maxDist/*, stopAtFirst*/); return false; } /// Intersect point - void operator() (const G3D::Vector3& p, uint32 idx) + void operator() (G3D::Vector3 const& p, std::size_t idx) { if (idx >= objects_size) return; - if (const T* obj = objects[idx]) + if (T const* obj = objects[idx]) _callback(p, *obj); } }; - typedef G3D::Array<const T*> ObjArray; - BIH m_tree; - ObjArray m_objects; - G3D::Table<const T*, uint32> m_obj2Idx; - G3D::Set<const T*> m_objects_to_push; + std::vector<T const*> m_objects; + std::unordered_map<T const*, std::size_t> m_obj2Idx; int unbalanced_times; public: BIHWrap() : unbalanced_times(0) { } - void insert(const T& obj) + void insert(T const& obj) { + auto [itr, isNew] = m_obj2Idx.try_emplace(&obj, m_objects.size()); + if (!isNew) + return; + + m_objects.push_back(itr->first); ++unbalanced_times; - m_objects_to_push.insert(&obj); } - void remove(const T& obj) + void remove(T const& obj) { + auto node = m_obj2Idx.extract(&obj); + if (!node) + return; + + if (node.key() != m_objects.back()) + { + // update index of last element (will be swapped with removed one) + m_obj2Idx.find(m_objects.back())->second = node.mapped(); + + // move last into removed element slot + m_objects[node.mapped()] = m_objects.back(); + } + + m_objects.pop_back(); + ++unbalanced_times; - uint32 Idx = 0; - const T * temp; - if (m_obj2Idx.getRemove(&obj, temp, Idx)) - m_objects[Idx] = nullptr; - else - m_objects_to_push.remove(&obj); } void balance() @@ -88,30 +96,25 @@ public: if (unbalanced_times == 0) return; - unbalanced_times = 0; - m_objects.fastClear(); - m_obj2Idx.getKeys(m_objects); - m_objects_to_push.getMembers(m_objects); - //assert that m_obj2Idx has all the keys - m_tree.build(m_objects, BoundsFunc()); + unbalanced_times = 0; } template<typename RayCallback> - void intersectRay(const G3D::Ray& ray, RayCallback& intersectCallback, float& maxDist) + void intersectRay(G3D::Ray const& ray, RayCallback& intersectCallback, float& maxDist) { balance(); - MDLCallback<RayCallback> temp_cb(intersectCallback, m_objects.getCArray(), m_objects.size()); + MDLCallback<RayCallback> temp_cb(intersectCallback, m_objects.data(), m_objects.size()); m_tree.intersectRay(ray, temp_cb, maxDist, true); } template<typename IsectCallback> - void intersectPoint(const G3D::Vector3& point, IsectCallback& intersectCallback) + void intersectPoint(G3D::Vector3 const& point, IsectCallback& intersectCallback) { balance(); - MDLCallback<IsectCallback> callback(intersectCallback, m_objects.getCArray(), m_objects.size()); + MDLCallback<IsectCallback> callback(intersectCallback, m_objects.data(), m_objects.size()); m_tree.intersectPoint(point, callback); } }; -#endif // _BIH_WRAP +#endif // TRINITYCORE_BOUNDING_INTERVAL_HIERARCHY_WRAPPER_H diff --git a/src/common/Collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp index 1f5875fac0a..073e317e4ae 100644 --- a/src/common/Collision/DynamicTree.cpp +++ b/src/common/Collision/DynamicTree.cpp @@ -35,10 +35,6 @@ int CHECK_TREE_PERIOD = 200; } // namespace -template<> struct HashTrait< GameObjectModel>{ - static size_t hashCode(GameObjectModel const& g) { return (size_t)(void*)&g; } -}; - template<> struct PositionTrait< GameObjectModel> { static void getPosition(GameObjectModel const& g, G3D::Vector3& p) { p = g.getPosition(); } }; diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index e5d9fb3d60b..39118263388 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -269,22 +269,18 @@ bool MoveSplineInitArgs::Validate(Unit const* unit) // check path lengths - why are we even starting such short movement? bool MoveSplineInitArgs::_checkPathLengths() { - constexpr float MIN_XY_OFFSET = -(1 << 11) / 4.0f; - constexpr float MIN_Z_OFFSET = -(1 << 10) / 4.0f; - - // positive values have 1 less bit limit (if the highest bit was set, value would be sign extended into negative when decompressing) constexpr float MAX_XY_OFFSET = (1 << 10) / 4.0f; constexpr float MAX_Z_OFFSET = (1 << 9) / 4.0f; - auto isValidPackedXYOffset = [](float coord) -> bool { return coord > MIN_XY_OFFSET && coord < MAX_XY_OFFSET; }; - auto isValidPackedZOffset = [](float coord) -> bool { return coord > MIN_Z_OFFSET && coord < MAX_Z_OFFSET; }; + auto isValidPackedXYOffset = [](float coord) -> bool { return coord > -MAX_XY_OFFSET && coord < MAX_XY_OFFSET; }; + auto isValidPackedZOffset = [](float coord) -> bool { return coord > -MAX_Z_OFFSET && coord < MAX_Z_OFFSET; }; if (path.size() > 2) { Vector3 middle = (path.front() + path.back()) / 2; for (uint32 i = 1; i < path.size() - 1; ++i) { - if ((path[i + 1] - path[i]).length() < 0.1f) + if ((path[i + 1] - path[i]).squaredLength() < 0.01f) return false; // when compression is enabled, each point coord is packed into 11 bits (10 for Z) |