diff --git a/data/sql/updates/pending_db_world/rev_1652007586211116800.sql b/data/sql/updates/pending_db_world/rev_1652007586211116800.sql new file mode 100644 index 000000000..e4dac0d5c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1652007586211116800.sql @@ -0,0 +1,6 @@ +-- +ALTER TABLE `waypoint_data` CHANGE `orientation` `orientation` FLOAT DEFAULT NULL NULL; +UPDATE `waypoint_data` SET `orientation`= NULL WHERE `orientation`= 0; + +ALTER TABLE `waypoints` CHANGE `orientation` `orientation` FLOAT DEFAULT NULL NULL; +UPDATE `waypoints` SET `orientation`= NULL WHERE `orientation`= 0; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 81362efba..612981260 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -257,9 +257,9 @@ void SmartAI::PausePath(uint32 delay, bool forced) me->GetMotionMaster()->MoveIdle();//force stop auto waypoint = mWayPoints->find(mCurrentWPID); - if (float orientation = waypoint->second->o) + if (waypoint->second->o.has_value()) { - me->SetFacingTo(orientation); + me->SetFacingTo(waypoint->second->o.has_value()); } } GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_PAUSED, nullptr, mCurrentWPID, GetScript()->GetPathId()); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index fb98247a1..23a93f166 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -79,11 +79,12 @@ void SmartWaypointMgr::LoadFromDB() Field* fields = result->Fetch(); uint32 entry = fields[0].Get(); uint32 id = fields[1].Get(); - float x, y, z, o; - x = fields[2].Get(); - y = fields[3].Get(); - z = fields[4].Get(); - o = fields[5].Get(); + float x = fields[2].Get(); + float y = fields[3].Get(); + float z = fields[4].Get(); + Optional o; + if (!fields[5].IsNull()) + o = fields[5].Get(); uint32 delay = fields[6].Get(); if (last_entry != entry) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index be9357fab..0867679fe 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -22,6 +22,7 @@ #include "Creature.h" #include "CreatureAI.h" #include "DBCStores.h" +#include "Optional.h" #include "Spell.h" #include "SpellMgr.h" #include "Unit.h" @@ -30,7 +31,7 @@ typedef uint32 SAIBool; struct WayPoint { - WayPoint(uint32 _id, float _x, float _y, float _z, float _o, uint32 _delay) + WayPoint(uint32 _id, float _x, float _y, float _z, Optional _o, uint32 _delay) { id = _id; x = _x; @@ -44,7 +45,7 @@ struct WayPoint float x; float y; float z; - float o; + std::optional o; uint32 delay; }; diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index ffb8b174d..10c9563df 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -175,9 +175,8 @@ bool WaypointMovementGenerator::StartMove(Creature* creature) //! but formationDest contains global coordinates init.MoveTo(node->x, node->y, z, true, true); - //! Accepts angles such as 0.00001 and -0.00001, 0 must be ignored, default value in waypoint table - if (node->orientation && node->delay) - init.SetFacing(node->orientation); + if (node->orientation.has_value() && node->delay > 0) + init.SetFacing(*node->orientation); switch (node->move_type) { diff --git a/src/server/game/Movement/Waypoints/WaypointMgr.cpp b/src/server/game/Movement/Waypoints/WaypointMgr.cpp index 9be0b3bd0..6b8601fa1 100644 --- a/src/server/game/Movement/Waypoints/WaypointMgr.cpp +++ b/src/server/game/Movement/Waypoints/WaypointMgr.cpp @@ -70,7 +70,9 @@ void WaypointMgr::Load() float x = fields[2].Get(); float y = fields[3].Get(); float z = fields[4].Get(); - float o = fields[5].Get(); + std::optional o; + if (!fields[5].IsNull()) + o = fields[5].Get(); Acore::NormalizeMapCoord(x); Acore::NormalizeMapCoord(y); @@ -131,7 +133,9 @@ void WaypointMgr::ReloadPath(uint32 id) float x = fields[1].Get(); float y = fields[2].Get(); float z = fields[3].Get(); - float o = fields[4].Get(); + std::optional o; + if (!fields[4].IsNull()) + o = fields[4].Get(); Acore::NormalizeMapCoord(x); Acore::NormalizeMapCoord(y); diff --git a/src/server/game/Movement/Waypoints/WaypointMgr.h b/src/server/game/Movement/Waypoints/WaypointMgr.h index c9ea8e709..0d81e14cf 100644 --- a/src/server/game/Movement/Waypoints/WaypointMgr.h +++ b/src/server/game/Movement/Waypoints/WaypointMgr.h @@ -35,7 +35,8 @@ enum WaypointMoveType struct WaypointData { uint32 id; - float x, y, z, orientation; + float x, y, z; + std::optional orientation; uint32 delay; uint32 event_id; uint32 move_type;