diff --git a/Client/mods/deathmatch/logic/CClientGame.h b/Client/mods/deathmatch/logic/CClientGame.h index ce3f00c51e..c3ef59d6a7 100644 --- a/Client/mods/deathmatch/logic/CClientGame.h +++ b/Client/mods/deathmatch/logic/CClientGame.h @@ -272,6 +272,9 @@ class CClientGame void EnablePacketRecorder(const char* szFilename); void InitVoice(bool bEnabled, unsigned int uiServerSampleRate, unsigned char ucQuality, unsigned int uiBitrate); + void SetTimeOffsetFromServer(std::int64_t offset) noexcept { m_serverTimeOffset = offset; } + std::int64_t GetSyncedTime() const noexcept { return GetLocalTick() + m_serverTimeOffset; } + bool IsWindowFocused() const { return m_bFocused; } // Accessors @@ -928,6 +931,8 @@ class CClientGame MultiCommandHandlerPolicy m_allowMultiCommandHandlers; long long m_timeLastDiscordStateUpdate; + + std::int64_t m_serverTimeOffset; }; extern CClientGame* g_pClientGame; diff --git a/Client/mods/deathmatch/logic/CClientPed.cpp b/Client/mods/deathmatch/logic/CClientPed.cpp index 058186bcc8..81b0fb8981 100644 --- a/Client/mods/deathmatch/logic/CClientPed.cpp +++ b/Client/mods/deathmatch/logic/CClientPed.cpp @@ -2917,8 +2917,8 @@ void CClientPed::StreamedInPulse(bool bDoStandardPulses) } // Are we need to update anim speed & progress? - // We need to do it here because the anim starts on the next frame after calling RunNamedAnimation - if (m_pAnimationBlock && m_AnimationCache.progressWaitForStreamIn && IsAnimationInProgress()) + // We need to do it here because the anim starts in the next frame after calling RunNamedAnimation + if (m_pAnimationBlock && m_AnimationCache.updateInNextFrame && IsAnimationInProgress()) UpdateAnimationProgressAndSpeed(); // Update our alpha @@ -5784,7 +5784,7 @@ bool CClientPed::IsAnimationInProgress() if (!m_pAnimationBlock) return constAnim; - float elapsedTime = static_cast(GetTimestamp() - m_AnimationCache.startTime) / 1000.0f; + float elapsedTime = static_cast(g_pClientGame->GetSyncedTime() - m_AnimationCache.startTime) / 1000.0f; auto animBlendHierarchy = g_pGame->GetAnimManager()->GetAnimation(m_AnimationCache.strName.c_str(), m_pAnimationBlock); if (!animBlendHierarchy) @@ -5871,6 +5871,9 @@ void CClientPed::RunNamedAnimation(std::unique_ptr& pBlock, const ch { m_pAnimationBlock = g_pGame->GetAnimManager()->GetAnimBlock(pBlock->GetInterface()); } + + m_AnimationCache = SAnimationCache{}; + m_AnimationCache.strName = szAnimName; m_AnimationCache.iTime = iTime; m_AnimationCache.iBlend = iBlend; @@ -5897,7 +5900,7 @@ void CClientPed::KillAnimation() } } m_pAnimationBlock = NULL; - m_AnimationCache.strName = ""; + m_AnimationCache = SAnimationCache{}; m_bRequestedAnimation = false; SetNextAnimationNormal(); } @@ -5916,46 +5919,57 @@ void CClientPed::RunAnimationFromCache() if (!m_pAnimationBlock) return; - // Copy our name incase it gets deleted - std::string animName = m_AnimationCache.strName; + // Copy our name & startTime incase it gets deleted + std::string animName = m_AnimationCache.strName; + std::int64_t startTime = m_AnimationCache.startTime; // Run our animation RunNamedAnimation(m_pAnimationBlock, animName.c_str(), m_AnimationCache.iTime, m_AnimationCache.iBlend, m_AnimationCache.bLoop, m_AnimationCache.bUpdatePosition, m_AnimationCache.bInterruptable, m_AnimationCache.bFreezeLastFrame); - // Set anim progress & speed - m_AnimationCache.progressWaitForStreamIn = true; + // Restore our startTime + m_AnimationCache.startTime = startTime; + + // Let's update animation progress & speed + m_AnimationCache.updateInNextFrame = true; } void CClientPed::UpdateAnimationProgressAndSpeed() { - if (!m_AnimationCache.progressWaitForStreamIn) - return; - // Get current anim auto animAssoc = g_pGame->GetAnimManager()->RpAnimBlendClumpGetAssociation(GetClump(), m_AnimationCache.strName.c_str()); if (!animAssoc) return; - float animLength = animAssoc->GetLength(); + // Animation progress is calculated based on the animation duration + // The cached value is only set when setPedAnimationProgress is called by the client, and is then reset to NaN float progress = 0.0f; - float elapsedTime = static_cast(GetTimestamp() - m_AnimationCache.startTime) / 1000.0f; + if (std::isnan(m_AnimationCache.progress)) + { + float animLength = animAssoc->GetLength(); + float elapsedTime = static_cast(g_pClientGame->GetSyncedTime() - m_AnimationCache.startTime) / 1000.0f; - if (m_AnimationCache.bFreezeLastFrame) // time and loop is ignored if freezeLastFrame is true - progress = (elapsedTime / animLength) * m_AnimationCache.speed; + if (m_AnimationCache.bFreezeLastFrame) // time and loop is ignored if freezeLastFrame is true + progress = (elapsedTime / animLength) * m_AnimationCache.speed; + else + { + if (m_AnimationCache.bLoop) + progress = std::fmod(elapsedTime * m_AnimationCache.speed, animLength) / animLength; + else + // For non-looped animations, limit duration to animLength if time exceeds it + progress = (elapsedTime / (m_AnimationCache.iTime <= animLength ? m_AnimationCache.iTime : animLength)) * m_AnimationCache.speed; + } + } else { - if (m_AnimationCache.bLoop) - progress = std::fmod(elapsedTime * m_AnimationCache.speed, animLength) / animLength; - else - // For non-looped animations, limit duration to animLength if time exceeds it - progress = (elapsedTime / (m_AnimationCache.iTime <= animLength ? m_AnimationCache.iTime : animLength)) * m_AnimationCache.speed; + progress = m_AnimationCache.progress; + m_AnimationCache.progress = std::numeric_limits::quiet_NaN(); } animAssoc->SetCurrentProgress(std::clamp(progress, 0.0f, 1.0f)); animAssoc->SetCurrentSpeed(m_AnimationCache.speed); - m_AnimationCache.progressWaitForStreamIn = false; + m_AnimationCache.updateInNextFrame = false; } void CClientPed::PostWeaponFire() diff --git a/Client/mods/deathmatch/logic/CClientPed.h b/Client/mods/deathmatch/logic/CClientPed.h index 8bab35d984..3cf85aae8e 100644 --- a/Client/mods/deathmatch/logic/CClientPed.h +++ b/Client/mods/deathmatch/logic/CClientPed.h @@ -137,17 +137,17 @@ struct SReplacedAnimation struct SAnimationCache { - std::string strName; + std::string strName{}; int iTime{-1}; bool bLoop{false}; bool bUpdatePosition{false}; bool bInterruptable{false}; bool bFreezeLastFrame{true}; int iBlend{250}; - float progress{0.0f}; + float progress{std::numeric_limits::quiet_NaN()}; float speed{1.0f}; - bool progressWaitForStreamIn{false}; std::int64_t startTime{0}; + bool updateInNextFrame{false}; }; class CClientObject; @@ -724,7 +724,7 @@ class CClientPed : public CClientStreamElement, public CAntiCheatModule bool m_bDoingGangDriveby; std::unique_ptr m_pAnimationBlock; bool m_bRequestedAnimation; - SAnimationCache m_AnimationCache; + SAnimationCache m_AnimationCache{}; bool m_bHeadless; bool m_bFrozen; bool m_bFrozenWaitingForGroundToLoad; diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 113fe53774..84ddb48898 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -330,6 +330,7 @@ void CPacketHandler::Packet_ServerJoined(NetBitStreamInterface& bitStream) // unsigned short (2) - HTTP Download URL Size // unsigned char (X) - HTTP Download URL // unsigned char (X) - Server name + // int64 (X) - Server time // Make sure any existing messageboxes are hided g_pCore->RemoveMessageBox(); @@ -486,6 +487,10 @@ void CPacketHandler::Packet_ServerJoined(NetBitStreamInterface& bitStream) discord->SetPresenceDetails(serverName.c_str(), false); } } + + std::int64_t serverLocalTick; + bitStream.Read(serverLocalTick); + g_pClientGame->SetTimeOffsetFromServer(serverLocalTick - GetLocalTick()); } void CPacketHandler::Packet_ServerDisconnected(NetBitStreamInterface& bitStream) @@ -1014,11 +1019,11 @@ void CPacketHandler::Packet_PlayerList(NetBitStreamInterface& bitStream) // Animation if (bitStream.ReadBit()) { - std::string blockName, animName; - int time, blendTime; - bool looped, updatePosition, interruptable, freezeLastFrame, taskRestore; - float speed; - double startTime; + std::string blockName, animName; + int time, blendTime; + bool looped, updatePosition, interruptable, freezeLastFrame, taskRestore; + float speed; + std::int64_t startTime; // Read data bitStream.ReadString(blockName); @@ -1036,9 +1041,8 @@ void CPacketHandler::Packet_PlayerList(NetBitStreamInterface& bitStream) // Run anim CStaticFunctionDefinitions::SetPedAnimation(*pPlayer, blockName, animName.c_str(), time, blendTime, looped, updatePosition, interruptable, freezeLastFrame); - pPlayer->m_AnimationCache.startTime = static_cast(startTime); + pPlayer->m_AnimationCache.startTime = startTime; pPlayer->m_AnimationCache.speed = speed; - pPlayer->m_AnimationCache.progress = 0.0f; pPlayer->SetHasSyncedAnim(true); } @@ -3970,11 +3974,11 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) // Animation if (bitStream.ReadBit()) { - std::string blockName, animName; - int time, blendTime; - bool looped, updatePosition, interruptable, freezeLastFrame, taskRestore; - float speed; - float elapsedTime; + std::string blockName, animName; + int time, blendTime; + bool looped, updatePosition, interruptable, freezeLastFrame, taskRestore; + float speed; + std::int64_t startTime; // Read data bitStream.ReadString(blockName); @@ -3986,19 +3990,14 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) bitStream.ReadBit(freezeLastFrame); bitStream.Read(blendTime); bitStream.ReadBit(taskRestore); - bitStream.Read(elapsedTime); + bitStream.Read(startTime); bitStream.Read(speed); - // Server sends elapsed time rather than start time due to bitstream limitations regarding 64 bit integers. - const uint64_t nowTick = GetTickCount64_(); - const int64_t startTime = nowTick - elapsedTime; - // Run anim CStaticFunctionDefinitions::SetPedAnimation(*pPed, blockName, animName.c_str(), time, blendTime, looped, updatePosition, interruptable, freezeLastFrame); pPed->m_AnimationCache.startTime = startTime; pPed->m_AnimationCache.speed = speed; - pPed->m_AnimationCache.progress = 0.0f; pPed->SetHasSyncedAnim(true); } diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 2bb48dcff8..4defcc9b09 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -2258,13 +2258,16 @@ bool CStaticFunctionDefinitions::SetPedAnimation(CClientEntity& Entity, const SS CClientPed& Ped = static_cast(Entity); if (strBlockName && szAnimName) { + bool success = false; + std::unique_ptr pBlock = g_pGame->GetAnimManager()->GetAnimationBlock(strBlockName); if (pBlock) { Ped.SetCurrentAnimationCustom(false); Ped.SetNextAnimationNormal(); Ped.RunNamedAnimation(pBlock, szAnimName, iTime, iBlend, bLoop, bUpdatePosition, bInterruptable, bFreezeLastFrame); - return true; + + success = true; } else { @@ -2283,12 +2286,16 @@ bool CStaticFunctionDefinitions::SetPedAnimation(CClientEntity& Entity, const SS const char* szGateWayAnimationName = g_pGame->GetAnimManager()->GetGateWayAnimationName(); Ped.RunNamedAnimation(pBlock, szGateWayAnimationName, iTime, iBlend, bLoop, bUpdatePosition, bInterruptable, bFreezeLastFrame); - return true; + + success = true; } } } - Ped.m_AnimationCache.startTime = GetTimestamp(); + if (success) + Ped.m_AnimationCache.startTime = g_pClientGame->GetSyncedTime(); + + return success; } else { @@ -2311,12 +2318,14 @@ bool CStaticFunctionDefinitions::SetPedAnimationProgress(CClientEntity& Entity, { auto pAnimAssociation = g_pGame->GetAnimManager()->RpAnimBlendClumpGetAssociation(Ped.GetClump(), strAnimName); if (pAnimAssociation) - { pAnimAssociation->SetCurrentProgress(fProgress); - return true; + else + { + Ped.m_AnimationCache.progress = fProgress; + Ped.m_AnimationCache.updateInNextFrame = true; } - Ped.m_AnimationCache.progress = fProgress; + return true; } else { @@ -2340,12 +2349,12 @@ bool CStaticFunctionDefinitions::SetPedAnimationSpeed(CClientEntity& Entity, con { auto pAnimAssociation = g_pGame->GetAnimManager()->RpAnimBlendClumpGetAssociation(Ped.GetClump(), strAnimName); if (pAnimAssociation) - { pAnimAssociation->SetCurrentSpeed(fSpeed); - return true; - } + else + Ped.m_AnimationCache.updateInNextFrame = true; Ped.m_AnimationCache.speed = fSpeed; + return true; } } diff --git a/Client/mods/deathmatch/logic/rpc/CPedRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CPedRPCs.cpp index 00ab607e11..2806885b2c 100644 --- a/Client/mods/deathmatch/logic/rpc/CPedRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CPedRPCs.cpp @@ -274,9 +274,8 @@ void CPedRPCs::SetPedAnimation(CClientEntity* pSource, NetBitStreamInterface& bi pPed->SetTaskToBeRestoredOnAnimEnd(bTaskToBeRestoredOnAnimEnd); pPed->SetTaskTypeToBeRestoredOnAnimEnd((eTaskType)TASK_SIMPLE_DUCK); - pPed->m_AnimationCache.startTime = GetTimestamp(); + pPed->m_AnimationCache.startTime = g_pClientGame->GetSyncedTime(); pPed->m_AnimationCache.speed = 1.0f; - pPed->m_AnimationCache.progress = 0.0f; pPed->SetHasSyncedAnim(true); } @@ -308,9 +307,11 @@ void CPedRPCs::SetPedAnimationProgress(CClientEntity* pSource, NetBitStreamInter { auto pAnimAssociation = g_pGame->GetAnimManager()->RpAnimBlendClumpGetAssociation(pPed->GetClump(), animName.c_str()); if (pAnimAssociation) - { pAnimAssociation->SetCurrentProgress(fProgress); + else + { pPed->m_AnimationCache.progress = fProgress; + pPed->m_AnimationCache.updateInNextFrame = true; } } } diff --git a/Server/mods/deathmatch/logic/CPed.h b/Server/mods/deathmatch/logic/CPed.h index 11da52a642..01fb9054c4 100644 --- a/Server/mods/deathmatch/logic/CPed.h +++ b/Server/mods/deathmatch/logic/CPed.h @@ -105,20 +105,17 @@ enum eBone struct SPlayerAnimData { - std::string blockName{}; - std::string animName{}; - int time{-1}; - bool loop{true}; - bool updatePosition{true}; - bool interruptable{true}; - bool freezeLastFrame{true}; - int blendTime{250}; - bool taskToBeRestoredOnAnimEnd{false}; - + std::string blockName{}; + std::string animName{}; + int time{-1}; + bool loop{true}; + bool updatePosition{true}; + bool interruptable{true}; + bool freezeLastFrame{true}; + int blendTime{250}; + bool taskToBeRestoredOnAnimEnd{false}; std::int64_t startTime{0}; - - float progress{0.0f}; - float speed{1.0f}; + float speed{1.0f}; bool IsAnimating() const noexcept { return !blockName.empty() && !animName.empty(); } }; @@ -304,9 +301,9 @@ class CPed : public CElement std::vector::const_iterator NearPlayersIterBegin() { return m_nearPlayersList.begin(); } std::vector::const_iterator NearPlayersIterEnd() { return m_nearPlayersList.end(); } - const SPlayerAnimData& GetAnimationData() const noexcept { return m_animData; }; - void SetAnimationData(const SPlayerAnimData& animData) { m_animData = animData; }; - void SetAnimationProgress(float progress) { m_animData.progress = progress; }; + const SPlayerAnimData& GetAnimationData() const noexcept { return m_animData; } + SPlayerAnimData GetAnimationData() noexcept { return m_animData; } + void SetAnimationData(const SPlayerAnimData& animData) { m_animData = animData; } void SetAnimationSpeed(float speed) { m_animData.speed = speed; }; void SetHanging(bool hanging) noexcept { m_hanging = hanging; } diff --git a/Server/mods/deathmatch/logic/CPedSync.cpp b/Server/mods/deathmatch/logic/CPedSync.cpp index 0523d7beb3..0d4073c5cf 100644 --- a/Server/mods/deathmatch/logic/CPedSync.cpp +++ b/Server/mods/deathmatch/logic/CPedSync.cpp @@ -20,6 +20,7 @@ #include "CColManager.h" #include "CSpatialDatabase.h" #include "CPlayerCamera.h" +#include CPedSync::CPedSync(CPlayerManager* pPlayerManager, CPedManager* pPedManager) { @@ -82,7 +83,7 @@ void CPedSync::OverrideSyncer(CPed* pPed, CPlayer* pPlayer, bool bPersist) void CPedSync::UpdateAllSyncer() { - auto currentTimestamp = GetTimestamp(); + auto currentLocalTick = GetLocalTick(); // Update all the ped's sync states for (auto iter = m_pPedManager->IterBegin(); iter != m_pPedManager->IterEnd(); iter++) @@ -91,9 +92,10 @@ void CPedSync::UpdateAllSyncer() const SPlayerAnimData& animData = (*iter)->GetAnimationData(); if (animData.IsAnimating()) { - const std::int64_t elapsedMs = currentTimestamp >= animData.startTime ? (currentTimestamp - animData.startTime) : 0; - const float deltaTime = static_cast(elapsedMs); - if (!animData.freezeLastFrame && animData.time > 0 && deltaTime >= animData.time) + // 1. time < 0, loop = true, anim never ends + // 2. time >= 0, loop = true, anim run for time + std::int64_t elapsedTime = currentLocalTick - animData.startTime; + if (!animData.freezeLastFrame && animData.time >= 0 && elapsedTime >= animData.time) (*iter)->SetAnimationData({}); } diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index d91d903322..79c1fe0f5a 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -54,6 +54,7 @@ #include "CUnoccupiedVehicleSync.h" #include "Utils.h" #include "CameraScriptShared.h" +#include #include "lua/CLuaFunctionParseHelpers.h" #include "packets/CLuaPacket.h" #include "packets/CElementRPCPacket.h" @@ -78,6 +79,7 @@ #ifndef MAX_PATH #define MAX_PATH PATH_MAX #endif + #endif extern CGame* g_pGame; @@ -4491,7 +4493,7 @@ bool CStaticFunctionDefinitions::SetPedAnimation(CElement* pElement, const SStri // Store anim data pPed->SetAnimationData(SPlayerAnimData{blockName, animName, iTime, bLoop, bUpdatePosition, bInterruptable, bFreezeLastFrame, iBlend, - bTaskToBeRestoredOnAnimEnd, GetTickCount64_()}); + bTaskToBeRestoredOnAnimEnd, GetLocalTick()}); BitStream.pBitStream->WriteString(blockName); BitStream.pBitStream->WriteString(animName); @@ -4535,7 +4537,10 @@ bool CStaticFunctionDefinitions::SetPedAnimationProgress(CElement* pElement, con BitStream.pBitStream->WriteString(animName); BitStream.pBitStream->Write(fProgress); - pPed->SetAnimationProgress(fProgress); + // Update animation startTime + SPlayerAnimData data = pPed->GetAnimationData(); + data.startTime = GetLocalTick() - static_cast((GetAnimationLength(animName) * 1000.0f) * fProgress); + pPed->SetAnimationData(data); } else { diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index 0a92e76376..0652b8248e 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -968,12 +968,8 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const BitStream.Write(animData.blendTime); BitStream.WriteBit(animData.taskToBeRestoredOnAnimEnd); - // Write elapsed time & speed - const uint64_t nowTick = GetTickCount64_(); - const uint64_t elapsedMs = - nowTick >= static_cast(animData.startTime) ? (nowTick - static_cast(animData.startTime)) : 0; - const float elapsedTime = static_cast(elapsedMs); - BitStream.Write(elapsedTime); + // Write start time & speed + BitStream.Write(animData.startTime); BitStream.Write(animData.speed); } diff --git a/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.cpp b/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.cpp index e4c821532b..fa9e0bab20 100644 --- a/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.cpp @@ -45,6 +45,7 @@ CPlayerJoinCompletePacket::CPlayerJoinCompletePacket(ElementID PlayerID, Element m_ucQuality = ucVoiceQuality; m_uiBitrate = uiBitrate; m_szServerName = szServerName; + m_serverTime = GetLocalTick(); switch (m_ucHTTPDownloadType) { @@ -120,6 +121,7 @@ bool CPlayerJoinCompletePacket::Write(NetBitStreamInterface& BitStream) const } BitStream.WriteString(m_szServerName); + BitStream.Write(m_serverTime); return true; } diff --git a/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.h b/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.h index 42849df51b..60e3bede10 100644 --- a/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.h +++ b/Server/mods/deathmatch/logic/packets/CPlayerJoinCompletePacket.h @@ -41,4 +41,5 @@ class CPlayerJoinCompletePacket final : public CPacket unsigned char m_ucQuality; unsigned int m_uiBitrate; const char* m_szServerName; + std::int64_t m_serverTime; }; diff --git a/Server/mods/deathmatch/logic/packets/CPlayerListPacket.cpp b/Server/mods/deathmatch/logic/packets/CPlayerListPacket.cpp index fd20c1d7fd..f3bbc5c802 100644 --- a/Server/mods/deathmatch/logic/packets/CPlayerListPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CPlayerListPacket.cpp @@ -237,7 +237,7 @@ bool CPlayerListPacket::Write(NetBitStreamInterface& BitStream) const BitStream.WriteBit(animData.freezeLastFrame); BitStream.Write(animData.blendTime); BitStream.WriteBit(animData.taskToBeRestoredOnAnimEnd); - BitStream.Write(static_cast(animData.startTime)); + BitStream.Write(animData.startTime); BitStream.Write(animData.speed); } } diff --git a/Shared/sdk/CAnimationsData.h b/Shared/sdk/CAnimationsData.h new file mode 100644 index 0000000000..08928c4ba4 --- /dev/null +++ b/Shared/sdk/CAnimationsData.h @@ -0,0 +1,1784 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * LICENSE: See LICENSE in the top level directory + * FILE: shared/sdk/CAnimationsData.h + * PURPOSE: SA Animations details + * + * Multi Theft Auto is available from https://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +#include +#include +#include + +const std::unordered_map g_animationDurations = { + {"thrw_barl_thrw", 2.0f}, + {"stepsit_in", 1.67f}, + {"stepsit_loop", 3.33f}, + {"stepsit_out", 1.67f}, + {"barcustom_get", 3.0f}, + {"barcustom_loop", 2.0f}, + {"barcustom_order", 3.67f}, + {"barman_idle", 8.33f}, + {"barserve_bottle", 3.0f}, + {"barserve_give", 2.33f}, + {"barserve_glass", 3.67f}, + {"barserve_in", 1.67f}, + {"barserve_loop", 2.33f}, + {"barserve_order", 3.67f}, + {"dnk_stndf_loop", 2.33f}, + {"dnk_stndm_loop", 2.33f}, + {"bat_1", 0.9f}, + {"bat_2", 1.13f}, + {"bat_3", 1.2f}, + {"bat_4", 1.0f}, + {"bat_block", 0.47f}, + {"bat_hit_1", 0.83f}, + {"bat_hit_2", 1.07f}, + {"bat_hit_3", 1.13f}, + {"bat_idle", 0.93f}, + {"bat_m", 0.53f}, + {"bat_part", 0.53f}, + {"bd_fire1", 1.83f}, + {"bd_fire2", 1.67f}, + {"bd_fire3", 1.83f}, + {"bd_gf_wave", 5.07f}, + {"bd_panic_01", 3.33f}, + {"bd_panic_02", 3.33f}, + {"bd_panic_03", 3.33f}, + {"bd_panic_04", 3.33f}, + {"bd_panic_loop", 3.33f}, + {"grlfrd_kiss_03", 7.0f}, + {"m_smklean_loop", 5.0f}, + {"playa_kiss_03", 7.0f}, + {"wash_up", 3.0f}, + {"bather", 4.2f}, + {"lay_bac_loop", 2.67f}, + {"parksit_m_loop", 3.67f}, + {"parksit_w_loop", 3.33f}, + {"sitnwait_loop_w", 1.33f}, + {"gym_bp_celebrate", 5.0f}, + {"gym_bp_down", 1.0f}, + {"gym_bp_getoff", 8.67f}, + {"gym_bp_geton", 5.33f}, + {"gym_bp_up_a", 2.33f}, + {"gym_bp_up_b", 2.67f}, + {"gym_bp_up_smooth", 1.33f}, + {"bf_getin_lhs", 1.0f}, + {"bf_getin_rhs", 1.0f}, + {"bf_getout_lhs", 1.13f}, + {"bf_getout_rhs", 1.13f}, + {"biked_back", 0.1f}, + {"biked_drivebyft", 0.2f}, + {"biked_drivebylhs", 0.2f}, + {"biked_drivebyrhs", 0.2f}, + {"biked_fwd", 0.2f}, + {"biked_getoffback", 1.47f}, + {"biked_getofflhs", 1.0f}, + {"biked_getoffrhs", 1.0f}, + {"biked_hit", 0.03f}, + {"biked_jumponl", 0.97f}, + {"biked_jumponr", 0.97f}, + {"biked_kick", 1.07f}, + {"biked_left", 0.1f}, + {"biked_passenger", 0.03f}, + {"biked_pushes", 0.8f}, + {"biked_ride", 0.03f}, + {"biked_right", 0.1f}, + {"biked_shuffle", 0.43f}, + {"biked_still", 0.03f}, + {"bikeh_back", 0.1f}, + {"bikeh_drivebyft", 0.2f}, + {"bikeh_drivebylhs", 0.2f}, + {"bikeh_drivebyrhs", 0.2f}, + {"bikeh_fwd", 0.2f}, + {"bikeh_getoffback", 1.7f}, + {"bikeh_getofflhs", 0.77f}, + {"bikeh_getoffrhs", 0.73f}, + {"bikeh_hit", 0.03f}, + {"bikeh_jumponl", 1.47f}, + {"bikeh_jumponr", 1.5f}, + {"bikeh_kick", 1.07f}, + {"bikeh_left", 0.13f}, + {"bikeh_passenger", 0.03f}, + {"bikeh_pushes", 0.97f}, + {"bikeh_ride", 0.03f}, + {"bikeh_right", 0.13f}, + {"bikeh_still", 0.03f}, + {"bk_blnce_in", 1.9f}, + {"bk_blnce_out", 1.0f}, + {"bk_jmp", 0.4f}, + {"bk_rdy_in", 0.5f}, + {"bk_rdy_out", 0.4f}, + {"struggle_cesar", 0.47f}, + {"struggle_driver", 0.47f}, + {"truck_driver", 0.73f}, + {"truck_getin", 2.5f}, + {"bikes_back", 0.1f}, + {"bikes_drivebyft", 0.2f}, + {"bikes_drivebylhs", 0.2f}, + {"bikes_drivebyrhs", 0.2f}, + {"bikes_fwd", 0.2f}, + {"bikes_getoffback", 2.43f}, + {"bikes_getofflhs", 1.1f}, + {"bikes_getoffrhs", 1.1f}, + {"bikes_hit", 0.03f}, + {"bikes_jumponl", 0.9f}, + {"bikes_jumponr", 0.9f}, + {"bikes_kick", 1.0f}, + {"bikes_left", 0.1f}, + {"bikes_passenger", 0.03f}, + {"bikes_pushes", 0.73f}, + {"bikes_ride", 0.03f}, + {"bikes_right", 0.1f}, + {"bikes_snatch_l", 0.43f}, + {"bikes_snatch_r", 0.43f}, + {"bikes_still", 0.03f}, + {"bikev_back", 0.17f}, + {"bikev_drivebyft", 0.17f}, + {"bikev_drivebylhs", 0.23f}, + {"bikev_drivebyrhs", 0.2f}, + {"bikev_fwd", 0.2f}, + {"bikev_getoffback", 1.7f}, + {"bikev_getofflhs", 0.67f}, + {"bikev_getoffrhs", 0.67f}, + {"bikev_hit", 0.03f}, + {"bikev_jumponl", 0.67f}, + {"bikev_jumponr", 0.67f}, + {"bikev_kick", 1.0f}, + {"bikev_left", 0.1f}, + {"bikev_passenger", 0.03f}, + {"bikev_pushes", 0.73f}, + {"bikev_ride", 0.03f}, + {"bikev_right", 0.1f}, + {"bikev_still", 0.03f}, + {"pass_driveby_bwd", 0.83f}, + {"pass_driveby_fwd", 0.83f}, + {"pass_driveby_lhs", 0.83f}, + {"pass_driveby_rhs", 0.83f}, + {"bj_car_end_p", 4.13f}, + {"bj_car_end_w", 3.67f}, + {"bj_car_loop_p", 0.67f}, + {"bj_car_loop_w", 0.67f}, + {"bj_car_start_p", 2.33f}, + {"bj_car_start_w", 2.33f}, + {"bj_couch_end_p", 7.67f}, + {"bj_couch_end_w", 7.67f}, + {"bj_couch_loop_p", 2.0f}, + {"bj_couch_loop_w", 2.0f}, + {"bj_couch_start_p", 5.33f}, + {"bj_couch_start_w", 5.33f}, + {"bj_stand_end_p", 4.87f}, + {"bj_stand_end_w", 5.33f}, + {"bj_stand_loop_p", 0.67f}, + {"bj_stand_loop_w", 0.67f}, + {"bj_stand_start_p", 2.0f}, + {"bj_stand_start_w", 2.0f}, + {"bmx_back", 0.1f}, + {"bmx_bunnyhop", 0.33f}, + {"bmx_drivebyft", 0.2f}, + {"bmx_driveby_lhs", 0.2f}, + {"bmx_driveby_rhs", 0.2f}, + {"bmx_fwd", 0.13f}, + {"bmx_getoffback", 1.37f}, + {"bmx_getofflhs", 0.73f}, + {"bmx_getoffrhs", 0.63f}, + {"bmx_jumponl", 0.9f}, + {"bmx_jumponr", 0.9f}, + {"bmx_left", 0.13f}, + {"bmx_pedal", 0.73f}, + {"bmx_pushes", 0.8f}, + {"bmx_ride", 0.03f}, + {"bmx_right", 0.13f}, + {"bmx_sprint", 0.67f}, + {"bmx_still", 0.03f}, + {"bom_plant", 2.67f}, + {"bom_plant_2idle", 1.0f}, + {"bom_plant_crouch_in", 0.8f}, + {"bom_plant_crouch_out", 0.8f}, + {"bom_plant_in", 0.87f}, + {"bom_plant_loop", 0.8f}, + {"boxhipin", 6.53f}, + {"boxhipup", 5.0f}, + {"boxshdwn", 6.1f}, + {"boxshup", 5.2f}, + {"bxhipwlk", 1.5f}, + {"bxhwlki", 0.97f}, + {"bxshwlk", 2.5f}, + {"bxshwlki", 0.97f}, + {"bxwlko", 0.53f}, + {"catch_box", 1.5f}, + {"bball_def_jump_shot", 1.17f}, + {"bball_def_loop", 1.0f}, + {"bball_def_stepl", 0.6f}, + {"bball_def_stepr", 0.6f}, + {"bball_dnk", 1.4f}, + {"bball_dnk_gli", 0.37f}, + {"bball_dnk_gli_o", 0.37f}, + {"bball_dnk_lnch", 0.2f}, + {"bball_dnk_lnch_o", 0.2f}, + {"bball_dnk_lnd", 0.93f}, + {"bball_dnk_o", 0.1f}, + {"bball_idle", 2.43f}, + {"bball_idle2", 2.67f}, + {"bball_idle2_o", 2.67f}, + {"bball_idleloop", 0.67f}, + {"bball_idleloop_o", 0.67f}, + {"bball_idle_o", 2.43f}, + {"bball_jump_cancel", 1.07f}, + {"bball_jump_cancel_o", 1.07f}, + {"bball_jump_end", 0.93f}, + {"bball_jump_shot", 1.67f}, + {"bball_jump_shot_o", 0.67f}, + {"bball_net_dnk_o", 1.83f}, + {"bball_pickup", 1.83f}, + {"bball_pickup_o", 1.83f}, + {"bball_react_miss", 0.8f}, + {"bball_react_score", 1.1f}, + {"bball_run", 0.9f}, + {"bball_run_o", 0.9f}, + {"bball_skidstop_l", 0.5f}, + {"bball_skidstop_l_o", 0.5f}, + {"bball_skidstop_r", 0.5f}, + {"bball_skidstop_r_o", 0.5f}, + {"bball_walk", 1.07f}, + {"bball_walkstop_l", 0.5f}, + {"bball_walkstop_l_o", 0.5f}, + {"bball_walkstop_r", 0.5f}, + {"bball_walkstop_r_o", 0.5f}, + {"bball_walk_o", 1.07f}, + {"bball_walk_start", 0.2f}, + {"bball_walk_start_o", 0.2f}, + {"buddy_crouchfire", 0.87f}, + {"buddy_crouchreload", 1.1f}, + {"buddy_fire", 0.8f}, + {"buddy_fire_poor", 1.33f}, + {"buddy_reload", 1.3f}, + {"bus_close", 0.4f}, + {"bus_getin_lhs", 0.33f}, + {"bus_getin_rhs", 2.17f}, + {"bus_getout_lhs", 0.8f}, + {"bus_getout_rhs", 1.87f}, + {"bus_jacked_lhs", 1.13f}, + {"bus_open", 1.47f}, + {"bus_open_rhs", 1.2f}, + {"bus_pullout_lhs", 0.8f}, + {"camcrch_cmon", 2.33f}, + {"camcrch_idleloop", 2.0f}, + {"camcrch_stay", 2.0f}, + {"camcrch_to_camstnd", 1.33f}, + {"camstnd_cmon", 3.0f}, + {"camstnd_idleloop", 2.0f}, + {"camstnd_lkabt", 4.33f}, + {"camstnd_to_camcrch", 1.0f}, + {"piccrch_in", 1.33f}, + {"piccrch_out", 2.0f}, + {"piccrch_take", 1.0f}, + {"picstnd_in", 1.0f}, + {"picstnd_out", 0.67f}, + {"picstnd_take", 1.0f}, + {"fixn_car_loop", 5.0f}, + {"fixn_car_out", 2.33f}, + {"flag_drop", 4.5f}, + {"sit_relaxed", 0.03f}, + {"tap_hand", 0.03f}, + {"tyd2car_bump", 0.83f}, + {"tyd2car_high", 8.0f}, + {"tyd2car_low", 6.67f}, + {"tyd2car_med", 6.67f}, + {"tyd2car_turnl", 1.0f}, + {"tyd2car_turnr", 1.0f}, + {"crry_prtial", 0.03f}, + {"liftup", 1.53f}, + {"liftup05", 0.63f}, + {"liftup105", 0.67f}, + {"putdwn", 1.13f}, + {"putdwn05", 0.67f}, + {"putdwn105", 0.53f}, + {"carfone_in", 6.0f}, + {"carfone_loopa", 4.0f}, + {"carfone_loopa_to_b", 1.0f}, + {"carfone_loopb", 5.0f}, + {"carfone_loopb_to_a", 0.67f}, + {"carfone_out", 3.0f}, + {"car_sc1_bl", 11.67f}, + {"car_sc1_br", 11.67f}, + {"car_sc1_fl", 11.67f}, + {"car_sc1_fr", 11.67f}, + {"car_sc2_fl", 5.0f}, + {"car_sc3_br", 10.83f}, + {"car_sc3_fl", 10.83f}, + {"car_sc3_fr", 10.83f}, + {"car_sc4_bl", 4.4f}, + {"car_sc4_br", 6.53f}, + {"car_sc4_fl", 10.0f}, + {"car_sc4_fr", 10.0f}, + {"car_talkm_in", 1.67f}, + {"car_talkm_loop", 4.33f}, + {"car_talkm_out", 7.33f}, + {"cards_in", 0.67f}, + {"cards_loop", 3.33f}, + {"cards_lose", 3.33f}, + {"cards_out", 0.67f}, + {"cards_pick_01", 4.67f}, + {"cards_pick_02", 5.33f}, + {"cards_raise", 1.67f}, + {"cards_win", 3.0f}, + {"dealone", 0.8f}, + {"manwinb", 1.5f}, + {"manwind", 1.67f}, + {"roulette_bet", 2.33f}, + {"roulette_in", 0.67f}, + {"roulette_loop", 3.67f}, + {"roulette_lose", 2.67f}, + {"roulette_out", 0.67f}, + {"roulette_win", 2.33f}, + {"slot_bet_01", 4.67f}, + {"slot_bet_02", 2.0f}, + {"slot_in", 3.67f}, + {"slot_lose_out", 4.0f}, + {"slot_plyr", 1.33f}, + {"slot_wait", 3.67f}, + {"slot_win_out", 9.33f}, + {"wof", 1.47f}, + {"csaw_1", 1.0f}, + {"csaw_2", 1.03f}, + {"csaw_3", 0.87f}, + {"csaw_g", 1.17f}, + {"csaw_hit_1", 0.83f}, + {"csaw_hit_2", 1.07f}, + {"csaw_hit_3", 1.13f}, + {"csaw_part", 0.13f}, + {"idle_csaw", 1.53f}, + {"weapon_csaw", 1.33f}, + {"weapon_csawlo", 1.9f}, + {"choppa_back", 0.1f}, + {"choppa_bunnyhop", 0.33f}, + {"choppa_drivebyft", 0.2f}, + {"choppa_driveby_lhs", 0.2f}, + {"choppa_driveby_rhs", 0.2f}, + {"choppa_fwd", 0.2f}, + {"choppa_getoffback", 1.27f}, + {"choppa_getofflhs", 0.73f}, + {"choppa_getoffrhs", 0.63f}, + {"choppa_jumponl", 0.7f}, + {"choppa_jumponr", 0.8f}, + {"choppa_left", 0.13f}, + {"choppa_pedal", 0.73f}, + {"choppa_pushes", 0.8f}, + {"choppa_ride", 0.03f}, + {"choppa_right", 0.13f}, + {"choppa_sprint", 0.67f}, + {"choppa_still", 0.03f}, + {"clo_buy", 2.07f}, + {"clo_in", 4.0f}, + {"clo_out", 2.67f}, + {"clo_pose_hat", 3.33f}, + {"clo_pose_in", 3.13f}, + {"clo_pose_in_o", 4.0f}, + {"clo_pose_legs", 3.33f}, + {"clo_pose_loop", 6.0f}, + {"clo_pose_out", 4.0f}, + {"clo_pose_out_o", 4.0f}, + {"clo_pose_shoes", 3.33f}, + {"clo_pose_torso", 3.33f}, + {"clo_pose_watch", 3.33f}, + {"coach_inl", 2.17f}, + {"coach_inr", 2.2f}, + {"coach_opnl", 1.2f}, + {"coach_opnr", 1.2f}, + {"coach_outl", 1.73f}, + {"coach_outr", 1.83f}, + {"2guns_crouchfire", 0.8f}, + {"colt45_crouchfire", 0.8f}, + {"colt45_crouchreload", 1.0f}, + {"colt45_fire", 0.73f}, + {"colt45_fire_2hands", 0.87f}, + {"colt45_reload", 0.93f}, + {"sawnoff_reload", 0.93f}, + {"copbrowse_in", 5.0f}, + {"copbrowse_loop", 2.33f}, + {"copbrowse_nod", 4.0f}, + {"copbrowse_out", 2.67f}, + {"copbrowse_shake", 1.83f}, + {"coplook_in", 1.33f}, + {"coplook_loop", 2.67f}, + {"coplook_nod", 5.33f}, + {"coplook_out", 0.67f}, + {"coplook_shake", 4.0f}, + {"coplook_think", 3.33f}, + {"coplook_watch", 2.0f}, + {"cop_dvby_b", 0.83f}, + {"cop_dvby_ft", 0.83f}, + {"cop_dvby_l", 0.83f}, + {"cop_dvby_r", 0.83f}, + {"bbalbat_idle_01", 6.67f}, + {"bbalbat_idle_02", 10.0f}, + {"crckdeth1", 2.17f}, + {"crckdeth2", 3.0f}, + {"crckdeth3", 2.17f}, + {"crckdeth4", 1.67f}, + {"crckidle1", 3.5f}, + {"crckidle2", 3.33f}, + {"crckidle3", 3.33f}, + {"crckidle4", 2.67f}, + {"crib_console_loop", 3.0f}, + {"crib_use_switch", 1.17f}, + {"ped_console_loop", 3.0f}, + {"ped_console_loose", 3.5f}, + {"ped_console_win", 3.5f}, + {"dam_dive_loop", 1.33f}, + {"dam_land", 2.6f}, + {"dam_launch", 2.4f}, + {"jump_roll", 3.17f}, + {"sf_jumpwall", 3.0f}, + {"bd_clap", 3.2f}, + {"bd_clap1", 2.63f}, + {"dance_loop", 1.17f}, + {"dan_down_a", 1.0f}, + {"dan_left_a", 1.0f}, + {"dan_loop_a", 2.0f}, + {"dan_right_a", 1.0f}, + {"dan_up_a", 1.0f}, + {"dnce_m_a", 2.13f}, + {"dnce_m_b", 1.93f}, + {"dnce_m_c", 1.93f}, + {"dnce_m_d", 2.43f}, + {"dnce_m_e", 0.9f}, + {"dealer_deal", 1.17f}, + {"dealer_idle", 2.0f}, + {"dealer_idle_01", 5.0f}, + {"dealer_idle_02", 4.0f}, + {"dealer_idle_03", 4.67f}, + {"drugs_buy", 1.17f}, + {"shop_pay", 6.67f}, + {"dildo_1", 0.97f}, + {"dildo_2", 1.1f}, + {"dildo_3", 1.17f}, + {"dildo_block", 0.47f}, + {"dildo_g", 1.47f}, + {"dildo_hit_1", 0.77f}, + {"dildo_hit_2", 1.03f}, + {"dildo_hit_3", 0.9f}, + {"dildo_idle", 0.87f}, + {"cover_dive_01", 6.0f}, + {"cover_dive_02", 6.0f}, + {"crushed", 0.93f}, + {"crush_jump", 3.17f}, + {"dozer_align_lhs", 0.97f}, + {"dozer_align_rhs", 0.93f}, + {"dozer_getin_lhs", 0.43f}, + {"dozer_getin_rhs", 0.43f}, + {"dozer_getout_lhs", 1.07f}, + {"dozer_getout_rhs", 0.77f}, + {"dozer_jacked_lhs", 1.27f}, + {"dozer_jacked_rhs", 1.07f}, + {"dozer_pullout_lhs", 0.73f}, + {"dozer_pullout_rhs", 0.7f}, + {"gang_drivebylhs", 0.83f}, + {"gang_drivebylhs_bwd", 0.83f}, + {"gang_drivebylhs_fwd", 0.83f}, + {"gang_drivebyrhs", 0.83f}, + {"gang_drivebyrhs_bwd", 0.83f}, + {"gang_drivebyrhs_fwd", 0.83f}, + {"gang_drivebytop_lhs", 0.83f}, + {"gang_drivebytop_rhs", 0.83f}, + {"fatidle", 1.5f}, + {"fatidle_armed", 1.53f}, + {"fatidle_csaw", 1.5f}, + {"fatidle_rocket", 1.6f}, + {"fatrun", 0.77f}, + {"fatrun_armed", 0.77f}, + {"fatrun_csaw", 0.77f}, + {"fatrun_rocket", 0.77f}, + {"fatsprint", 0.6f}, + {"fatwalk", 1.17f}, + {"fatwalkstart", 0.2f}, + {"fatwalkstart_csaw", 0.2f}, + {"fatwalkst_armed", 0.2f}, + {"fatwalkst_rocket", 0.2f}, + {"fatwalk_armed", 1.17f}, + {"fatwalk_csaw", 1.17f}, + {"fatwalk_rocket", 1.17f}, + {"idle_tired", 1.0f}, + {"fightb_1", 0.73f}, + {"fightb_2", 1.1f}, + {"fightb_3", 1.2f}, + {"fightb_block", 0.47f}, + {"fightb_g", 1.07f}, + {"fightb_idle", 0.8f}, + {"fightb_m", 0.5f}, + {"hitb_1", 0.73f}, + {"hitb_2", 0.83f}, + {"hitb_3", 1.43f}, + {"fightc_1", 0.83f}, + {"fightc_2", 1.03f}, + {"fightc_3", 1.0f}, + {"fightc_block", 0.47f}, + {"fightc_blocking", 3.2f}, + {"fightc_g", 0.77f}, + {"fightc_idle", 1.0f}, + {"fightc_m", 0.9f}, + {"fightc_spar", 3.2f}, + {"hitc_1", 0.3f}, + {"hitc_2", 0.67f}, + {"hitc_3", 0.83f}, + {"fightd_1", 0.93f}, + {"fightd_2", 1.87f}, + {"fightd_3", 0.9f}, + {"fightd_block", 0.47f}, + {"fightd_g", 0.83f}, + {"fightd_idle", 1.53f}, + {"fightd_m", 1.07f}, + {"hitd_1", 0.67f}, + {"hitd_2", 1.83f}, + {"hitd_3", 0.97f}, + {"fightkick", 0.77f}, + {"fightkick_b", 1.03f}, + {"hit_fightkick", 0.5f}, + {"hit_fightkick_b", 1.13f}, + {"fin_climb_in", 2.9f}, + {"fin_cop1_climbout2", 6.0f}, + {"fin_cop1_loop", 2.0f}, + {"fin_cop1_stomp", 1.0f}, + {"fin_hang_l", 0.57f}, + {"fin_hang_loop", 4.0f}, + {"fin_hang_r", 0.57f}, + {"fin_hang_slip", 3.33f}, + {"fin_jump_on", 5.6f}, + {"fin_land_car", 0.67f}, + {"fin_land_die", 2.37f}, + {"fin_legsup", 1.0f}, + {"fin_legsup_l", 0.5f}, + {"fin_legsup_loop", 1.33f}, + {"fin_legsup_r", 0.5f}, + {"fin_let_go", 0.17f}, + {"fin_cop1_climbout", 4.0f}, + {"fin_cop1_fall", 0.43f}, + {"fin_cop1_shot", 2.07f}, + {"fin_cop1_swing", 1.17f}, + {"fin_cop2_climbout", 5.33f}, + {"fin_switch_p", 3.97f}, + {"fin_switch_s", 2.17f}, + {"flame_fire", 0.8f}, + {"flower_attack", 0.8f}, + {"flower_attack_m", 1.23f}, + {"flower_hit", 0.83f}, + {"eat_burger", 5.0f}, + {"eat_chicken", 5.0f}, + {"eat_pizza", 5.0f}, + {"eat_vomit_p", 8.0f}, + {"eat_vomit_sk", 8.0f}, + {"ff_dam_bkw", 0.67f}, + {"ff_dam_fwd", 0.67f}, + {"ff_dam_left", 0.67f}, + {"ff_dam_right", 0.67f}, + {"ff_die_bkw", 0.67f}, + {"ff_die_fwd", 0.67f}, + {"ff_die_left", 0.67f}, + {"ff_die_right", 0.67f}, + {"ff_sit_eat1", 2.83f}, + {"ff_sit_eat2", 2.67f}, + {"ff_sit_eat3", 2.67f}, + {"ff_sit_in", 3.0f}, + {"ff_sit_in_l", 2.0f}, + {"ff_sit_in_r", 2.0f}, + {"ff_sit_look", 8.0f}, + {"ff_sit_loop", 2.67f}, + {"ff_sit_out_180", 2.83f}, + {"ff_sit_out_l_180", 1.33f}, + {"ff_sit_out_r_180", 1.33f}, + {"shp_thank", 1.17f}, + {"shp_tray_in", 0.67f}, + {"shp_tray_lift", 1.67f}, + {"shp_tray_lift_in", 0.5f}, + {"shp_tray_lift_loop", 8.0f}, + {"shp_tray_lift_out", 0.5f}, + {"shp_tray_out", 0.67f}, + {"shp_tray_pose", 2.67f}, + {"shp_tray_return", 1.33f}, + {"gym_barbell", 2.37f}, + {"gym_free_a", 1.93f}, + {"gym_free_b", 2.33f}, + {"gym_free_celebrate", 3.33f}, + {"gym_free_down", 0.57f}, + {"gym_free_loop", 0.67f}, + {"gym_free_pickup", 3.17f}, + {"gym_free_putdown", 3.17f}, + {"gym_free_up_smooth", 1.0f}, + {"drnkbr_prtl", 2.67f}, + {"drnkbr_prtl_f", 2.67f}, + {"hndshkaa", 4.0f}, + {"hndshkba", 2.33f}, + {"hndshkca", 3.33f}, + {"hndshkcb", 3.33f}, + {"hndshkda", 2.0f}, + {"hndshkea", 1.0f}, + {"hndshkfa", 4.17f}, + {"hndshkfa_swt", 4.17f}, + {"invite_no", 3.33f}, + {"invite_yes", 4.33f}, + {"leanidle", 1.0f}, + {"leanin", 1.0f}, + {"leanout", 1.0f}, + {"prtial_gngtlka", 4.0f}, + {"prtial_gngtlkb", 1.47f}, + {"prtial_gngtlkc", 1.5f}, + {"prtial_gngtlkd", 2.47f}, + {"prtial_gngtlke", 3.0f}, + {"prtial_gngtlkf", 2.67f}, + {"prtial_gngtlkg", 2.67f}, + {"prtial_gngtlkh", 3.33f}, + {"prtial_hndshk_01", 1.67f}, + {"prtial_hndshk_biz_01", 2.33f}, + {"shake_cara", 1.67f}, + {"shake_cark", 1.27f}, + {"shake_carsh", 1.5f}, + {"smkcig_prtl", 7.5f}, + {"smkcig_prtl_f", 7.5f}, + {"dance_b1", 1.13f}, + {"dance_b10", 1.17f}, + {"dance_b11", 1.13f}, + {"dance_b12", 1.17f}, + {"dance_b13", 1.13f}, + {"dance_b14", 1.17f}, + {"dance_b15", 1.13f}, + {"dance_b16", 1.17f}, + {"dance_b2", 1.17f}, + {"dance_b3", 1.13f}, + {"dance_b4", 1.17f}, + {"dance_b5", 1.13f}, + {"dance_b6", 1.17f}, + {"dance_b7", 1.13f}, + {"dance_b8", 1.17f}, + {"dance_b9", 1.13f}, + {"dance_g1", 1.13f}, + {"dance_g10", 1.17f}, + {"dance_g11", 1.13f}, + {"dance_g12", 1.17f}, + {"dance_g13", 1.13f}, + {"dance_g14", 1.17f}, + {"dance_g15", 1.13f}, + {"dance_g16", 1.17f}, + {"dance_g2", 1.17f}, + {"dance_g3", 1.13f}, + {"dance_g4", 1.17f}, + {"dance_g5", 1.13f}, + {"dance_g6", 1.17f}, + {"dance_g7", 1.13f}, + {"dance_g8", 1.17f}, + {"dance_g9", 1.13f}, + {"gsign1", 4.77f}, + {"gsign1lh", 2.73f}, + {"gsign2", 2.13f}, + {"gsign2lh", 2.33f}, + {"gsign3", 4.67f}, + {"gsign3lh", 2.0f}, + {"gsign4", 4.17f}, + {"gsign4lh", 4.67f}, + {"gsign5", 6.2f}, + {"gsign5lh", 2.0f}, + {"lhgsign1", 2.0f}, + {"lhgsign2", 2.0f}, + {"lhgsign3", 2.0f}, + {"lhgsign4", 2.0f}, + {"lhgsign5", 2.0f}, + {"rhgsign1", 2.0f}, + {"rhgsign2", 2.0f}, + {"rhgsign3", 2.0f}, + {"rhgsign4", 2.0f}, + {"rhgsign5", 2.0f}, + {"gdb_car2_ply", 9.5f}, + {"gdb_car2_smo", 9.5f}, + {"gdb_car2_swe", 9.5f}, + {"gdb_car_ply", 13.33f}, + {"gdb_car_ryd", 13.33f}, + {"gdb_car_smo", 13.33f}, + {"gdb_car_swe", 13.33f}, + {"goggles_put_on", 0.8f}, + {"graffiti_chkout", 4.67f}, + {"spraycan_fire", 2.33f}, + {"mrnf_loop", 4.67f}, + {"mrnm_loop", 2.67f}, + {"prst_loopa", 4.0f}, + {"weapon_start_throw", 0.2f}, + {"weapon_throw", 0.87f}, + {"weapon_throwu", 0.67f}, + {"gymshadowbox", 5.1f}, + {"gym_bike_celebrate", 1.93f}, + {"gym_bike_fast", 0.4f}, + {"gym_bike_faster", 0.4f}, + {"gym_bike_getoff", 1.67f}, + {"gym_bike_geton", 1.67f}, + {"gym_bike_pedal", 0.4f}, + {"gym_bike_slow", 0.43f}, + {"gym_bike_still", 1.67f}, + {"gym_jog_falloff", 2.17f}, + {"gym_shadowbox", 5.1f}, + {"gym_tread_celebrate", 2.5f}, + {"gym_tread_falloff", 2.0f}, + {"gym_tread_getoff", 3.33f}, + {"gym_tread_geton", 2.5f}, + {"gym_tread_jog", 0.77f}, + {"gym_tread_sprint", 0.67f}, + {"gym_tread_tired", 1.33f}, + {"gym_tread_walk", 1.07f}, + {"gym_walk_falloff", 3.33f}, + {"pedals_fast", 0.4f}, + {"pedals_med", 0.4f}, + {"pedals_slow", 0.43f}, + {"pedals_still", 0.43f}, + {"brb_beard_01", 4.5f}, + {"brb_buy", 4.17f}, + {"brb_cut", 1.7f}, + {"brb_cut_in", 0.83f}, + {"brb_cut_out", 1.33f}, + {"brb_hair_01", 3.83f}, + {"brb_hair_02", 4.5f}, + {"brb_in", 1.33f}, + {"brb_loop", 2.67f}, + {"brb_out", 0.67f}, + {"brb_sit_in", 2.07f}, + {"brb_sit_loop", 7.0f}, + {"brb_sit_out", 3.0f}, + {"cas_g2_gasko", 3.33f}, + {"swt_wllpk_l", 2.67f}, + {"swt_wllpk_l_back", 0.5f}, + {"swt_wllpk_r", 3.67f}, + {"swt_wllpk_r_back", 0.43f}, + {"swt_wllshoot_in_l", 1.0f}, + {"swt_wllshoot_in_r", 1.3f}, + {"swt_wllshoot_out_l", 2.0f}, + {"swt_wllshoot_out_r", 1.43f}, + {"use_swipecard", 1.17f}, + {"bed_in_l", 3.33f}, + {"bed_in_r", 3.33f}, + {"bed_loop_l", 3.33f}, + {"bed_loop_r", 3.33f}, + {"bed_out_l", 3.33f}, + {"bed_out_r", 3.33f}, + {"lou_in", 1.83f}, + {"lou_loop", 3.33f}, + {"lou_out", 2.0f}, + {"off_sit_2idle_180", 2.83f}, + {"off_sit_bored_loop", 2.83f}, + {"off_sit_crash", 3.33f}, + {"off_sit_drink", 4.17f}, + {"off_sit_idle_loop", 2.07f}, + {"off_sit_in", 2.77f}, + {"off_sit_read", 3.33f}, + {"off_sit_type_loop", 3.33f}, + {"off_sit_watch", 2.0f}, + {"shop_cashier", 6.67f}, + {"shop_in", 1.0f}, + {"shop_looka", 2.0f}, + {"shop_lookb", 3.0f}, + {"shop_loop", 2.0f}, + {"shop_out", 1.33f}, + {"shop_shelf", 2.33f}, + {"girl_01", 3.33f}, + {"girl_02", 11.33f}, + {"player_01", 24.83f}, + {"smoke_01", 25.0f}, + {"kart_getin_lhs", 0.83f}, + {"kart_getin_rhs", 0.83f}, + {"kart_getout_lhs", 0.83f}, + {"kart_getout_rhs", 0.83f}, + {"gfwave2", 2.67f}, + {"gf_carargue_01", 5.0f}, + {"gf_carargue_02", 5.0f}, + {"gf_carspot", 5.0f}, + {"gf_streetargue_01", 5.0f}, + {"gf_streetargue_02", 5.0f}, + {"gift_get", 5.33f}, + {"gift_give", 5.33f}, + {"grlfrd_kiss_01", 4.17f}, + {"grlfrd_kiss_02", 5.77f}, + {"playa_kiss_01", 5.0f}, + {"playa_kiss_02", 5.77f}, + {"kill_knife_ped_damage", 2.23f}, + {"kill_knife_ped_die", 1.93f}, + {"kill_knife_player", 2.67f}, + {"kill_partial", 0.03f}, + {"knife_1", 1.0f}, + {"knife_2", 0.93f}, + {"knife_3", 0.87f}, + {"knife_4", 0.9f}, + {"knife_block", 0.47f}, + {"knife_g", 0.9f}, + {"knife_hit_1", 0.57f}, + {"knife_hit_2", 0.63f}, + {"knife_hit_3", 1.6f}, + {"knife_idle", 1.3f}, + {"knife_part", 0.53f}, + {"weapon_knifeidle", 1.3f}, + {"lapdan_d", 51.47f}, + {"lapdan_p", 51.47f}, + {"f_smklean_loop", 4.0f}, + {"lrgirl_bdbnce", 2.67f}, + {"lrgirl_hair", 2.33f}, + {"lrgirl_hurry", 2.83f}, + {"lrgirl_idleloop", 2.17f}, + {"lrgirl_idle_to_l0", 2.17f}, + {"lrgirl_l0_bnce", 0.67f}, + {"lrgirl_l0_loop", 2.0f}, + {"lrgirl_l0_to_l1", 3.67f}, + {"lrgirl_l12_to_l0", 2.0f}, + {"lrgirl_l1_bnce", 0.67f}, + {"lrgirl_l1_loop", 2.0f}, + {"lrgirl_l1_to_l2", 1.33f}, + {"lrgirl_l2_bnce", 0.67f}, + {"lrgirl_l2_loop", 1.5f}, + {"lrgirl_l2_to_l3", 1.5f}, + {"lrgirl_l345_to_l1", 1.0f}, + {"lrgirl_l3_bnce", 0.67f}, + {"lrgirl_l3_loop", 2.0f}, + {"lrgirl_l3_to_l4", 0.67f}, + {"lrgirl_l4_bnce", 0.67f}, + {"lrgirl_l4_loop", 2.33f}, + {"lrgirl_l4_to_l5", 1.0f}, + {"lrgirl_l5_bnce", 0.83f}, + {"lrgirl_l5_loop", 1.67f}, + {"m_smkstnd_loop", 5.33f}, + {"rap_a_loop", 2.67f}, + {"rap_b_loop", 2.67f}, + {"rap_c_loop", 3.0f}, + {"carhit_hangon", 1.53f}, + {"carhit_tumble", 2.03f}, + {"donutdrop", 1.5f}, + {"fen_choppa_l1", 1.43f}, + {"fen_choppa_l2", 1.3f}, + {"fen_choppa_l3", 1.3f}, + {"fen_choppa_r1", 1.3f}, + {"fen_choppa_r2", 1.3f}, + {"fen_choppa_r3", 1.3f}, + {"hangon_stun_loop", 4.67f}, + {"hangon_stun_turn", 4.0f}, + {"md_bike_2_hang", 1.37f}, + {"md_bike_jmp_bl", 1.1f}, + {"md_bike_jmp_f", 1.0f}, + {"md_bike_lnd_bl", 0.9f}, + {"md_bike_lnd_die_bl", 1.53f}, + {"md_bike_lnd_die_f", 0.8f}, + {"md_bike_lnd_f", 1.17f}, + {"md_bike_lnd_roll", 2.7f}, + {"md_bike_lnd_roll_f", 1.03f}, + {"md_bike_punch", 1.83f}, + {"md_bike_punch_f", 1.83f}, + {"md_bike_shot_f", 1.33f}, + {"md_hang_lnd_roll", 2.7f}, + {"md_hang_loop", 1.0f}, + {"end_sc1_ply", 5.0f}, + {"end_sc1_ryd", 5.0f}, + {"end_sc1_smo", 5.0f}, + {"end_sc1_swe", 5.0f}, + {"end_sc2_ply", 9.0f}, + {"end_sc2_ryd", 9.0f}, + {"end_sc2_smo", 9.0f}, + {"end_sc2_swe", 9.0f}, + {"cpr", 8.33f}, + {"bitchslap", 1.17f}, + {"bmx_celebrate", 1.57f}, + {"bmx_comeon", 0.77f}, + {"bmx_idleloop_01", 3.33f}, + {"bmx_idleloop_02", 6.67f}, + {"bmx_talkleft_in", 0.67f}, + {"bmx_talkleft_loop", 6.67f}, + {"bmx_talkleft_out", 0.67f}, + {"bmx_talkright_in", 0.67f}, + {"bmx_talkright_loop", 7.33f}, + {"bmx_talkright_out", 0.67f}, + {"bng_wndw", 7.33f}, + {"bng_wndw_02", 7.33f}, + {"case_pickup", 1.0f}, + {"door_jet", 5.33f}, + {"grab_l", 0.4f}, + {"grab_r", 0.4f}, + {"hiker_pose", 0.33f}, + {"hiker_pose_l", 0.33f}, + {"idle_chat_02", 7.23f}, + {"kat_throw_k", 3.33f}, + {"kat_throw_o", 3.33f}, + {"kat_throw_p", 3.33f}, + {"pass_rifle_o", 1.33f}, + {"pass_rifle_ped", 1.33f}, + {"pass_rifle_ply", 1.33f}, + {"pickup_box", 0.4f}, + {"plane_door", 5.33f}, + {"plane_exit", 5.33f}, + {"plane_hijack", 5.33f}, + {"plunger_01", 3.33f}, + {"plyrlean_loop", 2.67f}, + {"plyr_shkhead", 1.67f}, + {"run_dive", 8.27f}, + {"scratchballs_01", 8.33f}, + {"seat_lr", 3.67f}, + {"seat_talk_01", 3.67f}, + {"seat_talk_02", 3.33f}, + {"seat_watch", 2.33f}, + {"smalplane_door", 6.33f}, + {"smlplane_door", 5.33f}, + {"mtb_back", 0.1f}, + {"mtb_bunnyhop", 0.33f}, + {"mtb_drivebyft", 0.2f}, + {"mtb_driveby_lhs", 0.2f}, + {"mtb_driveby_rhs", 0.2f}, + {"mtb_fwd", 0.2f}, + {"mtb_getoffback", 1.53f}, + {"mtb_getofflhs", 0.73f}, + {"mtb_getoffrhs", 0.73f}, + {"mtb_jumponl", 0.8f}, + {"mtb_jumponr", 0.83f}, + {"mtb_left", 0.13f}, + {"mtb_pedal", 0.67f}, + {"mtb_pushes", 0.8f}, + {"mtb_ride", 0.03f}, + {"mtb_right", 0.13f}, + {"mtb_sprint", 0.8f}, + {"mtb_still", 0.03f}, + {"msclewalkst_armed", 0.2f}, + {"msclewalkst_csaw", 0.2f}, + {"mscle_rckt_run", 0.8f}, + {"mscle_rckt_walkst", 0.2f}, + {"mscle_run_csaw", 0.8f}, + {"muscleidle", 1.5f}, + {"muscleidle_armed", 1.5f}, + {"muscleidle_csaw", 1.5f}, + {"muscleidle_rocket", 1.5f}, + {"musclerun", 0.8f}, + {"musclerun_armed", 0.8f}, + {"musclesprint", 0.57f}, + {"musclewalk", 1.07f}, + {"musclewalkstart", 0.27f}, + {"musclewalk_armed", 1.07f}, + {"musclewalk_csaw", 1.07f}, + {"musclewalk_rocket", 1.07f}, + {"nevada_getin", 1.87f}, + {"nevada_getout", 0.93f}, + {"lkaround_in", 0.33f}, + {"lkaround_loop", 7.0f}, + {"lkaround_out", 0.33f}, + {"lkup_in", 1.67f}, + {"lkup_loop", 5.33f}, + {"lkup_out", 1.0f}, + {"lkup_point", 3.33f}, + {"panic_cower", 6.67f}, + {"panic_hide", 6.33f}, + {"panic_in", 0.83f}, + {"panic_loop", 1.67f}, + {"panic_out", 0.67f}, + {"panic_point", 6.0f}, + {"panic_shout", 8.67f}, + {"pointup_in", 1.0f}, + {"pointup_loop", 2.67f}, + {"pointup_out", 1.0f}, + {"pointup_shout", 3.0f}, + {"point_in", 0.5f}, + {"point_loop", 3.0f}, + {"point_out", 0.33f}, + {"shout_01", 2.67f}, + {"shout_02", 4.0f}, + {"shout_in", 1.67f}, + {"shout_loop", 2.0f}, + {"shout_out", 0.33f}, + {"wave_in", 0.83f}, + {"wave_loop", 1.5f}, + {"wave_out", 0.83f}, + {"betslp_in", 1.33f}, + {"betslp_lkabt", 2.67f}, + {"betslp_loop", 2.67f}, + {"betslp_out", 1.0f}, + {"betslp_tnk", 5.6f}, + {"wtchrace_cmon", 5.0f}, + {"wtchrace_in", 1.67f}, + {"wtchrace_loop", 2.67f}, + {"wtchrace_lose", 4.0f}, + {"wtchrace_out", 1.0f}, + {"wtchrace_win", 4.33f}, + {"fall_skydive", 1.33f}, + {"fall_skydive_accel", 1.33f}, + {"fall_skydive_die", 1.0f}, + {"fall_skydive_l", 1.33f}, + {"fall_skydive_r", 1.33f}, + {"para_decel", 2.0f}, + {"para_decel_o", 2.0f}, + {"para_float", 2.0f}, + {"para_float_o", 2.0f}, + {"para_land", 1.67f}, + {"para_land_o", 2.17f}, + {"para_land_water", 2.33f}, + {"para_land_water_o", 2.17f}, + {"para_open", 2.83f}, + {"para_open_o", 2.33f}, + {"para_rip_land_o", 0.9f}, + {"para_rip_loop_o", 1.0f}, + {"para_rip_o", 0.23f}, + {"para_steerl", 2.0f}, + {"para_steerl_o", 2.0f}, + {"para_steerr", 2.0f}, + {"para_steerr_o", 2.0f}, + {"tai_chi_in", 2.17f}, + {"tai_chi_loop", 12.0f}, + {"tai_chi_out", 0.83f}, + {"piss_in", 9.0f}, + {"piss_loop", 6.67f}, + {"piss_out", 11.0f}, + {"pnm_argue1_a", 4.33f}, + {"pnm_argue1_b", 4.33f}, + {"pnm_argue2_a", 4.33f}, + {"pnm_argue2_b", 4.33f}, + {"pnm_loop_a", 5.33f}, + {"pnm_loop_b", 5.33f}, + {"wank_in", 7.33f}, + {"wank_loop", 2.67f}, + {"wank_out", 11.67f}, + {"abseil", 0.03f}, + {"arrestgun", 0.67f}, + {"atm", 12.17f}, + {"bike_elbowl", 0.97f}, + {"bike_elbowr", 0.97f}, + {"bike_fallr", 1.63f}, + {"bike_fall_off", 1.07f}, + {"bike_pickupl", 1.07f}, + {"bike_pickupr", 1.07f}, + {"bike_pullupl", 1.0f}, + {"bike_pullupr", 1.0f}, + {"bomber", 0.6f}, + {"car_alignhi_lhs", 0.73f}, + {"car_alignhi_rhs", 0.73f}, + {"car_align_lhs", 0.13f}, + {"car_align_rhs", 0.13f}, + {"car_closedoorl_lhs", 0.6f}, + {"car_closedoorl_rhs", 0.4f}, + {"car_closedoor_lhs", 0.6f}, + {"car_closedoor_rhs", 0.4f}, + {"car_close_lhs", 0.73f}, + {"car_close_rhs", 0.73f}, + {"car_crawloutrhs", 2.17f}, + {"car_dead_lhs", 0.03f}, + {"car_dead_rhs", 0.03f}, + {"car_doorlocked_lhs", 1.33f}, + {"car_doorlocked_rhs", 1.27f}, + {"car_fallout_lhs", 0.57f}, + {"car_fallout_rhs", 0.57f}, + {"car_getinl_lhs", 1.0f}, + {"car_getinl_rhs", 1.0f}, + {"car_getin_lhs", 1.0f}, + {"car_getin_rhs", 1.0f}, + {"car_getoutl_lhs", 0.93f}, + {"car_getoutl_rhs", 1.0f}, + {"car_getout_lhs", 1.13f}, + {"car_getout_rhs", 0.8f}, + {"car_hookertalk", 4.3f}, + {"car_jackedlhs", 2.9f}, + {"car_jackedrhs", 3.43f}, + {"car_jumpin_lhs", 1.0f}, + {"car_lb", 0.23f}, + {"car_lb_pro", 0.1f}, + {"car_lb_weak", 0.23f}, + {"car_ljackedlhs", 3.57f}, + {"car_ljackedrhs", 3.47f}, + {"car_lshuffle_rhs", 0.4f}, + {"car_lsit", 0.03f}, + {"car_open_lhs", 1.1f}, + {"car_open_rhs", 1.1f}, + {"car_pulloutl_lhs", 2.93f}, + {"car_pulloutl_rhs", 2.93f}, + {"car_pullout_lhs", 2.3f}, + {"car_pullout_rhs", 2.8f}, + {"car_qjacked", 3.3f}, + {"car_rolldoor", 0.6f}, + {"car_rolldoorlo", 0.6f}, + {"car_rollout_lhs", 1.63f}, + {"car_rollout_rhs", 1.27f}, + {"car_shuffle_rhs", 0.4f}, + {"car_sit", 0.03f}, + {"car_sitp", 0.03f}, + {"car_sitplo", 0.03f}, + {"car_sit_pro", 0.03f}, + {"car_sit_weak", 0.03f}, + {"car_tune_radio", 0.63f}, + {"climb_idle", 0.8f}, + {"climb_jump", 0.57f}, + {"climb_jump2fall", 0.03f}, + {"climb_jump_b", 0.97f}, + {"climb_pull", 0.87f}, + {"climb_stand", 0.8f}, + {"climb_stand_finish", 0.2f}, + {"cower", 0.8f}, + {"crouch_roll_l", 0.93f}, + {"crouch_roll_r", 0.93f}, + {"dam_arml_frmbk", 0.83f}, + {"dam_arml_frmft", 0.83f}, + {"dam_arml_frmlt", 0.67f}, + {"dam_armr_frmbk", 0.83f}, + {"dam_armr_frmft", 0.5f}, + {"dam_armr_frmrt", 0.27f}, + {"dam_legl_frmbk", 0.83f}, + {"dam_legl_frmft", 0.83f}, + {"dam_legl_frmlt", 0.83f}, + {"dam_legr_frmbk", 0.83f}, + {"dam_legr_frmft", 0.83f}, + {"dam_legr_frmrt", 0.83f}, + {"dam_stomach_frmbk", 0.83f}, + {"dam_stomach_frmft", 0.83f}, + {"dam_stomach_frmlt", 0.83f}, + {"dam_stomach_frmrt", 0.83f}, + {"door_lhinge_o", 1.07f}, + {"door_rhinge_o", 1.07f}, + {"drivebyl_l", 0.2f}, + {"drivebyl_r", 0.2f}, + {"driveby_l", 0.2f}, + {"driveby_r", 0.2f}, + {"drive_boat", 0.03f}, + {"drive_boat_back", 0.1f}, + {"drive_boat_l", 0.1f}, + {"drive_boat_r", 0.1f}, + {"drive_l", 0.13f}, + {"drive_lo_l", 0.13f}, + {"drive_lo_r", 0.13f}, + {"drive_l_pro", 0.13f}, + {"drive_l_pro_slow", 0.13f}, + {"drive_l_slow", 0.13f}, + {"drive_l_weak", 0.13f}, + {"drive_l_weak_slow", 0.13f}, + {"drive_r", 0.13f}, + {"drive_r_pro", 0.13f}, + {"drive_r_pro_slow", 0.13f}, + {"drive_r_slow", 0.13f}, + {"drive_r_weak", 0.13f}, + {"drive_r_weak_slow", 0.13f}, + {"drive_truck", 0.03f}, + {"drive_truck_back", 0.1f}, + {"drive_truck_l", 0.13f}, + {"drive_truck_r", 0.13f}, + {"drown", 2.5f}, + {"duck_cower", 0.8f}, + {"endchat_01", 2.0f}, + {"endchat_02", 2.0f}, + {"endchat_03", 2.33f}, + {"ev_dive", 2.33f}, + {"ev_step", 1.07f}, + {"facanger", 0.13f}, + {"facgum", 1.03f}, + {"facsurp", 0.13f}, + {"facsurpm", 0.13f}, + {"factalk", 2.33f}, + {"facurios", 0.13f}, + {"fall_back", 0.73f}, + {"fall_collapse", 1.0f}, + {"fall_fall", 0.73f}, + {"fall_front", 0.73f}, + {"fall_glide", 0.8f}, + {"fall_land", 0.47f}, + {"fight2idle", 0.33f}, + {"fighta_1", 0.43f}, + {"fighta_2", 0.77f}, + {"fighta_3", 0.87f}, + {"fighta_block", 0.47f}, + {"fighta_g", 0.93f}, + {"fighta_m", 0.4f}, + {"fightidle", 1.3f}, + {"fightshb", 0.47f}, + {"fightshf", 0.53f}, + {"fightsh_bwd", 0.67f}, + {"fightsh_fwd", 0.67f}, + {"fightsh_left", 0.67f}, + {"fightsh_right", 0.67f}, + {"flee_lkaround_01", 2.0f}, + {"floor_hit", 0.37f}, + {"floor_hit_f", 0.4f}, + {"fucku", 1.33f}, + {"gang_gunstand", 0.03f}, + {"gas_cwr", 1.0f}, + {"getup", 1.37f}, + {"getup_front", 1.37f}, + {"gum_eat", 5.33f}, + {"guncrouchbwd", 1.0f}, + {"guncrouchfwd", 0.73f}, + {"gunmove_bwd", 1.03f}, + {"gunmove_fwd", 1.0f}, + {"gunmove_l", 1.0f}, + {"gunmove_r", 1.0f}, + {"gun_2_idle", 0.27f}, + {"gun_butt", 0.43f}, + {"gun_butt_crouch", 0.43f}, + {"gun_stand", 0.03f}, + {"handscower", 1.93f}, + {"handsup", 0.6f}, + {"hita_1", 0.3f}, + {"hita_2", 0.53f}, + {"hita_3", 0.57f}, + {"hit_back", 0.5f}, + {"hit_behind", 0.67f}, + {"hit_front", 0.6f}, + {"hit_gun_butt", 0.5f}, + {"hit_l", 0.7f}, + {"hit_r", 0.6f}, + {"hit_walk", 0.33f}, + {"hit_wall", 0.7f}, + {"idlestance_fat", 1.67f}, + {"idlestance_old", 2.0f}, + {"idle_armed", 1.47f}, + {"idle_chat", 6.67f}, + {"idle_gang1", 1.67f}, + {"idle_hbhb", 2.67f}, + {"idle_rocket", 1.57f}, + {"idle_stance", 1.5f}, + {"idle_taxi", 0.87f}, + {"jetpack_idle", 0.03f}, + {"jog_femalea", 0.77f}, + {"jog_malea", 0.77f}, + {"jump_glide", 0.5f}, + {"jump_land", 0.23f}, + {"jump_launch", 0.2f}, + {"jump_launch_r", 0.2f}, + {"kart_drive", 0.03f}, + {"kart_l", 0.13f}, + {"kart_lb", 0.03f}, + {"kart_r", 0.13f}, + {"kd_left", 0.9f}, + {"kd_right", 0.9f}, + {"ko_shot_face", 2.1f}, + {"ko_shot_front", 0.57f}, + {"ko_shot_stom", 3.17f}, + {"ko_skid_back", 0.97f}, + {"ko_skid_front", 1.13f}, + {"ko_spin_l", 0.87f}, + {"ko_spin_r", 0.93f}, + {"pass_smoke_in_car", 1.73f}, + {"phone_in", 2.33f}, + {"phone_out", 2.0f}, + {"phone_talk", 2.0f}, + {"player_sneak", 1.33f}, + {"player_sneak_walkstart", 0.3f}, + {"roadcross", 2.0f}, + {"roadcross_female", 4.0f}, + {"roadcross_gang", 2.0f}, + {"roadcross_old", 4.0f}, + {"run_1armed", 0.77f}, + {"run_armed", 0.7f}, + {"run_civi", 0.73f}, + {"run_csaw", 0.7f}, + {"run_fat", 0.8f}, + {"run_fatold", 0.8f}, + {"run_gang1", 0.83f}, + {"run_left", 0.67f}, + {"run_old", 0.8f}, + {"run_player", 0.73f}, + {"run_right", 0.67f}, + {"run_rocket", 0.77f}, + {"run_stop", 0.87f}, + {"run_stopr", 0.8f}, + {"run_wuzi", 0.77f}, + {"seat_down", 1.5f}, + {"seat_idle", 2.0f}, + {"seat_up", 1.17f}, + {"shot_leftp", 0.3f}, + {"shot_partial", 0.37f}, + {"shot_partial_b", 0.33f}, + {"shot_rightp", 0.33f}, + {"shove_partial", 0.53f}, + {"smoke_in_car", 1.73f}, + {"sprint_civi", 0.53f}, + {"sprint_panic", 0.6f}, + {"sprint_wuzi", 0.67f}, + {"swat_run", 0.67f}, + {"swim_tread", 1.3f}, + {"tap_handp", 0.03f}, + {"turn_180", 0.63f}, + {"turn_l", 0.8f}, + {"turn_r", 0.8f}, + {"walk_armed", 1.07f}, + {"walk_civi", 1.13f}, + {"walk_csaw", 1.07f}, + {"walk_doorpartial", 0.8f}, + {"walk_drunk", 3.93f}, + {"walk_fat", 1.33f}, + {"walk_fatold", 1.17f}, + {"walk_gang1", 1.4f}, + {"walk_gang2", 1.4f}, + {"walk_old", 1.4f}, + {"walk_player", 1.2f}, + {"walk_rocket", 1.07f}, + {"walk_shuffle", 1.2f}, + {"walk_start", 0.27f}, + {"walk_start_armed", 0.2f}, + {"walk_start_csaw", 0.2f}, + {"walk_start_rocket", 0.2f}, + {"walk_wuzi", 1.17f}, + {"weapon_crouch", 0.8f}, + {"woman_idlestance", 5.33f}, + {"woman_run", 0.77f}, + {"woman_runbusy", 0.67f}, + {"woman_runfatold", 1.2f}, + {"woman_runpanic", 0.6f}, + {"woman_runsexy", 0.7f}, + {"woman_walkbusy", 1.0f}, + {"woman_walkfatold", 1.2f}, + {"woman_walknorm", 1.13f}, + {"woman_walkold", 1.2f}, + {"woman_walkpro", 1.33f}, + {"woman_walksexy", 1.17f}, + {"woman_walkshop", 0.97f}, + {"xpressscratch", 3.97f}, + {"plyr_drivebybwd", 0.83f}, + {"plyr_drivebyfwd", 0.83f}, + {"plyr_drivebylhs", 0.83f}, + {"plyr_drivebyrhs", 0.83f}, + {"shift", 3.6f}, + {"shldr", 2.17f}, + {"stretch", 4.6f}, + {"strleg", 3.67f}, + {"time", 5.2f}, + {"coptraf_away", 1.47f}, + {"coptraf_come", 2.87f}, + {"coptraf_left", 2.0f}, + {"coptraf_stop", 2.0f}, + {"cop_getoutcar_lhs", 0.83f}, + {"cop_move_fwd", 1.0f}, + {"crm_drgbst_01", 18.57f}, + {"door_kick", 1.33f}, + {"plc_drgbst_01", 20.6f}, + {"plc_drgbst_02", 7.57f}, + {"pool_chalkcue", 4.83f}, + {"pool_idle_stance", 2.0f}, + {"pool_long_shot", 1.67f}, + {"pool_long_shot_o", 1.67f}, + {"pool_long_start", 0.67f}, + {"pool_long_start_o", 0.67f}, + {"pool_med_shot", 1.67f}, + {"pool_med_shot_o", 1.67f}, + {"pool_med_start", 0.67f}, + {"pool_med_start_o", 0.67f}, + {"pool_place_white", 2.5f}, + {"pool_short_shot", 1.67f}, + {"pool_short_shot_o", 1.67f}, + {"pool_short_start", 0.67f}, + {"pool_short_start_o", 0.67f}, + {"pool_walk", 1.27f}, + {"pool_walk_start", 0.2f}, + {"pool_xlong_shot", 1.67f}, + {"pool_xlong_shot_o", 1.67f}, + {"pool_xlong_start", 0.67f}, + {"pool_xlong_start_o", 0.67f}, + {"winwash_start", 0.43f}, + {"winwash_wash2beg", 2.13f}, + {"python_crouchfire", 1.2f}, + {"python_crouchreload", 1.0f}, + {"python_fire", 1.17f}, + {"python_fire_poor", 1.47f}, + {"python_reload", 0.93f}, + {"quad_back", 0.1f}, + {"quad_driveby_ft", 0.2f}, + {"quad_driveby_lhs", 0.2f}, + {"quad_driveby_rhs", 0.2f}, + {"quad_fwd", 0.2f}, + {"quad_getoff_b", 1.63f}, + {"quad_getoff_lhs", 0.67f}, + {"quad_getoff_rhs", 0.7f}, + {"quad_geton_lhs", 0.73f}, + {"quad_geton_rhs", 0.73f}, + {"quad_hit", 0.03f}, + {"quad_kick", 1.13f}, + {"quad_left", 0.13f}, + {"quad_passenger", 0.03f}, + {"quad_reverse", 0.17f}, + {"quad_ride", 0.03f}, + {"quad_right", 0.13f}, + {"laugh_01", 5.33f}, + {"rap_a_in", 0.83f}, + {"rap_a_out", 0.33f}, + {"rap_b_in", 1.0f}, + {"rap_b_out", 0.87f}, + {"rifle_crouchfire", 0.87f}, + {"rifle_crouchload", 1.27f}, + {"rifle_fire", 0.8f}, + {"rifle_fire_poor", 0.8f}, + {"rifle_load", 1.4f}, + {"riot_angry", 5.0f}, + {"riot_angry_b", 0.63f}, + {"riot_challenge", 3.23f}, + {"riot_chant", 1.73f}, + {"riot_fuku", 0.67f}, + {"riot_punches", 0.67f}, + {"riot_shout", 1.0f}, + {"cat_safe_end", 0.5f}, + {"cat_safe_open", 3.33f}, + {"cat_safe_open_o", 3.33f}, + {"cat_safe_rob", 1.83f}, + {"shp_handsup_scr", 0.67f}, + {"idle_rocket", 1.6f}, + {"rocketfire", 0.97f}, + {"walk_rocket", 1.07f}, + {"plane_align_lhs", 0.73f}, + {"plane_close", 0.4f}, + {"plane_getin", 0.8f}, + {"plane_getout", 1.57f}, + {"plane_open", 0.7f}, + {"ryd_beckon_01", 1.23f}, + {"ryd_beckon_02", 1.0f}, + {"ryd_beckon_03", 1.07f}, + {"ryd_die_pt1", 4.0f}, + {"ryd_die_pt2", 7.93f}, + {"van_crate_l", 0.67f}, + {"van_crate_r", 0.67f}, + {"van_fall_l", 0.47f}, + {"van_fall_r", 0.93f}, + {"van_lean_l", 0.67f}, + {"van_lean_r", 0.67f}, + {"van_pickup_e", 1.83f}, + {"van_pickup_s", 1.5f}, + {"van_stand", 0.67f}, + {"van_stand_crate", 0.67f}, + {"van_throw", 1.37f}, + {"scdldlp", 0.67f}, + {"scdlulp", 0.67f}, + {"scdrdlp", 0.67f}, + {"scdrulp", 0.67f}, + {"sclng_l", 1.0f}, + {"sclng_r", 1.0f}, + {"scmid_l", 0.47f}, + {"scmid_r", 0.47f}, + {"scshrtl", 0.2f}, + {"scshrtr", 0.2f}, + {"sc_ltor", 0.67f}, + {"sc_rtol", 0.67f}, + {"sex_1to2_p", 1.0f}, + {"sex_1to2_w", 1.0f}, + {"sex_1_cum_p", 6.67f}, + {"sex_1_cum_w", 6.67f}, + {"sex_1_fail_p", 5.33f}, + {"sex_1_fail_w", 5.33f}, + {"sex_1_p", 0.33f}, + {"sex_1_w", 0.33f}, + {"sex_2to3_p", 1.5f}, + {"sex_2to3_w", 1.5f}, + {"sex_2_fail_p", 6.33f}, + {"sex_2_fail_w", 6.33f}, + {"sex_2_p", 0.33f}, + {"sex_2_w", 0.33f}, + {"sex_3to1_p", 1.0f}, + {"sex_3to1_w", 1.0f}, + {"sex_3_fail_p", 4.33f}, + {"sex_3_fail_w", 4.33f}, + {"sex_3_p", 0.33f}, + {"sex_3_w", 0.33f}, + {"shamal_align", 0.2f}, + {"shamal_getin_lhs", 1.4f}, + {"shamal_getout_lhs", 1.37f}, + {"shamal_open", 0.6f}, + {"rob_2idle", 1.17f}, + {"rob_loop", 2.67f}, + {"rob_loop_threat", 2.0f}, + {"rob_shifty", 5.67f}, + {"rob_stickup_in", 0.53f}, + {"shp_duck", 0.67f}, + {"shp_duck_aim", 0.33f}, + {"shp_duck_fire", 0.83f}, + {"shp_gun_aim", 0.63f}, + {"shp_gun_duck", 0.5f}, + {"shp_gun_fire", 0.87f}, + {"shp_gun_grab", 0.87f}, + {"shp_gun_threat", 0.83f}, + {"shp_jump_glide", 0.33f}, + {"shp_jump_land", 0.7f}, + {"shp_jump_launch", 0.57f}, + {"shp_rob_givecash", 3.83f}, + {"shp_rob_handsup", 2.67f}, + {"shp_rob_react", 2.67f}, + {"shp_serve_end", 5.5f}, + {"shp_serve_idle", 5.0f}, + {"shp_serve_loop", 4.17f}, + {"shp_serve_start", 1.33f}, + {"smoke_ryd", 6.67f}, + {"shotgun_crouchfire", 1.47f}, + {"shotgun_fire", 1.47f}, + {"shotgun_fire_poor", 1.5f}, + {"crouchreload", 1.0f}, + {"silencecrouchfire", 0.93f}, + {"silence_fire", 0.87f}, + {"silence_reload", 0.93f}, + {"skate_idle", 1.0f}, + {"skate_run", 0.83f}, + {"skate_sprint", 0.67f}, + {"m_smk_drag", 3.67f}, + {"m_smk_in", 6.67f}, + {"m_smk_loop", 3.33f}, + {"m_smk_out", 3.0f}, + {"m_smk_tap", 3.0f}, + {"weapon_sniper", 1.47f}, + {"snm_caned_idle_p", 2.0f}, + {"snm_caned_idle_w", 2.0f}, + {"snm_caned_p", 1.33f}, + {"snm_caned_w", 1.33f}, + {"snm_cane_idle_p", 2.0f}, + {"snm_cane_idle_w", 2.0f}, + {"snm_cane_p", 1.33f}, + {"snm_cane_w", 1.33f}, + {"spankedp", 1.33f}, + {"spankedw", 1.33f}, + {"spanked_idlep", 1.33f}, + {"spanked_idlew", 1.33f}, + {"spankingp", 1.33f}, + {"spankingw", 1.33f}, + {"spanking_endp", 6.67f}, + {"spanking_endw", 6.67f}, + {"spanking_idlep", 1.33f}, + {"spanking_idlew", 1.33f}, + {"spanking_sittingidlep", 1.33f}, + {"spanking_sittingidlew", 1.33f}, + {"spanking_sittingp", 1.0f}, + {"spanking_sittingw", 1.0f}, + {"spraycan_full", 4.5f}, + {"ply_cash", 1.67f}, + {"pun_cash", 3.33f}, + {"pun_holler", 5.0f}, + {"pun_loop", 1.93f}, + {"strip_a", 2.07f}, + {"strip_b", 1.0f}, + {"strip_c", 0.97f}, + {"strip_d", 1.9f}, + {"strip_e", 3.33f}, + {"strip_f", 1.03f}, + {"strip_g", 2.27f}, + {"str_a2b", 4.0f}, + {"str_b2a", 0.5f}, + {"str_b2c", 5.0f}, + {"str_c1", 6.0f}, + {"str_c2", 6.0f}, + {"str_c2b", 1.0f}, + {"str_loop_a", 1.0f}, + {"str_loop_b", 2.0f}, + {"str_loop_c", 3.0f}, + {"batherdown", 3.93f}, + {"batherup", 12.3f}, + {"lay_bac_in", 2.33f}, + {"lay_bac_out", 3.0f}, + {"parksit_m_idlea", 3.33f}, + {"parksit_m_idleb", 2.67f}, + {"parksit_m_idlec", 4.33f}, + {"parksit_m_in", 2.33f}, + {"parksit_m_out", 2.0f}, + {"parksit_w_idlea", 3.33f}, + {"parksit_w_idleb", 5.0f}, + {"parksit_w_idlec", 3.0f}, + {"parksit_w_in", 4.0f}, + {"parksit_w_out", 2.67f}, + {"sbathe_f_lieb2sit", 1.67f}, + {"sbathe_f_out", 2.0f}, + {"sitnwait_in_w", 4.67f}, + {"sitnwait_out_w", 2.67f}, + {"gnstwall_injurd", 2.0f}, + {"jmp_wall1m_180", 1.17f}, + {"rail_fall", 3.0f}, + {"rail_fall_crawl", 5.67f}, + {"swt_breach_01", 5.47f}, + {"swt_breach_02", 5.33f}, + {"swt_breach_03", 4.3f}, + {"swt_go", 1.67f}, + {"swt_lkt", 3.0f}, + {"swt_sty", 1.17f}, + {"swt_vent_01", 4.73f}, + {"swt_vent_02", 4.43f}, + {"swt_vnt_sht_die", 0.67f}, + {"swt_vnt_sht_in", 1.6f}, + {"swt_vnt_sht_loop", 0.27f}, + {"ho_ass_slapped", 2.0f}, + {"lafin_player", 26.67f}, + {"lafin_sweet", 26.67f}, + {"plyr_hndshldr_01", 4.0f}, + {"sweet_ass_slap", 2.0f}, + {"sweet_hndshldr_01", 4.0f}, + {"sweet_injuredloop", 2.0f}, + {"swim_breast", 1.3f}, + {"swim_crawl", 0.9f}, + {"swim_dive_under", 1.07f}, + {"swim_glide", 1.47f}, + {"swim_jumpout", 0.33f}, + {"swim_under", 1.5f}, + {"sword_1", 0.87f}, + {"sword_2", 1.07f}, + {"sword_3", 0.8f}, + {"sword_4", 1.1f}, + {"sword_block", 0.47f}, + {"sword_hit_1", 0.83f}, + {"sword_hit_2", 1.03f}, + {"sword_hit_3", 0.87f}, + {"sword_idle", 1.0f}, + {"sword_part", 0.67f}, + {"tank_align_lhs", 1.43f}, + {"tank_close_lhs", 0.33f}, + {"tank_doorlocked", 0.53f}, + {"tank_getin_lhs", 0.43f}, + {"tank_getout_lhs", 1.97f}, + {"tank_open_lhs", 0.3f}, + {"tat_arml_in_o", 0.83f}, + {"tat_arml_in_p", 0.83f}, + {"tat_arml_in_t", 0.83f}, + {"tat_arml_out_o", 0.93f}, + {"tat_arml_out_p", 2.5f}, + {"tat_arml_out_t", 0.93f}, + {"tat_arml_pose_o", 0.83f}, + {"tat_arml_pose_p", 0.83f}, + {"tat_arml_pose_t", 0.83f}, + {"tat_armr_in_o", 0.83f}, + {"tat_armr_in_p", 0.83f}, + {"tat_armr_in_t", 0.83f}, + {"tat_armr_out_o", 1.0f}, + {"tat_armr_out_p", 2.5f}, + {"tat_armr_out_t", 1.0f}, + {"tat_armr_pose_o", 0.83f}, + {"tat_armr_pose_p", 0.83f}, + {"tat_armr_pose_t", 0.83f}, + {"tat_back_in_o", 0.83f}, + {"tat_back_in_p", 0.83f}, + {"tat_back_in_t", 0.83f}, + {"tat_back_out_o", 0.93f}, + {"tat_back_out_p", 2.5f}, + {"tat_back_out_t", 0.93f}, + {"tat_back_pose_o", 0.83f}, + {"tat_back_pose_p", 0.83f}, + {"tat_back_pose_t", 0.83f}, + {"tat_back_sit_in_p", 0.83f}, + {"tat_back_sit_loop_p", 2.67f}, + {"tat_back_sit_out_p", 0.83f}, + {"tat_bel_in_o", 0.83f}, + {"tat_bel_in_t", 0.83f}, + {"tat_bel_out_o", 0.97f}, + {"tat_bel_out_t", 0.97f}, + {"tat_bel_pose_o", 0.83f}, + {"tat_bel_pose_t", 0.83f}, + {"tat_che_in_o", 0.83f}, + {"tat_che_in_p", 0.83f}, + {"tat_che_in_t", 0.83f}, + {"tat_che_out_o", 0.93f}, + {"tat_che_out_p", 2.5f}, + {"tat_che_out_t", 0.93f}, + {"tat_che_pose_o", 0.83f}, + {"tat_che_pose_p", 0.83f}, + {"tat_che_pose_t", 0.83f}, + {"tat_drop_o", 0.5f}, + {"tat_idle_loop_o", 2.67f}, + {"tat_idle_loop_t", 2.67f}, + {"tat_sit_in_o", 2.33f}, + {"tat_sit_in_p", 2.33f}, + {"tat_sit_in_t", 2.33f}, + {"tat_sit_loop_o", 2.67f}, + {"tat_sit_loop_p", 2.67f}, + {"tat_sit_loop_t", 2.67f}, + {"tat_sit_out_o", 2.83f}, + {"tat_sit_out_p", 2.17f}, + {"tat_sit_out_t", 2.83f}, + {"tec_crouchfire", 0.97f}, + {"tec_crouchreload", 1.33f}, + {"tec_fire", 1.1f}, + {"tec_reload", 1.5f}, + {"tran_gtup", 3.17f}, + {"tran_hng", 2.33f}, + {"tran_ouch", 1.17f}, + {"tran_stmb", 2.33f}, + {"truck_align_lhs", 0.57f}, + {"truck_align_rhs", 0.57f}, + {"truck_closedoor_lhs", 0.4f}, + {"truck_closedoor_rhs", 0.4f}, + {"truck_close_lhs", 0.73f}, + {"truck_close_rhs", 0.73f}, + {"truck_getin_lhs", 0.6f}, + {"truck_getin_rhs", 0.6f}, + {"truck_getout_lhs", 0.8f}, + {"truck_getout_rhs", 0.8f}, + {"truck_jackedlhs", 1.73f}, + {"truck_jackedrhs", 1.5f}, + {"truck_open_lhs", 0.53f}, + {"truck_open_rhs", 0.53f}, + {"truck_pullout_lhs", 0.9f}, + {"truck_pullout_rhs", 0.9f}, + {"truck_shuffle", 0.4f}, + {"uzi_crouchfire", 0.63f}, + {"uzi_crouchreload", 1.37f}, + {"uzi_fire", 0.57f}, + {"uzi_fire_poor", 0.53f}, + {"uzi_reload", 1.4f}, + {"van_close_back_lhs", 0.33f}, + {"van_close_back_rhs", 0.33f}, + {"van_getin_back_lhs", 0.6f}, + {"van_getin_back_rhs", 0.6f}, + {"van_getout_back_lhs", 0.63f}, + {"van_getout_back_rhs", 0.63f}, + {"van_open_back_lhs", 0.97f}, + {"van_open_back_rhs", 0.97f}, + {"vend_drink2_p", 3.33f}, + {"vend_drink_p", 1.33f}, + {"vend_eat1_p", 4.33f}, + {"vend_eat_p", 1.67f}, + {"vend_use", 2.6f}, + {"vend_use_pt2", 0.4f}, + {"car_jumpin_rhs", 0.93f}, + {"vortex_getout_lhs", 1.0f}, + {"vortex_getout_rhs", 1.0f}, + {"wf_back", 0.1f}, + {"wf_drivebyft", 0.2f}, + {"wf_drivebylhs", 0.2f}, + {"wf_drivebyrhs", 0.2f}, + {"wf_fwd", 0.2f}, + {"wf_getoffback", 1.73f}, + {"wf_getofflhs", 0.9f}, + {"wf_getoffrhs", 0.9f}, + {"wf_hit", 0.03f}, + {"wf_jumponl", 0.9f}, + {"wf_jumponr", 0.9f}, + {"wf_kick", 1.03f}, + {"wf_left", 0.13f}, + {"wf_passenger", 0.03f}, + {"wf_pushes", 0.97f}, + {"wf_ride", 0.03f}, + {"wf_right", 0.13f}, + {"wf_still", 0.03f}, + {"shp_1h_lift", 1.0f}, + {"shp_1h_lift_end", 0.33f}, + {"shp_1h_ret", 0.83f}, + {"shp_1h_ret_s", 0.33f}, + {"shp_2h_lift", 0.93f}, + {"shp_2h_lift_end", 0.33f}, + {"shp_2h_ret", 0.9f}, + {"shp_2h_ret_s", 0.33f}, + {"shp_ar_lift", 1.0f}, + {"shp_ar_lift_end", 0.33f}, + {"shp_ar_ret", 1.17f}, + {"shp_ar_ret_s", 0.33f}, + {"shp_g_lift_in", 0.67f}, + {"shp_g_lift_out", 0.67f}, + {"cs_dead_guy", 5.07f}, + {"cs_plyr_pt1", 3.77f}, + {"cs_plyr_pt2", 9.67f}, + {"cs_wuzi_pt1", 3.77f}, + {"cs_wuzi_pt2", 9.67f}, + {"walkstart_idle_01", 3.17f}, + {"wuzi_follow", 3.0f}, + {"wuzi_greet_plyr", 4.0f}, + {"wuzi_greet_wuzi", 4.0f}, + {"wuzi_grnd_chk", 4.0f}, + {"wuzi_stand_loop", 2.67f}, + {"wuzi_walk", 1.17f}, +}; + +namespace SharedUtil +{ + inline float GetAnimationLength(const std::string& name) + { + std::string lower(name); + std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower); + + if (auto it = g_animationDurations.find(lower); it != g_animationDurations.end()) + { + return it->second; + } + + return 0.0f; + } +}; diff --git a/Shared/sdk/SharedUtil.Time.h b/Shared/sdk/SharedUtil.Time.h index c91eaa2f00..907db71c58 100644 --- a/Shared/sdk/SharedUtil.Time.h +++ b/Shared/sdk/SharedUtil.Time.h @@ -42,6 +42,7 @@ namespace SharedUtil double GetSecondCount(); std::int64_t GetTimestamp(); + std::int64_t GetLocalTick(); // // Get the time as a sortable string. diff --git a/Shared/sdk/SharedUtil.Time.hpp b/Shared/sdk/SharedUtil.Time.hpp index ae2aedbc78..c8aa455900 100644 --- a/Shared/sdk/SharedUtil.Time.hpp +++ b/Shared/sdk/SharedUtil.Time.hpp @@ -95,6 +95,18 @@ std::int64_t SharedUtil::GetTimestamp() return std::chrono::duration_cast(now.time_since_epoch()).count(); } +// Returns a monotonic time value in milliseconds since application start. +// This uses std::chrono::steady_clock, which is guaranteed to be +// steady (non-decreasing) and not affected by system clock changes, +// daylight saving adjustments, or manual time modifications. +// Unlike system_clock-based timestamps, this value is not tied to +// real-world calendar time. +std::int64_t SharedUtil::GetLocalTick() +{ + static const auto start = std::chrono::steady_clock::now(); + return std::chrono::duration_cast(std::chrono::steady_clock::now() - start).count(); +} + // // Get the time as a sortable string. // Set bDate to include the date, bMs to include milliseconds diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index 6b04aa6a30..d371774f54 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -372,6 +372,12 @@ class NetBitStreamInterface : public CRefCountable return ReadStringCharacters(result, uiLength); } +#if !defined(__linux__) + void Write(std::int64_t input) { WriteBits(&input, sizeof(input) * 8); } + + bool Read(std::int64_t& output) { return ReadBits(&output, sizeof(output) * 8); } +#endif + #ifdef MTA_CLIENT #define MAX_ELEMENTS MAX_CLIENT_ELEMENTS #else