diff --git a/Client/game_sa/CBuildingsPoolSA.cpp b/Client/game_sa/CBuildingsPoolSA.cpp index 50ae14bb3c..7cd8e887ae 100644 --- a/Client/game_sa/CBuildingsPoolSA.cpp +++ b/Client/game_sa/CBuildingsPoolSA.cpp @@ -53,6 +53,13 @@ CBuilding* CBuildingsPoolSA::AddBuilding(CClientBuilding* pClientBuilding, uint1 if (!HasFreeBuildingSlot()) return nullptr; + auto modelInfo = pGame->GetModelInfo(modelId); + + // Change the properties group to force dynamic models to be created as buildings instead of dummies + auto prevGroup = modelInfo->GetObjectPropertiesGroup(); + if (prevGroup != MODEL_PROPERTIES_GROUP_STATIC) + modelInfo->SetObjectPropertiesGroup(MODEL_PROPERTIES_GROUP_STATIC); + // Load building SFileObjectInstance instance; instance.modelID = modelId; @@ -70,9 +77,12 @@ CBuilding* CBuildingsPoolSA::AddBuilding(CClientBuilding* pClientBuilding, uint1 pBuilding->m_pLod = nullptr; pBuilding->m_iplIndex = 0; + // Restore changed properties group + if (prevGroup != MODEL_PROPERTIES_GROUP_STATIC) + modelInfo->SetObjectPropertiesGroup(prevGroup); + // Always stream model collosion // TODO We can setup collison bounding box and use GTA streamer for it - auto modelInfo = pGame->GetModelInfo(modelId); modelInfo->AddColRef(); // Add building in world diff --git a/Client/game_sa/CModelInfoSA.h b/Client/game_sa/CModelInfoSA.h index b261bcc04a..ed306f4c8f 100644 --- a/Client/game_sa/CModelInfoSA.h +++ b/Client/game_sa/CModelInfoSA.h @@ -14,6 +14,7 @@ #include #include #include "CRenderWareSA.h" +#include "game/RenderWare.h" class CPedModelInfoSA; class CPedModelInfoSAInterface; @@ -231,6 +232,11 @@ class CBaseModelInfoSAInterface // +726 = Word array as referenced in CVehicleModelInfo::GetVehicleUpgrade(int) // +762 = Array of WORD containing something relative to paintjobs // +772 = Anim file index + + void Shutdown() + { + ((void(*)())VFTBL->Shutdown)(); + } }; static_assert(sizeof(CBaseModelInfoSAInterface) == 0x20, "Invalid size for CBaseModelInfoSAInterface"); @@ -259,53 +265,66 @@ class CTimeModelInfoSAInterface : public CBaseModelInfoSAInterface CTimeInfoSAInterface timeInfo; }; +class CVehicleModelUpgradePosnDesc +{ + CVector m_vPosition; + RtQuat m_vRotation; + int m_iParentId; +}; + class CVehicleModelVisualInfoSAInterface // Not sure about this name. If somebody knows more, please change { public: - CVector vecDummies[15]; - char m_sUpgrade[18]; + CVector vecDummies[15]; + CVehicleModelUpgradePosnDesc m_sUpgrade[18]; + RpAtomic* m_pExtra[6]; + std::uint8_t m_numExtras; + std::uint8_t _pad[3]; + int m_maskComponentDamagable; }; -class CVehicleModelInfoSAInterface : public CBaseModelInfoSAInterface +class CVehicleModelInfoSAInterface : public CClumpModelInfoSAInterface { public: - uint32 pad1; // +32 - RpMaterial* pPlateMaterial; // +36 + RpMaterial* pPlateMaterial; char plateText[8]; - char pad[2]; + std::uint8_t field_30; + std::uint8_t plateType; char gameName[8]; - char pad2[2]; - unsigned int uiVehicleType; + std::uint8_t field_3A[2]; + std::uint32_t vehicleType; float fWheelSizeFront; float fWheelSizeRear; - short sWheelModel; - short sHandlingID; - byte ucNumDoors; - byte ucVehicleList; - byte ucVehicleFlags; - byte ucWheelUpgradeClass; - byte ucTimesUsed; - short sVehFrequency; - unsigned int uiComponentRules; - float fSteeringAngle; - CVehicleModelVisualInfoSAInterface* pVisualInfo; // +92 - char pad3[464]; - char pDirtMaterial[64]; // *RwMaterial - char pad4[64]; - char primColors[8]; - char secondColors[8]; - char treeColors[8]; - char fourColors[8]; - unsigned char ucNumOfColorVariations; - unsigned char ucLastColorVariation; - unsigned char ucPrimColor; - unsigned char ucSecColor; - unsigned char ucTertColor; - unsigned char ucQuatColor; - char upgrades[36]; - char anRemapTXDs[8]; - char pad5[2]; - char pAnimBlock[4]; + std::int16_t wheelModelID; + std::int16_t handlingID; + std::uint8_t numDoors; + std::uint8_t vehicleClass; + std::uint8_t vehicleFlags; + std::uint8_t wheelUpgradeClass; + std::uint8_t timesUsed; + std::uint8_t field_51; + std::int16_t vehFrequency; + std::uint32_t componentRules; + float bikeSteeringAngle; + CVehicleModelVisualInfoSAInterface* pVisualInfo; // vehicleStruct + std::uint8_t field_60[464]; + RpMaterial** m_dirtMaterials; + std::size_t m_numDirtMaterials; + RpMaterial* m_staticDirtMaterials[30]; + std::uint8_t primColors[8]; + std::uint8_t secondColors[8]; + std::uint8_t treeColors[8]; + std::uint8_t fourColors[8]; + std::uint8_t numOfColorVariations; + std::uint8_t lastColorVariation; + std::uint8_t primColor; + std::uint8_t secColor; + std::uint8_t tertColor; + std::uint8_t quatColor; + std::uint8_t upgrades[36]; + std::uint8_t anRemapTXDs[8]; + std::uint8_t field_302[2]; + void* pAnimBlock; // CAnimBlock* }; class CModelInfoSA : public CModelInfo @@ -466,7 +485,7 @@ class CModelInfoSA : public CModelInfo // Vehicle towing functions bool IsTowableBy(CModelInfo* towingModel) override; - bool IsDynamic() { return m_pInterface ? m_pInterface->usDynamicIndex != 0xffff : false; }; + bool IsDynamic() { return m_pInterface ? m_pInterface->usDynamicIndex != MODEL_PROPERTIES_GROUP_STATIC : false; }; private: void CopyStreamingInfoFromModel(ushort usCopyFromModelID); diff --git a/Client/game_sa/CPlayerPedSA.cpp b/Client/game_sa/CPlayerPedSA.cpp index 534f8376c6..cf8a03faea 100644 --- a/Client/game_sa/CPlayerPedSA.cpp +++ b/Client/game_sa/CPlayerPedSA.cpp @@ -18,6 +18,7 @@ #include "CPlayerInfoSA.h" #include "CPlayerPedSA.h" #include "CWorldSA.h" +#include "CProjectileInfoSA.h" extern CCoreInterface* g_pCore; extern CGameSA* pGame; @@ -137,6 +138,7 @@ CPlayerPedSA::~CPlayerPedSA() if ((DWORD)GetInterface()->vtbl != VTBL_CPlaceable) { CWorldSA* world = (CWorldSA*)pGame->GetWorld(); + pGame->GetProjectileInfo()->RemoveEntityReferences(this); world->Remove(m_pInterface, CPlayerPed_Destructor); DWORD dwThis = (DWORD)m_pInterface; diff --git a/Client/game_sa/CProjectileInfoSA.cpp b/Client/game_sa/CProjectileInfoSA.cpp index 439553941d..843f029462 100644 --- a/Client/game_sa/CProjectileInfoSA.cpp +++ b/Client/game_sa/CProjectileInfoSA.cpp @@ -180,3 +180,18 @@ DWORD CProjectileInfoSA::GetCounter() { return internalInterface->dwCounter - pGame->GetSystemTime(); } + +void CProjectileInfoSA::RemoveEntityReferences(CEntity* entity) +{ + const CEntitySAInterface* entityInterface = entity->GetInterface(); + for (int i = 0; i < PROJECTILE_INFO_COUNT; i++) + { + auto projectileInterface = projectileInfo[i]->internalInterface; + + if (projectileInterface->pEntProjectileOwner == entityInterface) + projectileInterface->pEntProjectileOwner = nullptr; + + if (projectileInterface->pEntProjectileTarget == entityInterface) + projectileInterface->pEntProjectileTarget = nullptr; + } +} diff --git a/Client/game_sa/CProjectileInfoSA.h b/Client/game_sa/CProjectileInfoSA.h index 2d8ba9cb32..73b69f74e2 100644 --- a/Client/game_sa/CProjectileInfoSA.h +++ b/Client/game_sa/CProjectileInfoSA.h @@ -42,7 +42,8 @@ class CProjectileInfoSAInterface }; // #pragma pack(pop) -class CProjectileInfoSA : public CProjectileInfo +// TODO extract manager class +class CProjectileInfoSA final : public CProjectileInfo { private: CProjectileInfoSA* projectileInfo[PROJECTILE_INFO_COUNT]; @@ -65,6 +66,7 @@ class CProjectileInfoSA : public CProjectileInfo CProjectileInfo* GetProjectileInfo(DWORD dwIndex); bool AddProjectile(CEntity* creator, eWeaponType eWeapon, CVector vecOrigin, float fForce, CVector* target, CEntity* targetEntity); CProjectile* GetProjectile(void* projectilePointer); + void RemoveEntityReferences(CEntity* entity); CEntity* GetTarget(); void SetTarget(CEntity* pEntity); diff --git a/Client/game_sa/CVehicleSA.cpp b/Client/game_sa/CVehicleSA.cpp index 9d4a02598e..579ebb6180 100644 --- a/Client/game_sa/CVehicleSA.cpp +++ b/Client/game_sa/CVehicleSA.cpp @@ -224,6 +224,7 @@ CVehicleSA::~CVehicleSA() } CWorldSA* pWorld = (CWorldSA*)pGame->GetWorld(); + pGame->GetProjectileInfo()->RemoveEntityReferences(this); pWorld->Remove(m_pInterface, CVehicle_Destructor); pWorld->RemoveReferencesToDeletedObject(m_pInterface); diff --git a/Client/game_sa/gamesa_renderware.h b/Client/game_sa/gamesa_renderware.h index 594c203b59..4073f8f2b2 100644 --- a/Client/game_sa/gamesa_renderware.h +++ b/Client/game_sa/gamesa_renderware.h @@ -105,6 +105,7 @@ typedef RpHAnimHierarchy*(__cdecl* GetAnimHierarchyFromSkinClump_t)(RpClump*); typedef int(__cdecl* RpHAnimIDGetIndex_t)(RpHAnimHierarchy*, int); typedef RwMatrix*(__cdecl* RpHAnimHierarchyGetMatrixArray_t)(RpHAnimHierarchy*); typedef RtQuat*(__cdecl* RtQuatRotate_t)(RtQuat* quat, const RwV3d* axis, float angle, RwOpCombineType combineOp); +typedef RpGeometry*(__cdecl* RpGeometryForAllMaterials_t)(RpGeometry* geom, void* callback, void* data); /*****************************************************************************/ /** Renderware function mappings **/ @@ -195,6 +196,7 @@ RWFUNC(GetAnimHierarchyFromSkinClump_t GetAnimHierarchyFromSkinClump, (GetAnimHi RWFUNC(RpHAnimIDGetIndex_t RpHAnimIDGetIndex, (RpHAnimIDGetIndex_t)0xDEAD) RWFUNC(RpHAnimHierarchyGetMatrixArray_t RpHAnimHierarchyGetMatrixArray, (RpHAnimHierarchyGetMatrixArray_t)0xDEAD) RWFUNC(RtQuatRotate_t RtQuatRotate, (RtQuatRotate_t)0xDEAD) +RWFUNC(RpGeometryForAllMaterials_t RpGeometryForAllMaterials, (RpGeometryForAllMaterials_t)0xDEAD) /*****************************************************************************/ /** GTA function definitions and mappings **/ diff --git a/Client/game_sa/gamesa_renderware.hpp b/Client/game_sa/gamesa_renderware.hpp index a638cfede0..f52d205dda 100644 --- a/Client/game_sa/gamesa_renderware.hpp +++ b/Client/game_sa/gamesa_renderware.hpp @@ -89,7 +89,8 @@ void InitRwFunctions() RpHAnimIDGetIndex = (RpHAnimIDGetIndex_t)0x7C51A0; RpHAnimHierarchyGetMatrixArray = (RpHAnimHierarchyGetMatrixArray_t)0x7C5120; RtQuatRotate = (RtQuatRotate_t)0x7EB7C0; - + RpGeometryForAllMaterials = (RpGeometryForAllMaterials_t)0x74C790; + SetTextureDict = (SetTextureDict_t)0x007319C0; LoadClumpFile = (LoadClumpFile_t)0x005371F0; LoadModel = (LoadModel_t)0x0040C6B0; diff --git a/Client/mods/deathmatch/logic/CClientBuildingManager.cpp b/Client/mods/deathmatch/logic/CClientBuildingManager.cpp index 243917b89f..a09df6a226 100644 --- a/Client/mods/deathmatch/logic/CClientBuildingManager.cpp +++ b/Client/mods/deathmatch/logic/CClientBuildingManager.cpp @@ -73,11 +73,6 @@ bool CClientBuildingManager::IsValidModel(uint16_t modelId) if (!pModelInfo->IsAllocatedInArchive()) return false; - if (pModelInfo->IsDynamic()) - { - return false; - } - eModelInfoType eType = pModelInfo->GetModelType(); return (eType == eModelInfoType::CLUMP || eType == eModelInfoType::ATOMIC || eType == eModelInfoType::WEAPON || eType == eModelInfoType::TIME); } @@ -106,29 +101,9 @@ void CClientBuildingManager::RestoreDestroyed() { const CClientBuilding* highLodBuilding = building->GetHighLodBuilding(); if (highLodBuilding && !highLodBuilding->IsValid()) - { hasInvalidLods = true; - } else - { - CModelInfo* modelInfo = building->GetModelInfo(); - const uint16_t physicalGroup = modelInfo->GetObjectPropertiesGroup(); - - if (physicalGroup == -1) - { - building->Create(); - } - else - { - // GTA creates dynamic models as dummies. - // It's possible that the physical group was changes after - // creating a new building. We can avoid crashes in this case. - modelInfo->SetObjectPropertiesGroup(-1); - building->Create(); - modelInfo->SetObjectPropertiesGroup(physicalGroup); - } - - } + building->Create(); } } } diff --git a/Client/mods/deathmatch/logic/CClientGUIManager.cpp b/Client/mods/deathmatch/logic/CClientGUIManager.cpp index b2eb23322c..8b3db9650a 100644 --- a/Client/mods/deathmatch/logic/CClientGUIManager.cpp +++ b/Client/mods/deathmatch/logic/CClientGUIManager.cpp @@ -43,7 +43,7 @@ void CClientGUIManager::DeleteAll() bool CClientGUIManager::Exists(CClientGUIElement* pGUIElement) { - return m_Elements.Contains(pGUIElement); + return pGUIElement ? m_Elements.Contains(pGUIElement) : false; } bool CClientGUIManager::Exists(CGUIElement* pCGUIElement) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 7169125a24..acc385998c 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -34,6 +34,7 @@ #include #include #include "game/CClock.h" +#include #include #include "CServerInfo.h" @@ -403,6 +404,10 @@ CClientGame::CClientGame(bool bLocalPlay) : m_ServerInfo(new CServerInfo()) CClientGame::~CClientGame() { m_bBeingDeleted = true; + // Remove active projectile references to local player + if (auto pLocalPlayer = g_pClientGame->GetLocalPlayer()) + g_pGame->GetProjectileInfo()->RemoveEntityReferences(pLocalPlayer->GetGameEntity()); + // Stop all explosions. Unfortunately this doesn't fix the crash // if a vehicle is destroyed while it explodes. g_pGame->GetExplosionManager()->RemoveAllExplosions(); diff --git a/Client/multiplayer_sa/CMultiplayerSA_Vehicles.cpp b/Client/multiplayer_sa/CMultiplayerSA_Vehicles.cpp index 88b0b11eb8..afaa8de6f1 100644 --- a/Client/multiplayer_sa/CMultiplayerSA_Vehicles.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA_Vehicles.cpp @@ -9,6 +9,12 @@ *****************************************************************************/ #include "StdInc.h" +#include "..\game_sa\gamesa_renderware.h" + +#define FUNC_CBaseModelInfo_Shutdown 0x4C4D50 +#define IN_PLACE_BUFFER_DIRT_SIZE 30 + +static RwTexture** const ms_aDirtTextures = (RwTexture**)0xC02BD0; static bool __fastcall AreVehicleDoorsUndamageable(CVehicleSAInterface* vehicle) { @@ -107,6 +113,100 @@ static void _declspec(naked) HOOK_CAEVehicleAudioEntity__Initialise() } } +static void __fastcall CVehicleModelInfo_Shutdown(CVehicleModelInfoSAInterface* mi) +{ + if (!mi) + return; + + mi->Shutdown(); + + delete[] mi->m_dirtMaterials; + mi->m_dirtMaterials = nullptr; +} + +static void SetDirtTextures(CVehicleModelInfoSAInterface* mi, std::uint32_t level) +{ + RpMaterial** materials = mi->m_numDirtMaterials > IN_PLACE_BUFFER_DIRT_SIZE ? mi->m_dirtMaterials : mi->m_staticDirtMaterials; + for (std::uint32_t i = 0; i < mi->m_numDirtMaterials; i++) + RpMaterialSetTexture(materials[i], ms_aDirtTextures[level]); +} + +#define HOOKPOS_CVehicleModelInfo_SetDirtTextures 0x5D5DBB +#define HOOKSIZE_CVehicleModelInfo_SetDirtTextures 6 +static constexpr DWORD CONTINUE_CVehicleModelInfo_SetDirtTextures = 0x5D5DE3; +static void _declspec(naked) HOOK_CVehicleModelInfo_SetDirtTextures() +{ + _asm + { + push ebx + push esi + call SetDirtTextures + add esp, 8 + + jmp CONTINUE_CVehicleModelInfo_SetDirtTextures + } +} + +static RpMaterial* GetAtomicGeometryMaterialsCB(RpMaterial* material, void* data) +{ + RwTexture* texture = material->texture; + if (!texture) + return nullptr; + + auto cbData = static_cast*>(data); + if (texture->name && std::strcmp(texture->name, "vehiclegrunge256") == 0) + cbData->push_back(material); + + return material; +} + +static bool GetEditableMaterialListCB(RpAtomic* atomic, void* data) +{ + RpGeometryForAllMaterials(atomic->geometry, &GetAtomicGeometryMaterialsCB, data); + return true; +} + +static void __fastcall FindEditableMaterialList(CVehicleModelInfoSAInterface* mi) +{ + std::vector list; + RpClumpForAllAtomics(reinterpret_cast(mi->pRwObject), &GetEditableMaterialListCB, &list); + + for (std::uint32_t i = 0; i < mi->pVisualInfo->m_numExtras; i++) + GetEditableMaterialListCB(mi->pVisualInfo->m_pExtra[i], &list); + + mi->m_numDirtMaterials = list.size(); + if (mi->m_numDirtMaterials > IN_PLACE_BUFFER_DIRT_SIZE) + { + mi->m_dirtMaterials = new RpMaterial*[mi->m_numDirtMaterials]; + std::copy(list.begin(), list.end(), mi->m_dirtMaterials); + } + else + { + mi->m_dirtMaterials = nullptr; + std::copy(list.begin(), list.end(), mi->m_staticDirtMaterials); + } + + mi->primColor = 255; + mi->secColor = 255; + mi->tertColor = 255; + mi->quatColor = 255; +} + +#define HOOKPOS_CVehicleModelInfo_SetClump 0x4C9648 +#define HOOKSIZE_CVehicleModelInfo_SetClump 24 +static constexpr DWORD CONTINUE_CVehicleModelInfo_SetClump = 0x4C9660; +static void _declspec(naked) HOOK_CVehicleModelInfo_SetClump() +{ + _asm + { + push ecx + call FindEditableMaterialList + pop ecx + + jmp CONTINUE_CVehicleModelInfo_SetClump + } +} + ////////////////////////////////////////////////////////////////////////////////////////// // // CMultiplayerSA::InitHooks_Vehicles @@ -118,4 +218,9 @@ void CMultiplayerSA::InitHooks_Vehicles() { EZHookInstall(CDamageManager__ProgressDoorDamage); EZHookInstall(CAEVehicleAudioEntity__Initialise); + + // Fix vehicle dirt level + EZHookInstall(CVehicleModelInfo_SetClump); + EZHookInstall(CVehicleModelInfo_SetDirtTextures); + MemCpy((void*)0x85C5E4, &CVehicleModelInfo_Shutdown, 4); } diff --git a/Client/sdk/game/CModelInfo.h b/Client/sdk/game/CModelInfo.h index 08cb032e4c..3541750038 100644 --- a/Client/sdk/game/CModelInfo.h +++ b/Client/sdk/game/CModelInfo.h @@ -15,6 +15,8 @@ #include "CAnimBlock.h" #include "Common.h" +constexpr std::uint16_t MODEL_PROPERTIES_GROUP_STATIC = 0xFFFF; + class CBaseModelInfoSAInterface; class CColModel; class CPedModelInfo; @@ -131,6 +133,7 @@ struct SVehicleSupportedUpgrades bool m_bMisc; bool m_bInitialised; }; + class CModelInfo { public: diff --git a/Client/sdk/game/CProjectileInfo.h b/Client/sdk/game/CProjectileInfo.h index 586cbd029c..d32a538623 100644 --- a/Client/sdk/game/CProjectileInfo.h +++ b/Client/sdk/game/CProjectileInfo.h @@ -24,6 +24,7 @@ class CProjectileInfo virtual CProjectileInfo* GetProjectileInfo(void* projectileInfoInterface) = 0; // don't use virtual void RemoveProjectile(CProjectileInfo* pProjectileInfo, CProjectile* pProjectile, bool bBlow = true) = 0; virtual CProjectileInfo* GetProjectileInfo(DWORD Index) = 0; + virtual void RemoveEntityReferences(CEntity* entity) = 0; virtual CEntity* GetTarget() = 0; virtual void SetTarget(CEntity* pEntity) = 0; 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 2bfd95eb7c..e99dff9b64 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-11-21 22:47+0000\n" +"POT-Creation-Date: 2024-12-14 11:44+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -159,121 +159,121 @@ msgid "(Development mode) prints world sound ids into the debug window" msgstr "" #: Client/mods/deathmatch/logic/CResource.cpp:375 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1090 Client/core/CCore.cpp:674 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1095 Client/core/CCore.cpp:674 #: Client/core/CSettings.cpp:3510 msgid "In-game" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:375 +#: Client/mods/deathmatch/logic/CClientGame.cpp:376 msgid "Flying a UFO around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:375 +#: Client/mods/deathmatch/logic/CClientGame.cpp:376 msgid "Cruising around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:375 +#: Client/mods/deathmatch/logic/CClientGame.cpp:376 msgid "Riding the waves of" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:376 +#: Client/mods/deathmatch/logic/CClientGame.cpp:377 msgid "Riding the train in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:376 +#: Client/mods/deathmatch/logic/CClientGame.cpp:377 msgid "Flying around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:377 +#: Client/mods/deathmatch/logic/CClientGame.cpp:378 msgid "Riding around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:377 +#: Client/mods/deathmatch/logic/CClientGame.cpp:378 msgid "Monster truckin' around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:377 +#: Client/mods/deathmatch/logic/CClientGame.cpp:378 msgid "Quaddin' around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:378 +#: Client/mods/deathmatch/logic/CClientGame.cpp:379 msgid "Bunny hopping around" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:378 +#: Client/mods/deathmatch/logic/CClientGame.cpp:379 msgid "Doing weird stuff in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:382 +#: Client/mods/deathmatch/logic/CClientGame.cpp:383 msgid "Climbing around in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:383 #: Client/mods/deathmatch/logic/CClientGame.cpp:384 +#: Client/mods/deathmatch/logic/CClientGame.cpp:385 msgid "Doing a drive-by in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:385 +#: Client/mods/deathmatch/logic/CClientGame.cpp:386 msgid "Blub blub..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:386 +#: Client/mods/deathmatch/logic/CClientGame.cpp:387 msgid "Breathing water" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:387 +#: Client/mods/deathmatch/logic/CClientGame.cpp:388 msgid "Drowning in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:388 +#: Client/mods/deathmatch/logic/CClientGame.cpp:389 msgid "Ducking for cover in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:389 +#: Client/mods/deathmatch/logic/CClientGame.cpp:390 msgid "Fighting in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:390 +#: Client/mods/deathmatch/logic/CClientGame.cpp:391 msgid "Throwing fists in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:391 +#: Client/mods/deathmatch/logic/CClientGame.cpp:392 msgid "Blastin' fools in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:392 +#: Client/mods/deathmatch/logic/CClientGame.cpp:393 msgid "Shooting up" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:393 +#: Client/mods/deathmatch/logic/CClientGame.cpp:394 msgid "Jetpacking in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:394 +#: Client/mods/deathmatch/logic/CClientGame.cpp:395 msgid "Literally on fire in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:395 +#: Client/mods/deathmatch/logic/CClientGame.cpp:396 msgid "Burning up in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:396 +#: Client/mods/deathmatch/logic/CClientGame.cpp:397 msgid "Swimming in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:397 +#: Client/mods/deathmatch/logic/CClientGame.cpp:398 msgid "Floating around in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:398 +#: Client/mods/deathmatch/logic/CClientGame.cpp:399 msgid "Being chased by a shark" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:399 +#: Client/mods/deathmatch/logic/CClientGame.cpp:400 msgid "Choking to death in" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:534 +#: Client/mods/deathmatch/logic/CClientGame.cpp:539 #: Client/core/CMainMenu.cpp:304 Client/core/CCore.cpp:674 #: Client/core/CSettings.cpp:3506 msgid "Main menu" @@ -283,17 +283,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:642 -#: Client/mods/deathmatch/logic/CClientGame.cpp:716 -#: Client/mods/deathmatch/logic/CClientGame.cpp:740 -#: Client/mods/deathmatch/logic/CClientGame.cpp:762 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1175 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1255 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1265 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1334 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1371 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1420 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1432 +#: Client/mods/deathmatch/logic/CClientGame.cpp:647 +#: Client/mods/deathmatch/logic/CClientGame.cpp:721 +#: Client/mods/deathmatch/logic/CClientGame.cpp:745 +#: Client/mods/deathmatch/logic/CClientGame.cpp:767 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1180 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1260 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1270 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1339 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1376 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1425 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1437 #: Client/mods/deathmatch/logic/CResourceFileDownloadManager.cpp:145 #: Client/loader/MainFunctions.cpp:252 Client/loader/MainFunctions.cpp:267 #: Client/loader/MainFunctions.cpp:269 Client/loader/MainFunctions.cpp:846 @@ -316,140 +316,140 @@ msgstr "" msgid "Error" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:642 -#: Client/mods/deathmatch/logic/CClientGame.cpp:740 +#: Client/mods/deathmatch/logic/CClientGame.cpp:647 +#: Client/mods/deathmatch/logic/CClientGame.cpp:745 #: Client/core/ServerBrowser/CServerBrowser.cpp:1307 #: Client/core/ServerBrowser/CServerBrowser.cpp:1364 msgid "Invalid nickname! Please go to Settings and set a new one!" msgstr "" #. Display the status box -#: Client/mods/deathmatch/logic/CClientGame.cpp:658 +#: Client/mods/deathmatch/logic/CClientGame.cpp:663 #: Client/core/CConnectManager.cpp:148 msgid "CONNECTING" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:658 +#: Client/mods/deathmatch/logic/CClientGame.cpp:663 msgid "Entering the game ..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:716 +#: Client/mods/deathmatch/logic/CClientGame.cpp:721 msgid "" "Not connected; please use Quick Connect or the 'connect' command to connect " "to a server." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:762 +#: Client/mods/deathmatch/logic/CClientGame.cpp:767 msgid "Could not start the local server. See console for details." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:772 -#: Client/mods/deathmatch/logic/CClientGame.cpp:1244 +#: Client/mods/deathmatch/logic/CClientGame.cpp:777 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1249 msgid "Local Server" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:772 +#: Client/mods/deathmatch/logic/CClientGame.cpp:777 msgid "Starting local server ..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1020 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1025 msgid "Area 51" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1029 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1034 msgid "Walking around " msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1175 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1180 #, c-format msgid "You were kicked from the game ( %s )" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1244 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1249 msgid "Connecting to local server..." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1255 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1260 msgid "Error connecting to server." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1265 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1270 msgid "Connecting to local server timed out. See console for details." msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1334 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1339 #: Client/core/CConnectManager.cpp:263 msgid "Connection timed out" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1371 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1376 msgid "Connection with the server was lost" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1382 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1387 #: Client/core/CConnectManager.cpp:277 Client/core/CConnectManager.cpp:281 msgid "Disconnected: unknown protocol error" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1386 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1391 #: Client/core/CConnectManager.cpp:285 msgid "Disconnected: disconnected remotely" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1390 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1395 #: Client/core/CConnectManager.cpp:289 msgid "Disconnected: connection lost remotely" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1394 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1399 #: Client/core/CConnectManager.cpp:293 msgid "Disconnected: you are banned from this server" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1398 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1403 msgid "Disconnected: the server is currently full" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1402 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1407 #: Client/core/CConnectManager.cpp:300 msgid "Disconnected: disconnected from the server" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1406 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1411 #: Client/core/CConnectManager.cpp:304 msgid "Disconnected: connection to the server was lost" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1410 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1415 msgid "Disconnected: invalid password specified" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1414 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1419 #: Client/core/CConnectManager.cpp:311 msgid "Disconnected: connection was refused" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:1432 +#: Client/mods/deathmatch/logic/CClientGame.cpp:1437 msgid "MTA Client verification failed!" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5620 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5625 msgid "In a ditch" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5620 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5625 msgid "En-route to hospital" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5620 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5625 msgid "Meeting their maker" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5621 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5626 msgid "Regretting their decisions" msgstr "" -#: Client/mods/deathmatch/logic/CClientGame.cpp:5621 +#: Client/mods/deathmatch/logic/CClientGame.cpp:5626 msgid "Wasted" msgstr "" diff --git a/Shared/data/launchers/CEFLauncher.exe b/Shared/data/launchers/CEFLauncher.exe index 8ddad15d39..a9be86fc62 100644 Binary files a/Shared/data/launchers/CEFLauncher.exe and b/Shared/data/launchers/CEFLauncher.exe differ diff --git a/Shared/data/launchers/MTA Server ARM64.exe b/Shared/data/launchers/MTA Server ARM64.exe index f64006f3d8..974d0d82b5 100644 Binary files a/Shared/data/launchers/MTA Server ARM64.exe and b/Shared/data/launchers/MTA Server ARM64.exe differ diff --git a/Shared/data/launchers/MTA Server.exe b/Shared/data/launchers/MTA Server.exe index bc664aec89..78b87553a5 100644 Binary files a/Shared/data/launchers/MTA Server.exe and b/Shared/data/launchers/MTA Server.exe differ diff --git a/Shared/data/launchers/MTA Server64.exe b/Shared/data/launchers/MTA Server64.exe index 021e55401f..7397e22a42 100644 Binary files a/Shared/data/launchers/MTA Server64.exe and b/Shared/data/launchers/MTA Server64.exe differ diff --git a/Shared/data/launchers/Multi Theft Auto.exe b/Shared/data/launchers/Multi Theft Auto.exe index 99fcb3c6bf..547a73812a 100644 Binary files a/Shared/data/launchers/Multi Theft Auto.exe and b/Shared/data/launchers/Multi Theft Auto.exe differ diff --git a/Shared/data/launchers/wow64_helper.exe b/Shared/data/launchers/wow64_helper.exe index 24a78f7abb..51fc605af7 100644 Binary files a/Shared/data/launchers/wow64_helper.exe and b/Shared/data/launchers/wow64_helper.exe differ diff --git a/Shared/installer/nightly.nsi b/Shared/installer/nightly.nsi index d270a0d719..cba6d23680 100644 --- a/Shared/installer/nightly.nsi +++ b/Shared/installer/nightly.nsi @@ -780,8 +780,8 @@ SectionGroup /e "$(INST_SEC_CLIENT)" SECGCLIENT File "${FILES_ROOT}\mta\cgui\unifont.ttf" SetOutPath "$INSTDIR\MTA\cgui\images" - File "${FILES_ROOT}\mta\cgui\images\*.png" - File "${FILES_ROOT}\mta\cgui\images\*.jpg" + File /nonfatal "${FILES_ROOT}\mta\cgui\images\*.png" + File /nonfatal "${FILES_ROOT}\mta\cgui\images\*.jpg" SetOutPath "$INSTDIR\MTA\cgui\images\radarset" File "${FILES_ROOT}\mta\cgui\images\radarset\*.png" diff --git a/utils/buildactions/install_cef.lua b/utils/buildactions/install_cef.lua index 364bedf3e2..663c5a244d 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 = "130.1.2+g48f3ef6+chromium-130.0.6723.44" -local CEF_HASH = "f436f0f23caa8167d14e8de331d15fbb534e411f4235895024c2e242510e8deb" +local CEF_VERSION = "131.3.4+g7ecebf0+chromium-131.0.6778.140" +local CEF_HASH = "c6f00e0bcc8973c5ff0aa1d9297748ab0bdc483f6d8932946ad70450fb1f14ed" function make_cef_download_url() return CEF_URL_PREFIX..http.escapeUrlParam(CEF_VERSION)..CEF_URL_SUFFIX