2019-05-31 09:44:43 +00:00
|
|
|
#include "common.h"
|
2020-04-17 13:31:11 +00:00
|
|
|
|
2019-10-29 23:12:58 +00:00
|
|
|
#include "General.h"
|
2019-05-31 09:44:43 +00:00
|
|
|
#include "CutsceneMgr.h"
|
2019-09-28 14:03:00 +00:00
|
|
|
#include "Directory.h"
|
|
|
|
#include "Camera.h"
|
|
|
|
#include "Streaming.h"
|
|
|
|
#include "FileMgr.h"
|
|
|
|
#include "main.h"
|
|
|
|
#include "AnimManager.h"
|
2020-03-28 14:47:52 +00:00
|
|
|
#include "AnimBlendAssociation.h"
|
2019-09-28 14:03:00 +00:00
|
|
|
#include "AnimBlendAssocGroup.h"
|
|
|
|
#include "AnimBlendClumpData.h"
|
|
|
|
#include "Pad.h"
|
|
|
|
#include "DMAudio.h"
|
|
|
|
#include "World.h"
|
|
|
|
#include "PlayerPed.h"
|
2020-03-28 14:47:52 +00:00
|
|
|
#include "Wanted.h"
|
2019-09-28 14:03:00 +00:00
|
|
|
#include "RpAnimBlend.h"
|
|
|
|
#include "ModelIndices.h"
|
|
|
|
#include "TempColModels.h"
|
2020-08-24 18:52:16 +00:00
|
|
|
#include "ColStore.h"
|
|
|
|
#include "Radar.h"
|
|
|
|
#include "Pools.h"
|
2021-01-11 23:53:48 +00:00
|
|
|
#include "crossplatform.h"
|
2020-08-24 18:52:16 +00:00
|
|
|
|
|
|
|
//--MIAMI: file done
|
2019-09-28 14:03:00 +00:00
|
|
|
|
2021-01-11 17:53:15 +00:00
|
|
|
static bool bModelsRemovedForCutscene;
|
|
|
|
static int32 NumberOfSavedWeapons;
|
|
|
|
static eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS];
|
|
|
|
static int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS];
|
|
|
|
|
|
|
|
char CCutsceneMgr::ms_cAppendAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
|
|
|
char CCutsceneMgr::ms_cAppendObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH];
|
|
|
|
int CCutsceneMgr::ms_numAppendObjectNames;
|
2020-04-16 19:19:56 +00:00
|
|
|
CDirectory *CCutsceneMgr::ms_pCutsceneDir;
|
|
|
|
bool CCutsceneMgr::ms_loaded;
|
2021-01-11 17:53:15 +00:00
|
|
|
bool CCutsceneMgr::ms_hasFileInfo;
|
2020-06-15 22:38:26 +00:00
|
|
|
bool CCutsceneMgr::ms_wasCutsceneSkipped;
|
2021-01-11 17:53:15 +00:00
|
|
|
bool CCutsceneMgr::ms_useLodMultiplier;
|
|
|
|
bool CCutsceneMgr::ms_cutsceneProcessing;
|
|
|
|
bool CCutsceneMgr::ms_running;
|
|
|
|
bool CCutsceneMgr::ms_animLoaded;
|
2020-04-16 19:19:56 +00:00
|
|
|
uint32 CCutsceneMgr::ms_cutsceneLoadStatus;
|
2019-09-28 14:03:00 +00:00
|
|
|
|
|
|
|
void
|
2021-01-11 17:53:15 +00:00
|
|
|
CCutsceneMgr::Initialise(void *dir)
|
2020-03-27 19:53:47 +00:00
|
|
|
{
|
2021-01-11 17:53:15 +00:00
|
|
|
ms_cutsceneLoadStatus = CUTSCENE_NOT_LOADED;
|
2020-03-27 19:53:47 +00:00
|
|
|
ms_running = false;
|
|
|
|
ms_animLoaded = false;
|
|
|
|
ms_cutsceneProcessing = false;
|
2021-01-11 17:53:15 +00:00
|
|
|
ms_useLodMultiplier = false;
|
2020-06-15 22:38:26 +00:00
|
|
|
ms_wasCutsceneSkipped = false;
|
2021-01-11 17:53:15 +00:00
|
|
|
ms_hasFileInfo = false;
|
|
|
|
//ms_numCutsceneObjs = 0;
|
|
|
|
//ms_loaded = false;
|
|
|
|
if (gMakeResources) {
|
|
|
|
ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE);
|
|
|
|
ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR");
|
2020-03-27 19:53:47 +00:00
|
|
|
}
|
2021-01-11 17:53:15 +00:00
|
|
|
else
|
|
|
|
ms_pCutsceneDir = (CDirectory*)dir;
|
2020-03-27 19:53:47 +00:00
|
|
|
|
2021-01-11 17:53:15 +00:00
|
|
|
//numUncompressedAnims = 0;
|
|
|
|
//uncompressedAnims[0][0] = '\0';
|
2019-09-28 14:03:00 +00:00
|
|
|
}
|
|
|
|
|
2021-01-11 17:53:15 +00:00
|
|
|
void CCutsceneMgr::Write(base::cRelocatableChunkWriter& writer)
|
2019-09-28 14:03:00 +00:00
|
|
|
{
|
2021-01-11 17:53:15 +00:00
|
|
|
writer.AllocateRaw(ms_pCutsceneDir, sizeof(*ms_pCutsceneDir), 4, false, true);
|
|
|
|
writer.AllocateRaw(ms_pCutsceneDir->entries, sizeof(CDirectory::DirectoryInfo) * ms_pCutsceneDir->numEntries, 4, false, true);
|
|
|
|
writer.AddPatch(ms_pCutsceneDir);
|
2019-09-28 14:03:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2021-01-11 17:53:15 +00:00
|
|
|
CCutsceneMgr::Shutdown(void)
|
2019-09-28 14:03:00 +00:00
|
|
|
{
|
2021-01-11 17:53:15 +00:00
|
|
|
delete ms_pCutsceneDir;
|
2019-09-28 14:03:00 +00:00
|
|
|
}
|
|
|
|
|
2020-06-15 22:38:26 +00:00
|
|
|
void
|
2021-01-11 17:53:15 +00:00
|
|
|
CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName)
|
2019-09-28 14:03:00 +00:00
|
|
|
{
|
2021-01-11 17:53:15 +00:00
|
|
|
LoadCutsceneData_overlay(szCutsceneName);
|
2019-09-28 14:03:00 +00:00
|
|
|
}
|
|
|
|
|
2020-03-27 19:53:47 +00:00
|
|
|
void
|
|
|
|
CCutsceneMgr::DeleteCutsceneData(void)
|
|
|
|
{
|
2021-01-11 17:53:15 +00:00
|
|
|
DeleteCutsceneData_overlay();
|
|
|
|
if (bModelsRemovedForCutscene)
|
|
|
|
LoadEverythingBecauseCutsceneDeletedAllOfIt();
|
2020-08-24 18:52:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2021-01-11 17:53:15 +00:00
|
|
|
CCutsceneMgr::RemoveEverythingBecauseCutsceneDoesntFitInMemory()
|
2020-08-24 18:52:16 +00:00
|
|
|
{
|
2021-01-11 17:53:15 +00:00
|
|
|
//CStreaming::ms_disableStreaming = true;
|
|
|
|
CWorld::ClearExcitingStuffFromArea(FindPlayerCoors(), 120.0f, true);
|
2020-08-24 18:52:16 +00:00
|
|
|
CColStore::RemoveAllCollision();
|
|
|
|
CWorld::bProcessCutsceneOnly = true;
|
2021-01-11 17:53:15 +00:00
|
|
|
/*ms_cutsceneProcessing = true;
|
2020-08-24 18:52:16 +00:00
|
|
|
|
|
|
|
for (int i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) {
|
|
|
|
CPed *pPed = CPools::GetPedPool()->GetSlot(i);
|
|
|
|
if (pPed) {
|
|
|
|
if (!pPed->IsPlayer() && pPed->CanBeDeleted()) {
|
|
|
|
CWorld::Remove(pPed);
|
|
|
|
delete pPed;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = CPools::GetVehiclePool()->GetSize() - 1; i >= 0; i--) {
|
|
|
|
CVehicle *pVehicle = CPools::GetVehiclePool()->GetSlot(i);
|
|
|
|
if (pVehicle) {
|
|
|
|
if (pVehicle->CanBeDeleted()) {
|
|
|
|
CWorld::Remove(pVehicle);
|
|
|
|
delete pVehicle;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-01-11 17:53:15 +00:00
|
|
|
CWorld::bProcessCutsceneOnly = true;
|
|
|
|
//bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true;*/
|
2020-08-24 18:52:16 +00:00
|
|
|
CStreaming::RemoveCurrentZonesModels();
|
2021-01-11 17:53:15 +00:00
|
|
|
while (CStreaming::RemoveLoadedVehicle());
|
|
|
|
CRadar::RemoveRadarSections();
|
2020-08-24 18:52:16 +00:00
|
|
|
CStreaming::SetModelIsDeletable(MI_MALE01);
|
|
|
|
CStreaming::SetModelTxdIsDeletable(MI_MALE01);
|
2021-01-11 17:53:15 +00:00
|
|
|
CStreaming::SetModelIsDeletable(MI_COLT45);
|
|
|
|
CStreaming::SetModelTxdIsDeletable(MI_COLT45);
|
2020-08-24 18:52:16 +00:00
|
|
|
CStreaming::SetModelIsDeletable(MI_NIGHTSTICK);
|
|
|
|
CStreaming::SetModelTxdIsDeletable(MI_NIGHTSTICK);
|
|
|
|
CStreaming::SetModelIsDeletable(MI_MISSILE);
|
|
|
|
CStreaming::SetModelTxdIsDeletable(MI_MISSILE);
|
|
|
|
|
2021-01-11 17:53:15 +00:00
|
|
|
/*for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) {
|
2020-08-24 18:52:16 +00:00
|
|
|
CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i);
|
|
|
|
if (pDummy)
|
|
|
|
pDummy->DeleteRwObject();
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = CPools::GetObjectPool()->GetSize() - 1; i >= 0; i--) {
|
|
|
|
CObject* pObject = CPools::GetObjectPool()->GetSlot(i);
|
|
|
|
if (pObject)
|
|
|
|
pObject->DeleteRwObject();
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = CPools::GetBuildingPool()->GetSize() - 1; i >= 0; i--) {
|
|
|
|
CBuilding* pBuilding = CPools::GetBuildingPool()->GetSlot(i);
|
2020-09-09 19:36:53 +00:00
|
|
|
if (pBuilding && pBuilding->m_rwObject != nil && pBuilding->bIsBIGBuilding && pBuilding->bStreamBIGBuilding) {
|
2020-08-24 18:52:16 +00:00
|
|
|
if (pBuilding->bIsBIGBuilding)
|
|
|
|
CStreaming::RequestModel(pBuilding->GetModelIndex(), 0);
|
|
|
|
if (!pBuilding->bImBeingRendered)
|
|
|
|
pBuilding->DeleteRwObject();
|
|
|
|
}
|
2021-01-11 17:53:15 +00:00
|
|
|
}*/
|
2020-08-24 18:52:16 +00:00
|
|
|
|
|
|
|
CPlayerPed *pPlayerPed = FindPlayerPed();
|
|
|
|
pPlayerPed->RemoveWeaponAnims(0, -1000.0f);
|
|
|
|
NumberOfSavedWeapons = 0;
|
|
|
|
|
|
|
|
for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) {
|
|
|
|
if (pPlayerPed->m_weapons[i].m_eWeaponType != WEAPONTYPE_UNARMED) {
|
|
|
|
SavedWeaponIDs[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_eWeaponType;
|
|
|
|
SavedWeaponAmmo[NumberOfSavedWeapons] = pPlayerPed->m_weapons[i].m_nAmmoTotal;
|
|
|
|
NumberOfSavedWeapons++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pPlayerPed->ClearWeapons();
|
2021-01-11 17:53:15 +00:00
|
|
|
bModelsRemovedForCutscene = true;
|
|
|
|
//CGame::DrasticTidyUpMemory(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneMgr::LoadEverythingBecauseCutsceneDeletedAllOfIt()
|
|
|
|
{
|
|
|
|
bModelsRemovedForCutscene = false;
|
|
|
|
CStreaming::LoadInitialPeds();
|
|
|
|
CStreaming::LoadInitialWeapons();
|
|
|
|
//CStreaming::LoadInitialVehicles();
|
|
|
|
|
|
|
|
CPlayerPed *pPlayerPed = FindPlayerPed();
|
|
|
|
for (int i = 0; i < NumberOfSavedWeapons; i++) {
|
|
|
|
int32 weaponModelId = CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModelId;
|
|
|
|
uint8 flags = CStreaming::ms_aInfoForModel[weaponModelId].m_flags;
|
|
|
|
CStreaming::RequestModel(weaponModelId, STREAMFLAGS_DONT_REMOVE);
|
|
|
|
CStreaming::LoadAllRequestedModels(false);
|
|
|
|
if (CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id != -1) {
|
|
|
|
CStreaming::RequestModel(CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id, 0);
|
|
|
|
CStreaming::LoadAllRequestedModels(false);
|
|
|
|
}
|
|
|
|
if (!(flags & STREAMFLAGS_DONT_REMOVE))
|
|
|
|
CStreaming::SetModelIsDeletable(weaponModelId);
|
|
|
|
pPlayerPed->GiveWeapon(SavedWeaponIDs[i], SavedWeaponAmmo[i], true);
|
|
|
|
}
|
|
|
|
NumberOfSavedWeapons = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneMgr::Update(void)
|
|
|
|
{
|
|
|
|
if (ms_cutsceneLoadStatus != CUTSCENE_NOT_LOADED)
|
|
|
|
Update_overlay();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneMgr::LoadAnimationUncompressed(char const* name)
|
|
|
|
{
|
|
|
|
strcpy(ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims], name);
|
|
|
|
|
|
|
|
// Because that's how CAnimManager knows the end of array
|
|
|
|
++ms_numUncompressedCutsceneAnims;
|
|
|
|
assert(ms_numUncompressedCutsceneAnims < ARRAY_SIZE(ms_aUncompressedCutsceneAnims));
|
|
|
|
ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims][0] = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
CCutsceneMgr::IsCutsceneSkipButtonBeingPressed()
|
|
|
|
{
|
|
|
|
return (CPad::GetPad(0)->GetCrossJustDown()
|
|
|
|
|| CPad::GetPad(0)->GetLeftMouseJustDown()
|
|
|
|
|| CPad::GetPad(0)->GetEnterJustDown()
|
|
|
|
|| CPad::GetPad(0)->GetCharJustDown(' '));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneMgr::AppendToNextCutscene(const char *object, const char *anim)
|
|
|
|
{
|
|
|
|
strcpy(ms_cAppendObjectName[ms_numAppendObjectNames], object);
|
|
|
|
strlwr(ms_cAppendObjectName[ms_numAppendObjectNames]);
|
|
|
|
strcpy(ms_cAppendAnimName[ms_numAppendObjectNames], anim);
|
|
|
|
strlwr(ms_cAppendAnimName[ms_numAppendObjectNames]);
|
|
|
|
ms_numAppendObjectNames++;
|
2020-07-30 12:11:06 +00:00
|
|
|
}
|