From db9d5ddf55a037c1a1763af28e80cc0c062ebc32 Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Mon, 8 May 2017 03:33:51 +0200 Subject: [PATCH 1/6] Added onClientWorldSound event --- Client/game_sa/CAudioEngineSA.cpp | 13 ++++--- Client/game_sa/CAudioEngineSA.h | 18 +++++----- Client/mods/deathmatch/logic/CClientGame.cpp | 38 +++++++++++++++----- Client/mods/deathmatch/logic/CClientGame.h | 4 +-- Client/sdk/game/CAudioEngine.h | 9 ++--- 5 files changed, 52 insertions(+), 30 deletions(-) diff --git a/Client/game_sa/CAudioEngineSA.cpp b/Client/game_sa/CAudioEngineSA.cpp index b9d914c5bf3..9606895383d 100644 --- a/Client/game_sa/CAudioEngineSA.cpp +++ b/Client/game_sa/CAudioEngineSA.cpp @@ -486,7 +486,7 @@ void CAudioEngineSA::ResetWorldSounds ( void ) m_DisabledWorldSounds = CRanges (); } -void CAudioEngineSA::SetWorldSoundHandler ( WorldSoundHandler * pHandler ) +void CAudioEngineSA::SetWorldSoundHandler ( WorldSoundHandler pHandler ) { m_pWorldSoundHandler = pHandler; } @@ -496,8 +496,13 @@ bool CAudioEngineSA::OnWorldSound ( CAESound* pAESound ) if ( !IsWorldSoundEnabled ( pAESound->usGroup, pAESound->usIndex ) ) return false; - if ( m_pWorldSoundHandler ) - m_pWorldSoundHandler ( pAESound->usGroup, pAESound->usIndex ); + if ( m_pWorldSoundHandler ) { + bool bCanceled = !m_pWorldSoundHandler ( pAESound->usGroup, pAESound->usIndex, pAESound->pGameEntity, pAESound->m_vCurrPosn ); + + if ( bCanceled ) { + return false; + } + } return true; } @@ -568,4 +573,4 @@ void CAudioEngineSA::ReportWeaponEvent ( int iEvent, eWeaponType weaponType, CPh push iEvent call dwFunc } -} \ No newline at end of file +} diff --git a/Client/game_sa/CAudioEngineSA.h b/Client/game_sa/CAudioEngineSA.h index 8a691a28a3d..5b668f84641 100644 --- a/Client/game_sa/CAudioEngineSA.h +++ b/Client/game_sa/CAudioEngineSA.h @@ -143,7 +143,7 @@ class CAudioEngineSA : public CAudioEngine VOID SetWorldSoundEnabled ( uint uiGroup, uint uiIndex, bool bEnabled ); bool IsWorldSoundEnabled ( uint uiGroup, uint uiIndex ); void ResetWorldSounds ( void ); - void SetWorldSoundHandler ( WorldSoundHandler * pHandler ); + void SetWorldSoundHandler ( WorldSoundHandler pHandler ); void ReportBulletHit ( CEntity * pEntity, unsigned char ucSurfaceType, CVector * pvecPosition, float f_2 ); void ReportWeaponEvent ( int iEvent, eWeaponType weaponType, CPhysical * pPhysical ); @@ -151,14 +151,14 @@ class CAudioEngineSA : public CAudioEngine bool OnWorldSound ( CAESound* pAESound ); private: - bool m_bRadioOn; - bool m_bRadioMuted; - unsigned char m_ucRadioChannel; - bool m_bAmbientSoundsPaused; - bool m_bAmbientGeneralEnabled; - bool m_bAmbientGunfireEnabled; - CRanges m_DisabledWorldSounds; - WorldSoundHandler* m_pWorldSoundHandler; + bool m_bRadioOn; + bool m_bRadioMuted; + unsigned char m_ucRadioChannel; + bool m_bAmbientSoundsPaused; + bool m_bAmbientGeneralEnabled; + bool m_bAmbientGunfireEnabled; + CRanges m_DisabledWorldSounds; + WorldSoundHandler m_pWorldSoundHandler; CAudioEngineSAInterface * m_pInterface; }; diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 1f27276ffc7..6b177abc65a 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -288,6 +288,7 @@ CClientGame::CClientGame ( bool bLocalPlay ) g_pGame->SetPreWeaponFireHandler ( CClientGame::PreWeaponFire ); g_pGame->SetPostWeaponFireHandler ( CClientGame::PostWeaponFire ); g_pGame->SetTaskSimpleBeHitHandler ( CClientGame::StaticTaskSimpleBeHitHandler ); + g_pGame->GetAudio ()->SetWorldSoundHandler ( CClientGame::StaticWorldSoundHandler ); g_pCore->SetMessageProcessor ( CClientGame::StaticProcessMessage ); g_pCore->GetKeyBinds ()->SetKeyStrokeHandler ( CClientGame::StaticKeyStrokeHandler ); g_pCore->GetKeyBinds ()->SetCharacterKeyHandler ( CClientGame::StaticCharacterKeyHandler ); @@ -2923,8 +2924,10 @@ void CClientGame::AddBuiltInEvents ( void ) // Misc events m_Events.AddEvent ( "onClientFileDownloadComplete", "fileName, success", NULL, false ); - + m_Events.AddEvent ( "onClientWeaponFire", "ped, x, y, z", NULL, false ); + + m_Events.AddEvent ( "onClientWorldSound", "group, index, x, y, z", NULL, false ); } @@ -6368,11 +6371,6 @@ void CClientGame::SetDevelopmentMode ( bool bEnable, bool bEnableWeb ) { m_bDevelopmentMode = bEnable; - if ( m_bDevelopmentMode ) - g_pGame->GetAudio ()->SetWorldSoundHandler ( CClientGame::StaticWorldSoundHandler ); - else - g_pGame->GetAudio ()->SetWorldSoundHandler ( NULL ); - if ( g_pCore->IsWebCoreLoaded() ) g_pCore->GetWebCore()->SetTestModeEnabled ( bEnableWeb ); } @@ -6385,9 +6383,9 @@ void CClientGame::SetDevelopmentMode ( bool bEnable, bool bEnableWeb ) // Handle callback from CAudioSA when a world sound is played // ////////////////////////////////////////////////////////////////// -void CClientGame::StaticWorldSoundHandler ( uint uiGroup, uint uiIndex ) +bool CClientGame::StaticWorldSoundHandler ( uint uiGroup, uint uiIndex, CEntitySAInterface* pEntityInterface, const CVector& vecPosition ) { - g_pClientGame->WorldSoundHandler ( uiGroup, uiIndex ); + return g_pClientGame->WorldSoundHandler ( uiGroup, uiIndex, pEntityInterface, vecPosition ); } @@ -6398,10 +6396,32 @@ void CClientGame::StaticWorldSoundHandler ( uint uiGroup, uint uiIndex ) // Handle callback from CAudioSA when a world sound is played // ////////////////////////////////////////////////////////////////// -void CClientGame::WorldSoundHandler ( uint uiGroup, uint uiIndex ) +bool CClientGame::WorldSoundHandler ( uint uiGroup, uint uiIndex, CEntitySAInterface* pEntityInterface, const CVector& vecPosition ) { if ( m_bShowSound ) m_pScriptDebugging->LogInformation ( NULL, "%s - World sound group:%d index:%d", *GetLocalTimeString ( false, true ), uiGroup, uiIndex ); + + if ( pEntityInterface ) { + CClientEntity* pEntity = g_pClientGame->GetGameEntityXRefManager()->FindClientEntity( pEntityInterface ); + + if ( !pEntity ) { + pEntity = m_pRootEntity; + } + + CLuaArguments Arguments; + Arguments.PushNumber( uiGroup ); + Arguments.PushNumber( uiIndex ); + Arguments.PushNumber( vecPosition.fX ); + Arguments.PushNumber( vecPosition.fY ); + Arguments.PushNumber( vecPosition.fZ ); + bool bCanceled = !pEntity->CallEvent( "onClientWorldSound", Arguments, pEntity != m_pRootEntity ); + + if ( bCanceled ) { + return false; + } + } + + return true; } diff --git a/Client/mods/deathmatch/logic/CClientGame.h b/Client/mods/deathmatch/logic/CClientGame.h index b5ab362ed23..172dc5e1f53 100644 --- a/Client/mods/deathmatch/logic/CClientGame.h +++ b/Client/mods/deathmatch/logic/CClientGame.h @@ -517,7 +517,7 @@ class CClientGame static void StaticGamePlayerDestructHandler ( CEntitySAInterface* pPlayer ); static void StaticGameProjectileDestructHandler ( CEntitySAInterface* pProjectile ); static void StaticGameModelRemoveHandler ( ushort usModelId ); - static void StaticWorldSoundHandler ( uint uiGroup, uint uiIndex ); + static bool StaticWorldSoundHandler ( uint uiGroup, uint uiIndex, CEntitySAInterface* pEntityInterface, const CVector& vecPosition ); static void StaticGameEntityRenderHandler ( CEntitySAInterface* pEntity ); static void StaticTaskSimpleBeHitHandler ( CPedSAInterface* pPedAttacker, ePedPieceTypes hitBodyPart, int hitBodySide, int weaponId ); static void StaticFxSystemDestructionHandler ( void * pFxSAInterface ); @@ -548,7 +548,7 @@ class CClientGame void GamePlayerDestructHandler ( CEntitySAInterface* pPlayer ); void GameProjectileDestructHandler ( CEntitySAInterface* pProjectile ); void GameModelRemoveHandler ( ushort usModelId ); - void WorldSoundHandler ( uint uiGroup, uint uiIndex ); + bool WorldSoundHandler ( uint uiGroup, uint uiIndex, CEntitySAInterface* pEntityInterface, const CVector& vecPosition ); void TaskSimpleBeHitHandler ( CPedSAInterface* pPedAttacker, ePedPieceTypes hitBodyPart, int hitBodySide, int weaponId ); AnimationId DrivebyAnimationHandler ( AnimationId animGroup, AssocGroupId animId ); diff --git a/Client/sdk/game/CAudioEngine.h b/Client/sdk/game/CAudioEngine.h index a18bd88f519..fb4b2f24158 100644 --- a/Client/sdk/game/CAudioEngine.h +++ b/Client/sdk/game/CAudioEngine.h @@ -9,13 +9,12 @@ * *****************************************************************************/ -#ifndef __CGAME_AUDIOENGINE -#define __CGAME_AUDIOENGINE +#pragma once #include #include "CVehicle.h" -typedef void ( WorldSoundHandler ) ( uint uiGroup, uint uiIndex ); +using WorldSoundHandler = bool (*) ( uint uiGroup, uint uiIndex, CEntitySAInterface* pEntityInterface, const CVector& vecPosition ); enum eSurfaceType { @@ -60,9 +59,7 @@ class CAudioEngine virtual VOID SetWorldSoundEnabled ( uint uiGroup, uint uiIndex, bool bEnabled ) = 0; virtual bool IsWorldSoundEnabled ( uint uiGroup, uint uiIndex ) = 0; virtual void ResetWorldSounds ( void ) = 0; - virtual void SetWorldSoundHandler ( WorldSoundHandler * pHandler ) = 0; + virtual void SetWorldSoundHandler ( WorldSoundHandler pHandler ) = 0; virtual void ReportBulletHit ( CEntity * pEntity, unsigned char ucSurfaceType, CVector * pvecPosition, float f_2 ) = 0; virtual void ReportWeaponEvent ( int iEvent, eWeaponType weaponType, CPhysical * pPhysical ) = 0; }; - -#endif \ No newline at end of file From 268bbc816240545d95845c8a6255bad75e1d9efb Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Thu, 11 May 2017 17:21:19 +0200 Subject: [PATCH 2/6] Restrict world sounds to Ped/Player --- Client/mods/deathmatch/logic/CClientGame.cpp | 29 +++++++++----------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 6b177abc65a..e1dd5941fa0 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -2817,6 +2817,7 @@ void CClientGame::AddBuiltInEvents ( void ) m_Events.AddEvent ( "onClientPedChoke", "", NULL, false ); m_Events.AddEvent ( "onClientPedHeliKilled", "heli", NULL, false ); m_Events.AddEvent ( "onClientPedHitByWaterCannon", "vehicle", NULL, false ); + m_Events.AddEvent ( "onClientPedSound", "group, index, x, y, z", NULL, false ); // Vehicle events m_Events.AddEvent ( "onClientVehicleRespawn", "", NULL, false ); @@ -2926,8 +2927,6 @@ void CClientGame::AddBuiltInEvents ( void ) m_Events.AddEvent ( "onClientFileDownloadComplete", "fileName, success", NULL, false ); m_Events.AddEvent ( "onClientWeaponFire", "ped, x, y, z", NULL, false ); - - m_Events.AddEvent ( "onClientWorldSound", "group, index, x, y, z", NULL, false ); } @@ -6404,20 +6403,18 @@ bool CClientGame::WorldSoundHandler ( uint uiGroup, uint uiIndex, CEntitySAInter if ( pEntityInterface ) { CClientEntity* pEntity = g_pClientGame->GetGameEntityXRefManager()->FindClientEntity( pEntityInterface ); - if ( !pEntity ) { - pEntity = m_pRootEntity; - } - - CLuaArguments Arguments; - Arguments.PushNumber( uiGroup ); - Arguments.PushNumber( uiIndex ); - Arguments.PushNumber( vecPosition.fX ); - Arguments.PushNumber( vecPosition.fY ); - Arguments.PushNumber( vecPosition.fZ ); - bool bCanceled = !pEntity->CallEvent( "onClientWorldSound", Arguments, pEntity != m_pRootEntity ); - - if ( bCanceled ) { - return false; + if ( pEntity && ( pEntity->GetType() == CCLIENTPED || pEntity->GetType() == CCLIENTPLAYER ) ) { + CLuaArguments Arguments; + Arguments.PushNumber( uiGroup ); + Arguments.PushNumber( uiIndex ); + Arguments.PushNumber( vecPosition.fX ); + Arguments.PushNumber( vecPosition.fY ); + Arguments.PushNumber( vecPosition.fZ ); + bool bCanceled = !pEntity->CallEvent( "onClientPedSound", Arguments, pEntity != m_pRootEntity ); + + if ( bCanceled ) { + return false; + } } } From 93c5b409bb110117fa2ffb7a99fb5c173aa1e787 Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Sat, 13 May 2017 14:28:08 +0200 Subject: [PATCH 3/6] Revert "Restrict world sounds to Ped/Player" This reverts commit b3ed2d69c7380ad90706ab1617aab3ae9c1d390a. --- Client/mods/deathmatch/logic/CClientGame.cpp | 29 +++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index e1dd5941fa0..6b177abc65a 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -2817,7 +2817,6 @@ void CClientGame::AddBuiltInEvents ( void ) m_Events.AddEvent ( "onClientPedChoke", "", NULL, false ); m_Events.AddEvent ( "onClientPedHeliKilled", "heli", NULL, false ); m_Events.AddEvent ( "onClientPedHitByWaterCannon", "vehicle", NULL, false ); - m_Events.AddEvent ( "onClientPedSound", "group, index, x, y, z", NULL, false ); // Vehicle events m_Events.AddEvent ( "onClientVehicleRespawn", "", NULL, false ); @@ -2927,6 +2926,8 @@ void CClientGame::AddBuiltInEvents ( void ) m_Events.AddEvent ( "onClientFileDownloadComplete", "fileName, success", NULL, false ); m_Events.AddEvent ( "onClientWeaponFire", "ped, x, y, z", NULL, false ); + + m_Events.AddEvent ( "onClientWorldSound", "group, index, x, y, z", NULL, false ); } @@ -6403,18 +6404,20 @@ bool CClientGame::WorldSoundHandler ( uint uiGroup, uint uiIndex, CEntitySAInter if ( pEntityInterface ) { CClientEntity* pEntity = g_pClientGame->GetGameEntityXRefManager()->FindClientEntity( pEntityInterface ); - if ( pEntity && ( pEntity->GetType() == CCLIENTPED || pEntity->GetType() == CCLIENTPLAYER ) ) { - CLuaArguments Arguments; - Arguments.PushNumber( uiGroup ); - Arguments.PushNumber( uiIndex ); - Arguments.PushNumber( vecPosition.fX ); - Arguments.PushNumber( vecPosition.fY ); - Arguments.PushNumber( vecPosition.fZ ); - bool bCanceled = !pEntity->CallEvent( "onClientPedSound", Arguments, pEntity != m_pRootEntity ); - - if ( bCanceled ) { - return false; - } + if ( !pEntity ) { + pEntity = m_pRootEntity; + } + + CLuaArguments Arguments; + Arguments.PushNumber( uiGroup ); + Arguments.PushNumber( uiIndex ); + Arguments.PushNumber( vecPosition.fX ); + Arguments.PushNumber( vecPosition.fY ); + Arguments.PushNumber( vecPosition.fZ ); + bool bCanceled = !pEntity->CallEvent( "onClientWorldSound", Arguments, pEntity != m_pRootEntity ); + + if ( bCanceled ) { + return false; } } From d2ca7553212ef0c573ffea37f9cb762d4a4f9705 Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Sat, 13 May 2017 14:40:26 +0200 Subject: [PATCH 4/6] Restrict onClientWorldSound to ped and player --- Client/mods/deathmatch/logic/CClientGame.cpp | 26 +++++++++----------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 6b177abc65a..04e6026f181 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -6404,20 +6404,18 @@ bool CClientGame::WorldSoundHandler ( uint uiGroup, uint uiIndex, CEntitySAInter if ( pEntityInterface ) { CClientEntity* pEntity = g_pClientGame->GetGameEntityXRefManager()->FindClientEntity( pEntityInterface ); - if ( !pEntity ) { - pEntity = m_pRootEntity; - } - - CLuaArguments Arguments; - Arguments.PushNumber( uiGroup ); - Arguments.PushNumber( uiIndex ); - Arguments.PushNumber( vecPosition.fX ); - Arguments.PushNumber( vecPosition.fY ); - Arguments.PushNumber( vecPosition.fZ ); - bool bCanceled = !pEntity->CallEvent( "onClientWorldSound", Arguments, pEntity != m_pRootEntity ); - - if ( bCanceled ) { - return false; + if ( pEntity && ( pEntity->GetType() == CCLIENTPED || pEntity->GetType() == CCLIENTPLAYER ) ) { + CLuaArguments Arguments; + Arguments.PushNumber( uiGroup ); + Arguments.PushNumber( uiIndex ); + Arguments.PushNumber( vecPosition.fX ); + Arguments.PushNumber( vecPosition.fY ); + Arguments.PushNumber( vecPosition.fZ ); + bool bCanceled = !pEntity->CallEvent( "onClientWorldSound", Arguments, pEntity != m_pRootEntity ); + + if ( bCanceled ) { + return false; + } } } From d1646049eb8668e39d73447220ffa8d3e37253ad Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Wed, 28 Feb 2018 03:55:39 +0100 Subject: [PATCH 5/6] Update CAESoundManagerSAInterface --- Client/game_sa/CAESoundManagerSA.h | 18 +++++++++++++++++- Client/game_sa/CAudioEngineSA.h | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Client/game_sa/CAESoundManagerSA.h b/Client/game_sa/CAESoundManagerSA.h index 270941d2247..440dda8cf90 100644 --- a/Client/game_sa/CAESoundManagerSA.h +++ b/Client/game_sa/CAESoundManagerSA.h @@ -14,10 +14,26 @@ #define CLASS_CAESoundManager 0xB62CB0 +#pragma pack(push, 1) class CAESoundManagerSAInterface { - + int16_t m_wNumAvailableChannels; // + 0x0000 // = CAEAudioHardware::GetNumAvailableChannels(...), [10, 300] + int16_t m_wChannel; // + 0x0002 // = CAEAudioHardware::AllocateChannels(...), could be -1 + CAESound m_aSound [300]; // + 0x0004 + int16_t * m_aChannelSoundTable; // + 0x87F4 // = new short[m_wNumAvailableChannels] + int16_t * m_aChannelSoundPosition; // + 0x87F8 // = new short[m_wNumAvailableChannels] + int16_t * m_aChannelSoundUncancellable; // + 0x87FC // = new short[m_wNumAvailableChannels] + int16_t m_wSoundLength [300]; // + 0x8800 // = -1 (0xFFFF) when initialized + int16_t m_wSoundLoopStartTime [300]; // + 0x8A58 // = -1 (0xFFFF) when initialized + uint32_t m_uiUpdateTime; // + 0x8CB0 + int8_t m_bPauseTimeInUse; // + 0x8CB4 + int8_t m_bPaused; // + 0x8CB5 + int8_t field_8CB6; + int8_t field_8CB7; + uint32_t m_uiPauseUpdateTime; // + 0x8CB8 }; +#pragma pack(pop) +static_assert(sizeof(CAESoundManagerSAInterface) == 0x8CBC, "Invalid size for CAESoundManagerSAInterface"); class CAESoundManagerSA : public CAESoundManager { diff --git a/Client/game_sa/CAudioEngineSA.h b/Client/game_sa/CAudioEngineSA.h index 7f890e8e917..d583d29124a 100644 --- a/Client/game_sa/CAudioEngineSA.h +++ b/Client/game_sa/CAudioEngineSA.h @@ -113,7 +113,7 @@ class CAESound short m_wPlayingState; // +104 char unk6[2]; // +106 float m_fSoundHeadRoom; // +108 - short unk7; // +112 + short m_wSoundLength; // +112 short unk8; // +114 }; From 92f0a99272d9fb1014165c2a41e078879b1a9c5a Mon Sep 17 00:00:00 2001 From: Marek Kulik Date: Thu, 1 Mar 2018 03:06:23 +0100 Subject: [PATCH 6/6] Add CAudioZones --- Client/game_sa/Audio/CAudioZonesSA.cpp | 49 ++++++++++++++++++++++++++ Client/game_sa/Audio/CAudioZonesSA.h | 47 ++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 Client/game_sa/Audio/CAudioZonesSA.cpp create mode 100644 Client/game_sa/Audio/CAudioZonesSA.h diff --git a/Client/game_sa/Audio/CAudioZonesSA.cpp b/Client/game_sa/Audio/CAudioZonesSA.cpp new file mode 100644 index 00000000000..c3253fd15a3 --- /dev/null +++ b/Client/game_sa/Audio/CAudioZonesSA.cpp @@ -0,0 +1,49 @@ +/***************************************************************************** +* +* PROJECT: Multi Theft Auto +* LICENSE: See LICENSE in the top level directory +* FILE: game_sa/Audio/CAudioZonesSA.cpp +* PURPOSE: Source file for audio zones class +* +* Multi Theft Auto is available from https://www.multitheftauto.com/ +* +*****************************************************************************/ +#include "StdInc.h" +#include "CAudioZonesSA.h" + +// 0xB6DC6C CAudioZones::m_aActiveBoxes +// 0xB6DC94 CAudioZones::m_aActiveSpheres +// 0xB6DCBC CAudioZones::m_NumActiveBoxes +// 0xB6DCC0 CAudioZones::m_NumActiveSpheres +// 0xB6DCC4 CAudioZones::m_NumBoxes +// 0xB6DCC8 CAudioZones::m_NumSpheres +// 0xB6EBB0 CAudioZones::m_aSpheres + +#define VAR_CAudioZonesSA__m_aBoxes 0xB6DCD0 + +CAudioZoneBoxSAInterface ( * CAudioZonesSA::m_aBoxes ) [100] = reinterpret_cast < decltype ( CAudioZonesSA::m_aBoxes ) > ( VAR_CAudioZonesSA__m_aBoxes ); + +void CAudioZonesSA::Init ( void ) +{ + // 0x5081A0 void __cdecl CAudioZones::Init(void) +} + +void CAudioZonesSA::RegisterAudioBox ( const char * szZoneName, int16_t wBank, bool bEnabled, float minX, float minY, float minZ, float maxX, float maxY, float maxZ ) +{ + // 0x508240 void __cdecl CAudioZones::RegisterAudioBox(const char *, int16_t, bool, float, float, float, float, float, float) +} + +void CAudioZonesSA::RegisterAudioSphere ( const char * szZoneName, int16_t wBank, bool bEnabled, float centerX, float centerY, float centerZ ) +{ + // 0x5081C0 void __cdecl CAudioZones::RegisterAudioSphere(const char *, in16_t, bool, float, float, float, float) +} + +void CAudioZonesSA::SwitchAudioZone ( const char * szZoneName, bool bEnabled ) +{ + // 0x508320 void __cdecl CAudioZones::SwitchAudioZone(const char *, bool) +} + +void CAudioZonesSA::Update ( bool bForced ) +{ + // 0x5083C0 CAudioZones::Update(bool) +} diff --git a/Client/game_sa/Audio/CAudioZonesSA.h b/Client/game_sa/Audio/CAudioZonesSA.h new file mode 100644 index 00000000000..8bb6abe3e11 --- /dev/null +++ b/Client/game_sa/Audio/CAudioZonesSA.h @@ -0,0 +1,47 @@ +/***************************************************************************** +* +* PROJECT: Multi Theft Auto +* LICENSE: See LICENSE in the top level directory +* FILE: game_sa/Audio/CAudioZonesSA.h +* PURPOSE: Header file for audio zones class +* +* Multi Theft Auto is available from https://www.multitheftauto.com/ +* +*****************************************************************************/ +#pragma once + +#include + +struct CAudioZoneBoxSAInterface +{ + char szName[8]; // + 0x00 + int16_t wBank; // + 0x08 + bool bEnabled; // + 0x0A + int8_t field_B; + uint16_t wMinX; // + 0x0C + uint16_t wMinY; // + 0x0E + uint16_t wMinZ; // + 0x10 + uint16_t wMaxX; // + 0x12 + uint16_t wMaxY; // + 0x14 + uint16_t wMaxZ; // + 0x16 +}; +static_assert(sizeof(CAudioZoneBoxSAInterface) == 0x18, "Invalid size of CAudioZoneBoxSAInterface"); + +struct CAudioZoneSphereSAInterface +{ + +}; +// static_assert(sizeof(CAudioZoneSphereSAInterface) == 0x18, "Invalid size of CAudioZoneSphereSAInterface"); + +class CAudioZonesSA +{ +public: + static void Init ( void ); + static void RegisterAudioBox ( const char * szZoneName, int16_t wBank, bool bEnabled, float minX, float minY, float minZ, float maxX, float maxY, float maxZ ); + static void RegisterAudioSphere ( const char * szZoneName, int16_t wBank, bool bEnabled, float centerX, float centerY, float centerZ ); + static void SwitchAudioZone ( const char * szZoneName, bool bEnabled ); + static void Update ( bool bForced ); + +public: + static CAudioZoneBoxSAInterface ( *m_aBoxes ) [100]; +};