From 69963cea68b3057c0e590e30ee438dff801a4d07 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 8 Oct 2019 00:29:30 +0300 Subject: Full CGameLogic --- src/core/Camera.cpp | 10 ++++++++++ src/core/Camera.h | 1 + src/core/CutsceneMgr.h | 2 +- src/core/PlayerInfo.cpp | 42 ++++++++++++++++++++++++++++++++++++++---- src/core/PlayerInfo.h | 2 ++ src/core/Stats.cpp | 3 +++ src/core/Stats.h | 4 ++++ src/core/Wanted.cpp | 2 ++ src/core/Wanted.h | 1 + src/core/World.cpp | 1 + src/core/World.h | 1 + 11 files changed, 64 insertions(+), 5 deletions(-) (limited to 'src/core') diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp index 775ab46a..28cced53 100644 --- a/src/core/Camera.cpp +++ b/src/core/Camera.cpp @@ -1349,6 +1349,14 @@ CCamera::TakeControlWithSpline(short nSwitch) //FindPlayerPed(); // unused }; +void CCamera::SetCameraDirectlyInFrontForFollowPed_CamOnAString() +{ + m_bCamDirectlyInFront = true; + CPlayerPed *player = FindPlayerPed(); + if (player) + m_PedOrientForBehindOrInFront = CGeneral::GetATanOfXY(player->GetForward().x, player->GetForward().y); +} + STARTPATCHES InjectHook(0x42C760, (bool (CCamera::*)(const CVector ¢er, float radius, const CMatrix *mat))&CCamera::IsSphereVisible, PATCH_JUMP); InjectHook(0x46FD00, &CCamera::SetFadeColour, PATCH_JUMP); @@ -1357,6 +1365,8 @@ STARTPATCHES InjectHook(0x46FD80, &CCamera::SetMotionBlurAlpha, PATCH_JUMP); InjectHook(0x46F940, &CCamera::RenderMotionBlur, PATCH_JUMP); + InjectHook(0x46FC90, &CCamera::SetCameraDirectlyInFrontForFollowPed_CamOnAString, PATCH_JUMP); + InjectHook(0x456F40, WellBufferMe, PATCH_JUMP); InjectHook(0x4582F0, &CCam::GetVectorsReadyForRW, PATCH_JUMP); InjectHook(0x457710, &CCam::DoAverageOnVector, PATCH_JUMP); diff --git a/src/core/Camera.h b/src/core/Camera.h index 0fd372c3..7d765a06 100644 --- a/src/core/Camera.h +++ b/src/core/Camera.h @@ -489,6 +489,7 @@ int m_iModeObbeCamIsInForCar; void SetCamCutSceneOffSet(const CVector&); void TakeControlWithSpline(short); void RestoreWithJumpCut(void); + void SetCameraDirectlyInFrontForFollowPed_CamOnAString(void); void dtor(void) { this->CCamera::~CCamera(); } }; diff --git a/src/core/CutsceneMgr.h b/src/core/CutsceneMgr.h index 9b942030..7215a123 100644 --- a/src/core/CutsceneMgr.h +++ b/src/core/CutsceneMgr.h @@ -10,7 +10,6 @@ class CCutsceneHead; class CCutsceneMgr { static bool &ms_running; - static bool &ms_cutsceneProcessing; static CCutsceneObject *(&ms_pCutsceneObjects)[NUMCUTSCENEOBJECTS]; static int32 &ms_numCutsceneObjs; @@ -25,6 +24,7 @@ class CCutsceneMgr public: static CDirectory *&ms_pCutsceneDir; static uint32 &ms_cutsceneLoadStatus; + static bool &ms_cutsceneProcessing; static bool IsRunning(void) { return ms_running; } static bool IsCutsceneProcessing(void) { return ms_cutsceneProcessing; } diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index dc72848d..be2c0687 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -5,25 +5,32 @@ #include "Frontend.h" #include "Vehicle.h" #include "PlayerSkin.h" +#include "Darkel.h" +#include "Messages.h" +#include "Text.h" +#include "Stats.h" WRAPPER void CPlayerInfo::MakePlayerSafe(bool) { EAXJMP(0x4A1400); } WRAPPER void CPlayerInfo::AwardMoneyForExplosion(CVehicle *vehicle) { EAXJMP(0x4A15F0); } WRAPPER void CPlayerInfo::Process(void) { EAXJMP(0x49FD30); } -void CPlayerInfo::SetPlayerSkin(char *skin) +void +CPlayerInfo::SetPlayerSkin(char *skin) { strncpy(m_aSkinName, skin, 32); LoadPlayerSkin(); } -CVector& CPlayerInfo::GetPos() +CVector& +CPlayerInfo::GetPos() { if (m_pPed->bInVehicle && m_pPed->m_pMyVehicle) return m_pPed->m_pMyVehicle->GetPosition(); return m_pPed->GetPosition(); } -void CPlayerInfo::LoadPlayerSkin() +void +CPlayerInfo::LoadPlayerSkin() { DeletePlayerSkin(); @@ -32,7 +39,8 @@ void CPlayerInfo::LoadPlayerSkin() m_pSkinTexture = CPlayerSkin::GetSkinTexture(DEFAULT_SKIN_NAME); } -void CPlayerInfo::DeletePlayerSkin() +void +CPlayerInfo::DeletePlayerSkin() { if (m_pSkinTexture) { RwTextureDestroy(m_pSkinTexture); @@ -40,7 +48,33 @@ void CPlayerInfo::DeletePlayerSkin() } } +void +CPlayerInfo::KillPlayer() +{ + if (m_WBState != WBSTATE_PLAYING) return; + + m_WBState = WBSTATE_WASTED; + m_nWBTime = CTimer::GetTimeInMilliseconds(); + CDarkel::ResetOnPlayerDeath(); + CMessages::AddBigMessage(TheText.Get("DEAD"), 4000, 2); + CStats::TimesDied++; +} + +void +CPlayerInfo::ArrestPlayer() +{ + if (m_WBState != WBSTATE_PLAYING) return; + + m_WBState = WBSTATE_BUSTED; + m_nWBTime = CTimer::GetTimeInMilliseconds(); + CDarkel::ResetOnPlayerDeath(); + CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2); + CStats::TimesArrested++; +} + STARTPATCHES InjectHook(0x4A1700, &CPlayerInfo::LoadPlayerSkin, PATCH_JUMP); InjectHook(0x4A1750, &CPlayerInfo::DeletePlayerSkin, PATCH_JUMP); +InjectHook(0x4A12E0, &CPlayerInfo::KillPlayer, PATCH_JUMP); +InjectHook(0x4A1330, &CPlayerInfo::ArrestPlayer, PATCH_JUMP); ENDPATCHES diff --git a/src/core/PlayerInfo.h b/src/core/PlayerInfo.h index f0b879ee..5784e1fb 100644 --- a/src/core/PlayerInfo.h +++ b/src/core/PlayerInfo.h @@ -73,6 +73,8 @@ public: void SetPlayerSkin(char* skin); CVector& GetPos(); void Process(void); + void KillPlayer(void); + void ArrestPlayer(void); }; static_assert(sizeof(CPlayerInfo) == 0x13C, "CPlayerInfo: error"); diff --git a/src/core/Stats.cpp b/src/core/Stats.cpp index d4d91dac..9641e8f0 100644 --- a/src/core/Stats.cpp +++ b/src/core/Stats.cpp @@ -9,6 +9,9 @@ int32 &CStats::NumberKillFrenziesPassed = *(int32*)0x8E287C; int32 &CStats::PeopleKilledByOthers = *(int32*)0x8E2C50; int32 &CStats::HelisDestroyed = *(int32*)0x8E2A64; int32 *CStats::PedsKilledOfThisType = (int32*)0x880DBC; +int32 &CStats::TimesDied = *(int32*)0x8E2BDC; +int32 &CStats::TimesArrested = *(int32*)0x8E2BEC; +int32 &CStats::KillsSinceLastCheckpoint = *(int32*)0x8F2C8C; void CStats::AnotherKillFrenzyPassed() { diff --git a/src/core/Stats.h b/src/core/Stats.h index 53c40ca3..7bae8c51 100644 --- a/src/core/Stats.h +++ b/src/core/Stats.h @@ -11,7 +11,11 @@ public: static int32 &PeopleKilledByOthers; static int32 &HelisDestroyed; static int32 *PedsKilledOfThisType; //[NUM_PEDTYPES] + static int32 &TimesDied; + static int32 &TimesArrested; + static int32 &KillsSinceLastCheckpoint; public: static void AnotherKillFrenzyPassed(); + static void CheckPointReachedUnsuccessfully() { KillsSinceLastCheckpoint = 0; }; }; \ No newline at end of file diff --git a/src/core/Wanted.cpp b/src/core/Wanted.cpp index 26b115e3..bafe0ae1 100644 --- a/src/core/Wanted.cpp +++ b/src/core/Wanted.cpp @@ -12,6 +12,8 @@ int32 &CWanted::MaximumWantedLevel = *(int32*)0x5F7714; // 6 int32 &CWanted::nMaximumWantedLevel = *(int32*)0x5F7718; // 6400 +WRAPPER void CWanted::Reset() { EAXJMP(0x4AD790) }; + void CWanted::Initialise() { diff --git a/src/core/Wanted.h b/src/core/Wanted.h index 34a4b58d..1303365d 100644 --- a/src/core/Wanted.h +++ b/src/core/Wanted.h @@ -76,6 +76,7 @@ public: bool AddCrimeToQ(eCrimeType type, int32 id, const CVector &pos, bool reported, bool policeDoesntCare); void ReportCrimeNow(eCrimeType type, const CVector &coors, bool policeDoesntCare); void UpdateWantedLevel(); + void Reset(); bool IsIgnored(void) { return m_bIgnoredByCops || m_bIgnoredByEveryone; } diff --git a/src/core/World.cpp b/src/core/World.cpp index 1598967a..3a8367f1 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -41,6 +41,7 @@ bool &CWorld::bIncludeCarTyres = *(bool*)0x95CDAA; WRAPPER void CWorld::ShutDown(void) { EAXJMP(0x4AE450); } WRAPPER void CWorld::RemoveReferencesToDeletedObject(CEntity*) { EAXJMP(0x4B3BF0); } WRAPPER void CWorld::FindObjectsKindaColliding(const CVector &, float, bool, int16*, int16, CEntity **, bool, bool, bool, bool, bool){ EAXJMP(0x4B2A30); } +WRAPPER void CWorld::ClearExcitingStuffFromArea(const CVector &pos, float radius, uint8) { EAXJMP(0x4B4E70) }; void CWorld::Initialise() diff --git a/src/core/World.h b/src/core/World.h index 523585e7..f420207c 100644 --- a/src/core/World.h +++ b/src/core/World.h @@ -85,6 +85,7 @@ public: } } static void ClearScanCodes(void); + static void ClearExcitingStuffFromArea(const CVector &pos, float radius, uint8); static bool CameraToIgnoreThisObject(CEntity *ent); -- cgit v1.2.3