Script stuff + bug fixes

This commit is contained in:
Nikolay Korolev
2019-07-04 01:16:24 +03:00
parent 92af18c165
commit 7fae683316
16 changed files with 288 additions and 15 deletions

View File

@ -6,6 +6,7 @@ int &CCarCtrl::NumLawEnforcerCars = *(int*)0x8F1B38;
int &CCarCtrl::NumAmbulancesOnDuty = *(int*)0x885BB0;
int &CCarCtrl::NumFiretrucksOnDuty = *(int*)0x9411F0;
bool &CCarCtrl::bCarsGeneratedAroundCamera = *(bool*)0x95CD8A;
float& CCarCtrl::CarDensityMultiplier = *(float*)0x5EC8B4;
WRAPPER void CCarCtrl::SwitchVehicleToRealPhysics(CVehicle*) { EAXJMP(0x41F7F0); }
WRAPPER void CCarCtrl::AddToCarArray(int32 id, int32 vehclass) { EAXJMP(0x4182F0); }

View File

@ -14,4 +14,5 @@ public:
static int32 &NumAmbulancesOnDuty;
static int32 &NumFiretrucksOnDuty;
static bool &bCarsGeneratedAroundCamera;
static float &CarDensityMultiplier;
};

View File

@ -5,6 +5,8 @@
PedGroup *CPopulation::ms_pPedGroups = (PedGroup*)0x6E9248;
bool &CPopulation::ms_bGivePedsWeapons = *(bool*)0x95CCF6;
int32 &CPopulation::m_AllRandomPedsThisType = *(int32*)0x5FA570;
float &CPopulation::PedDensityMultiplier = *(float*)0x5FA56C;
WRAPPER void CPopulation::UpdatePedCount(uint32, bool) { EAXJMP(0x4F5A60); }
WRAPPER void CPopulation::DealWithZoneChange(eLevelName oldLevel, eLevelName newLevel, bool) { EAXJMP(0x4F6200); }

View File

@ -12,6 +12,8 @@ class CPopulation
public:
static PedGroup *ms_pPedGroups; //[31]
static bool &ms_bGivePedsWeapons;
static int32 &m_AllRandomPedsThisType;
static float &PedDensityMultiplier;
static void UpdatePedCount(uint32, bool);
static void DealWithZoneChange(eLevelName oldLevel, eLevelName newLevel, bool);

View File

@ -1572,7 +1572,7 @@ void CReplay::Display()
if (Mode == MODE_RECORD)
return;
counter = (counter + 1) % 65536;
if (counter & 0x20 == 0)
if ((counter & 0x20) == 0)
return;
CFont::SetPropOn();
CFont::SetBackgroundOff();

View File

@ -3,12 +3,161 @@
#include "Script.h"
uint8 *CTheScripts::ScriptSpace = (uint8*)0x74B248;
CTextLine* CTheScripts::IntroTextLines = (CTextLine*)0x70EA74;
CScriptRectangle* CTheScripts::IntroRectangles = (CScriptRectangle*)0x72D109;
CSprite2d* CTheScripts::ScriptSprites = (CSprite2d*)0x72B090;
bool CTheScripts::DbgFlag = *(bool*)0x95CD87;
uint32 CTheScripts::OnAMissionFlag = *(uint32*)0x8F1B64;
#include "Camera.h"
#include "CarCtrl.h"
#include "DMAudio.h"
#include "Hud.h"
#include "ModelIndices.h"
#include "PlayerInfo.h"
#include "PlayerPed.h"
#include "Pools.h"
#include "Population.h"
#include "Streaming.h"
#include "User.h"
#include "Weather.h"
#include "World.h"
uint8 (&CTheScripts::ScriptSpace)[160 * 1024] = *(uint8(*)[160 * 1024])*(uintptr*)0x74B248;
CTextLine (&CTheScripts::IntroTextLines)[2] = *(CTextLine (*)[2])*(uintptr*)0x70EA74;
CScriptRectangle (&CTheScripts::IntroRectangles)[16] = *(CScriptRectangle (*)[16])*(uintptr*)0x72D108;
CSprite2d (&CTheScripts::ScriptSprites)[16] = *(CSprite2d(*)[16])*(uintptr*)0x72B090;
bool &CTheScripts::DbgFlag = *(bool*)0x95CD87;
uint32 &CTheScripts::OnAMissionFlag = *(uint32*)0x8F2A24;
int32 &CTheScripts::StoreVehicleIndex = *(int32*)0x8F5F3C;
bool &CTheScripts::StoreVehicleWasRandom = *(bool*)0x95CDBC;
CMissionCleanup(&CTheScripts::MissionCleanup) = *(CMissionCleanup*)0x8F2AD8;
CUpsideDownCarCheck(&CTheScripts::UpsideDownCars) = *(CUpsideDownCarCheck*)0x6EE450;
CStuckCarCheck(&CTheScripts::StuckCars) = *(CStuckCarCheck*)0x87C588;
CMissionCleanup::CMissionCleanup()
{
Init();
}
void CMissionCleanup::Init()
{
for (int i = 0; i < MAX_CLEANUP; i++){
m_sEntities[i].type = CLEANUP_UNUSED;
m_sEntities[i].id = 0;
}
}
CMissionCleanupEntity* CMissionCleanup::FindFree()
{
for (int i = 0; i < MAX_CLEANUP; i++){
if (m_sEntities[i].type == CLEANUP_UNUSED)
return &m_sEntities[i];
}
assert(0);
return nil;
}
void CMissionCleanup::AddEntityToList(int32 id, uint8 type)
{
CMissionCleanupEntity* pNew = FindFree();
if (!pNew)
return;
pNew->id = id;
pNew->type = type;
m_bCount++;
}
void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type)
{
for (int i = 0; i < MAX_CLEANUP; i++){
if (m_sEntities[i].type == type && m_sEntities[i].id == 0){
m_sEntities[i].id = 0;
m_sEntities[i].type = CLEANUP_UNUSED;
}
}
}
void CMissionCleanup::Process()
{
CPopulation::m_AllRandomPedsThisType = -1;
CPopulation::PedDensityMultiplier = 1.0f;
CCarCtrl::CarDensityMultiplier = 1.0;
FindPlayerPed()->m_pWanted->m_fCrimeSensitivity = 1.0f;
TheCamera.Restore();
TheCamera.SetWidescreenOff();
DMAudio.ClearMissionAudio();
CWeather::ReleaseWeather();
for (int i = 0; i < NUM_OF_SPECIAL_CHARS; i++)
CStreaming::SetMissionDoesntRequireSpecialChar(i);
for (int i = 0; i < NUM_OF_CUTSCENE_OBJECTS; i++)
CStreaming::SetMissionDoesntRequireModel(MI_CUTOBJ01 + i);
CStreaming::ms_disableStreaming = false;
CHud::m_ItemToFlash = -1;
CHud::SetHelpMessage(nil, false);
CUserDisplay::OnscnTimer.m_bDisabled = false;
CWorld::Players[0].m_pPed->m_pWanted->m_IsIgnoredByCops = false;
CWorld::Players[0].m_pPed->m_pWanted->m_IsIgnoredByEveryOne = false;
CWorld::Players[0].MakePlayerSafe(false);
CTheScripts::StoreVehicleIndex = -1;
CTheScripts::StoreVehicleWasRandom = true;
CTheScripts::UpsideDownCars.Init();
CTheScripts::StuckCars.Init();
for (int i = 0; i < MAX_CLEANUP; i++){
if (m_sEntities[i].type == CLEANUP_UNUSED)
continue;
switch (m_sEntities[i].type) {
case CLEANUP_CAR:
{
CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id);
if (v)
CTheScripts::CleanUpThisVehicle(v);
break;
}
case CLEANUP_CHAR:
{
CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id);
if (p)
CTheScripts::CleanUpThisPed(p);
break;
}
case CLEANUP_OBJECT:
{
CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id);
if (o)
CTheScripts::CleanUpThisObject(o);
break;
}
default:
break;
}
}
}
void CUpsideDownCarCheck::Init()
{
for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){
m_sCars[i].m_nVehicleIndex = -1;
m_sCars[i].m_nVehicleIndex = 0;
}
}
void CStuckCarCheck::Init()
{
for (int i = 0; i < MAX_STUCK_CAR_CHECKS; i++) {
m_sCars[i].m_nVehicleIndex = -1;
m_sCars[i].m_vecPos = CVector(-5000.0f, -5000.0f, -5000.0f);
m_sCars[i].m_nStartTime = -1;
m_sCars[i].m_fDistance = 0.0f;
m_sCars[i].m_nStuckTime = 0;
m_sCars[i].m_bStuck = false;
}
}
WRAPPER void CTheScripts::CleanUpThisVehicle(CVehicle*) { EAXJMP(0x4548D0); }
WRAPPER void CTheScripts::CleanUpThisPed(CPed*) { EAXJMP(0x4547A0); }
WRAPPER void CTheScripts::CleanUpThisObject(CObject*) { EAXJMP(0x454910); }
WRAPPER bool CTheScripts::IsPlayerOnAMission() { EAXJMP(0x439410); }
WRAPPER void CTheScripts::ScriptDebugLine3D(float x1, float y1, float z1, float x2, float y2, float z2, int col, int col2) { EAXJMP(0x4534E0); }
STARTPATCHES
InjectHook(0x437AE0, &CMissionCleanup::Init, PATCH_JUMP);
InjectHook(0x437BA0, &CMissionCleanup::AddEntityToList, PATCH_JUMP);
InjectHook(0x437BD0, &CMissionCleanup::RemoveEntityFromList, PATCH_JUMP);
InjectHook(0x437C10, &CMissionCleanup::Process, PATCH_JUMP);
ENDPATCHES

View File

@ -1,5 +1,8 @@
#pragma once
#include "Ped.h"
#include "Object.h"
#include "Sprite2d.h"
#include "Vehicle.h"
struct CScriptRectangle
{
@ -32,17 +35,111 @@ struct CTextLine
wchar m_awText[500];
};
struct CRunningScript
{
CRunningScript *next;
CRunningScript *prev;
uint8 m_abScriptName[8];
uint32 m_nIp;
uint32 m_anStack[6];
uint16 m_nStackPointer;
void* m_anLocalVariables[18];
bool m_bCondResult;
bool m_bIsMissionThread;
bool m_bSkipWakeTime;
uint32 m_nWakeTime;
uint16 m_wIfOp;
bool m_bNotFlag;
bool m_bWBCheck;
bool m_bWastedOrBusted;
bool m_bMissionFlag;
};
enum {
CLEANUP_UNUSED = 0,
CLEANUP_CAR,
CLEANUP_CHAR,
CLEANUP_OBJECT
};
struct CMissionCleanupEntity
{
uint8 type;
int32 id;
};
enum {
MAX_CLEANUP = 50,
MAX_UPSIDEDOWN_CAR_CHECKS = 6,
MAX_STUCK_CAR_CHECKS = 6
};
class CMissionCleanup
{
CMissionCleanupEntity m_sEntities[MAX_CLEANUP];
uint8 m_bCount;
public:
CMissionCleanup();
void Init();
CMissionCleanupEntity* FindFree();
void AddEntityToList(int32, uint8);
void RemoveEntityFromList(int32, uint8);
void Process();
};
struct CUpsideDownCarCheckEntry
{
int32 m_nVehicleIndex;
uint32 m_nUpsideDownTimer;
};
class CUpsideDownCarCheck
{
CUpsideDownCarCheckEntry m_sCars[MAX_UPSIDEDOWN_CAR_CHECKS];
public:
void Init();
};
struct CStuckCarCheckEntry
{
int32 m_nVehicleIndex;
CVector m_vecPos;
int32 m_nStartTime;
float m_fDistance;
uint32 m_nStuckTime;
bool m_bStuck;
};
class CStuckCarCheck
{
CStuckCarCheckEntry m_sCars[MAX_STUCK_CAR_CHECKS];
public:
void Init();
};
class CTheScripts
{
public:
static uint8 *ScriptSpace;//[160*1024]
static CTextLine* IntroTextLines;
static CScriptRectangle* IntroRectangles;
static CSprite2d* ScriptSprites;
static bool DbgFlag;
static uint32 OnAMissionFlag;
static uint8(&ScriptSpace)[160 * 1024];
static CTextLine(&IntroTextLines)[2];
static CScriptRectangle(&IntroRectangles)[16];
static CSprite2d(&ScriptSprites)[16];
static bool &DbgFlag;
static uint32 &OnAMissionFlag;
static CMissionCleanup &MissionCleanup;
static CStuckCarCheck &StuckCars;
static CUpsideDownCarCheck &UpsideDownCars;
static int32 &StoreVehicleIndex;
static bool &StoreVehicleWasRandom;
public:
static bool IsPlayerOnAMission();
static void ScriptDebugLine3D(float x1, float y1, float z1, float x2, float y2, float z2, int col, int col2);
static void CleanUpThisVehicle(CVehicle*);
static void CleanUpThisPed(CPed*);
static void CleanUpThisObject(CObject*);
};