From 79a6c44b8fede2a251768d4b018fac35c32bfbe4 Mon Sep 17 00:00:00 2001 From: MTABot Date: Wed, 28 Aug 2024 07:21:10 +0000 Subject: [PATCH 01/15] Visual Studio Update Build Tools 2022: 17.11.35222.181 This is an automated commit to keep track of toolchain changes on the build server. It applies to every MTA build after this commit until further notice. [skip ci] From b766ed1e6c9543557fdceb5be298e6805c9a5881 Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Wed, 28 Aug 2024 13:37:49 +0300 Subject: [PATCH 02/15] Fix building OOP API (#3614) * Fix building OOP API * style fixes --- Client/mods/deathmatch/logic/lua/CLuaMain.cpp | 1 + .../deathmatch/logic/luadefs/CLuaBuildingDefs.cpp | 11 +++++++---- .../mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Client/mods/deathmatch/logic/lua/CLuaMain.cpp b/Client/mods/deathmatch/logic/lua/CLuaMain.cpp index 446fdc866e3..6b794be0165 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaMain.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaMain.cpp @@ -127,6 +127,7 @@ void CLuaMain::InitClasses(lua_State* luaVM) CLuaVehicleDefs::AddClass(luaVM); CLuaWaterDefs::AddClass(luaVM); CLuaWeaponDefs::AddClass(luaVM); + CLuaBuildingDefs::AddClass(luaVM); CLuaShared::AddClasses(luaVM); } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp index f45efbf09c3..bcb765e7128 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.cpp @@ -30,10 +30,10 @@ void CLuaBuildingDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "create", "createBuilding"); - lua_registerclass(luaVM, "Building"); + lua_registerclass(luaVM, "Building", "Element"); } -CClientBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, uint16_t modelId, CVector pos, CVector rot, std::optional interior) +CClientBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, std::uint16_t modelId, CVector pos, std::optional rot, std::optional interior) { CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); @@ -48,11 +48,14 @@ CClientBuilding* CLuaBuildingDefs::CreateBuilding(lua_State* const luaVM, uint16 if (!CClientBuildingManager::IsValidPosition(pos)) throw std::invalid_argument("Position is outside of game world"); - ConvertDegreesToRadians(rot); + if (rot.has_value()) + ConvertDegreesToRadians(rot.value()); + else + rot.emplace(CVector(0, 0, 0)); m_pBuildingManager->ResizePoolIfNeeds(); - CClientBuilding* pBuilding = new CClientBuilding(m_pManager, INVALID_ELEMENT_ID, modelId, pos, rot, interior.value_or(0)); + CClientBuilding* pBuilding = new CClientBuilding(m_pManager, INVALID_ELEMENT_ID, modelId, pos, rot.value() , interior.value_or(0)); CClientEntity* pRoot = pResource->GetResourceDynamicEntity(); pBuilding->SetParent(pRoot); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h index 628d320844d..a244c74bbb1 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaBuildingDefs.h @@ -19,7 +19,7 @@ class CLuaBuildingDefs : public CLuaDefs static void AddClass(lua_State* luaVM); // Buiding create funcs - static CClientBuilding* CreateBuilding(lua_State* const luaVM, uint16_t modelId, CVector pos, CVector rot, std::optional interior); + static CClientBuilding* CreateBuilding(lua_State* const luaVM, std::uint16_t modelId, CVector pos, std::optional rot, std::optional interior); static void RemoveAllGameBuildings(); static void RestoreGameBuildings(); }; From 82000c34830b51ace2d14e39f3b487feb1aac1da Mon Sep 17 00:00:00 2001 From: FileEX Date: Wed, 28 Aug 2024 12:52:57 +0200 Subject: [PATCH 03/15] Deprecate setHelicopterRotorSpeed (#3643) Update CResourceChecker.Data.h --- Server/mods/deathmatch/logic/CResourceChecker.Data.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Server/mods/deathmatch/logic/CResourceChecker.Data.h b/Server/mods/deathmatch/logic/CResourceChecker.Data.h index a0234eb386d..e6bdee92125 100644 --- a/Server/mods/deathmatch/logic/CResourceChecker.Data.h +++ b/Server/mods/deathmatch/logic/CResourceChecker.Data.h @@ -168,7 +168,9 @@ namespace // Base Encoding & Decoding {false, "base64Encode", "encodeString"}, - {false, "base64Decode", "decodeString"} + {false, "base64Decode", "decodeString"}, + + {false, "setHelicopterRotorSpeed", "setVehicleRotorSpeed"} }; SDeprecatedItem serverDeprecatedList[] = { From 69aa420f21fde3ac56e3d3bbc62ef0f060295c0a Mon Sep 17 00:00:00 2001 From: justns <39979049+jvstns@users.noreply.github.com> Date: Wed, 28 Aug 2024 07:41:37 -0400 Subject: [PATCH 04/15] Adds new timer functions (#3683) * Add SetPaused to timer class * Add pause variables to class * Add new functions "pauseTimer" and "isTimerPaused" * Add new timer function defs - pauseTimer - isTimerPaused * Add "PauseTimer" to CLuaTimerManager * Def "PauseTimer" in CLuaTimerManager * Adds pauseTimer() and isTimerPaused() * Add new timer function defs * Add "PauseTimer" to CLuaTimerManager * Def "PauseTimer" in CLuaTimerManager * fix typo * fix typo * A few minor adjustments * Minor adjustments #2 * Update to ArgumentParser * Update to ArgumentParser * minor adjustment * Minor adjustment to function name * Updated to ArgumentParser and changed function name * Update to ArgumentParser * Minor adjustment to function name * Minor adjustment to function name * Removed hungarian notation * Removed hungarian notation * Removed hungarian notation & useless luaState * Removed hungarian notation & useless luaState * Removed hungarian notations * Removed hungarian notation * Removed hungarian notation & useless luaState * Removed hungarian notation & useless luaState * Removed hungarian notations * Removed hungarian notations --------- Co-authored-by: TEDERIs --- .../deathmatch/logic/lua/CLuaTimerManager.cpp | 15 +++++++++++- .../deathmatch/logic/lua/CLuaTimerManager.h | 1 + .../logic/luadefs/CLuaTimerDefs.cpp | 24 ++++++++++++++++--- .../deathmatch/logic/luadefs/CLuaTimerDefs.h | 2 ++ .../deathmatch/logic/lua/CLuaTimerManager.cpp | 14 ++++++++++- .../deathmatch/logic/lua/CLuaTimerManager.h | 1 + .../logic/luadefs/CLuaTimerDefs.cpp | 23 +++++++++++++++--- .../deathmatch/logic/luadefs/CLuaTimerDefs.h | 4 +++- .../mods/deathmatch/logic/lua/CLuaTimer.cpp | 23 ++++++++++++++++++ Shared/mods/deathmatch/logic/lua/CLuaTimer.h | 6 ++++- 10 files changed, 103 insertions(+), 10 deletions(-) diff --git a/Client/mods/deathmatch/logic/lua/CLuaTimerManager.cpp b/Client/mods/deathmatch/logic/lua/CLuaTimerManager.cpp index 317de7f16d8..4c70d03f047 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaTimerManager.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaTimerManager.cpp @@ -21,7 +21,10 @@ void CLuaTimerManager::DoPulse(CLuaMain* pLuaMain) // Use a separate queue to avoid trouble for (CFastList::const_iterator iter = m_TimerList.begin(); iter != m_TimerList.end(); iter++) - m_ProcessQueue.push_back(*iter); + { + if (!(*iter)->IsPaused()) + m_ProcessQueue.push_back(*iter); + } while (!m_ProcessQueue.empty()) { @@ -108,6 +111,16 @@ void CLuaTimerManager::RemoveAllTimers() m_pProcessingTimer = NULL; } +void CLuaTimerManager::SetTimerPaused(CLuaTimer* timer, bool paused) +{ + assert(timer); + + timer->SetPaused(paused); + if (paused) + ListRemove(m_ProcessQueue, timer); +} + + void CLuaTimerManager::ResetTimer(CLuaTimer* pLuaTimer) { assert(pLuaTimer); diff --git a/Client/mods/deathmatch/logic/lua/CLuaTimerManager.h b/Client/mods/deathmatch/logic/lua/CLuaTimerManager.h index 055b644fcbf..c4f97d2626b 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaTimerManager.h +++ b/Client/mods/deathmatch/logic/lua/CLuaTimerManager.h @@ -36,6 +36,7 @@ class CLuaTimerManager void RemoveAllTimers(); unsigned long GetTimerCount() const { return m_TimerList.size(); } + void SetTimerPaused(CLuaTimer* timer, bool paused); void ResetTimer(CLuaTimer* pLuaTimer); CFastList::const_iterator IterBegin() { return m_TimerList.begin(); } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp index 401abcfd96d..e0c8a96ba03 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp @@ -10,12 +10,14 @@ *****************************************************************************/ #include "StdInc.h" +#include void CLuaTimerDefs::LoadFunctions() { constexpr static const std::pair functions[]{ - {"setTimer", SetTimer}, {"killTimer", KillTimer}, {"resetTimer", ResetTimer}, - {"getTimers", GetTimers}, {"isTimer", IsTimer}, {"getTimerDetails", GetTimerDetails}, + {"setTimer", SetTimer}, {"killTimer", KillTimer}, {"resetTimer", ResetTimer}, + {"setTimerPaused", ArgumentParser},{"isTimerPaused", ArgumentParser}, + {"getTimers", GetTimers}, {"isTimer", IsTimer}, {"getTimerDetails", GetTimerDetails}, }; // Add functions @@ -31,10 +33,10 @@ void CLuaTimerDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "destroy", "killTimer"); lua_classfunction(luaVM, "reset", "resetTimer"); lua_classfunction(luaVM, "isValid", "isTimer"); - lua_classfunction(luaVM, "getDetails", "getTimerDetails"); lua_classvariable(luaVM, "valid", NULL, "isTimer"); + lua_classvariable(luaVM, "paused", "setTimerPaused", "isTimerPaused"); lua_registerclass(luaVM, "Timer"); } @@ -111,6 +113,22 @@ int CLuaTimerDefs::KillTimer(lua_State* luaVM) return 1; } +bool CLuaTimerDefs::IsTimerPaused(CLuaTimer* timer) noexcept +{ + return timer->IsPaused(); +} + +bool CLuaTimerDefs::SetTimerPaused(lua_State* luaVM, CLuaTimer* timer, bool paused) +{ + // bool setTimerPaused ( timer theTimer, bool paused ) + CLuaMain* luaMain = m_pLuaManager->GetVirtualMachine(luaVM); + if (!luaMain) + return false; + + luaMain->GetTimerManager()->SetTimerPaused(timer, paused); + return true; +} + int CLuaTimerDefs::ResetTimer(lua_State* luaVM) { // bool resetTimer ( timer theTimer ) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h index 671a329b289..db6cac48a9a 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h @@ -24,4 +24,6 @@ class CLuaTimerDefs : public CLuaDefs LUA_DECLARE(GetTimers); LUA_DECLARE(IsTimer); LUA_DECLARE(GetTimerDetails); + static bool IsTimerPaused(CLuaTimer* timer) noexcept; + static bool SetTimerPaused(lua_State* luaVM, CLuaTimer* timer, bool paused); }; diff --git a/Server/mods/deathmatch/logic/lua/CLuaTimerManager.cpp b/Server/mods/deathmatch/logic/lua/CLuaTimerManager.cpp index fbd86eccaf1..0af771b2891 100644 --- a/Server/mods/deathmatch/logic/lua/CLuaTimerManager.cpp +++ b/Server/mods/deathmatch/logic/lua/CLuaTimerManager.cpp @@ -26,7 +26,10 @@ void CLuaTimerManager::DoPulse(CLuaMain* pLuaMain) // Use a separate queue to avoid trouble // What kind of problems are we trying to avoid? Doing a copy each frame isn't quite efficient for (CFastList::const_iterator iter = m_TimerList.begin(); iter != m_TimerList.end(); ++iter) - m_ProcessQueue.push_back(*iter); + { + if (!(*iter)->IsPaused()) + m_ProcessQueue.push_back(*iter); + } while (!m_ProcessQueue.empty()) { @@ -113,6 +116,15 @@ void CLuaTimerManager::RemoveAllTimers() m_pProcessingTimer = NULL; } +void CLuaTimerManager::SetTimerPaused(CLuaTimer* timer, bool paused) +{ + assert(timer); + + timer->SetPaused(paused); + if (paused) + ListRemove(m_ProcessQueue, timer); +} + void CLuaTimerManager::ResetTimer(CLuaTimer* pLuaTimer) { assert(pLuaTimer); diff --git a/Server/mods/deathmatch/logic/lua/CLuaTimerManager.h b/Server/mods/deathmatch/logic/lua/CLuaTimerManager.h index d9d2fc41f2b..d63e659147a 100644 --- a/Server/mods/deathmatch/logic/lua/CLuaTimerManager.h +++ b/Server/mods/deathmatch/logic/lua/CLuaTimerManager.h @@ -36,6 +36,7 @@ class CLuaTimerManager void RemoveAllTimers(); unsigned long GetTimerCount() const { return m_TimerList.size(); } + void SetTimerPaused(CLuaTimer* timer, bool paused); void ResetTimer(CLuaTimer* pLuaTimer); CFastList::const_iterator IterBegin() { return m_TimerList.begin(); } diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp index 49c83bd576c..c3e0478c8b3 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.cpp @@ -16,8 +16,9 @@ void CLuaTimerDefs::LoadFunctions() { constexpr static const std::pair functions[]{ - {"setTimer", SetTimer}, {"killTimer", KillTimer}, {"resetTimer", ResetTimer}, - {"getTimers", GetTimers}, {"isTimer", IsTimer}, {"getTimerDetails", GetTimerDetails}, + {"setTimer", SetTimer}, {"killTimer", KillTimer}, {"resetTimer", ResetTimer}, + {"setTimerPaused", ArgumentParser},{"isTimerPaused", ArgumentParser}, + {"getTimers", GetTimers}, {"isTimer", IsTimer},{"getTimerDetails", GetTimerDetails}, }; // Add functions @@ -33,10 +34,10 @@ void CLuaTimerDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "destroy", "killTimer"); lua_classfunction(luaVM, "reset", "resetTimer"); lua_classfunction(luaVM, "isValid", "isTimer"); - lua_classfunction(luaVM, "getDetails", "getTimerDetails"); lua_classvariable(luaVM, "valid", NULL, "isTimer"); + lua_classvariable(luaVM, "paused", "setTimerPaused", "isTimerPaused"); lua_registerclass(luaVM, "Timer"); } @@ -114,6 +115,22 @@ int CLuaTimerDefs::KillTimer(lua_State* luaVM) return 1; } +bool CLuaTimerDefs::IsTimerPaused(CLuaTimer* timer) noexcept +{ + return timer->IsPaused(); +} + +bool CLuaTimerDefs::SetTimerPaused(lua_State* luaVM, CLuaTimer* timer, bool paused) +{ + // bool setTimerPaused ( timer theTimer, bool paused ) + CLuaMain* luaMain = m_pLuaManager->GetVirtualMachine(luaVM); + if (!luaMain) + return false; + + luaMain->GetTimerManager()->SetTimerPaused(timer, paused); + return true; +} + int CLuaTimerDefs::ResetTimer(lua_State* luaVM) { // bool resetTimer ( timer theTimer ) diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h index fd37e2aaa48..abf1b725d6c 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaTimerDefs.h @@ -24,4 +24,6 @@ class CLuaTimerDefs : public CLuaDefs LUA_DECLARE(GetTimers); LUA_DECLARE(IsTimer); LUA_DECLARE(GetTimerDetails); -}; \ No newline at end of file + static bool IsTimerPaused(CLuaTimer* timer) noexcept; + static bool SetTimerPaused(lua_State* luaVM, CLuaTimer* timer, bool paused); +}; diff --git a/Shared/mods/deathmatch/logic/lua/CLuaTimer.cpp b/Shared/mods/deathmatch/logic/lua/CLuaTimer.cpp index f632a1a237f..bd0383222be 100644 --- a/Shared/mods/deathmatch/logic/lua/CLuaTimer.cpp +++ b/Shared/mods/deathmatch/logic/lua/CLuaTimer.cpp @@ -23,6 +23,7 @@ CLuaTimer::CLuaTimer(const CLuaFunctionRef& iLuaFunction, const CLuaArguments& A m_uiRepeats = 1; m_iLuaFunction = iLuaFunction; m_Arguments = Arguments; + m_paused = false; } CLuaTimer::~CLuaTimer() @@ -64,8 +65,30 @@ void CLuaTimer::ExecuteTimer(CLuaMain* pLuaMain) } } +void CLuaTimer::SetPaused(bool paused) +{ + if (paused == IsPaused()) + return; + + CTickCount llTimeRemaining = GetTimeLeft(); + if (paused) + { + m_pausedRemainingTime = llTimeRemaining.ToLongLong() == 0LL ? m_llDelay : llTimeRemaining; + } + else + { + CTickCount llCurrentTime = CTickCount::Now(); + CTickCount llNewStartTime = llCurrentTime - (m_llDelay - llTimeRemaining); + SetStartTime(llNewStartTime); + } + m_paused = paused; +} + CTickCount CLuaTimer::GetTimeLeft() { + if (IsPaused()) + return m_pausedRemainingTime; + CTickCount llCurrentTime = CTickCount::Now(); CTickCount llTimeLeft = m_llStartTime + m_llDelay - llCurrentTime; return llTimeLeft.ToLongLong() < 0LL ? CTickCount(0LL) : llTimeLeft; diff --git a/Shared/mods/deathmatch/logic/lua/CLuaTimer.h b/Shared/mods/deathmatch/logic/lua/CLuaTimer.h index 62bb3c97a53..9534c2c47f8 100644 --- a/Shared/mods/deathmatch/logic/lua/CLuaTimer.h +++ b/Shared/mods/deathmatch/logic/lua/CLuaTimer.h @@ -17,7 +17,7 @@ class CLuaTimer; #include "lua/LuaCommon.h" #include "lua/CLuaArguments.h" -#define LUA_TIMER_MIN_INTERVAL 0 +#define LUA_TIMER_MIN_INTERVAL 0 class CLuaTimer { @@ -35,6 +35,8 @@ class CLuaTimer unsigned int GetRepeats() const { return m_uiRepeats; }; void SetRepeats(unsigned int uiRepeats) { m_uiRepeats = uiRepeats; } + bool IsPaused() const noexcept { return m_paused; }; + void SetPaused(bool paused); void ExecuteTimer(class CLuaMain* pLuaMain); @@ -45,10 +47,12 @@ class CLuaTimer void SetLuaDebugInfo(const SLuaDebugInfo& luaDebugInfo) { m_LuaDebugInfo = luaDebugInfo; } private: + bool m_paused; CLuaFunctionRef m_iLuaFunction; CLuaArguments m_Arguments; CTickCount m_llStartTime; CTickCount m_llDelay; + CTickCount m_pausedRemainingTime; unsigned int m_uiRepeats; uint m_uiScriptID; SLuaDebugInfo m_LuaDebugInfo; From 631afc43c2a6e42c583a6342f42eff561f47e798 Mon Sep 17 00:00:00 2001 From: Tracer <43095317+TracerDS@users.noreply.github.com> Date: Wed, 28 Aug 2024 13:43:11 +0200 Subject: [PATCH 05/15] Add definitions for CHeliSAInterface (#3686) * Update CHeliSA.h * Update CHeliSA.h --- Client/game_sa/CHeliSA.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Client/game_sa/CHeliSA.h b/Client/game_sa/CHeliSA.h index 49fc0d866dd..497fe46a707 100644 --- a/Client/game_sa/CHeliSA.h +++ b/Client/game_sa/CHeliSA.h @@ -15,10 +15,47 @@ class CHeliSAInterface : public CAutomobileSAInterface { +public: + std::uint8_t m_heliFlags; + + std::uint8_t _pad1[3]; + std::uint32_t m_leftRightSkid; + std::uint32_t m_steeringUpDown; + std::uint32_t m_steeringLeftRight; + std::uint32_t m_accelerationBreakStatus; + std::uint32_t field_99C; + std::uint32_t m_rotorZ; + std::uint32_t m_secondRotorZ; + std::uint32_t m_maxAltitude; + std::uint32_t field_9AC; + std::uint32_t m_minAltitude; + std::uint32_t field_9B4; + std::uint8_t field_9B8; + std::uint8_t m_numSwatOccupants; + std::uint8_t m_swatIDs[4]; + + std::uint8_t _pad2[2]; + std::uint32_t field_9C0[4]; + std::uint32_t field_9D0; + + std::uint32_t m_particlesList; + std::uint8_t field_9D8[24]; + std::uint32_t field_9F0; + CVector m_searchLightTarget; + std::uint32_t m_searchLightIntensity; + std::uint32_t field_A04; + std::uint32_t field_A08; + std::uint32_t m_gunflashFx; + std::uint8_t m_firingMultiplier; + std::uint8_t m_searchLightEnabled; + std::uint8_t _pad3[2]; + std::uint32_t field_A14; }; +static_assert(sizeof(CHeliSAInterface) == 0xA18, "Invalid size for CHeliSAInterface"); class CHeliSA final : public virtual CHeli, public virtual CAutomobileSA { public: CHeliSA(CHeliSAInterface* pInterface); + CHeliSAInterface* GetHeliInterface() noexcept { return reinterpret_cast(GetInterface()); } }; From 2a927c7033335f7e87564eb24b112323ea9f535b Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Fri, 30 Aug 2024 01:41:57 +0200 Subject: [PATCH 06/15] Add support for Apple Silicon (arm64) --- Server/dbconmy/premake5.lua | 1 + Shared/sdk/SharedUtil.File.hpp | 7 +++++++ Shared/sdk/SharedUtil.Misc.hpp | 7 +++++-- premake5.lua | 6 +++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Server/dbconmy/premake5.lua b/Server/dbconmy/premake5.lua index 3bd8cf5eff1..125047f9060 100644 --- a/Server/dbconmy/premake5.lua +++ b/Server/dbconmy/premake5.lua @@ -41,6 +41,7 @@ project "Dbconmy" includedirs { os.findheader("mysql.h", { "/usr/local/opt/mysql/include/mysql", + "/opt/homebrew/include/mysql", "/opt/osxcross/macports/pkgs/opt/local/include/mysql8/mysql", }) } diff --git a/Shared/sdk/SharedUtil.File.hpp b/Shared/sdk/SharedUtil.File.hpp index 351afa63c33..0a1cf56c7c1 100644 --- a/Shared/sdk/SharedUtil.File.hpp +++ b/Shared/sdk/SharedUtil.File.hpp @@ -156,11 +156,18 @@ bool SharedUtil::FileLoad(std::nothrow_t, const SString& filePath, SString& outB CloseHandle(handle); return true; +#else +#ifdef __APPLE__ + struct stat info; + + if (stat(filePath, &info) != 0) + return false; #else struct stat64 info; if (stat64(filePath, &info) != 0) return false; +#endif size_t fileSize = static_cast(info.st_size); diff --git a/Shared/sdk/SharedUtil.Misc.hpp b/Shared/sdk/SharedUtil.Misc.hpp index ed789460d1e..1ebf46a599e 100644 --- a/Shared/sdk/SharedUtil.Misc.hpp +++ b/Shared/sdk/SharedUtil.Misc.hpp @@ -36,8 +36,8 @@ #endif #endif -#ifdef __APPLE__ - #include "cpuid.h" +#if defined(__APPLE__) && !defined(__aarch64__) + #include #endif CCriticalSection CRefCountable::ms_CS; @@ -1834,6 +1834,8 @@ namespace SharedUtil return FnGetCurrentProcessorNumber(); return _GetCurrentProcessorNumberXP(); +#elif defined(__APPLE__) && defined(__aarch64__) + return -1; #elif defined(__APPLE__) // Hacked from https://stackoverflow.com/a/40398183/1517394 unsigned long cpu; @@ -1851,6 +1853,7 @@ namespace SharedUtil cpu = 0; return cpu; + #endif #else // This should work on Linux return sched_getcpu(); diff --git a/premake5.lua b/premake5.lua index 34dc2e37f45..c3375ad1e04 100644 --- a/premake5.lua +++ b/premake5.lua @@ -26,7 +26,7 @@ workspace "MTASA" configurations {"Debug", "Release", "Nightly"} if os.host() == "macosx" then - platforms { "x64" } + platforms { "x64", "arm64" } elseif os.host() == "windows" then platforms { "x86", "x64", "arm64" } else @@ -103,6 +103,10 @@ workspace "MTASA" defaultplatform "x86" end + filter { "system:macosx", "platforms:arm64" } + includedirs { "/opt/homebrew/include" } + libdirs { "/opt/homebrew/lib" } + filter {"system:windows", "configurations:Nightly", "kind:not StaticLib"} symbolspath "$(SolutionDir)Symbols\\$(Configuration)_$(Platform)\\$(ProjectName).pdb" From b404523247fe0395cdc64281586476651198afb6 Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Fri, 30 Aug 2024 02:26:58 +0200 Subject: [PATCH 07/15] Fix compile error --- Shared/sdk/SharedUtil.Misc.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Shared/sdk/SharedUtil.Misc.hpp b/Shared/sdk/SharedUtil.Misc.hpp index 1ebf46a599e..5697da49f49 100644 --- a/Shared/sdk/SharedUtil.Misc.hpp +++ b/Shared/sdk/SharedUtil.Misc.hpp @@ -1853,7 +1853,6 @@ namespace SharedUtil cpu = 0; return cpu; - #endif #else // This should work on Linux return sched_getcpu(); From c6a79fe532f885b5fb526c4e891012869eb4d731 Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Mon, 2 Sep 2024 16:58:30 +0200 Subject: [PATCH 08/15] Update digital signatures Farewell to Hans Roes --- .../MTA San Andreas/MTA/XInput9_1_0_mta.dll | Bin 22400 -> 19848 bytes Shared/data/MTA San Andreas/MTA/bass_aac.dll | Bin 271232 -> 268680 bytes Shared/data/MTA San Andreas/MTA/bass_ac3.dll | Bin 41856 -> 39304 bytes Shared/data/MTA San Andreas/MTA/bass_fx.dll | Bin 81280 -> 78728 bytes Shared/data/MTA San Andreas/MTA/tags.dll | Bin 43904 -> 41352 bytes .../server/arm64/libcrypto-3-arm64.dll | Bin 7000960 -> 6998408 bytes .../MTA San Andreas/server/arm64/libmysql.dll | Bin 8040320 -> 8037768 bytes .../server/arm64/libssl-3-arm64.dll | Bin 2451328 -> 2448776 bytes .../server/mods/deathmatch/libcrypto-3.dll | Bin 4643712 -> 4641160 bytes .../server/mods/deathmatch/libmysql.dll | Bin 7384960 -> 7382408 bytes .../server/mods/deathmatch/libssl-3.dll | Bin 1533824 -> 1531272 bytes .../server/x64/libcrypto-3-x64.dll | Bin 7252352 -> 7249800 bytes .../MTA San Andreas/server/x64/libmysql.dll | Bin 7950208 -> 7947656 bytes .../server/x64/libssl-3-x64.dll | Bin 1937792 -> 1935240 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Shared/data/MTA San Andreas/MTA/XInput9_1_0_mta.dll b/Shared/data/MTA San Andreas/MTA/XInput9_1_0_mta.dll index 3483103b055b415540f4fdb3c22bf589ba583874..74387b001363e19b72e2bab314d001477c3c1fad 100644 GIT binary patch delta 2563 zcmZveX*?4S1IKNSF-Pu6@_wD z$m3c>t_nrvdj7q6KF^E)@7?eF`M&;rezA>!ltMt0DFEo$M85zq1g5}RGXNAB=@b|X z3kwj)f{2HOb8smpnI`S=0zklf@vzJPAR=8_?h25%w)Ie*!6A)^=lFt%XB)l83IqUw z{NgSPo#N9U^97a8F)u)}4d~QOrj71p@yVD9||Ej1Sy3$ z^;ZD%h**b`f}wUH;S?_t)R=UY6c`dpq9B!(5U{@jE04^-3d&G((pA4;s0k$`ER619 zaGF+zX`ft_(kK*8+JJXi$37bUc@bxHQR9fLO@7lN4tsnG#r#SOSNl~Gl%EZdd*Why z_&)Sc#*1zhDJVQ8$f)DNaBOfmI(7c?d&EWZ+Z2Svt9c=K@r1l_?=Rf+um!K=Hg0lA zY|lI>?Tdq~uj#3vskLU(Kpd&4W7o-Lew*fH>O4a^pJ~7`LGD{lxA<0ITgky!YnO^Y zdXHsWWe(4$)%;xdMF%hsK&FQE#f7`J<+Xbn0lsB$2Fc&`sJanap8JCrnRO7mL#ebq zfMEG<-O<1pm5Ok=*;pPh7CvjU#<(S!2RB{vA+L`xEqUpS{fzZkIW+ka`wI>Nt;^

p5AUugmZV zxfRZkn2d^S_nA1 zf7_$MnN5vVmA!?QKJ8^yRYrPCn)q#*7Pk`>vt4BsFs7T zo4}ZKM!S|WJ6IM-S$Qj|%kUfHbEu3UPz1-o6;a+H=Y!qu7Y0p`qP2N$@VTdF&#cKM5V|%~kPzuVmm-v-ijewyJJC#d|5mrhOfj2+;3||+i=uz^XVtF6e zI7hBi`5rn-wVPk@&ab0w$>+vOZo?ls%wFv!3U6jzR!X2nX!HHC*{2rFWl3TDs@df} zSI~S&GGo}8HY&~_P)YSVE#v7V?Z%z#U7sMW8A6OUP1ZXbb`?kg`j z$JA>z8MAMdZ!vT#W8@NK-YG{qJHEfy3n$bcAkyqMb|0<|^cLV&np7@rex`r9-*EG- zf!cdy%c&KsPg~a-EufBdGgq%@=5{|XX%MCKv+Wjfb&KR!+13{%Ca6|;-opN-b_<*@ z#pq8p&l_T(Zp5`b;hR;N3IgQteHUcBggzo(0s{m95dL%~+)40X_7ACBLIbi$3sH27 zG2#XHG7rdur;JB~7wa=|%UctI?nH=OY2sXo{3&jcKpTBD)*ud{ExJL>c=ihyTT+FUc&bpqGOx_d4Vt3{#>OAbcaBD;S)%zk~^ z`nq3U6E2F;)Zetea{f#*Z8ZHhxuvtOv8o5}gau>}Bir2LE@(_*K`Yjl*LdwS6>hJe zuYU4!T1~{w0V%6z_y}jetd^M(Dd1dwn3k*`y-{qI%E)bIZ_7{#)xiBpNY4*GiYeVy zv?T0Mbvh-kVX4l7aU0$h+YOM!7pvbW4^)qpt4zO}Ku*lYJXbhLYZFeAk#}07ojun$ zxCAWNTbki7;_dXm#jU&`5{I{Kpc;Hut;nB8C~piUNz(!%eWRnQ9zwJ6-~t&=E@7Bv z4nSqpP~K}{ZtAjIE!9=1Fiao~e%!?DANGQ>Oj#0AHB-k=8NCkvJDbHPfNn=tpaPNO5TG zr)mm{>n+v7?_`YSHmVatSxD;5-EJ5o)5V$4^JJQl8b^?V!p%GdL6cVkjhSq8Y zVKKto{|D%ncyk1T%#*)=_+lQjw9yu`p#N-5^%dK8O)G!RnRoH9u+cvohQE6;KDSdo zHna>10rqh8*Z4NtBa3DCyqm%%T$W&D@y-+8uQqLlEiqgc{+PwY?5_9bs6mliD-Gukb0@F(soTUOYa zd;?9gLn%bo)fdT@g~Q+ZITfz`A0BHbyEfDcCunZu-jF;^58-L9WAux&TQ{t)M;j&( z-05~1{NN8PYv^VpoJM(YhcO-0c7A)g*Wp3*KVA12{8UVqh2-;Q1-7F?9H?#XXvl_O!9iJs(Jt%_vwm6w8pNY)5kxF`%9YoqTAm-T$u}Z)##tFIVU;z Pl)Ghsb?Bdi_c#9qaZi+# delta 3523 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 Ntis;A{B!Vr<-hYosto`D delta 3523 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 delta 3540 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 D`X3;& diff --git a/Shared/data/MTA San Andreas/MTA/tags.dll b/Shared/data/MTA San Andreas/MTA/tags.dll index f73a96cae278e8a7cc23530c2e0061adc995572b..874ef2c6727f66e103de139e0c544c295d043220 100644 GIT binary patch delta 2563 zcmZveX*?5*1IK6XGsnoiRaEZHkt@uZ%6*2Ejb)f)b0*B4`TzpCmCjY)@bLfKgu?U`5v zfciEtUMSC>!p6mF=#TU8Mo*HC^a90CI|Kw&&_2tR+ABvky5 zz`-SG8G!PG*!l21eskraddIPFI236F0c*~i-hj%x1`iwKl)MuH%_AIBHZ4+%sEIie=DR!r0 zaHh4nA$ltLU<0k{Gk45tYEbi}@X)5b`bgaeU8Y1udEY*LS_di5{l*Q;I*#7Qk!+4d z;5=#h>e_}Sg6yu==Ev08B`wA%*TkEC^)8;+jo~?SZo)z@bt76z73;#>&4R$UTTh4j zY9WIdr#fp18%)m%)A{n5+30&wS(YW~brGR`K2M$OjF|@zsJ~+^x16<4zhQk;`Bs;Ralu9SM3oxv zi{^Kqx761Zj%FKsw3ZbWsp*ZWqL0oux}K?=Y0p~#OcQhFbII$QRX$9W7Ho_JbmA{i zgO@A+C|_-A=EqD45j~j(-jBK>gwThH`1mrP`-+smCH9vgX6?#Xe=iMqa0>LqhW?PO zcQ^mMP^i3h3n9G*thlPQLn#rPKl{Y=+^C&n%;t!$X(#hMk~HD-&dDW%>)90Nh^7PD zm2VWB@lsQsnd1Tww=yW9L-iWvaUg{vaQvejl@T8PCVs9Jg}xK0NG+}eo;&Fo_(CfU zWC-7utoKk+w1#IeymK`NM=aM`ivLtK&Td7$K~%*%Y(;9t(LSTQ|lte7^CfdT4Gn2Wo`{~!AY%Pz(P0ivI9SE-BH zWGk=7Z+e7^L`JQL&Xw;+wcQ`XSEP6~yC+vC)F!a+XIqX6Z+=-!)|oM$*eISbXqvh? z5@(}t#TT%CPW;~;%Trg|u4&sae;{Iazm{oo@`&Di+R$u^Wr`PL93<^-`y8TPZL)M5 zS-cB~BXz_p^XhXCnLFU$%R-v!L7XYCP2}YlCr?zC0+mT>%(V3;O~Ghw`^nBn&g?Kx zan|+P=5!p#Ws57jays>cVCI@McZO=}hKJr%9F~T)konPzYk%w)UL*q-6TMag+XRcB|(9F~7)x1BLbb>b#J5#B*og?_HMKjm9 zBD7>Q9KCp~5219fYX988i0LGU({cpsd9_}Jg`T9prP~Id>VX?uwWw zLjMOhdc)wJ4-wzpcKt%yfT${1<-ky}PCLYA%*oN@Z1v`r^_e#B?rl!$-H9(Yn5`bv zjxJaID@EEqa_Z_W`?_gJ2qUs=J3D$&2&6ubAJ_gAx zv{DO`Ov_($+ivw7EH5OGoTr#da4rK41Z3qPN5F?0+l0?3LzPvbnown!s+x+bMiXnU zHi+~80KuGm6Z&#_iYN8X_pjeRy**y`GwEd&`UdB}Gv2Vz!Ids|>3h=6ujyUrw+fi7 zOEC?iWZ^bKANd8|)Ku+tET!}Vitdp&Qh*a5XpCT5%1YgH6C9ZD@T{2$_A+spa+uTtz6uQ_Zyv=1+WizyFJ%XhU0m-;+tA7&ViKf)No zzj7GA!SZ%T-ttNVC@evRcUlC+o18|K`FS8iV5b+pm53Z}>Y zNhggkc1>XV`-!NXac5i`pv(l0pC$PKdq< O*=NOQ_wT{`lYaoT0=2gQ delta 3523 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 diff --git a/Shared/data/MTA San Andreas/server/arm64/libcrypto-3-arm64.dll b/Shared/data/MTA San Andreas/server/arm64/libcrypto-3-arm64.dll index a1aacfd78883ad5c8ba4e997b1359b188e11628a..666c0f287b6c40140572cd061d773291aaf53db6 100644 GIT binary patch delta 2999 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 DFlT~2 delta 4025 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 diff --git a/Shared/data/MTA San Andreas/server/mods/deathmatch/libcrypto-3.dll b/Shared/data/MTA San Andreas/server/mods/deathmatch/libcrypto-3.dll index a54d2e20d5b00cbb7417c60c90492cce096b632f..f7ce3d098ea14f3ae22279ef6788f0a0e13af270 100644 GIT binary patch delta 2855 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 P(;^DS&ye8N`!oLnTZ0k8 delta 3817 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 J?E}AE{{jvM+P(k) diff --git a/Shared/data/MTA San Andreas/server/mods/deathmatch/libssl-3.dll b/Shared/data/MTA San Andreas/server/mods/deathmatch/libssl-3.dll index 4d45e0095b7e5bf7b8b2e289bac063aa9a08c96a..e09cfd88c7ff0b200a7b4f667dc0cee4dd52a357 100644 GIT binary patch delta 2666 zcmZwJcRbXO9|v%EIP1vDIl?6)`|i*gnP-(fzV^}K$aaUw`WTVymHQ%lbV#z35x(Eb zC|OAn&d5$tMv33`&-bt2`|)`G@p?aAf4?8^*tfXkF5HtFAbMvN{#r7%QU( zgTP=;0msE>0v|v8%`J0qtqu%K&awTiT~f( zAhD;8R==l$erEjhTuvCFknE4`tQ(CD2vtg1@SH+g5Z@#t1z#=jC=^di==C4ze;hSo z7uwT*Kf-@#?4P=Bd+Dap1^=1NCc;o0;X&ttz2m|j;BMqFM>5FNflL!$d`>snEwHMF zaMW6-*qlyjGi*>t7g8xdwr(o7(s%N2SEKF+5P8xa+G-`P=F zC$amaYO52tHb)v6qmC^-&w{fwJ?U9oRilr=B^d`iaq=Q=y``G6=PtkO*@_iYB04et z1Hl8`mLJ0W)!ahpXZj!KZZXsqrE`%PnHTnAvdl}<8>7MoeIGj5=rfMs3BA$>^sK*) zem&$X>`Z#D-=ej4_vC>#HL&m6L2&i*iR7s}mC%&k_B*CoB((q&qs?;SGNAZ!yDY1z zcp@?1(#e0^1$%25=QU?3YUQbpZ9;D24JmsQ<8 zK-A*s);&di3+)knA9cHh^Xx@AW)aHk$7JL?u{Xc(ct=j#6+Fgil2^ersMEALjlaFBPuD1OwzUq=?O-2x;_qk8{{ohv7-wphT2&OY$+SDnMhr~#Keve6a}4Vm?M z@{{%moGE)weeyd&c+B~;>A!>r14d;WO8g|AQFr0r6l*Z-ll$JJ?N?^(){TPLQeA+Xs&}hWZQi*Ph5Z z?X2dmS3bV?Mn`c9)qG*iZ0TEgqY1*Ue(qL?O5XEpr;@DMM)gKtd?KeCKr*W15H&?%nn1pz#r8}%N28|3nZ|NNdD&0n{mth7;~kK51XL6- zEG(D*y=B&|qc=3s{iV!>i@Y&lPL<9OXIn27dn~`x;g@_vHakTfv4i825IHW_h5f7! zjm2fOy{{ovKU=%oqZPD-g}-lwoX8zj(dH%9iT{|ghvfIpddGYA7c!z>KlmBiopXW_ zj^hGgsvv@#>0t?_yvw~eE?x0}2evOar()N4FMl=B+k8A!k8LFQem_&>xf;mY@a>&A zPqL*sELs%>Rl?YZCz#bHtpQL z7@a>c(Ag6q1?gepB+p!*P3omckq13sZ2)fxQ2ga`ex4=b(%!Dj)@J0372;~+GA=2f z@w)HZ^_#|Z*qgw6wT^aV{VRumMCqj-)jRmv$UT$C4~n||`?Zvt&0nDIv5Z@=$Jh&v zL_h$tm}|?VpP~446kQiTm99KBu{YZ+-)^dTDqg%NVbucNcv9tSL6+W3M~A#=AOXa! zR-loUnQAd$%*geCSzc>`ZV#s4X_?$!8=dfU(`5+T#D{Q=KVfJ;9P!t5KZ$COcqfr) zawhWAkz=VHL+nkQv5#Cyzkv*OEHW4 zjdiBl+q_0cN#46V3)zMhuAE)C2>1?P$>I~eeUV}s{@B_k7DuUAMc2q()fjcux2~qp zg%pQhIF^a$?_G)ebU+6!v;a*{4#xGRNK!D2L7=EwgSU-q>V7!Ea~UBkwZD|_eecU- zs9i7TUT6bVZc8A-#5qh%#;2fL$`NJ_RXF(Z9oi)QFD^l07-iG1ZAT& zq7@%(Sm#pev@71VCmS?cQ_f~GvRK>21{jFF%-&R$xEv!jJMr;MNaVWG^;1pqWq|Ip fUP5`sR;F)hB(qrikv(ZRpDp<7!3yow`!oLoWk|*z delta 3628 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 EUrS=B4 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 G?fMtLT*Q0; diff --git a/Shared/data/MTA San Andreas/server/x64/libmysql.dll b/Shared/data/MTA San Andreas/server/x64/libmysql.dll index 96e63b50d03622e152192695727925cf4e0ade7f..7e1949a4853ec51368bc7c4c46cec8c5e5204c52 100644 GIT binary patch delta 3059 zcmZwJc{~&T9|v%on>j;nYmRbnOpcLrB1f*T9I1vGF>IQdd<{iKb3`rV%C(3hDRM+9 zC5)u>l`|pyDrzar@6$iuzrOFsXOyZ|4-4+sE)fDj-IhybDh3=jjv0SQ17kOHKEJ%9`#3&;U`0eL_HPz00! zWk3Z`1=IjIun#~0>VO8I31|WPfdhaxpabXvdVoG)02l&D00kHU#sC^H0S*GDfEi#8 zSO6Hn60iae0oH&GU<=p*_J9L`1ss9HfD_;h906PaSHKN$2aWCxDZ{DF6oq10g^tfCs_=0uT;F0H=XSAPOJ?(Lf9k3y=UZ5C@zA zC_p?w1ri=iL1+j?wTs$3JUmb+4>C=gA|R}j;gs=H3?c|EPty(qt6-*@GVKgh?AC)F zeOjl08Zu2_37N*nF6V_ppioK0fSGp1_Y>Epbq~%SQOL7pj_#*L(a}gVlrhT0#K^=X zV6T{w$-faDfJ|keM3KS*ynpct?19>Pp(K&we}WK9&_0G78WW5|sUcPVYy@F)z7bJT zIQU_FG@gu$g4^Mv2xMGz3`!NL{HGuSlRX-XkA{24P{<*8xC1^O9~BdeC!_Rqk=lO> zyfDOn7WCjQ`1puu_+fHPTpaVHIc*=k0@M0-Ue&Z%CS%pG<7i3?`-cbC-ounjvLL-` zR@8o=Y&82nI>mUilz2T4qVX`mYiBI>clMKReO0*OMWTIM-B3z21)Vt^Hiq;d4PHbl zJ)hoVSTe5V(6fnsKjbQ=vW|T_Apg^an6>1q9`2+}eD}Et{~{HCqmAPiFuhI>aq^!e zJLcF5jFb94FeUN>+3G>r_e zFzm#iKF+PZ1HW1DT@01Gow7l$_S#mk5x>kd#n_k03I}<*ZFkNrSnwtXWw=D&4J43O zhG*Tx^5>s*uB2$7NrC)N1aR~Y&j~8gBKQpNyPn4U6~4M+h7^-uXnH+4_h=d8P7<|0 zvew@R%Rhj_cj<6=MRuIFYUPUBGP<$%tQRkA->{jDdF;%ItDfK9&kdQyH|5>mNp4ol zDl|>D5#B!0Yy51rJh!Q2H2s=qAaUe`ef*N0gD9@oHh=kW$d$B1<1gr^It>>p-^5`R z9rgZJtD0Tq$iFIc$gS?^C0UDi*l|(cD4j}glW6xOcl#<#XJ9f>f=-d6>r)#6=k;w) zLfMk81vdrzZJR!i82R-oV2iYD#%oL@@3*|1Tr*wP|2fm#XYt9vpp(&@rFa$593)Zo zq2t;-&qU#sxdPVb)tX4YDt94XX1ES*OQtCzNP0x7F)QbNj*5b{c9Z1$Lkdi)E-iz8 zz9N!lQ2$tE;}hJq!^m=XVIWj=PhT4Km+IXRx5@cpqcuOA<}$R>((r42nbO?e5~qD5 zKF3m5*@v8Z_~(MF$0J|*2WG?S-ifl!eZzyKM%1!f&Gq<2)S=|XK^3dch!Jt$YATK_ zJt9(-6dL0g9aLFN9LN7{0ZSJ@!N{f;dzb~sORedg9=efYMxfaAEL|ZN-n95AsdvvF z8tc1J{c)b^u1k%&G(i|TD_iwgH}oCPSn8cAQoa7ySazcK^kV4sdipo5f)tf?!`r?e z;(LN+)^fvi&(WzC;=et&5(}qtRWT8@{2B{YbOIhRVl#O^5o;TzYjBpH{pc+{oteiW z5X~oX$rg0=&^#j#|Aw6U0)y9n@E|v_EAqhywI0p?*jRaw zA+BK?ndQC8xxM_Nrx3e%S3huVA%Cf|@zS8J@ffOEdC`6DTf!Yz__6xQ_%mh&-Myua za^z=xoEyU3vRB-_8Vb*!GpIUs+2&Vbx0GWU#`;~;v>gT>6#V&`%%z%~15zZ)RsbqZ z$r_oagn>dJ$kWW({WL%6|2Tpu6Iv-9%9HOUzO{8stV!wx3*~jrxTVdkHUEUgae5N- zW$pR(UzMNvw`X!=?P?zW6T-NesjDjMK<{_2MMIY-Xk{rv#WpNT78*vZ8O~YwN3_*T zu2Ces;8nOSgLm(?r8D!iS&2hK31@KTK$u<;W{8z$tWpg5{a7NQp1tVWc8yHWT<)h@ zKJ1|oOpV_tmzXE|?ip7cy_==m5IH?dUGZI#wqT5{LQ;HkXe*Q;(F_ctORT>(b@)P| zs%-H0%IEVQL+q*X);e#T+&#wTv&N17f+me__MFYf$iSGKRFs+zr7tdST*Pttux-6r z@#NJ(9*to(By?7EK<`}O_X7G;JN~rllUrZs&bD9W9I1D9nci^?OtR7%=AmD?(KvCU zBFC9e^Or^ig|Sg;@+@p_KDPGK8YJF8z0VYlBkZP?UoSYB8Cb^Yahm8No4KDs*u5<3 zZqa@$E$ew()!*Zi@)7&RE7`qumzQ4#emBoS)EP_kpFiknr+LgEC_v{aU3B>FM+eyE zQ$J;|s=4Vm)=IkZKAhs`EkvF}ZgnxbXFnQG{Dv(EM|;X4lXmB*&Gz3I|Cr}xk1irU z1}kA(k6X&NB@^AtpR5YG*a^5s+&Y^-_4MjKzXzPkNDW)WzV;Z0+bvu-%_Wb6QNP=| zJ{!N%r$Cr9~Jq^l1QB7lgr}DTUlCWKN&q58%AAh zln81%nAf=pGu-F<$(8&r1;V?al}g9NSk36Ynul~OT_1)>JW{#G9xGw}$G&#HLSO+)TVSU18u*vP2 zR*~dImb#5vjpU=Jw8fY`5wx!=k5rXj$J#?!j}%v)XJ)sU?0YMfW=)B{Mz_Au_vQ>@ z=hR!J16i$GMeNdriF7Eui}B<5`Z#7s{qweD&(1WSokUuFN|9F}Y+BfzmX_n2O&{BN z)^T~)nxVXe{i4w6eDb>Q4CS8vz{7IRp}vM}XBM_Ynuv@bMHUlm?ApzJ3iT&xovW>? z^+B>i3mD?s)#mnR*Sw~`(>pq-o0uQ+ioIHl^9tA{MNv6*L=w}xlv`0aZE4QDDm96T zbyBE8lOV4vefuoTF4u&+#d5nH>K5A`4_*j&;X!<(%t-kCT%A}t*z5J`!=3M{5kn0- zL6#p(=mYJe&YtcoU*g)8Nw1+DshNjL;w0Zsv~xXz>+@@^j;Om!i4IKtCV*G(&-@=$ C{d?{J delta 4021 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 a8n_(98dp0qUY_mr!?Q$vtcd`hUH<|wZvt!p diff --git a/Shared/data/MTA San Andreas/server/x64/libssl-3-x64.dll b/Shared/data/MTA San Andreas/server/x64/libssl-3-x64.dll index 8e7f859cd63f2e772b1b026c1fad37c3cb8c7719..849cd5f0ba3e4d41b2507a299acac70f63c85207 100644 GIT binary patch delta 2689 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 R+NNa;A>{r&s8aB^>pxLkM;-tG From 48f94d89c1f7517cae688804a4249f99947454bc Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Mon, 2 Sep 2024 17:46:32 +0200 Subject: [PATCH 09/15] Update integrity checklist in loader --- Client/loader/MainFunctions.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Client/loader/MainFunctions.cpp b/Client/loader/MainFunctions.cpp index 9940fde94af..ed802555abe 100644 --- a/Client/loader/MainFunctions.cpp +++ b/Client/loader/MainFunctions.cpp @@ -863,15 +863,15 @@ void CheckDataFiles() { const char* expected; const char* fileName; - } integrityCheckList[] = {{"36CB1B284BC7CBB4F25CD00BBB044550", "bass.dll"}, {"1B909B47946167D153FB94020393E781", "bass_aac.dll"}, - {"E7E69A3B369F0ABA1A4A18C831BC4364", "bass_ac3.dll"}, {"E20A57EA7D845FADC9A48A0AA919121A", "bass_fx.dll"}, + } integrityCheckList[] = {{"36CB1B284BC7CBB4F25CD00BBB044550", "bass.dll"}, {"80CDC5A50B27C47E53B99DE4D4523698", "bass_aac.dll"}, + {"2757D3E0F63C8C62DB32F90D776AB815", "bass_ac3.dll"}, {"539BE2B8762FF618C3BA04B638FD4A8B", "bass_fx.dll"}, {"F47DCE69DAFAA06A55A4BC1F07F80C8A", "bassflac.dll"}, {"F246D72BA73E9624FE8BE66E785FB5C5", "bassmidi.dll"}, {"5DEEC10A943E352EF7E0223327E8B48C", "bassmix.dll"}, {"2F87C5E0A1B7B28C8FC0D7E74116DDFC", "bassopus.dll"}, {"0F1B2FC6C0C703A43A24DC05352E7ADA", "basswebm.dll"}, {"893113C6C49DC1E1EF288310E68DB306", "basswma.dll"}, {"C6A44FC3CF2F5801561804272217B14D", "D3DX9_42.dll"}, {"D439E8EDD8C93D7ADE9C04BCFE9197C6", "sa.dat"}, - {"B33B21DB610116262D906305CE65C354", "D3DCompiler_42.dll"}, {"02ECD2919B3DAA59D6014EEFD29FC294", "tags.dll"}, + {"B33B21DB610116262D906305CE65C354", "D3DCompiler_42.dll"}, {"7A1665DD46726DA4592E77DC05D114F8", "tags.dll"}, {"0B3DD892007FB366D1F52F2247C046F5", "d3dcompiler_43.dll"}, {"D5D8C8561C6DDA7EF0D7D6ABB0D772F4", "xinput1_3_mta.dll"}, - {"7096EB0458485D89BB749474550C7651", "d3dcompiler_47.dll"}, {"E2BAC93166B0C2AD4D83E97FC1E88F8F", "XInput9_1_0_mta.dll"}}; + {"7096EB0458485D89BB749474550C7651", "d3dcompiler_47.dll"}, {"87F689D5636B6F31DBB4B9CBF56E17E3", "XInput9_1_0_mta.dll"}}; for (const auto& item : integrityCheckList) { From 7daa694e9f6865e0f8aeb9a347933560eb1669cf Mon Sep 17 00:00:00 2001 From: Uladzislau Nikalayevich Date: Tue, 3 Sep 2024 06:26:29 +0300 Subject: [PATCH 10/15] Fix bad destructor for buildings (#3690) This fixes random crashes/regressions after `engineSetPoolCapacity` --- Client/game_sa/CBuildingsPoolSA.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Client/game_sa/CBuildingsPoolSA.cpp b/Client/game_sa/CBuildingsPoolSA.cpp index b8363f6507f..caa392c132e 100644 --- a/Client/game_sa/CBuildingsPoolSA.cpp +++ b/Client/game_sa/CBuildingsPoolSA.cpp @@ -101,7 +101,14 @@ void CBuildingsPoolSA::RemoveBuilding(CBuilding* pBuilding) // Remove plant pGame->GetPlantManager()->RemovePlant(pInterface); - RemoveBuildingFromWorld(pInterface); + // Remove shadow + pInterface->RemoveShadows(); + + // Remove building from world + pGame->GetWorld()->Remove(pInterface, CBuildingPool_Destructor); + + // Call virtual destructor + ((void*(__thiscall*)(void*, char))pInterface->vtbl->SCALAR_DELETING_DESTRUCTOR)(pInterface, 0); // Remove col reference auto modelInfo = pGame->GetModelInfo(pBuilding->GetModelIndex()); From 04ef14bbf2182b356155f28d4ed972b0f293632f Mon Sep 17 00:00:00 2001 From: TEDERIs Date: Tue, 3 Sep 2024 22:13:21 +0700 Subject: [PATCH 11/15] dxDrawModel3D reimplementation (#3266) --- Client/game_sa/CGameSA.cpp | 2 + Client/game_sa/CGameSA.h | 6 +- Client/game_sa/CModelInfoSA.cpp | 5 +- Client/game_sa/CRendererSA.cpp | 55 ++++++++++++++ Client/game_sa/CRendererSA.h | 23 ++++++ Client/game_sa/CVisibilityPluginsSA.cpp | 7 ++ Client/game_sa/CVisibilityPluginsSA.h | 2 + Client/game_sa/gamesa_renderware.h | 4 ++ Client/game_sa/gamesa_renderware.hpp | 2 + Client/mods/deathmatch/StdInc.h | 1 + Client/mods/deathmatch/logic/CClientGame.cpp | 12 ++++ Client/mods/deathmatch/logic/CClientGame.h | 5 ++ .../mods/deathmatch/logic/CModelRenderer.cpp | 72 +++++++++++++++++++ Client/mods/deathmatch/logic/CModelRenderer.h | 40 +++++++++++ .../logic/luadefs/CLuaDrawingDefs.cpp | 19 +++++ .../logic/luadefs/CLuaDrawingDefs.h | 2 + Client/multiplayer_sa/CMultiplayerSA.h | 1 + .../CMultiplayerSA_Rendering.cpp | 37 ++++++++++ Client/sdk/game/CGame.h | 2 + Client/sdk/game/CModelInfo.h | 1 + Client/sdk/game/CRenderer.h | 23 ++++++ Client/sdk/game/CVisibilityPlugins.h | 2 + Client/sdk/multiplayer/CMultiplayer.h | 2 + 23 files changed, 323 insertions(+), 2 deletions(-) create mode 100644 Client/game_sa/CRendererSA.cpp create mode 100644 Client/game_sa/CRendererSA.h create mode 100644 Client/mods/deathmatch/logic/CModelRenderer.cpp create mode 100644 Client/mods/deathmatch/logic/CModelRenderer.h create mode 100644 Client/sdk/game/CRenderer.h diff --git a/Client/game_sa/CGameSA.cpp b/Client/game_sa/CGameSA.cpp index 5d4a8300996..07ac611c09a 100644 --- a/Client/game_sa/CGameSA.cpp +++ b/Client/game_sa/CGameSA.cpp @@ -145,6 +145,8 @@ CGameSA::CGameSA() m_pPlantManager = new CPlantManagerSA(); m_pBuildingRemoval = new CBuildingRemovalSA(); + m_pRenderer = std::make_unique(); + // Normal weapon types (WEAPONSKILL_STD) for (int i = 0; i < NUM_WeaponInfosStdSkill; i++) { diff --git a/Client/game_sa/CGameSA.h b/Client/game_sa/CGameSA.h index 976c1d5db0a..cf4788d9539 100644 --- a/Client/game_sa/CGameSA.h +++ b/Client/game_sa/CGameSA.h @@ -17,6 +17,7 @@ #include "CStreamingSA.h" #include "CCoverManagerSA.h" #include "CPlantManagerSA.h" +#include "CRendererSA.h" class CAnimBlendClumpDataSAInterface; class CObjectGroupPhysicalPropertiesSA; @@ -172,7 +173,8 @@ class CGameSA : public CGame CCoverManagerSA* GetCoverManager() const noexcept { return m_pCoverManager; }; CPlantManagerSA* GetPlantManager() const noexcept { return m_pPlantManager; }; CBuildingRemoval* GetBuildingRemoval() { return m_pBuildingRemoval; } - + CRenderer* GetRenderer() const noexcept override { return m_pRenderer.get(); } + CWeaponInfo* GetWeaponInfo(eWeaponType weapon, eWeaponSkill skill = WEAPONSKILL_STD); CModelInfo* GetModelInfo(DWORD dwModelID, bool bCanBeInvalid = false); CObjectGroupPhysicalProperties* GetObjectGroupPhysicalProperties(unsigned char ucObjectGroup); @@ -346,6 +348,8 @@ class CGameSA : public CGame CPlantManagerSA* m_pPlantManager; CBuildingRemoval* m_pBuildingRemoval; + std::unique_ptr m_pRenderer; + CPad* m_pPad; CAERadioTrackManager* m_pCAERadioTrackManager; CAudioEngine* m_pAudioEngine; diff --git a/Client/game_sa/CModelInfoSA.cpp b/Client/game_sa/CModelInfoSA.cpp index 483615d3e14..2db97a5245e 100644 --- a/Client/game_sa/CModelInfoSA.cpp +++ b/Client/game_sa/CModelInfoSA.cpp @@ -2028,7 +2028,10 @@ void CModelInfoSA::RestoreAllObjectsPropertiesGroups() eModelInfoType CModelInfoSA::GetModelType() { - return ((eModelInfoType(*)())m_pInterface->VFTBL->GetModelType)(); + if (auto pInterface = GetInterface()) + return ((eModelInfoType(*)())pInterface->VFTBL->GetModelType)(); + + return eModelInfoType::UNKNOWN; } bool CModelInfoSA::IsTowableBy(CModelInfo* towingModel) diff --git a/Client/game_sa/CRendererSA.cpp b/Client/game_sa/CRendererSA.cpp new file mode 100644 index 00000000000..bad607d5ba2 --- /dev/null +++ b/Client/game_sa/CRendererSA.cpp @@ -0,0 +1,55 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: game_sa/CRendererSA.cpp + * PURPOSE: Game renderer class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#include "StdInc.h" +#include "CRendererSA.h" +#include "CModelInfoSA.h" +#include "CMatrix.h" +#include "gamesa_renderware.h" + +CRendererSA::CRendererSA() +{ +} + +CRendererSA::~CRendererSA() +{ +} + +void CRendererSA::RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix) +{ + CBaseModelInfoSAInterface* pModelInfoSAInterface = pModelInfo->GetInterface(); + if (!pModelInfoSAInterface) + return; + + RwObject* pRwObject = pModelInfoSAInterface->pRwObject; + if (!pRwObject) + return; + + RwFrame* pFrame = RpGetFrame(pRwObject); + + static RwMatrix rwMatrix; + rwMatrix.right = (RwV3d&)matrix.vRight; + rwMatrix.up = (RwV3d&)matrix.vFront; + rwMatrix.at = (RwV3d&)matrix.vUp; + rwMatrix.pos = (RwV3d&)matrix.vPos; + RwFrameTransform(pFrame, &rwMatrix, rwCOMBINEREPLACE); + + if (pRwObject->type == RP_TYPE_ATOMIC) + { + RpAtomic* pRpAtomic = reinterpret_cast(pRwObject); + pRpAtomic->renderCallback(reinterpret_cast(pRwObject)); + } + else + { + RpClump* pClump = reinterpret_cast(pRwObject); + RpClumpRender(pClump); + } +} diff --git a/Client/game_sa/CRendererSA.h b/Client/game_sa/CRendererSA.h new file mode 100644 index 00000000000..e71a83665ed --- /dev/null +++ b/Client/game_sa/CRendererSA.h @@ -0,0 +1,23 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: game_sa/CRendererSA.h + * PURPOSE: Game renderer class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +#include + +class CRendererSA : public CRenderer +{ +public: + CRendererSA(); + ~CRendererSA(); + + void RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix) override; +}; diff --git a/Client/game_sa/CVisibilityPluginsSA.cpp b/Client/game_sa/CVisibilityPluginsSA.cpp index d7cf9849bc1..b5fe2d92c6f 100644 --- a/Client/game_sa/CVisibilityPluginsSA.cpp +++ b/Client/game_sa/CVisibilityPluginsSA.cpp @@ -12,6 +12,8 @@ #include "StdInc.h" #include "CVisibilityPluginsSA.h" +#define FUNC_CVisibilityPlugins_InsertEntityIntoEntityList 0x733DD0 + void CVisibilityPluginsSA::SetClumpAlpha(RpClump* pClump, int iAlpha) { DWORD dwFunc = FUNC_CVisiblityPlugins_SetClumpAlpha; @@ -51,3 +53,8 @@ int CVisibilityPluginsSA::GetAtomicId(RwObject* pAtomic) } return iResult; } + +bool CVisibilityPluginsSA::InsertEntityIntoEntityList(void* entity, float distance, void* callback) +{ + return ((bool(_cdecl*)(void*, float, void*))FUNC_CVisibilityPlugins_InsertEntityIntoEntityList)(entity, distance, callback); +} diff --git a/Client/game_sa/CVisibilityPluginsSA.h b/Client/game_sa/CVisibilityPluginsSA.h index 57cab620c07..f4a583bcf29 100644 --- a/Client/game_sa/CVisibilityPluginsSA.h +++ b/Client/game_sa/CVisibilityPluginsSA.h @@ -21,4 +21,6 @@ class CVisibilityPluginsSA : public CVisibilityPlugins public: void SetClumpAlpha(RpClump* pClump, int iAlpha); int GetAtomicId(RwObject* pAtomic); + + bool InsertEntityIntoEntityList(void* entity, float distance, void* callback); }; diff --git a/Client/game_sa/gamesa_renderware.h b/Client/game_sa/gamesa_renderware.h index e2f2d9a472d..594c203b59e 100644 --- a/Client/game_sa/gamesa_renderware.h +++ b/Client/game_sa/gamesa_renderware.h @@ -38,6 +38,7 @@ typedef RwFrame*(__cdecl* RwFrameAddChild_t)(RwFrame* parent, RwFrame* child); typedef RwFrame*(__cdecl* RwFrameRemoveChild_t)(RwFrame* child); typedef RwFrame*(__cdecl* RwFrameForAllObjects_t)(RwFrame* frame, void* callback, void* data); typedef RwFrame*(__cdecl* RwFrameTranslate_t)(RwFrame* frame, const RwV3d* v, RwTransformOrder order); +typedef RwFrame*(__cdecl* RwFrameTransform_t)(RwFrame* frame, const RwMatrix* m, RwOpCombineType combine); typedef RwFrame*(__cdecl* RwFrameScale_t)(RwFrame* frame, const RwV3d* v, RwTransformOrder order); typedef RwFrame*(__cdecl* RwFrameUpdateObjects_t)(RwFrame*); typedef RwFrame*(__cdecl* RwFrameCreate_t)(); @@ -69,6 +70,7 @@ typedef RwTexture*(__cdecl* RwTexDictionaryAddTexture_t)(RwTexDictionary* dict, typedef RwTexDictionary*(__cdecl* RwTexDictionaryGetCurrent_t)(); typedef RwTexture*(__cdecl* RwTexDictionaryFindNamedTexture_t)(RwTexDictionary* dict, const char* name); typedef void(__cdecl* RpPrtStdGlobalDataSetStreamEmbedded_t)(void* value); +typedef RpClump*(__cdecl* RpClumpRender_t)(RpClump* clump); typedef RpWorld*(__cdecl* RpWorldAddAtomic_t)(RpWorld* world, RpAtomic* atomic); typedef RpWorld*(__cdecl* RpWorldAddClump_t)(RpWorld* world, RpClump* clump); typedef RpWorld*(__cdecl* RpWorldAddLight_t)(RpWorld* world, RpLight* light); @@ -125,6 +127,7 @@ RWFUNC(RwStreamSkip_t RwStreamSkip, (RwStreamSkip_t)0xDEAD) RWFUNC(RpClumpDestroy_t RpClumpDestroy, (RpClumpDestroy_t)0xDEAD) RWFUNC(RpClumpGetNumAtomics_t RpClumpGetNumAtomics, (RpClumpGetNumAtomics_t)0xDEAD) RWFUNC(RwFrameTranslate_t RwFrameTranslate, (RwFrameTranslate_t)0xDEAD) +RWFUNC(RwFrameTransform_t RwFrameTransform, (RwFrameTransform_t)0xDEAD) RWFUNC(RpClumpForAllAtomics_t RpClumpForAllAtomics, (RpClumpForAllAtomics_t)0xDEAD) RWFUNC(RwFrameAddChild_t RwFrameAddChild, (RwFrameAddChild_t)0xDEAD) RWFUNC(RpClumpAddAtomic_t RpClumpAddAtomic, (RpClumpAddAtomic_t)0xDEAD) @@ -138,6 +141,7 @@ RWFUNC(RwTexDictionaryAddTexture_t RwTexDictionaryAddTexture, (RwTexDictionaryAd RWFUNC(RwTexDictionaryStreamWrite_t RwTexDictionaryStreamWrite, (RwTexDictionaryStreamWrite_t)0xDEAD) RWFUNC(rwD3D9NativeTextureRead_t rwD3D9NativeTextureRead, (rwD3D9NativeTextureRead_t)0xDEAD) RWFUNC(RpPrtStdGlobalDataSetStreamEmbedded_t RpPrtStdGlobalDataSetStreamEmbedded, (RpPrtStdGlobalDataSetStreamEmbedded_t)0xDEAD) +RWFUNC(RpClumpRender_t RpClumpRender, (RpClumpRender_t)0xDEAD) RWFUNC(RpClumpRemoveAtomic_t RpClumpRemoveAtomic, (RpClumpRemoveAtomic_t)0xDEAD) RWFUNC(RpAtomicClone_t RpAtomicClone, (RpAtomicClone_t)0xDEAD) RWFUNC(RwTexDictionaryFindNamedTexture_t RwTexDictionaryFindNamedTexture, (RwTexDictionaryFindNamedTexture_t)0xDEAD) diff --git a/Client/game_sa/gamesa_renderware.hpp b/Client/game_sa/gamesa_renderware.hpp index 804040c802e..a638cfede04 100644 --- a/Client/game_sa/gamesa_renderware.hpp +++ b/Client/game_sa/gamesa_renderware.hpp @@ -20,6 +20,7 @@ void InitRwFunctions() RwStreamSkip = (RwStreamSkip_t)0x007ECD00; RpClumpDestroy = (RpClumpDestroy_t)0x0074A310; RpClumpGetNumAtomics = (RpClumpGetNumAtomics_t)0x007498E0; + RwFrameTransform = (RwFrameTransform_t)0x007F0F70; RwFrameTranslate = (RwFrameTranslate_t)0x007F0E30; RpClumpForAllAtomics = (RpClumpForAllAtomics_t)0x00749B70; RwFrameAddChild = (RwFrameAddChild_t)0x007F0B00; @@ -34,6 +35,7 @@ void InitRwFunctions() RwTexDictionaryStreamWrite = (RwTexDictionaryStreamWrite_t)0x008049F0; rwD3D9NativeTextureRead = (rwD3D9NativeTextureRead_t)0x004CD820; RpPrtStdGlobalDataSetStreamEmbedded = (RpPrtStdGlobalDataSetStreamEmbedded_t)0x0041B350; + RpClumpRender = (RpClumpRender_t)0x00749B20; RpClumpRemoveAtomic = (RpClumpRemoveAtomic_t)0x0074A4C0; RpAtomicClone = (RpAtomicClone_t)0x00749E60; RwTexDictionaryFindNamedTexture = (RwTexDictionaryFindNamedTexture_t)0x007F39F0; diff --git a/Client/mods/deathmatch/StdInc.h b/Client/mods/deathmatch/StdInc.h index 68b18a6ab58..465478454f5 100644 --- a/Client/mods/deathmatch/StdInc.h +++ b/Client/mods/deathmatch/StdInc.h @@ -105,6 +105,7 @@ #include #include #include +#include #include #include #include diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 7b57fe13e10..df20bf6eaab 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -251,6 +251,9 @@ CClientGame::CClientGame(bool bLocalPlay) : m_ServerInfo(new CServerInfo()) // Singular file download manager m_pSingularFileDownloadManager = new CSingularFileDownloadManager(); + // 3D model renderer + m_pModelRenderer = std::make_unique(); + // Register the message and the net packet handler g_pMultiplayer->SetPreWeaponFireHandler(CClientGame::PreWeaponFire); g_pMultiplayer->SetPostWeaponFireHandler(CClientGame::PostWeaponFire); @@ -267,6 +270,7 @@ CClientGame::CClientGame(bool bLocalPlay) : m_ServerInfo(new CServerInfo()) g_pMultiplayer->SetRender3DStuffHandler(CClientGame::StaticRender3DStuffHandler); g_pMultiplayer->SetPreRenderSkyHandler(CClientGame::StaticPreRenderSkyHandler); g_pMultiplayer->SetRenderHeliLightHandler(CClientGame::StaticRenderHeliLightHandler); + g_pMultiplayer->SetRenderEverythingBarRoadsHandler(CClientGame::StaticRenderEverythingBarRoadsHandler); g_pMultiplayer->SetChokingHandler(CClientGame::StaticChokingHandler); g_pMultiplayer->SetPreWorldProcessHandler(CClientGame::StaticPreWorldProcessHandler); g_pMultiplayer->SetPostWorldProcessHandler(CClientGame::StaticPostWorldProcessHandler); @@ -470,6 +474,7 @@ CClientGame::~CClientGame() g_pMultiplayer->SetRender3DStuffHandler(NULL); g_pMultiplayer->SetPreRenderSkyHandler(NULL); g_pMultiplayer->SetRenderHeliLightHandler(nullptr); + g_pMultiplayer->SetRenderEverythingBarRoadsHandler(nullptr); g_pMultiplayer->SetChokingHandler(NULL); g_pMultiplayer->SetPreWorldProcessHandler(NULL); g_pMultiplayer->SetPostWorldProcessHandler(NULL); @@ -3546,6 +3551,11 @@ void CClientGame::StaticRenderHeliLightHandler() g_pClientGame->GetManager()->GetPointLightsManager()->RenderHeliLightHandler(); } +void CClientGame::StaticRenderEverythingBarRoadsHandler() +{ + g_pClientGame->GetModelRenderer()->Render(); +} + bool CClientGame::StaticChokingHandler(unsigned char ucWeaponType) { return g_pClientGame->ChokingHandler(ucWeaponType); @@ -3853,6 +3863,8 @@ void CClientGame::PostWorldProcessPedsAfterPreRenderHandler() { CLuaArguments Arguments; m_pRootEntity->CallEvent("onClientPedsProcessed", Arguments, false); + + g_pClientGame->GetModelRenderer()->Update(); } void CClientGame::IdleHandler() diff --git a/Client/mods/deathmatch/logic/CClientGame.h b/Client/mods/deathmatch/logic/CClientGame.h index f2c290d94ca..97f7e08dab2 100644 --- a/Client/mods/deathmatch/logic/CClientGame.h +++ b/Client/mods/deathmatch/logic/CClientGame.h @@ -308,6 +308,8 @@ class CClientGame CRemoteCalls* GetRemoteCalls() { return m_pRemoteCalls; } CResourceFileDownloadManager* GetResourceFileDownloadManager() { return m_pResourceFileDownloadManager; } + CModelRenderer* GetModelRenderer() const noexcept { return m_pModelRenderer.get(); } + SharedUtil::CAsyncTaskScheduler* GetAsyncTaskScheduler() { return m_pAsyncTaskScheduler; } // Status toggles @@ -504,6 +506,7 @@ class CClientGame static void StaticRender3DStuffHandler(); static void StaticPreRenderSkyHandler(); static void StaticRenderHeliLightHandler(); + static void StaticRenderEverythingBarRoadsHandler(); static bool StaticChokingHandler(unsigned char ucWeaponType); static void StaticPreWorldProcessHandler(); static void StaticPostWorldProcessHandler(); @@ -698,6 +701,8 @@ class CClientGame CRemoteCalls* m_pRemoteCalls; CResourceFileDownloadManager* m_pResourceFileDownloadManager; + std::unique_ptr m_pModelRenderer; + // Revised facilities CServer m_Server; diff --git a/Client/mods/deathmatch/logic/CModelRenderer.cpp b/Client/mods/deathmatch/logic/CModelRenderer.cpp new file mode 100644 index 00000000000..2f06c836ec8 --- /dev/null +++ b/Client/mods/deathmatch/logic/CModelRenderer.cpp @@ -0,0 +1,72 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/CModelRenderer.cpp + * PURPOSE: 3D models renderer + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#include "StdInc.h" +#include "game\CRenderer.h" +#include "game\CVisibilityPlugins.h" + +bool CModelRenderer::EnqueueModel(CModelInfo* pModelInfo, const CMatrix& matrix) +{ + if (g_pCore->IsWindowMinimized()) + return false; + + if (pModelInfo && pModelInfo->IsLoaded()) + { + m_Queue.emplace_back(pModelInfo, matrix); + return true; + } + + return false; +} + +void CModelRenderer::Update() +{ + CVisibilityPlugins* pVisibilityPlugins = g_pGame->GetVisibilityPlugins(); + assert(pVisibilityPlugins); + + for (auto& modelDesc : m_Queue) + { + // Insert transparent entities into a sorted list + if (modelDesc.pModelInfo->GetIdeFlag(eModelIdeFlag::DRAW_LAST)) + { + const CVector& vecCameraPosition = *(CVector*)0xB76870; // CRenderer::ms_vecCameraPosition + const float fDistance = (modelDesc.matrix.GetPosition() - vecCameraPosition).Length(); + + pVisibilityPlugins->InsertEntityIntoEntityList(&modelDesc, fDistance, RenderEntity); + } + } +} + +void CModelRenderer::Render() +{ + CRenderer* pRenderer = g_pGame->GetRenderer(); + assert(pRenderer); + + // Draw opaque entities + for (auto& modelDesc : m_Queue) + { + if (modelDesc.pModelInfo->IsLoaded() && !modelDesc.pModelInfo->GetIdeFlag(eModelIdeFlag::DRAW_LAST)) + pRenderer->RenderModel(modelDesc.pModelInfo, modelDesc.matrix); + } + + m_Queue.clear(); +} + +void CModelRenderer::RenderEntity(SModelToRender* modelDesc, float distance) +{ + if (!modelDesc->pModelInfo->IsLoaded()) + return; + + CRenderer* pRenderer = g_pGame->GetRenderer(); + assert(pRenderer); + + pRenderer->RenderModel(modelDesc->pModelInfo, modelDesc->matrix); +} diff --git a/Client/mods/deathmatch/logic/CModelRenderer.h b/Client/mods/deathmatch/logic/CModelRenderer.h new file mode 100644 index 00000000000..d923db6c7f8 --- /dev/null +++ b/Client/mods/deathmatch/logic/CModelRenderer.h @@ -0,0 +1,40 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/CModelRenderer.h + * PURPOSE: 3D models renderer + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +class CModelRenderer final +{ +public: + struct SModelToRender final + { + CModelInfo* pModelInfo; + CMatrix matrix; + + SModelToRender(CModelInfo* pModelInfo, const CMatrix& matrix) : + pModelInfo(pModelInfo), + matrix(matrix) + { + } + }; + + bool EnqueueModel(CModelInfo* pModelInfo, const CMatrix& matrix); + + void Update(); + + void Render(); + + static void RenderEntity(SModelToRender* entity, float distance); + +private: + + std::vector m_Queue; +}; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp index e30b7f3ba24..f54378944de 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp @@ -36,6 +36,7 @@ void CLuaDrawingDefs::LoadFunctions() {"dxDrawMaterialPrimitive", DxDrawMaterialPrimitive}, {"dxDrawMaterialPrimitive3D", DxDrawMaterialPrimitive3D}, {"dxDrawWiredSphere", ArgumentParser}, + {"dxDrawModel3D", ArgumentParser}, {"dxGetTextWidth", DxGetTextWidth}, {"dxGetTextSize", ArgumentParser}, {"dxGetFontHeight", DxGetFontHeight}, @@ -2121,3 +2122,21 @@ bool CLuaDrawingDefs::DxDrawWiredSphere(lua_State* const luaVM, const CVector po g_pCore->GetGraphics()->DrawWiredSphere(position, radius, color.value(), lineWidth.value_or(1), iterations.value_or(1)); return true; } + +bool CLuaDrawingDefs::DxDrawModel3D(std::uint32_t modelID, CVector position, CVector rotation, const std::optional scale) +{ + CModelInfo* pModelInfo = g_pGame->GetModelInfo(modelID); + if (!pModelInfo) + throw std::invalid_argument("Invalid model ID"); + + if (auto modelType = pModelInfo->GetModelType(); + modelType == eModelInfoType::UNKNOWN || modelType == eModelInfoType::VEHICLE || modelType == eModelInfoType::PED) + { + throw std::invalid_argument("Invalid model type"); + } + + ConvertDegreesToRadians(rotation); + + return g_pClientGame->GetModelRenderer()->EnqueueModel(pModelInfo, + CMatrix{position, rotation, scale.value_or(CVector{1.0f, 1.0f, 1.0f})}); +} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h index 0bda34f5e92..55dc3adda17 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h @@ -82,6 +82,8 @@ class CLuaDrawingDefs : public CLuaDefs static bool DxDrawWiredSphere(lua_State* const luaVM, const CVector position, const float radius, const std::optional color, const std::optional lineWidth, const std::optional iterations); + static bool DxDrawModel3D(std::uint32_t modelID, CVector position, CVector rotation, const std::optional scale); + private: static void AddDxMaterialClass(lua_State* luaVM); static void AddDxTextureClass(lua_State* luaVM); diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index f725f37b639..802b9b56eac 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -268,6 +268,7 @@ class CMultiplayerSA : public CMultiplayer void SetRender3DStuffHandler(Render3DStuffHandler* pHandler); void SetPreRenderSkyHandler(PreRenderSkyHandler* pHandler); void SetRenderHeliLightHandler(RenderHeliLightHandler* pHandler); + void SetRenderEverythingBarRoadsHandler(RenderEverythingBarRoadsHandler* pHandler) override; void Reset(); diff --git a/Client/multiplayer_sa/CMultiplayerSA_Rendering.cpp b/Client/multiplayer_sa/CMultiplayerSA_Rendering.cpp index 03a27688d2b..b346f258740 100644 --- a/Client/multiplayer_sa/CMultiplayerSA_Rendering.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA_Rendering.cpp @@ -13,6 +13,7 @@ extern CCoreInterface* g_pCore; GameEntityRenderHandler* pGameEntityRenderHandler = nullptr; PreRenderSkyHandler* pPreRenderSkyHandlerHandler = nullptr; RenderHeliLightHandler* pRenderHeliLightHandler = nullptr; +RenderEverythingBarRoadsHandler* pRenderEverythingBarRoadsHandler = nullptr; #define VAR_CCullZones_NumMirrorAttributeZones 0x0C87AC4 // int #define VAR_CMirrors_d3dRestored 0x0C7C729 // uchar @@ -581,6 +582,17 @@ void CMultiplayerSA::SetRenderHeliLightHandler(RenderHeliLightHandler* pHandler) pRenderHeliLightHandler = pHandler; } +////////////////////////////////////////////////////////////////////////////////////////// +// +// CMultiplayerSA::SetRenderEverythingBarRoadsHandler +// +// +////////////////////////////////////////////////////////////////////////////////////////// +void CMultiplayerSA::SetRenderEverythingBarRoadsHandler(RenderEverythingBarRoadsHandler* pHandler) +{ + pRenderEverythingBarRoadsHandler = pHandler; +} + ////////////////////////////////////////////////////////////////////////////////////////// // // CMultiplayerSA::SetIsMinimizedAndNotConnected @@ -703,6 +715,30 @@ void _declspec(naked) HOOK_CVisibilityPlugins_RenderPedCB() } } +// Hook info +#define HOOKPOS_CRenderer_EverythingBarRoads 0x553C78 +#define HOOKSIZE_CRenderer_EverythingBarRoads 5 +DWORD RETURN_CRenderer_EverythingBarRoads = 0x553C7D; +DWORD DO_CRenderer_EverythingBarRoads = 0x7EE180; +void _declspec(naked) HOOK_CRenderer_EverythingBarRoads() +{ + _asm + { + pushad + } + + if (pRenderEverythingBarRoadsHandler) + pRenderEverythingBarRoadsHandler(); + + _asm + { + popad + call DO_CRenderer_EverythingBarRoads + jmp RETURN_CRenderer_EverythingBarRoads + + } +} + ////////////////////////////////////////////////////////////////////////////////////////// // // CMultiplayerSA::InitHooks_Rendering @@ -726,4 +762,5 @@ void CMultiplayerSA::InitHooks_Rendering() EZHookInstallChecked(CClouds_RenderSkyPolys); EZHookInstallChecked(RwCameraSetNearClipPlane); EZHookInstall(RenderEffects_HeliLight); + EZHookInstall(CRenderer_EverythingBarRoads); } diff --git a/Client/sdk/game/CGame.h b/Client/sdk/game/CGame.h index a1d792813e1..2314fdad0e2 100644 --- a/Client/sdk/game/CGame.h +++ b/Client/sdk/game/CGame.h @@ -68,6 +68,7 @@ class CWeather; class CWorld; class CIplStore; class CBuildingRemoval; +class CRenderer; enum eEntityType; enum ePedPieceTypes; @@ -149,6 +150,7 @@ class __declspec(novtable) CGame virtual CPointLights* GetPointLights() = 0; virtual CColStore* GetCollisionStore() = 0; virtual CBuildingRemoval* GetBuildingRemoval() = 0; + virtual CRenderer* GetRenderer() const noexcept = 0; virtual CWeaponInfo* GetWeaponInfo(eWeaponType weapon, eWeaponSkill skill = WEAPONSKILL_STD) = 0; virtual CModelInfo* GetModelInfo(DWORD dwModelID, bool bCanBeInvalid = false) = 0; diff --git a/Client/sdk/game/CModelInfo.h b/Client/sdk/game/CModelInfo.h index af9fa1bdf3f..08cb032e4ce 100644 --- a/Client/sdk/game/CModelInfo.h +++ b/Client/sdk/game/CModelInfo.h @@ -60,6 +60,7 @@ enum class eModelInfoType : unsigned char VEHICLE = 6, PED = 7, LOD_ATOMIC = 8, + UNKNOWN = 9 }; enum eVehicleUpgradePosn diff --git a/Client/sdk/game/CRenderer.h b/Client/sdk/game/CRenderer.h new file mode 100644 index 00000000000..65d6a8bdcaf --- /dev/null +++ b/Client/sdk/game/CRenderer.h @@ -0,0 +1,23 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: sdk/game/CRenderer.h + * PURPOSE: Renderer interface + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +class CModelInfo; +class CMatrix; + +class CRenderer +{ +public: + virtual ~CRenderer() {} + + virtual void RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix) = 0; +}; diff --git a/Client/sdk/game/CVisibilityPlugins.h b/Client/sdk/game/CVisibilityPlugins.h index 1d8d1b47cc4..f2e948f65a3 100644 --- a/Client/sdk/game/CVisibilityPlugins.h +++ b/Client/sdk/game/CVisibilityPlugins.h @@ -22,4 +22,6 @@ class CVisibilityPlugins public: virtual void SetClumpAlpha(RpClump* pClump, int iAlpha) = 0; virtual int GetAtomicId(RwObject* pAtomic) = 0; + + virtual bool InsertEntityIntoEntityList(void* entity, float distance, void* callback) = 0; }; diff --git a/Client/sdk/multiplayer/CMultiplayer.h b/Client/sdk/multiplayer/CMultiplayer.h index c8b043a37fa..02c932cf574 100644 --- a/Client/sdk/multiplayer/CMultiplayer.h +++ b/Client/sdk/multiplayer/CMultiplayer.h @@ -104,6 +104,7 @@ typedef void(IdleHandler)(); typedef void(PreFxRenderHandler)(); typedef void(PostColorFilterRenderHandler)(); typedef void(PreHudRenderHandler)(); +typedef void(RenderEverythingBarRoadsHandler)(); typedef CAnimBlendAssociationSAInterface*(AddAnimationHandler)(RpClump* pClump, AssocGroupId animGroup, AnimationId animID); typedef CAnimBlendAssociationSAInterface*(AddAnimationAndSyncHandler)(RpClump* pClump, CAnimBlendAssociationSAInterface* pAnimAssocToSyncWith, AssocGroupId animGroup, AnimationId animID); @@ -385,6 +386,7 @@ class CMultiplayer virtual void SetRender3DStuffHandler(Render3DStuffHandler* pHandler) = 0; virtual void SetPreRenderSkyHandler(PreRenderSkyHandler* pHandler) = 0; virtual void SetRenderHeliLightHandler(RenderHeliLightHandler* pHandler) = 0; + virtual void SetRenderEverythingBarRoadsHandler(RenderEverythingBarRoadsHandler* pHandler) = 0; virtual void Reset() = 0; From ef47974ed59fba8282956ce861389d735d9c91dc Mon Sep 17 00:00:00 2001 From: Pot Bot <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:15:15 +0000 Subject: [PATCH 12/15] Update client en_US pot [ci skip] --- .../MTA/locale/en_US/client.pot | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot b/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot index 986344b426f..ea684a182f8 100644 --- a/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot +++ b/Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: MTA San Andreas 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-14 19:10+0000\n" +"POT-Creation-Date: 2024-09-03 15:15+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -398,116 +398,116 @@ msgstr[1] "" msgid "Disconnected" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:370 +#: Client/mods/deathmatch/logic/CClientGame.cpp:374 msgid "Flying a UFO around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:370 +#: Client/mods/deathmatch/logic/CClientGame.cpp:374 msgid "Cruising around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:370 +#: Client/mods/deathmatch/logic/CClientGame.cpp:374 msgid "Riding the waves of" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:371 +#: Client/mods/deathmatch/logic/CClientGame.cpp:375 msgid "Riding the train in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:371 +#: Client/mods/deathmatch/logic/CClientGame.cpp:375 msgid "Flying around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:372 +#: Client/mods/deathmatch/logic/CClientGame.cpp:376 msgid "Riding around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:372 +#: Client/mods/deathmatch/logic/CClientGame.cpp:376 msgid "Monster truckin' around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:372 +#: Client/mods/deathmatch/logic/CClientGame.cpp:376 msgid "Quaddin' around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:373 +#: Client/mods/deathmatch/logic/CClientGame.cpp:377 msgid "Bunny hopping around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:373 +#: Client/mods/deathmatch/logic/CClientGame.cpp:377 msgid "Doing weird stuff in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:377 +#: Client/mods/deathmatch/logic/CClientGame.cpp:381 msgid "Climbing around in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:378 -#: Client/mods/deathmatch/logic/CClientGame.cpp:379 +#: Client/mods/deathmatch/logic/CClientGame.cpp:382 +#: Client/mods/deathmatch/logic/CClientGame.cpp:383 msgid "Doing a drive-by in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:380 +#: Client/mods/deathmatch/logic/CClientGame.cpp:384 msgid "Blub blub..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:381 +#: Client/mods/deathmatch/logic/CClientGame.cpp:385 msgid "Breathing water" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:382 +#: Client/mods/deathmatch/logic/CClientGame.cpp:386 msgid "Drowning in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:383 +#: Client/mods/deathmatch/logic/CClientGame.cpp:387 msgid "Ducking for cover in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:384 +#: Client/mods/deathmatch/logic/CClientGame.cpp:388 msgid "Fighting in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:385 +#: Client/mods/deathmatch/logic/CClientGame.cpp:389 msgid "Throwing fists in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:386 +#: Client/mods/deathmatch/logic/CClientGame.cpp:390 msgid "Blastin' fools in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:387 +#: Client/mods/deathmatch/logic/CClientGame.cpp:391 msgid "Shooting up" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:388 +#: Client/mods/deathmatch/logic/CClientGame.cpp:392 msgid "Jetpacking in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:389 +#: Client/mods/deathmatch/logic/CClientGame.cpp:393 msgid "Literally on fire in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:390 +#: Client/mods/deathmatch/logic/CClientGame.cpp:394 msgid "Burning up in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:391 +#: Client/mods/deathmatch/logic/CClientGame.cpp:395 msgid "Swimming in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:392 +#: Client/mods/deathmatch/logic/CClientGame.cpp:396 msgid "Floating around in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:393 +#: Client/mods/deathmatch/logic/CClientGame.cpp:397 msgid "Being chased by a shark" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:394 +#: Client/mods/deathmatch/logic/CClientGame.cpp:398 msgid "Choking to death in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:528 +#: Client/mods/deathmatch/logic/CClientGame.cpp:533 #: Client/core/CSettings.cpp:3479 Client/core/CMainMenu.cpp:304 #: Client/core/CCore.cpp:674 msgid "Main menu" @@ -517,17 +517,17 @@ msgstr "" #. Display an error, reset the error status and exit #. Show a message that the connection timed out and abort #. Show failed message and abort the attempt -#: Client/mods/deathmatch/logic/CClientGame.cpp:636 -#: Client/mods/deathmatch/logic/CClientGame.cpp:710 -#: Client/mods/deathmatch/logic/CClientGame.cpp:734 -#: Client/mods/deathmatch/logic/CClientGame.cpp:756 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1169 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1249 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1259 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1328 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1365 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1414 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1426 +#: Client/mods/deathmatch/logic/CClientGame.cpp:641 +#: Client/mods/deathmatch/logic/CClientGame.cpp:715 +#: Client/mods/deathmatch/logic/CClientGame.cpp:739 +#: Client/mods/deathmatch/logic/CClientGame.cpp:761 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1174 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1254 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1264 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1333 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1370 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1419 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1431 #: Client/mods/deathmatch/logic/CResourceFileDownloadManager.cpp:145 #: Client/core/CConnectManager.cpp:80 Client/core/CConnectManager.cpp:111 #: Client/core/CConnectManager.cpp:127 Client/core/CConnectManager.cpp:263 @@ -549,146 +549,146 @@ msgstr "" msgid "Error" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:636 -#: Client/mods/deathmatch/logic/CClientGame.cpp:734 +#: Client/mods/deathmatch/logic/CClientGame.cpp:641 +#: Client/mods/deathmatch/logic/CClientGame.cpp:739 #: Client/core/ServerBrowser/CServerBrowser.cpp:1300 #: Client/core/ServerBrowser/CServerBrowser.cpp:1357 msgid "Invalid nickname! Please go to Settings and set a new one!" msgstr "" #. Display the status box -#: Client/mods/deathmatch/logic/CClientGame.cpp:652 +#: Client/mods/deathmatch/logic/CClientGame.cpp:657 #: Client/core/CConnectManager.cpp:148 msgid "CONNECTING" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:652 +#: Client/mods/deathmatch/logic/CClientGame.cpp:657 msgid "Entering the game ..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:710 +#: Client/mods/deathmatch/logic/CClientGame.cpp:715 msgid "" "Not connected; please use Quick Connect or the 'connect' command to connect " "to a server." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:756 +#: Client/mods/deathmatch/logic/CClientGame.cpp:761 msgid "Could not start the local server. See console for details." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:766 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1238 +#: Client/mods/deathmatch/logic/CClientGame.cpp:771 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1243 msgid "Local Server" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:766 +#: Client/mods/deathmatch/logic/CClientGame.cpp:771 msgid "Starting local server ..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1014 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1019 msgid "Area 51" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1023 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1028 msgid "Walking around " msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1084 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1089 #: Client/mods/deathmatch/logic/CResource.cpp:375 #: Client/core/CSettings.cpp:3483 Client/core/CCore.cpp:674 msgid "In-game" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1169 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1174 #, c-format msgid "You were kicked from the game ( %s )" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1238 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1243 msgid "Connecting to local server..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1249 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1254 msgid "Error connecting to server." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1259 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1264 msgid "Connecting to local server timed out. See console for details." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1328 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1333 #: Client/core/CConnectManager.cpp:263 msgid "Connection timed out" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1365 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1370 msgid "Connection with the server was lost" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1376 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1381 #: Client/core/CConnectManager.cpp:277 Client/core/CConnectManager.cpp:281 msgid "Disconnected: unknown protocol error" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1380 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1385 #: Client/core/CConnectManager.cpp:285 msgid "Disconnected: disconnected remotely" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1384 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1389 #: Client/core/CConnectManager.cpp:289 msgid "Disconnected: connection lost remotely" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1388 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1393 #: Client/core/CConnectManager.cpp:293 msgid "Disconnected: you are banned from this server" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1392 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1397 msgid "Disconnected: the server is currently full" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1396 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1401 #: Client/core/CConnectManager.cpp:300 msgid "Disconnected: disconnected from the server" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1400 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1405 #: Client/core/CConnectManager.cpp:304 msgid "Disconnected: connection to the server was lost" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1404 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1409 msgid "Disconnected: invalid password specified" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1408 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1413 #: Client/core/CConnectManager.cpp:311 msgid "Disconnected: connection was refused" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1426 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1431 msgid "MTA Client verification failed!" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5713 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5725 msgid "In a ditch" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5713 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5725 msgid "En-route to hospital" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5713 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5725 msgid "Meeting their maker" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5714 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5726 msgid "Regretting their decisions" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5714 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5726 msgid "Wasted" msgstr "" From acced09849301f7a2e60b86fcc80493a392255e7 Mon Sep 17 00:00:00 2001 From: Dutchman101 <12105539+Dutchman101@users.noreply.github.com> Date: Wed, 4 Sep 2024 03:21:45 +0000 Subject: [PATCH 13/15] Update CEF to 128.4.8+g88b5034+chromium-128.0.6613.114 --- utils/buildactions/install_cef.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index f01f92af475..194fcde4e6f 100644 --- a/utils/buildactions/install_cef.lua +++ b/utils/buildactions/install_cef.lua @@ -9,8 +9,8 @@ local CEF_URL_PREFIX = "https://cef-builds.spotifycdn.com/cef_binary_" local CEF_URL_SUFFIX = "_windows32_minimal.tar.bz2" -- Change here to update CEF version -local CEF_VERSION = "127.3.5+g114ea2a+chromium-127.0.6533.120" -local CEF_HASH = "ad91d535873bdd2b6f36135d42a383f92ab2f2959be33db0a6f0f4178cf49436" +local CEF_VERSION = "128.4.8+g88b5034+chromium-128.0.6613.114" +local CEF_HASH = "eb5a84db83b51f6d6be43e9bb7f8a557e86dd056a9a565251c28c301feb1c9ef" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX From 023821e2c8e5a94767e50a551e056c1ad303dc46 Mon Sep 17 00:00:00 2001 From: Dutchman101 Date: Wed, 4 Sep 2024 05:24:47 +0200 Subject: [PATCH 14/15] Update launchers --- Shared/data/launchers/CEFLauncher.exe | Bin 95112 -> 95112 bytes Shared/data/launchers/MTA Server ARM64.exe | Bin 369544 -> 369544 bytes Shared/data/launchers/MTA Server.exe | Bin 323976 -> 323976 bytes Shared/data/launchers/MTA Server64.exe | Bin 378248 -> 378248 bytes Shared/data/launchers/Multi Theft Auto.exe | Bin 416136 -> 416136 bytes Shared/data/launchers/wow64_helper.exe | Bin 259464 -> 259464 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Shared/data/launchers/CEFLauncher.exe b/Shared/data/launchers/CEFLauncher.exe index 62684b73d0559f7621adb23233750a71f3fa8caa..8ddad15d39e3d38c09fdecbc3acdd6906553f92e 100644 GIT binary patch delta 1426 zcmV;D1#S9>=LLx81+WkS1FqlIlM?|=1HLE%gJS`=V*vp%7CWxr)n)(y00062003wJ z0068n0RXHS0RR91006Gv)n)(y000aC000yK000y)0RR*l0RR91006Gv)wje%Q)d5`S zsEt?O66x<~7cxwyWO((3;@&5J``Du5NFS>VBpUC+&kq~;<+K>T9{5`dNc-y#Iz9kw za&n+6+B=Erd(y+g9S$}B%M{5f0@e9!vGOb%?5GTd&`{gurzwIXsHU;YXWN7g&Y07# zGK0J7f$jfAg~kGbXUZ)I3e!lES8t3|HTm6;?89XSJ-7wCRKwZ9I3WRlT(rF0y6CnG zHVbWw?SMvQ@4H>NNN*yH9W)1wAErg z-(v}MxkKh`eY8{^2=!=xaZ=Gg?Pl=*4k_9O#wg_11&B&k-Q4==2Cg93leig0>Gp*a z5ZiAxGu*s+IwX0#@tY}g-z)hqLdPhrci%qmyI0fD^&jR@6G`Ef-=Bj--0gW?@yo(- zLcS^jr5+w0FwpW*y%HUv5)4e&H75B|tdtnExJ8ZXiGrz%NMsE+MlO0YZZn@ChWT{U zXrqxkE8uLRzm?m^&3E>?lwsHOnU zix?R%DXE6^+Td3Nv!x4WPa=guK|RpLg`kq-_W@MK1%AufO`8mBY@wCP_U=~zu1lPj zh<8~Oy-!ZLxCUiLQW5E{(Ve<|2UeQ?f>o^)Yt3zMo#p5LK|J#!(vM4Yrz9yO0e^za zqc@xfVHd6o1vatObG@%zw~B{@jUw|bq&F%g!Ui#HXQ5Z*XsmI!xutavuBQ>;SY(X#>n*;@EP<@o%*-CPE}^J)x_s1ts0AX z3{Jn#%y2WYSu4g+Z$bD3S{YRffqw$2AG=MU))x&tAfag`KOfo<7KEQg&PaSYW^OA5 zW4B!6P#AYmN-BQ`7VbDf2JEm#T_)7HcaR#R`Q$K6@=g*pme1MOM}!t+_yQ;81jaz_ zQ1pUtwZ2Z;V%voJacPo{`DOj#vPU+k6i*HML82S+Y}n{c7|ZLpC2eYV;(tbIU5T48 z7AVwmBOkI~&JiArco+Y|5ju$tfV4;knC_;g!ThtB*9h?+CFG zd&hWQI4f6gp$0^MtK(hKt<*jZ9P{q-BVAY}zKJs+Px(F7SlIZr=jEJxk1${|H1sJd g9W-fjWJJ?CVcHd^inoP8APXp%N*VwF000000DJ|8xc~qF delta 1426 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 diff --git a/Shared/data/launchers/MTA Server.exe b/Shared/data/launchers/MTA Server.exe index f89f45b7ef4be166372bbb8c00b9fe6f37559893..bc664aec899824e0f4e946a34da5973752362259 100644 GIT binary patch delta 1440 zcmV;R1z-Az;}eME6R;Qo1G(STlN$j|0xvDIY5}o40j`4_K8GAW0k<4J0?5xhx!=`h z000000ssI2WdHyG%p?N<%oqaz00000x!=`h000003;+NC6aWAKG$jK7G#LW`00000 zx!={d9}WYt3J^_hzVcWIhC_xRRb{0#-)D#57z4N97z7}T39eWH000000Irt_qy&cr zHvljIGMAO41UCgY05AYDx6z~opd%oQ<^oud56DZmdbAk!lvB#&Us3{C`x|eY*s0n- zQ2xNTk;nv*4u97k)PyI%lCP`ouPfa1LMEEJh)Y1;l+!amej5s32OcmD1_>&LNQUp01!FK4SHO6c!*f162Za$zg$~Df{GyQ-ZeE=GrQOZzA}Oi!7R}f zjqxqZEhK&$>Pqswp-=cRp0!Cg^IL4Ny$H6RW8SM@^nWvFm=Nf>bwt?~J-N-F+DoMo zlG2sQQzJb~E1*W05A?(A+sGXkryqg3^_gpaw&UXTXSPVH*Q^!N+sqOWC)Y8mb5n~+ zTAZmBEs3NcA6laGK8@($`6&KNIX?JV)(+m&HX5%dbiiC@&}yb;bm`RkEcjJ?IB4*? zqu^Tx9)C@R`!^pCq@|B?bi4_pD;k-Vkn>N{SqekJk_3ni9cFF<=Nys8T)#XX#_ z@!$gYpORw@vKn58;*Fgjp7I)&o+L2+?a3d>T*1--r=b_Q3&{j+LJxKrjb!>rz>Tk1 zgHeat#ly74#Dc0}&X5G`p~RgV9RA*5L5a@ojelzT>WfTnEMLG<-VVnXhfIhl3YC$Z zP?T-R{7;(%@rXZWpW#1E$m{GePd(B(fk09MF7+F+8EYh5Qo2L4Ftp>!E4RezYGj!D zZk2I{p~D*jiTTaTH!5{?08??iE>x3$;FP+eokr{&$Z=)fN}%};Gf?W%<2z5P*8tK= zs`Q7}hGAyTI3s?_uz5L9Hu8P~dm;M4w&6 zUIF6ke5_9>;Y-KhDOabDhZ9!#)J={37oSr(d>6T5TDK7DgYc-ezA-xYQd-0G zqH7!F0zZ=x(qdSDlE%$WFAAt)(aQEQ)-w(b&yS$y`IWr5k(=jH%-S88c08Q)jvA0KL{mmuh2~Cseu%nw!xE9Arsz7 zbDPUwd1jP>06%>oBoOiGF|oCEIE#ZwDLp7)4?^QawVX!U*DmZ=Rc= u@-)zYmae3d@2~@LPxOqQ9Nf(K2r`c~j3dq{lELQ-;H?^1000000002s!jgCZ delta 1440 zcmV;R1z-Az;}eME6R;Qo1Jp&nlN$j|0=~JkY5}o40hEIrK8GAW0k<4J0?5xh)J48# z000000ssI2WdHyG%p?N<%oqaz00000)J48#000003;+NC6aWAKG$jK7G#LW`00000 z)J49x9}WYt3J~&4hi+FZ>qNA(zCdlsp^AbuVD;TJN&LNQUp0Dq+Cnj99n$mQXq_wY}@IkW@ZAzn-+9sGK-v$?~_sUCEA)3f%@z$|rj zGVn62xs-@?J3TbF~4#m$36d=69L~fF~T6#L)s6%$eG>Cy1E> zvkyeR3$F=#&F6oHQ(yXD&`+;z?*_f9XZf0`1LdR-WjOoTUY$xnGKFzzg;KIwmPCA4 zkZ7kDYky&c;sY5scu&4xnDbyIwjiSU#weO2Z8&9nfvB;eX;(?}yeOd`gmG(aa|Tu2 z*~BGhUiB_MB~reKqH@#qB!H~nt*gdP*qHcNcKRu&95X`C{|+4I5%qo(QylJMJy(-< zjZ7SbVD3Dq&fA^qMoLG>0yI_7wF^C3OW!95h<_)Az}nW{tOv1qru?TaEiST;WzjG1 z`id%B)F97RmC%>}fof>St;SuSOh6zMC$zo`gz`?77tjXQ`Vj&rKAe4} zhD*@Yr`t z7!NWqGBhwaF*PwbH8L|Ww+q??JroHzF*PwbH8L|Wmr?EnOE4^K`x#zFPWfjng)od_ zDR<}LcFV~m)Cnu8aJZC{Gb){@*@gD&%o2>x8l-&6OTL%P?gX`eMyg$9ZU27%NJR-@ zl&!Eg@lSEKpp(NP)mgDaFFhs_ zd7izW(u&t~)3Z*0fjOMyafkaS!y2Ct!+zcH(5^wewXh<4WT_fG0BmWIcr4_B8L+N zY!K*R*eflyS)4aL;*lm@M@>*Q__;N z_qbCd*nsKLTse`|t(u`O_>j17+RXrvZahZ+*lYJ4-~3Rxb66GAvx8Wwsm9*R?*a}j z1H_c!)#9rm^_BYCgcUfEn6IOLv6miG!ZYQ&_#aPFa2$R89KcOk_0~;0BI4`#>g4zW z$K#b0FNueL--TBlgqAQp^GWc{0%OH2gWOf@mD;9JccDc#RGGaGB$z}W1!-Bz50r_{ z21;-mGkR%66#%0Va7`Fwa=zI`(aYUuaJit1MnTh+hq3;)UIDUVHm&yb&P0;*7I_m3 u^TLo;i0000000010bd#?D diff --git a/Shared/data/launchers/MTA Server64.exe b/Shared/data/launchers/MTA Server64.exe index 0914af8aa5c123575023f97058953625d9cc0ad3..021e55401f8ba498e5e7f4d909052d073ce0a561 100644 GIT binary patch delta 1442 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 diff --git a/Shared/data/launchers/Multi Theft Auto.exe b/Shared/data/launchers/Multi Theft Auto.exe index 3093964d55db51e65aa08745d494446378c6b8b5..99fcb3c6bf6af71e9a6bd69a50a13ea8d8b7a667 100644 GIT binary patch delta 1449 zcmV;a1y=fqvl)o98L%J$19;xmlOq951H3#3vvUEs)&Z`AEZB!E*a5dJ*a8R|J9ysJ zW&i*H00IC20BisN0N4-%0ND5f000000C?WjW&i*H01N;C02BZK07MZ307Ur$00000 z0C?Wjw{P+SZ3Ym*IkIvPC_71!%+2i8T8jpU?DztQ?DzwR?Dzz??Dz%L3kj}R0RR91 z006F+$pi+61vdaN05X?V1qL?-HvljIGPjWh2H+|nvTIViBm3RCySt>{1Tw3{VBK~% z^tUMCtDp`P;R&~nw~;Ugkq&>TV%5=D(?qmDUgX@bH2`aOm3^cwD%8(8*pyQ567B;q z4F(A+hDe6@4FLfG1pows0sv3eg7lhEav9GRJ_)-l2?G?ybX}kvo+~Khfy^kop88Sj zS^|zl(f4TYia6qKn1yUYPQ9rVL4)%yQrGeKVtjRe(P_I_R&Vu6Y?Xg`xThV*?3)vi zB-2NN8@Ll7^szKt|1F=4^9tK{$d` z;DZk}-N!gHN5jjTl&XCLZw&SjM#JV51_>_qDA=?kI4%dg^kBulFnp4QMfQTzGvLP58~&g-yPdMXi-$6*PjW2ndAHwKIvWzll+5)m z9LDW8t!bw$IWQPpHV-^rq(s~{AiFlQXf^c9>C1lWu>MZ=e}{js^!{OS*9v}eDLJ+9 zOEJyr*M^wc4CdQ3dYBE@RmK6icR%k0e$CW*qe7NBSIk_R=fDM_11u}#Ug|WG zqgo*to8!LED#Sr00CU&A`NXL>h2qDGs1r$R)m+nVawKB}bc=EB=>j6f>ExK-lhFj0 zoPwn0!&@=bnzdL6mk0-7p2}Y6=yx2{-rkvQJ)P28JL~Y)kMu`;jjkttP)>W%7jx zi0O=dkL?XRz-iH`IfV~hkL0N$Unp!td+8X-2iq1um(o zvAD}#18Nw!TGea;@ybgme`<3Vr$gz!(<%EP<#(x~ z(h$D1H)e}|K3w%_j(q-$LcbCbne!BflTl_4J#G4dJ&HY+EyIai3+is5iU0rr00000 DHWs0i delta 1449 zcmV;a1y=fqvl)o98L%J$1BgVvlOq9515W7%vvUEs)&Z1*EZB!E*a5dJ*a8R|JBUQS zW&i*H00IC20BisN0N4-%0ND5f000000Ek4sW&i*H01N;C02BZK07MZ307Ur$00000 z0Ek4sw{P+SZ3Yl|>;=|*3lKqqVSl@1u%aJ_?DztQ?DzwR?Dzz??Dz%L3kj510RR91 z005Mi$pi+61vUUT05+FZ1qL?-HUKvOHn))l2H+|n{CiX=VYP|$-Ut+bU@1z?a7%@p zn3R(B2UF3vZ@)H7w~;Ugkq&>Avx-aSRK@ke2pkDEJ92uISDR)Fui#8KSuSc0l)o@A z4F(A+hDe6@4FLfG1pows0svsI_eVckN+1VpRiF1MNSSl{2;NHB1&c$_OxW3(skh9Y zG{_=uqTybW=`sbm(fa*JEeoi4K#xS<{c?Gv9DE4f?cqQTJ zM^Zfgv@aTN;*k;+!5jRx(${aPg#k#cM*H>P3v+OcsU#N!ZtZ5m3_-1rHeR5|3}V*= zo!-cI{8cGAYj3ee8m$u9Ln?6fbGm?}COIv=T?G%k&vOcV_W?ALLmmTC9$UzaLc1Tx z``QtjV1=G~ewRbr@z1R^DpGl@A@8Q<76g9wWa0)cz2qy7a! z)1AWUzXh4F?a2HRbG>4eS|_0*^DdNw$}vBa=i*o>x)pjr0`7TP%w@UC>J+X?TeGc+ zPxdvy2cYZwjeS1@;9mCd!k{m|bBv)~s(S}uwv0(+mnN+(Gn{{M;ut7m0v4jA--O>^ zbN0XHw9#u7m#X(mED(o5#{SR1Kc= z2z3EtLdIVDG*Ex~>cD#xH24JOCW@!;S#jz@4s9E-?2=bqjk<|ioLGr-jp9vNP1Fes zPuNH>awr7%zGpY!GvK#&w>w_2l+@6EaO*O3bX7i(j#6+kRQv}68rQtjfHl@Krf`ue zqzem+;%&IIm#e%wI?9(-K?Z#}kT*~S+k9cEZ_@rJi5901XH951$}bI`0AXLK=_yPs z0tX7Hd_UP!{TL52FfueSI59ObI5jdeGPest20auBI59ObI5jdeGM7V3b(*f^(#7E#wjKH3r@S8sa@Y(pngzHxwS))lS0jW=P2ryMP>t|?=6y&M??T>L6V z6Re$^b_;u4vPcR-Q@p}Ne<3a*K!(ys0l<*6xgdb{3oxI*cmJrdTr9^KljP}_>#Tb= zdUU3AoE`sEl6EVcW4`0j*w&~!Ogns;RXyhwE*JeOk^VmK_O#0l3NA6$c|(Y&G)jt= zr#u?`de1C-X7r+o2oWJpbPZ4}7t>!E@_5R^H$PH-tTy_URe>#h3m^+#c>n+a00000 DXE1^< diff --git a/Shared/data/launchers/wow64_helper.exe b/Shared/data/launchers/wow64_helper.exe index 38927395bb82cce700877469bdebcb12932a053e..24a78f7abbf6e9df552acbd97e651d5c71b5b2ba 100644 GIT binary patch delta 1436 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 From 9d65bb673c4df16def27e97a4af74d3b0c7eedc9 Mon Sep 17 00:00:00 2001 From: FileEX Date: Wed, 4 Sep 2024 05:25:31 +0200 Subject: [PATCH 15/15] Object respawn functions (#3450) * Object respawn functions * Assertion fix * Update CPerfStat.RPCPacketUsage.cpp * Review * Review * Fix build --------- Co-authored-by: TEDERIs --- .../mods/deathmatch/logic/CPacketHandler.cpp | 6 ++- .../logic/luadefs/CLuaObjectDefs.cpp | 14 +++++++ .../deathmatch/logic/luadefs/CLuaObjectDefs.h | 1 + .../mods/deathmatch/logic/rpc/CObjectRPCs.cpp | 22 ++++++++++- .../mods/deathmatch/logic/rpc/CObjectRPCs.h | 2 + Server/mods/deathmatch/logic/CObject.cpp | 2 + Server/mods/deathmatch/logic/CObject.h | 4 ++ .../logic/CPerfStat.RPCPacketUsage.cpp | 2 + .../logic/CStaticFunctionDefinitions.cpp | 37 +++++++++++++++++++ .../logic/CStaticFunctionDefinitions.h | 2 + .../logic/luadefs/CLuaObjectDefs.cpp | 21 +++++++++++ .../deathmatch/logic/luadefs/CLuaObjectDefs.h | 3 ++ .../logic/packets/CEntityAddPacket.cpp | 4 ++ Shared/sdk/net/bitstream.h | 4 ++ Shared/sdk/net/rpc_enums.h | 2 + 15 files changed, 123 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index ed8ba623c1e..ebf2ba5140f 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2724,6 +2724,7 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) // bool (1) - static // SObjectHealthSync (?) - health // bool (1) - is break + // bool (1) - respawnable // Pickups: // CVector (12) - position @@ -3089,7 +3090,10 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) if (bitStream.ReadBit()) pObject->Break(); } - + + if (bitStream.Can(eBitStreamVersion::RespawnObject_Serverside)) + pObject->SetRespawnEnabled(bitStream.ReadBit()); + pObject->SetCollisionEnabled(bCollisonsEnabled); if (ucEntityTypeID == CClientGame::WEAPON) { diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index c47934bc075..81d1b4d7042 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -25,6 +25,7 @@ void CLuaObjectDefs::LoadFunctions() {"getObjectMass", GetObjectMass}, {"getObjectProperty", GetObjectProperty}, {"isObjectMoving", ArgumentParser}, + {"isObjectRespawnable", ArgumentParser}, // Object set funcs {"moveObject", MoveObject}, @@ -61,6 +62,7 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "getProperties", GetObjectProperties); lua_classfunction(luaVM, "getProperty", "getObjectProperty"); lua_classfunction(luaVM, "isMoving", "isObjectMoving"); + lua_classfunction(luaVM, "isRespawnable", "isObjectRespawnable"); lua_classfunction(luaVM, "setScale", "setObjectScale"); lua_classfunction(luaVM, "setBreakable", "setObjectBreakable"); @@ -707,3 +709,15 @@ int CLuaObjectDefs::SetObjectProperty(lua_State* luaVM) lua_pushboolean(luaVM, false); return 1; } + +bool CLuaObjectDefs::IsObjectRespawnable(CClientEntity* const pEntity) noexcept +{ + if (!IS_OBJECT(pEntity)) + return false; + + auto* pObject = static_cast(pEntity); + if (!pObject) + return false; + + return pObject->IsRespawnEnabled(); +} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h index e614ef9f29b..1ce12ad20e7 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h @@ -29,6 +29,7 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(GetObjectMass); LUA_DECLARE(GetObjectProperty); LUA_DECLARE(GetObjectProperties); + static bool IsObjectRespawnable(CClientEntity* const pEntity) noexcept; // Object set funcs LUA_DECLARE(SetObjectRotation); diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp index 5ef2bb66b1b..40984f5892b 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp @@ -22,6 +22,8 @@ void CObjectRPCs::LoadFunctions() AddHandler(SET_OBJECT_VISIBLE_IN_ALL_DIMENSIONS, SetObjectVisibleInAllDimensions, "SetObjectVisibleInAllDimensions"); AddHandler(SET_OBJECT_BREAKABLE, SetObjectBreakable, "SetObjectBreakable"); AddHandler(BREAK_OBJECT, BreakObject, "BreakObject"); + AddHandler(RESPAWN_OBJECT, RespawnObject, "RespawnObject"); + AddHandler(TOGGLE_OBJECT_RESPAWN, ToggleObjectRespawn, "ToggleObjectRespawn"); } void CObjectRPCs::DestroyAllObjects(NetBitStreamInterface& bitStream) @@ -130,8 +132,24 @@ void CObjectRPCs::SetObjectBreakable(CClientEntity* pSource, NetBitStreamInterfa void CObjectRPCs::BreakObject(CClientEntity* pSource, NetBitStreamInterface& bitStream) { - auto pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); + auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); - if (pObject != nullptr) + if (pObject) pObject->Break(); } + +void CObjectRPCs::RespawnObject(CClientEntity* pSource, NetBitStreamInterface& bitStream) +{ + auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); + + if (pObject) + g_pClientGame->GetObjectRespawner()->Respawn(pObject); +} + +void CObjectRPCs::ToggleObjectRespawn(CClientEntity* pSource, NetBitStreamInterface& bitStream) +{ + auto* pObject = static_cast(m_pObjectManager->Get(pSource->GetID())); + + if (pObject) + pObject->SetRespawnEnabled(bitStream.ReadBit()); +} diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h index 8aa427c14f7..5a342b743b6 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.h @@ -27,4 +27,6 @@ class CObjectRPCs : public CRPCFunctions DECLARE_ELEMENT_RPC(SetObjectVisibleInAllDimensions); DECLARE_ELEMENT_RPC(SetObjectBreakable); DECLARE_ELEMENT_RPC(BreakObject); + DECLARE_ELEMENT_RPC(RespawnObject); + DECLARE_ELEMENT_RPC(ToggleObjectRespawn); }; diff --git a/Server/mods/deathmatch/logic/CObject.cpp b/Server/mods/deathmatch/logic/CObject.cpp index c88dbf3e603..31aa8b2113d 100644 --- a/Server/mods/deathmatch/logic/CObject.cpp +++ b/Server/mods/deathmatch/logic/CObject.cpp @@ -33,6 +33,7 @@ CObject::CObject(CElement* pParent, CObjectManager* pObjectManager, bool bIsLowL m_bIsFrozen = false; m_bDoubleSided = false; m_bBreakable = false; + m_bRespawnable = false; m_bCollisionsEnabled = true; @@ -58,6 +59,7 @@ CObject::CObject(const CObject& Copy) : CElement(Copy.m_pParent), m_bIsLowLod(Co m_bBreakable = Copy.m_bBreakable; m_vecPosition = Copy.m_vecPosition; m_vecRotation = Copy.m_vecRotation; + m_bRespawnable = Copy.m_bRespawnable; m_pMoveAnimation = NULL; if (Copy.m_pMoveAnimation != NULL) diff --git a/Server/mods/deathmatch/logic/CObject.h b/Server/mods/deathmatch/logic/CObject.h index 9e2c23c360b..e5032b91ce7 100644 --- a/Server/mods/deathmatch/logic/CObject.h +++ b/Server/mods/deathmatch/logic/CObject.h @@ -81,6 +81,9 @@ class CObject : public CElement bool IsBreakable() { return m_bBreakable; } void SetBreakable(bool bBreakable) { m_bBreakable = bBreakable; } + bool IsRespawnEnabled() const noexcept { return m_bRespawnable; } + void SetRespawnEnabled(bool bRespawn) noexcept { m_bRespawnable = bRespawn; } + protected: bool ReadSpecialData(const int iLine) override; @@ -96,6 +99,7 @@ class CObject : public CElement bool m_bSyncable; CPlayer* m_pSyncer; bool m_bVisibleInAllDimensions = false; + bool m_bRespawnable; protected: bool m_bCollisionsEnabled; diff --git a/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp b/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp index 2f9cfa8ce91..7468fc5e6d7 100644 --- a/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp +++ b/Server/mods/deathmatch/logic/CPerfStat.RPCPacketUsage.cpp @@ -226,6 +226,8 @@ ADD_ENUM1(SET_COLPOLYGON_HEIGHT) ADD_ENUM1(SET_OBJECT_BREAKABLE) ADD_ENUM1(BREAK_OBJECT) ADD_ENUM1(SET_PLAYER_SCRIPT_DEBUG_LEVEL) +ADD_ENUM1(RESPAWN_OBJECT) +ADD_ENUM1(TOGGLE_OBJECT_RESPAWN) IMPLEMENT_ENUM_END("eElementRPCFunctions") DECLARE_ENUM(CRPCFunctions::eRPCFunctions); diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index ab24fe0d66c..ad06e54a704 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -8358,6 +8358,43 @@ bool CStaticFunctionDefinitions::SetObjectBreakable(CElement* pElement, const bo return false; } +bool CStaticFunctionDefinitions::RespawnObject(CElement* const pElement) noexcept +{ + RUN_CHILDREN(RespawnObject(*iter)); + + if (!IS_OBJECT(pElement)) + return false; + + CObject* pObject = static_cast(pElement); + if (!pObject) + return false; + + CBitStream BitStream; + m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, RESPAWN_OBJECT, *BitStream.pBitStream)); + + return true; +} + +bool CStaticFunctionDefinitions::ToggleObjectRespawn(CElement* const pElement, const bool bRespawn) noexcept +{ + RUN_CHILDREN(ToggleObjectRespawn(*iter, bRespawn)); + + if (!IS_OBJECT(pElement)) + return false; + + CObject* pObject = static_cast(pElement); + if (!pObject) + return false; + + pObject->SetRespawnEnabled(bRespawn); + + CBitStream BitStream; + BitStream->WriteBit(bRespawn); + m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, TOGGLE_OBJECT_RESPAWN, *BitStream.pBitStream)); + + return true; +} + CRadarArea* CStaticFunctionDefinitions::CreateRadarArea(CResource* pResource, const CVector2D& vecPosition2D, const CVector2D& vecSize, const SColor color, CElement* pVisibleTo) { diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 2f260e3ea59..bb0e99c0ee5 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -424,6 +424,8 @@ class CStaticFunctionDefinitions static bool BreakObject(CElement* pElement); static bool SetObjectVisibleInAllDimensions(CElement* pElement, bool bVisible, unsigned short usNewDimension = 0); static bool SetObjectBreakable(CElement* pElement, const bool bBreakable); + static bool RespawnObject(CElement* const pElement) noexcept; + static bool ToggleObjectRespawn(CElement* const pElement, const bool bRespawn) noexcept; // Radar area create/destroy funcs static CRadarArea* CreateRadarArea(CResource* pResource, const CVector2D& vecPosition, const CVector2D& vecSize, const SColor color, CElement* pVisibleTo); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp index 22d7e6b3162..898825673c4 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.cpp @@ -19,12 +19,14 @@ void CLuaObjectDefs::LoadFunctions() constexpr static const std::pair functions[]{ // Object create/destroy funcs {"createObject", CreateObject}, + {"respawnObject", ArgumentParser}, // Object get funcs {"getObjectRotation", GetObjectRotation}, {"getObjectScale", GetObjectScale}, {"isObjectBreakable", ArgumentParser}, {"isObjectMoving", ArgumentParser}, + {"isObjectRespawnable", ArgumentParser}, // Object set funcs {"setObjectRotation", SetObjectRotation}, @@ -33,6 +35,7 @@ void CLuaObjectDefs::LoadFunctions() {"moveObject", MoveObject}, {"stopObject", StopObject}, {"breakObject", ArgumentParser}, + {"toggleObjectRespawn", ArgumentParser}, }; // Add functions @@ -48,16 +51,19 @@ void CLuaObjectDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "move", "moveObject"); lua_classfunction(luaVM, "stop", "stopObject"); lua_classfunction(luaVM, "break", "breakObject"); + lua_classfunction(luaVM, "respawn", "respawnObject"); lua_classfunction(luaVM, "getScale", "getObjectScale"); lua_classfunction(luaVM, "setScale", "setObjectScale"); lua_classfunction(luaVM, "isBreakable", "isObjectBreakable"); lua_classfunction(luaVM, "setBreakable", "setObjectBreakable"); lua_classfunction(luaVM, "isMoving", "isObjectMoving"); + lua_classfunction(luaVM, "toggleRespawn", "toggleObjectRespawn"); lua_classvariable(luaVM, "scale", "setObjectScale", "getObjectScale"); lua_classvariable(luaVM, "breakable", "setObjectBreakable", "isObjectBreakable"); lua_classvariable(luaVM, "moving", nullptr, "isObjectMoving"); + lua_classvariable(luaVM, "isRespawnable", nullptr, "isObjectRespawnable"); lua_registerclass(luaVM, "Object", "Element"); } @@ -312,3 +318,18 @@ bool CLuaObjectDefs::BreakObject(CObject* const pObject) { return CStaticFunctionDefinitions::BreakObject(pObject); } + +bool CLuaObjectDefs::RespawnObject(CObject* const pObject) noexcept +{ + return CStaticFunctionDefinitions::RespawnObject(pObject); +} + +bool CLuaObjectDefs::ToggleObjectRespawn(CObject* const pObject, const bool bRespawn) noexcept +{ + return CStaticFunctionDefinitions::ToggleObjectRespawn(pObject, bRespawn); +} + +bool CLuaObjectDefs::IsObjectRespawnable(CObject* const pObject) noexcept +{ + return pObject->IsRespawnEnabled(); +} diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h index 159ba47d283..76a96a982b9 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaObjectDefs.h @@ -20,6 +20,7 @@ class CLuaObjectDefs : public CLuaDefs // Object create/destroy functions LUA_DECLARE(CreateObject); + static bool RespawnObject(CObject* const pObject) noexcept; // Object get functions LUA_DECLARE(GetObjectName); @@ -27,6 +28,7 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(GetObjectScale); static bool IsObjectBreakable(CObject* const pObject); static bool IsObjectMoving(CObject* const pObject); + static bool IsObjectRespawnable(CObject* const pObject) noexcept; // Object set functions LUA_DECLARE(SetObjectName); @@ -36,4 +38,5 @@ class CLuaObjectDefs : public CLuaDefs LUA_DECLARE(MoveObject); LUA_DECLARE(StopObject); static bool BreakObject(CObject* const pObject); + static bool ToggleObjectRespawn(CObject* const pObject, const bool bRespawn) noexcept; }; diff --git a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp index 2502b4cc309..a001ba518fd 100644 --- a/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp @@ -301,6 +301,10 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const if (BitStream.Can(eBitStreamVersion::BreakObject_Serverside)) BitStream.WriteBit(pObject->GetHealth() <= 0); + // Respawnable + if (BitStream.Can(eBitStreamVersion::RespawnObject_Serverside)) + BitStream.WriteBit(pObject->IsRespawnEnabled()); + if (ucEntityTypeID == CElement::WEAPON) { CCustomWeapon* pWeapon = static_cast(pElement); diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index e4dc40adf2d..c6337f7af71 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -552,6 +552,10 @@ enum class eBitStreamVersion : unsigned short // 2024-05-31 BreakObject_Serverside, + // Add respawnObject and toggleObjectRespawn to serverside + // 2024-06-09 + RespawnObject_Serverside, + // Ped syncronization revision // 2024-06-16 PedSync_Revision, diff --git a/Shared/sdk/net/rpc_enums.h b/Shared/sdk/net/rpc_enums.h index e4ce53df298..a5fcdca509a 100644 --- a/Shared/sdk/net/rpc_enums.h +++ b/Shared/sdk/net/rpc_enums.h @@ -278,6 +278,8 @@ enum eElementRPCFunctions SET_WORLD_SPECIAL_PROPERTY, BREAK_OBJECT, + RESPAWN_OBJECT, + TOGGLE_OBJECT_RESPAWN, SET_PLAYER_SCRIPT_DEBUG_LEVEL,