Files
GTASource/game/weapons/WeaponDebug.cpp

291 lines
7.5 KiB
C++
Raw Permalink Normal View History

2025-02-23 17:40:52 +08:00
// File header
#include "Weapons/WeaponDebug.h"
// Rage includes
#include "Bank/BkMgr.h"
// Game headers
#include "Debug/DebugScene.h"
#include "Peds/Ped.h"
#include "Peds/PedIntelligence.h"
#include "Peds/Ped.h"
#include "Scene/World/GameWorld.h"
#include "Shaders/CustomShaderEffectWeapon.h"
#include "Task/Weapons/Gun/TaskGun.h"
#include "Weapons/Bullet.h"
#include "Weapons/Components/WeaponComponentManager.h"
#include "Weapons/Info/WeaponAnimationsManager.h"
#include "Weapons/Inventory/PedInventoryLoadOut.h"
#include "Weapons/Projectiles/ProjectileManager.h"
#include "Weapons/ThrownWeaponInfo.h"
#include "Weapons/Weapon.h"
#if __BANK // Only included in __BANK builds
PARAM(rag_weapon,"rag_weapon");
PARAM(debugrenderweapon,"debug render weapon");
PARAM(debugrenderbullets,"debug render bullets");
// Macro to disable optimisations if set
WEAPON_OPTIMISATIONS()
//////////////////////////////////////////////////////////////////////////
// CWeaponDebug
//////////////////////////////////////////////////////////////////////////
// Statics
#if DEBUG_DRAW
CDebugDrawStore CWeaponDebug::ms_debugStore(100);
#endif // DEBUG_DRAW
bkBank* CWeaponDebug::ms_pBank = NULL;
bool CWeaponDebug::ms_bRenderDebug = false;
bool CWeaponDebug::ms_bRenderDebugBullets = false;
bool CWeaponDebug::ms_bUseInfiniteAmmo = false;
bool CWeaponDebug::ms_bUseRagdollForStungunAndRubbergun = true;
char CWeaponDebug::ms_focusPedAddress[MAX_STRING_LENGTH] = { "None" };
char CWeaponDebug::ms_focusPedPoolIndex[MAX_STRING_LENGTH] = { "None" };
char CWeaponDebug::ms_focusPedModelName[MAX_STRING_LENGTH] = { "None" };
char CWeaponDebug::ms_hashString[MAX_STRING_LENGTH] = "";
char CWeaponDebug::ms_hashStringResultUnsigned[MAX_STRING_LENGTH] = "";
char CWeaponDebug::ms_hashStringResultSigned[MAX_STRING_LENGTH] = "";
void CWeaponDebug::InitBank()
{
if(ms_pBank)
{
ShutdownBank();
}
if (PARAM_debugrenderweapon.Get())
{
ms_bRenderDebug = true;
}
if (PARAM_debugrenderbullets.Get())
{
ms_bRenderDebugBullets = true;
}
// Create the weapons bank
ms_pBank = &BANKMGR.CreateBank("Weapons", 0, 0, false);
if(weaponVerifyf(ms_pBank, "Failed to create Weapons bank"))
{
if (PARAM_rag_weapon.Get())
{
CWeaponDebug::AddWidgets(*ms_pBank);
}
else
{
ms_pBank->AddButton("Create weapon widgets", datCallback(CFA1(CWeaponDebug::AddWidgets), ms_pBank));
}
}
}
void CWeaponDebug::AddWidgets(bkBank& bank)
{
// destroy first widget which is the create button
bkWidget* pWidget = BANKMGR.FindWidget("Weapons/Create weapon widgets");
if(pWidget)
{
pWidget->Destroy();
}
// General widgets
InitWidgets(bank);
// Inventory widgets
CPedInventory::AddWidgets(bank);
// Weapon info widgets
CWeaponInfoManager::AddWidgetButton(bank);
// Weapon component widgets
CWeaponComponentManager::AddWidgetButton(bank);
// Load outs
CPedInventoryLoadOutManager::AddWidgets(bank);
// Firing pattern widgets
CFiringPatternInfoManager::AddWidgets(bank);
// Thrown weapon widgets
CThrownWeaponInfo::InitWidgets();
// Accuracy modifier widgets
sPedAccuracyModifiers::InitWidgets();
// Weapon animations
CWeaponAnimationsManager::AddWidgetButton(bank);
#if CSE_WEAPON_EDITABLEVALUES
CCustomShaderEffectWeapon::InitWidgets(bank);
#endif
#if __BANK
CWeapon::AddWidgets(bank);
#endif //__BANK
}
void CWeaponDebug::ShutdownBank()
{
if(ms_pBank)
{
BANKMGR.DestroyBank(*ms_pBank);
}
ms_pBank = NULL;
}
void CWeaponDebug::RenderDebug()
{
#if DEBUG_DRAW
ms_debugStore.Render();
#endif // DEBUG_DRAW
// Update the focus ped display
UpdateFocusPedText();
if(ms_bRenderDebug)
{
// Highlight the focus ped
HighlightFocusPed();
// Projectile rendering
CProjectileManager::RenderDebug();
#if __BANK
CPed* pFocusPed = GetFocusPed();
if(pFocusPed)
{
const CWeapon* pWeapon = pFocusPed->GetWeaponManager() ? pFocusPed->GetWeaponManager()->GetEquippedWeapon() : NULL;
if(pWeapon)
{
pWeapon->RenderDebug(pFocusPed);
}
}
#endif // __BANK
}
// Inventory rendering
CPedInventory::RenderDebug();
if(ms_bRenderDebugBullets)
{
CBulletManager::RenderDebug();
}
}
CPed* CWeaponDebug::GetFocusPed()
{
CEntity* pFocusEntity = CDebugScene::FocusEntities_Get(0);
if(pFocusEntity && pFocusEntity->GetIsTypePed())
{
return static_cast<CPed*>(pFocusEntity);
}
else
{
return CGameWorld::FindLocalPlayer();
}
}
void CWeaponDebug::InitWidgets(bkBank& bank)
{
// Focus ped display
bank.AddText("Focus Ped Address", ms_focusPedAddress, MAX_STRING_LENGTH, true);
bank.AddText("Focus Ped Index", ms_focusPedPoolIndex, MAX_STRING_LENGTH, true);
bank.AddText("Focus Ped Model", ms_focusPedModelName, MAX_STRING_LENGTH, true);
// Debug rendering
bank.AddSeparator();
bank.AddToggle("Render", &ms_bRenderDebug);
bank.AddToggle("Render Bullets", &ms_bRenderDebugBullets);
bank.AddToggle("Use Infinite Ammo", &ms_bUseInfiniteAmmo, UpdateInfiniteAmmo);
bank.AddToggle("Use Ragdoll for Stungun and Rubbergun", &ms_bUseRagdollForStungunAndRubbergun);
bank.AddToggle("Batch weapon probes", &CBulletManager::ms_bUseBatchTestsForSingleShotWeapons);
bank.AddToggle("Use undirected batch tests", &CBulletManager::ms_bUseUndirectedBatchTests);
bank.AddSeparator();
// Helpers
bank.PushGroup("Helpers", false);
bank.PushGroup("Hasher");
bank.AddText("String", ms_hashString, MAX_STRING_LENGTH, false, UpdateHasherStrings);
bank.AddText("Unsigned Hash", ms_hashStringResultUnsigned, MAX_STRING_LENGTH, true);
bank.AddText("Signed Hash", ms_hashStringResultSigned, MAX_STRING_LENGTH, true);
bank.PopGroup();
bank.AddButton("Print Pool Usage", PrintPoolUsage);
bank.AddButton("Remove All Projectiles",ClearAllProjectiles);
bank.PopGroup();
}
void CWeaponDebug::UpdateInfiniteAmmo()
{
CPed* pFocusPed = GetFocusPed();
if(pFocusPed)
{
if(pFocusPed->GetInventory())
{
pFocusPed->GetInventory()->GetAmmoRepository().SetUsingInfiniteClips(ms_bUseInfiniteAmmo);
}
}
}
void CWeaponDebug::UpdateFocusPedText()
{
const CPed* pFocusPed = GetFocusPed();
if(pFocusPed)
{
formatf(ms_focusPedAddress, MAX_STRING_LENGTH, "0x%X", pFocusPed);
formatf(ms_focusPedPoolIndex, MAX_STRING_LENGTH, "%d", CPed::GetPool()->GetIndex(pFocusPed));
const CBaseModelInfo* pModelInfo = pFocusPed->GetBaseModelInfo();
if(pModelInfo)
{
formatf(ms_focusPedModelName, MAX_STRING_LENGTH, "%s", pModelInfo->GetModelName());
}
else
{
formatf(ms_focusPedModelName, MAX_STRING_LENGTH, "%s", "None");
}
}
else
{
formatf(ms_focusPedAddress, MAX_STRING_LENGTH, "%s", "None");
formatf(ms_focusPedPoolIndex, MAX_STRING_LENGTH, "%s", "None");
formatf(ms_focusPedModelName, MAX_STRING_LENGTH, "%s", "None");
}
}
void CWeaponDebug::HighlightFocusPed()
{
const CPed* pFocusPed = GetFocusPed();
if(pFocusPed)
{
// Transform the bounds into world space
Vector3 vMin(pFocusPed->GetBoundingBoxMin());
Vector3 vMax(pFocusPed->GetBoundingBoxMax());
vMin = pFocusPed->TransformIntoWorldSpace(vMin);
vMax = pFocusPed->TransformIntoWorldSpace(vMax);
}
}
void CWeaponDebug::UpdateHasherStrings()
{
u32 uResult = atStringHash(ms_hashString);
s32 iResult = static_cast<s32>(uResult);
formatf(ms_hashStringResultUnsigned, MAX_STRING_LENGTH, "%u", uResult);
formatf(ms_hashStringResultSigned, MAX_STRING_LENGTH, "%d", iResult);
}
void CWeaponDebug::PrintPoolUsage()
{
CWeapon::GetPool()->PoolFullCallback();
}
void CWeaponDebug::ClearAllProjectiles()
{
CProjectileManager::RemoveAllProjectiles();
}
#endif // __BANK