From 5cf01e02f6b57f29d186f903fc7f578feb7abea8 Mon Sep 17 00:00:00 2001 From: Stoabrogga <38475780+Stoabrogga@users.noreply.github.com> Date: Sun, 21 Apr 2019 16:56:32 +0200 Subject: [PATCH] fix(Core): implement "SCRIPT_COMMAND_MOVEMENT" (35) to fix Defias Thug waypoint errors (#1721) * fix(DB): fix Defias Thug waypoint errors * implement SCRIPT_COMMAND_MOVEMENT (35); remove SQL script --- src/server/game/Globals/ObjectMgr.h | 10 +++++++++- src/server/game/Scripting/MapScripts.cpp | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 7a07cc756..70ed19585 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -110,7 +110,8 @@ enum ScriptCommands SCRIPT_COMMAND_EQUIP = 31, // soucre = Creature, datalong = equipment id SCRIPT_COMMAND_MODEL = 32, // source = Creature, datalong = model id SCRIPT_COMMAND_CLOSE_GOSSIP = 33, // source = Player - SCRIPT_COMMAND_PLAYMOVIE = 34 // source = Player, datalong = movie id + SCRIPT_COMMAND_PLAYMOVIE = 34, // source = Player, datalong = movie id + SCRIPT_COMMAND_MOVEMENT = 35 // soucre = Creature, datalong = MovementType, datalong2 = MovementDistance (spawndist f.ex.), dataint = pathid }; // Benchmarked: Faster than std::unordered_map (insert/find) @@ -359,6 +360,13 @@ struct ScriptInfo { uint32 MovieID; // datalong } PlayMovie; + + struct // SCRIPT_COMMAND_MOVEMENT (35) + { + uint32 MovementType; // datalong + uint32 MovementDistance; // datalong2 + int32 Path; // dataint + } Movement; }; std::string GetDebugInfo() const; diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 4609933d5..ea51fbb99 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -916,6 +916,28 @@ void Map::ScriptsProcess() player->SendMovieStart(step.script->PlayMovie.MovieID); break; + case SCRIPT_COMMAND_MOVEMENT: + // Source must be Creature. + if (Creature* cSource = _GetScriptCreature(source, true, step.script)) + { + if (!cSource->IsAlive()) + return; + + cSource->GetMotionMaster()->MovementExpired(); + cSource->GetMotionMaster()->MoveIdle(); + + switch (step.script->Movement.MovementType) + { + case RANDOM_MOTION_TYPE: + cSource->GetMotionMaster()->MoveRandom((float)step.script->Movement.MovementDistance); + break; + case WAYPOINT_MOTION_TYPE: + cSource->GetMotionMaster()->MovePath(step.script->Movement.Path, false); + break; + } + } + break; + default: sLog->outError("Unknown script command %s.", step.script->GetDebugInfo().c_str()); break;