mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-21 20:56:23 +00:00
184 lines
7.6 KiB
C++
184 lines
7.6 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version.
|
|
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
|
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
|
*/
|
|
|
|
#include "MoveSplineFlag.h"
|
|
#include <math.h>
|
|
#include <string>
|
|
|
|
namespace Movement
|
|
{
|
|
double gravity = 19.29110527038574;
|
|
UInt32Counter splineIdGen;
|
|
|
|
/// Velocity bounds that makes fall speed limited
|
|
float terminalVelocity = 60.148003f;
|
|
float terminalSafefallVelocity = 7.0f;
|
|
|
|
const float terminal_length = float(terminalVelocity* terminalVelocity) / (2.0f * gravity);
|
|
const float terminal_safeFall_length = (terminalSafefallVelocity* terminalSafefallVelocity) / (2.0f * gravity);
|
|
const float terminal_fallTime = float(terminalVelocity / gravity); // the time that needed to reach terminalVelocity
|
|
const float terminal_safeFall_fallTime = float(terminalSafefallVelocity / gravity); // the time that needed to reach terminalVelocity with safefall
|
|
|
|
float computeFallTime(float path_length, bool isSafeFall)
|
|
{
|
|
if (path_length < 0.0f)
|
|
return 0.0f;
|
|
|
|
float time;
|
|
if (isSafeFall)
|
|
{
|
|
if (path_length >= terminal_safeFall_length)
|
|
time = (path_length - terminal_safeFall_length) / terminalSafefallVelocity + terminal_safeFall_fallTime;
|
|
else
|
|
time = sqrtf(2.0f * path_length / gravity);
|
|
}
|
|
else
|
|
{
|
|
if (path_length >= terminal_length)
|
|
time = (path_length - terminal_length) / terminalVelocity + terminal_fallTime;
|
|
else
|
|
time = sqrtf(2.0f * path_length / gravity);
|
|
}
|
|
|
|
return time;
|
|
}
|
|
|
|
float computeFallElevation(float t_passed, bool isSafeFall, float start_velocity /*= 0.0f*/)
|
|
{
|
|
float termVel;
|
|
float result;
|
|
|
|
if (isSafeFall)
|
|
termVel = terminalSafefallVelocity;
|
|
else
|
|
termVel = terminalVelocity;
|
|
|
|
if (start_velocity > termVel)
|
|
start_velocity = termVel;
|
|
|
|
float terminal_time = (isSafeFall ? terminal_safeFall_fallTime : terminal_fallTime) - start_velocity / gravity; // the time that needed to reach terminalVelocity
|
|
|
|
if (t_passed > terminal_time)
|
|
{
|
|
result = termVel * (t_passed - terminal_time) +
|
|
start_velocity * terminal_time +
|
|
gravity * terminal_time * terminal_time * 0.5f;
|
|
}
|
|
else
|
|
result = t_passed * (start_velocity + t_passed * gravity * 0.5f);
|
|
|
|
return result;
|
|
}
|
|
|
|
#define STR(x) #x
|
|
|
|
char const* g_MovementFlag_names[] =
|
|
{
|
|
STR(Forward ), // 0x00000001,
|
|
STR(Backward ), // 0x00000002,
|
|
STR(Strafe_Left ), // 0x00000004,
|
|
STR(Strafe_Right ), // 0x00000008,
|
|
STR(Turn_Left ), // 0x00000010,
|
|
STR(Turn_Right ), // 0x00000020,
|
|
STR(Pitch_Up ), // 0x00000040,
|
|
STR(Pitch_Down ), // 0x00000080,
|
|
|
|
STR(Walk ), // 0x00000100, // Walking
|
|
STR(Ontransport ), // 0x00000200,
|
|
STR(Levitation ), // 0x00000400,
|
|
STR(Root ), // 0x00000800,
|
|
STR(Falling ), // 0x00001000,
|
|
STR(Fallingfar ), // 0x00002000,
|
|
STR(Pendingstop ), // 0x00004000,
|
|
STR(PendingSTRafestop ), // 0x00008000,
|
|
STR(Pendingforward ), // 0x00010000,
|
|
STR(Pendingbackward ), // 0x00020000,
|
|
STR(PendingSTRafeleft ), // 0x00040000,
|
|
STR(PendingSTRaferight ), // 0x00080000,
|
|
STR(Pendingroot ), // 0x00100000,
|
|
STR(Swimming ), // 0x00200000, // Appears With Fly Flag Also
|
|
STR(Ascending ), // 0x00400000, // Swim Up Also
|
|
STR(Descending ), // 0x00800000, // Swim Down Also
|
|
STR(Can_Fly ), // 0x01000000, // Can Fly In 3.3?
|
|
STR(Flying ), // 0x02000000, // Actual Flying Mode
|
|
STR(Spline_Elevation ), // 0x04000000, // Used For Flight Paths
|
|
STR(Spline_Enabled ), // 0x08000000, // Used For Flight Paths
|
|
STR(Waterwalking ), // 0x10000000, // Prevent Unit From Falling Through Water
|
|
STR(Safe_Fall ), // 0x20000000, // Active Rogue Safe Fall Spell (Passive)
|
|
STR(Hover ), // 0x40000000
|
|
STR(Unknown13 ), // 0x80000000
|
|
STR(Unk1 ),
|
|
STR(Unk2 ),
|
|
STR(Unk3 ),
|
|
STR(Fullspeedturning ),
|
|
STR(Fullspeedpitching ),
|
|
STR(Allow_Pitching ),
|
|
STR(Unk4 ),
|
|
STR(Unk5 ),
|
|
STR(Unk6 ),
|
|
STR(Unk7 ),
|
|
STR(Interp_Move ),
|
|
STR(Interp_Turning ),
|
|
STR(Interp_Pitching ),
|
|
STR(Unk8 ),
|
|
STR(Unk9 ),
|
|
STR(Unk10 ),
|
|
};
|
|
|
|
char const* g_SplineFlag_names[32] =
|
|
{
|
|
STR(AnimBit1 ), // 0x00000001,
|
|
STR(AnimBit2 ), // 0x00000002,
|
|
STR(AnimBit3 ), // 0x00000004,
|
|
STR(AnimBit4 ), // 0x00000008,
|
|
STR(AnimBit5 ), // 0x00000010,
|
|
STR(AnimBit6 ), // 0x00000020,
|
|
STR(AnimBit7 ), // 0x00000040,
|
|
STR(AnimBit8 ), // 0x00000080,
|
|
STR(Done ), // 0x00000100,
|
|
STR(Falling ), // 0x00000200, // Not Compartible With Trajectory Movement
|
|
STR(No_Spline ), // 0x00000400,
|
|
STR(Trajectory ), // 0x00000800, // Not Compartible With Fall Movement
|
|
STR(Walkmode ), // 0x00001000,
|
|
STR(Flying ), // 0x00002000, // Smooth Movement(Catmullrom Interpolation Mode), Flying Animation
|
|
STR(Knockback ), // 0x00004000, // Model Orientation Fixed
|
|
STR(Final_Point ), // 0x00008000,
|
|
STR(Final_Target ), // 0x00010000,
|
|
STR(Final_Angle ), // 0x00020000,
|
|
STR(Catmullrom ), // 0x00040000, // Used Catmullrom Interpolation Mode
|
|
STR(Cyclic ), // 0x00080000, // Movement By Cycled Spline
|
|
STR(Enter_Cycle ), // 0x00100000, // Everytime Appears With Cyclic Flag In Monster Move Packet
|
|
STR(Animation ), // 0x00200000, // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement
|
|
STR(Unknown4 ), // 0x00400000, // Disables Movement By Path
|
|
STR(Unknown5 ), // 0x00800000,
|
|
STR(Unknown6 ), // 0x01000000,
|
|
STR(Unknown7 ), // 0x02000000,
|
|
STR(Unknown8 ), // 0x04000000,
|
|
STR(OrientationInversed ), // 0x08000000, // Appears With Runmode Flag, Nodes ), // 1, Handles Orientation
|
|
STR(Unknown10 ), // 0x10000000,
|
|
STR(Unknown11 ), // 0x20000000,
|
|
STR(Unknown12 ), // 0x40000000,
|
|
STR(Unknown13 ), // 0x80000000,
|
|
};
|
|
|
|
template<class Flags, int N>
|
|
void print_flags(Flags t, char const * (&names)[N], std::string& str)
|
|
{
|
|
for (int i = 0; i < N; ++i)
|
|
{
|
|
if ((t & Flags(1 << i)) && names[i] != nullptr)
|
|
str.append(" ").append(names[i]);
|
|
}
|
|
}
|
|
|
|
std::string MoveSplineFlag::ToString() const
|
|
{
|
|
std::string str;
|
|
print_flags(raw(), g_SplineFlag_names, str);
|
|
return str;
|
|
}
|
|
}
|