diff options
57 files changed, 681 insertions, 90 deletions
@@ -38,13 +38,12 @@ to reverse at the time, calling the original functions is acceptable. ### Unreversed / incomplete classes (at least the ones we know) ``` -cAudioManager - being worked on +cAudioManager - WIP CBoat CBrightLights CBulletInfo CBulletTraces CCamera -CCopPed CCrane CCranes CCullZone @@ -57,7 +56,7 @@ CGame CGarage CGarages CGlass -CMenuManager +CMenuManager - WIP CMotionBlurStreaks CObject CPacManPickups diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 2565a269..e2ca6143 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -20,6 +20,7 @@ #include "MusicManager.h" #include "Pad.h" #include "Ped.h" +#include "Fire.h" #include "Physical.h" #include "Placeable.h" #include "Plane.h" @@ -7533,8 +7534,8 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) void cAudioManager::ProcessWaterCannon(int32) { for(int32 i = 0; i < NUM_WATERCANNONS; i++) { - if(aCannons[i].m_nId) { - m_sQueueSample.m_vecPos = aCannons[0].m_avecPos[aCannons[i].m_wIndex]; + if(CWaterCannons::aCannons[i].m_nId) { + m_sQueueSample.m_vecPos = CWaterCannons::aCannons[0].m_avecPos[CWaterCannons::aCannons[i].m_nCur]; float distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); if(distSquared < 900.f) { m_sQueueSample.m_fDistance = Sqrt(distSquared); diff --git a/src/audio/AudioScriptObject.cpp b/src/audio/AudioScriptObject.cpp index 796cd88b..b5093c52 100644 --- a/src/audio/AudioScriptObject.cpp +++ b/src/audio/AudioScriptObject.cpp @@ -2,6 +2,7 @@ #include "patcher.h" #include "AudioScriptObject.h" #include "Pools.h" +#include "DMAudio.h" WRAPPER void cAudioScriptObject::SaveAllAudioScriptObjects(uint8 *buf, uint32 *size) { EAXJMP(0x57c460); } diff --git a/src/audio/DMAudio.h b/src/audio/DMAudio.h index 90fe96b5..d2cdf466 100644 --- a/src/audio/DMAudio.h +++ b/src/audio/DMAudio.h @@ -1,7 +1,6 @@ #pragma once #include "audio_enums.h" -#include "Wanted.h" enum eSound : int16 { diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 1fac8a23..1f1c343a 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -8,6 +8,7 @@ #include "Hud.h" #include "ModelIndices.h" #include "Replay.h" +#include "Pad.h" #include "Text.h" #include "Timer.h" #include "World.h" diff --git a/src/audio/PoliceRadio.h b/src/audio/PoliceRadio.h index 152a5ee2..4c7030f1 100644 --- a/src/audio/PoliceRadio.h +++ b/src/audio/PoliceRadio.h @@ -1,5 +1,7 @@ #pragma once
+#include "Wanted.h"
+
struct cAMCrime {
int32 type;
CVector position;
diff --git a/src/control/Bridge.h b/src/control/Bridge.h index 377c8bf8..63f41578 100644 --- a/src/control/Bridge.h +++ b/src/control/Bridge.h @@ -1,5 +1,6 @@ #pragma once -#include "Entity.h" + +class CEntity; enum bridgeStates { STATE_BRIDGE_LOCKED, diff --git a/src/control/CarAI.cpp b/src/control/CarAI.cpp index c5d62c48..e47e3d5e 100644 --- a/src/control/CarAI.cpp +++ b/src/control/CarAI.cpp @@ -9,6 +9,9 @@ #include "HandlingMgr.h" #include "ModelIndices.h" #include "PlayerPed.h" +#include "Wanted.h" +#include "DMAudio.h" +#include "Fire.h" #include "Pools.h" #include "Timer.h" #include "TrafficLights.h" diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index de8c799e..07ba2e3c 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -19,6 +19,7 @@ #include "Ped.h" #include "PlayerInfo.h" #include "PlayerPed.h" +#include "Wanted.h" #include "Pools.h" #include "Renderer.h" #include "RoadBlocks.h" @@ -27,7 +28,7 @@ #include "Streaming.h" #include "VisibilityPlugins.h" #include "Vehicle.h" -#include "Wanted.h" +#include "Fire.h" #include "World.h" #include "Zones.h" diff --git a/src/control/Darkel.cpp b/src/control/Darkel.cpp index b7ae0726..ec1b887e 100644 --- a/src/control/Darkel.cpp +++ b/src/control/Darkel.cpp @@ -3,6 +3,7 @@ #include "main.h" #include "Darkel.h" #include "PlayerPed.h" +#include "Wanted.h" #include "Timer.h" #include "DMAudio.h" #include "Population.h" diff --git a/src/control/Darkel.h b/src/control/Darkel.h index f17d7581..12ce4451 100644 --- a/src/control/Darkel.h +++ b/src/control/Darkel.h @@ -1,9 +1,9 @@ #pragma once -#include "Weapon.h" #include "ModelIndices.h" class CVehicle; class CPed; +enum eWeaponType; enum { diff --git a/src/control/GameLogic.cpp b/src/control/GameLogic.cpp index 1e5b72c3..1493cec0 100644 --- a/src/control/GameLogic.cpp +++ b/src/control/GameLogic.cpp @@ -9,6 +9,7 @@ #include "CutsceneMgr.h"
#include "World.h"
#include "PlayerPed.h"
+#include "Wanted.h"
#include "Camera.h"
#include "Messages.h"
#include "CarCtrl.h"
diff --git a/src/control/Gangs.cpp b/src/control/Gangs.cpp index f9cb4698..340fe0f6 100644 --- a/src/control/Gangs.cpp +++ b/src/control/Gangs.cpp @@ -1,7 +1,8 @@ #include "common.h" #include "patcher.h" #include "ModelIndices.h" -#include "Gangs.h" +#include "Gangs.h"
+#include "Weapon.h" //CGangInfo(&CGangs::Gang)[NUM_GANGS] = *(CGangInfo(*)[NUM_GANGS])*(uintptr*)0x6EDF78; CGangInfo CGangs::Gang[NUM_GANGS]; @@ -38,8 +39,8 @@ void CGangs::SetGangVehicleModel(int16 gang, int32 model) void CGangs::SetGangWeapons(int16 gang, int32 weapon1, int32 weapon2) { CGangInfo *gi = GetGangInfo(gang); - gi->m_Weapon1 = (eWeaponType)weapon1; - gi->m_Weapon2 = (eWeaponType)weapon2; + gi->m_Weapon1 = weapon1; + gi->m_Weapon2 = weapon2; } void CGangs::SetGangPedModelOverride(int16 gang, int8 ovrd) diff --git a/src/control/Gangs.h b/src/control/Gangs.h index a348f259..cf22cc73 100644 --- a/src/control/Gangs.h +++ b/src/control/Gangs.h @@ -1,13 +1,11 @@ #pragma once -#include "Weapon.h" - struct CGangInfo { int32 m_nVehicleMI; int8 m_nPedModelOverride; - eWeaponType m_Weapon1; - eWeaponType m_Weapon2; + int32 m_Weapon1; + int32 m_Weapon2; CGangInfo(); }; diff --git a/src/control/Phones.cpp b/src/control/Phones.cpp index f3b3a8db..276f02b9 100644 --- a/src/control/Phones.cpp +++ b/src/control/Phones.cpp @@ -11,6 +11,7 @@ #include "General.h" #include "AudioScriptObject.h" #include "RpAnimBlend.h" +#include "AnimBlendAssociation.h" CPhoneInfo &gPhoneInfo = *(CPhoneInfo*)0x732A20; diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index 53da89f4..b1832f0e 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -15,6 +15,9 @@ #include "Pad.h"
#include "Pickups.h"
#include "PlayerPed.h"
+#include "Wanted.h"
+#include "DMAudio.h"
+#include "Fire.h"
#include "PointLights.h"
#include "Pools.h"
#include "Script.h"
diff --git a/src/control/Replay.cpp b/src/control/Replay.cpp index a68dd5e7..3c0393aa 100644 --- a/src/control/Replay.cpp +++ b/src/control/Replay.cpp @@ -5,6 +5,7 @@ #include "SpecialFX.h" #include "CarCtrl.h" #include "CivilianPed.h" +#include "Wanted.h" #include "Clock.h" #include "DMAudio.h" #include "Draw.h" @@ -22,6 +23,8 @@ #include "Pools.h" #include "Population.h" #include "Replay.h" +#include "References.h" +#include "Pools.h" #include "RpAnimBlend.h" #include "RwHelper.h" #include "CutsceneMgr.h" @@ -33,6 +36,8 @@ #include "Zones.h" #include "Font.h" #include "Text.h" +#include "Camera.h" +#include "Radar.h" uint8 &CReplay::Mode = *(uint8*)0x95CD5B; CAddressInReplayBuffer &CReplay::Record = *(CAddressInReplayBuffer*)0x942F7C; diff --git a/src/control/Replay.h b/src/control/Replay.h index cc652a11..56de52a3 100644 --- a/src/control/Replay.h +++ b/src/control/Replay.h @@ -1,14 +1,7 @@ #pragma once -#include "Camera.h" -#include "Ped.h" #include "Pools.h" -#include "Radar.h" -#include "References.h" -#include "Vehicle.h" -#include "Wanted.h" #include "World.h" -#include "common.h" #ifdef FIX_BUGS #ifndef DONT_FIX_REPLAY_BUGS @@ -16,6 +9,9 @@ #endif #endif +class CVehicle; +struct CReference; + struct CAddressInReplayBuffer { uint32 m_nOffset; diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 150b64cd..c8f252ca 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -53,6 +53,8 @@ #include "Restart.h" #include "Replay.h" #include "RpAnimBlend.h" +#include "AnimBlendAssociation.h" +#include "Fire.h" #include "Rubbish.h" #include "Shadows.h" #include "SpecialFX.h" @@ -65,6 +67,7 @@ #include "Weather.h" #include "World.h" #include "Zones.h" +#include "Radar.h" #define PICKUP_PLACEMENT_OFFSET 0.5f #define PED_FIND_Z_OFFSET 5.0f diff --git a/src/core/AnimViewer.cpp b/src/core/AnimViewer.cpp index a2d7b94a..20a0098d 100644 --- a/src/core/AnimViewer.cpp +++ b/src/core/AnimViewer.cpp @@ -33,6 +33,7 @@ #include "Clock.h" #include "Timecycle.h" #include "RpAnimBlend.h" +#include "AnimBlendAssociation.h" #include "Shadows.h" #include "Radar.h" #include "Hud.h" @@ -207,6 +208,7 @@ PlayAnimation(RpClump *clump, AssocGroupId animGroup, AnimationId anim) animAssoc->SetRun(); } +extern void (*DebugMenuProcess)(void); void CAnimViewer::Update(void) { @@ -246,6 +248,9 @@ CAnimViewer::Update(void) } CPad::UpdatePads(); CPad* pad = CPad::GetPad(0); + + DebugMenuProcess(); + CStreaming::UpdateForAnimViewer(); CStreaming::RequestModel(modelId, 0); if (CStreaming::HasModelLoaded(modelId)) { diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp index 4ddde360..546dfde0 100644 --- a/src/core/Cam.cpp +++ b/src/core/Cam.cpp @@ -1530,7 +1530,7 @@ CCam::Process_FollowPedWithMouse(const CVector &CameraTarget, float TargetOrient CamDist = fBaseDist + Cos(Alpha)*fAngleDist; if(TheCamera.m_bUseTransitionBeta) - Beta = -CGeneral::GetATanOfXY(-Cos(m_fTransitionBeta), -Sin(m_fTransitionBeta)); + Beta = CGeneral::GetATanOfXY(-Cos(m_fTransitionBeta), -Sin(m_fTransitionBeta)); if(TheCamera.m_bCamDirectlyBehind) Beta = TheCamera.m_PedOrientForBehindOrInFront; diff --git a/src/core/CutsceneMgr.cpp b/src/core/CutsceneMgr.cpp index c13aa3a8..a3ff2fd0 100644 --- a/src/core/CutsceneMgr.cpp +++ b/src/core/CutsceneMgr.cpp @@ -9,12 +9,14 @@ #include "FileMgr.h" #include "main.h" #include "AnimManager.h" +#include "AnimBlendAssociation.h" #include "AnimBlendAssocGroup.h" #include "AnimBlendClumpData.h" #include "Pad.h" #include "DMAudio.h" #include "World.h" #include "PlayerPed.h" +#include "Wanted.h" #include "CutsceneHead.h" #include "RpAnimBlend.h" #include "ModelIndices.h" diff --git a/src/core/EventList.cpp b/src/core/EventList.cpp index 4364359a..d72e32c4 100644 --- a/src/core/EventList.cpp +++ b/src/core/EventList.cpp @@ -212,7 +212,7 @@ CEventList::ReportCrimeForEvent(eEventType type, int32 crimeId, bool copsDontCar #ifdef VC_PED_PORTS if (crime == CRIME_HIT_PED && ((CPed*)crimeId)->IsPointerValid() && - FindPlayerPed()->m_pWanted->m_nWantedLevel == 0 && ((CPed*)crimeId)->m_ped_flagE2) { + FindPlayerPed()->m_pWanted->m_nWantedLevel == 0 && ((CPed*)crimeId)->bBeingChasedByPolice) { if(!((CPed*)crimeId)->DyingOrDead()) { sprintf(gString, "$50 Good Citizen Bonus!"); diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index aff8a3ec..0bade6c7 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -94,7 +94,6 @@ int32 *&pControlEdit = *(int32**)0x628D08; bool &DisplayComboButtonErrMsg = *(bool*)0x628D14; int32 &MouseButtonJustClicked = *(int32*)0x628D0C; int32 &JoyButtonJustClicked = *(int32*)0x628D10; -uint32 &nTimeForSomething = *(uint32*)0x628D54; bool &holdingScrollBar = *(bool*)0x628D59; //int32 *pControlTemp = 0; @@ -2202,15 +2201,15 @@ CMenuManager::ProcessButtonPresses(void) field_535 = false; } - static int nTimeForSomething = 0; + static uint32 lastTimeClickedScrollButton = 0; - if (CTimer::GetTimeInMillisecondsPauseMode() - nTimeForSomething >= 200) { + if (CTimer::GetTimeInMillisecondsPauseMode() - lastTimeClickedScrollButton >= 200) { m_bPressedPgUpOnList = false; m_bPressedPgDnOnList = false; m_bPressedUpOnList = false; m_bPressedDownOnList = false; m_bPressedScrollButton = false; - nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode(); + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); } if (CPad::GetPad(0)->GetTabJustDown()) { @@ -2249,7 +2248,7 @@ CMenuManager::ProcessButtonPresses(void) m_nCurrExLayer = 19; if (!m_bPressedUpOnList) { m_bPressedUpOnList = true; - nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode(); + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0); ScrollUpListByOne(); } @@ -2271,7 +2270,7 @@ CMenuManager::ProcessButtonPresses(void) m_nCurrExLayer = 19; if (!m_bPressedDownOnList) { m_bPressedDownOnList = true; - nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode(); + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0); ScrollDownListByOne(); } @@ -2286,7 +2285,7 @@ CMenuManager::ProcessButtonPresses(void) m_nCurrExLayer = 19; if (!m_bPressedPgUpOnList) { m_bPressedPgUpOnList = true; - nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode(); + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); m_bShowMouse = false; DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0); PageUpList(false); @@ -2298,7 +2297,7 @@ CMenuManager::ProcessButtonPresses(void) m_nCurrExLayer = 19; if (!m_bPressedPgDnOnList) { m_bPressedPgDnOnList = true; - nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode(); + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); m_bShowMouse = false; DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0); PageDownList(false); @@ -2384,7 +2383,7 @@ CMenuManager::ProcessButtonPresses(void) case HOVEROPTION_CLICKED_SCROLL_UP: if (!m_bPressedScrollButton) { m_bPressedScrollButton = true; - nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode(); + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); ScrollUpListByOne(); } break; @@ -2392,7 +2391,7 @@ CMenuManager::ProcessButtonPresses(void) case HOVEROPTION_CLICKED_SCROLL_DOWN: if (!m_bPressedScrollButton) { m_bPressedScrollButton = true; - nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode(); + lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode(); ScrollDownListByOne(); } break; @@ -3593,7 +3592,7 @@ void CMenuManager::SwitchMenuOnAndOff() PcSaveHelper.PopulateSlotInfo(); m_nCurrOption = 0; } -/* // PS2 leftover? +/* // PS2 leftover if (m_nCurrScreen != MENUPAGE_SOUND_SETTINGS && gMusicPlaying) { DMAudio.StopFrontEndTrack(); diff --git a/src/core/Game.cpp b/src/core/Game.cpp index e89d62a0..fce0c67f 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -41,6 +41,8 @@ #include "Record.h" #include "Renderer.h" #include "Replay.h" +#include "References.h" +#include "Radar.h" #include "Restart.h" #include "RoadBlocks.h" #include "PedRoutes.h" diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp index 87f45b9f..6bbe00f2 100644 --- a/src/core/Pad.cpp +++ b/src/core/Pad.cpp @@ -574,8 +574,9 @@ void CPad::AffectFromXinput(uint32 pad) PCTempJoyState.RightShoulder2 = xstate.Gamepad.bRightTrigger; PCTempJoyState.Select = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 255 : 0; +#ifdef REGISTER_START_BUTTON PCTempJoyState.Start = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 255 : 0; - +#endif float lx = (float)xstate.Gamepad.sThumbLX / (float)0x7FFF; float ly = (float)xstate.Gamepad.sThumbLY / (float)0x7FFF; float rx = (float)xstate.Gamepad.sThumbRX / (float)0x7FFF; diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index e0c0259e..ead32ee7 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -2,7 +2,9 @@ #include "patcher.h" #include "main.h" #include "PlayerPed.h" +#include "Wanted.h" #include "PlayerInfo.h" +#include "Fire.h" #include "Frontend.h" #include "PlayerSkin.h" #include "Darkel.h" @@ -12,6 +14,7 @@ #include "Remote.h" #include "World.h" #include "Replay.h" +#include "Camera.h" #include "Pad.h" #include "ProjectileInfo.h" #include "Explosion.h" diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 6106f3df..3dcb767a 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -10,6 +10,7 @@ #include "TxdStore.h" #include "ModelIndices.h" #include "Pools.h" +#include "Wanted.h" #include "Directory.h" #include "RwHelper.h" #include "World.h" diff --git a/src/math/Vector.h b/src/math/Vector.h index cd436123..6f544ada 100644 --- a/src/math/Vector.h +++ b/src/math/Vector.h @@ -38,6 +38,14 @@ public: }else x = 1.0f; } + + void Normalise(float norm) { + float sq = MagnitudeSqr(); + float invsqrt = RecipSqrt(norm, sq); + x *= invsqrt; + y *= invsqrt; + z *= invsqrt; + } const CVector &operator+=(CVector const &right) { x += right.x; diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 809ba971..89959975 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -5,6 +5,7 @@ #include "Pools.h" #include "Radar.h" #include "Object.h" +#include "DummyObject.h" WRAPPER void CObject::ObjectDamage(float amount) { EAXJMP(0x4BB240); } WRAPPER void CObject::DeleteAllTempObjectInArea(CVector, float) { EAXJMP(0x4BBED0); } diff --git a/src/objects/Object.h b/src/objects/Object.h index b9c570f5..9fcf9c0c 100644 --- a/src/objects/Object.h +++ b/src/objects/Object.h @@ -1,7 +1,6 @@ #pragma once #include "Physical.h" -#include "DummyObject.h" enum { GAME_OBJECT = 1, @@ -26,6 +25,7 @@ enum { }; class CVehicle; +class CDummyObject; class CObject : public CPhysical { diff --git a/src/peds/CivilianPed.cpp b/src/peds/CivilianPed.cpp index 2e6166be..533d7c98 100644 --- a/src/peds/CivilianPed.cpp +++ b/src/peds/CivilianPed.cpp @@ -4,6 +4,8 @@ #include "Phones.h" #include "General.h" #include "PlayerPed.h" +#include "Wanted.h" +#include "DMAudio.h" #include "World.h" #include "Vehicle.h" #include "SurfaceTable.h" diff --git a/src/peds/CopPed.cpp b/src/peds/CopPed.cpp index 94acac05..b5812136 100644 --- a/src/peds/CopPed.cpp +++ b/src/peds/CopPed.cpp @@ -3,15 +3,19 @@ #include "World.h" #include "PlayerPed.h" #include "CopPed.h" +#include "Wanted.h" +#include "DMAudio.h" #include "ModelIndices.h" #include "Vehicle.h" #include "RpAnimBlend.h" +#include "AnimBlendAssociation.h" #include "General.h" #include "ZoneCull.h" #include "PathFind.h" #include "RoadBlocks.h" - -WRAPPER void CCopPed::ProcessControl() { EAXJMP(0x4C1400); } +#include "CarCtrl.h" +#include "Renderer.h" +#include "Camera.h" CCopPed::CCopPed(eCopType copType) : CPed(PEDTYPE_COP) { @@ -62,12 +66,12 @@ CCopPed::CCopPed(eCopType copType) : CPed(PEDTYPE_COP) field_1356 = 0; m_attackTimer = 0; m_bBeatingSuspect = false; - m_bZoneDisabledButClose = false; + m_bStopAndShootDisabledZone = false; m_bZoneDisabled = false; field_1364 = -1; m_pPointGunAt = nil; - // VC also initializes in here, but it keeps object + // VC also initializes in here, but as nil #ifdef FIX_BUGS m_wRoadblockNode = -1; #endif @@ -171,7 +175,7 @@ CCopPed::ClearPursuit(void) bIsRunning = false; bNotAllowedToDuck = false; bKindaStayInSamePlace = false; - m_bZoneDisabledButClose = false; + m_bStopAndShootDisabledZone = false; m_bZoneDisabled = false; ClearObjective(); if (IsPedInControl()) { @@ -213,7 +217,7 @@ CCopPed::SetPursuit(bool ignoreCopLimit) SetObjectiveTimer(0); bNotAllowedToDuck = true; bIsRunning = true; - m_bZoneDisabledButClose = false; + m_bStopAndShootDisabledZone = false; } } } @@ -315,13 +319,15 @@ CCopPed::CopAI(void) m_prevObjective = OBJECTIVE_NONE; m_nLastPedState = PED_NONE; SetAttackTimer(0); + + // Safe distance for disabled zone? Or to just make game easier? if (m_fDistanceToTarget > 15.0f) - m_bZoneDisabledButClose = true; + m_bStopAndShootDisabledZone = true; } } else if (m_bZoneDisabled && !CCullZones::NoPolice()) { m_bZoneDisabled = false; m_bIsDisabledCop = false; - m_bZoneDisabledButClose = false; + m_bStopAndShootDisabledZone = false; bKindaStayInSamePlace = false; bCrouchWhenShooting = false; bDuckAndCover = false; @@ -524,7 +530,7 @@ CCopPed::CopAI(void) if (!anotherCopChasesHim) { SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, nearPed); nearPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, this); - nearPed->m_ped_flagE2 = true; + nearPed->bBeingChasedByPolice = true; return; } } @@ -551,6 +557,186 @@ CCopPed::CopAI(void) } } +void +CCopPed::ProcessControl(void) +{ + if (m_nZoneLevel > LEVEL_NONE && m_nZoneLevel != CCollision::ms_collisionInMemory) + return; + + CPed::ProcessControl(); + if (bWasPostponed) + return; + + if (m_nPedState == PED_DEAD) { + ClearPursuit(); + m_objective = OBJECTIVE_NONE; + return; + } + if (m_nPedState == PED_DIE) + return; + + if (m_nPedState == PED_ARREST_PLAYER) { + ArrestPlayer(); + return; + } + GetWeapon()->Update(m_audioEntityId); + if (m_moved.Magnitude() > 0.0f) + Avoid(); + + CPhysical *playerOrHisVeh = FindPlayerVehicle() ? (CPhysical*)FindPlayerVehicle() : (CPhysical*)FindPlayerPed(); + CPlayerPed *player = FindPlayerPed(); + + m_fDistanceToTarget = (playerOrHisVeh->GetPosition() - GetPosition()).Magnitude(); + if (player->m_nPedState == PED_ARRESTED || player->DyingOrDead()) { + if (m_fDistanceToTarget < 5.0f) { + SetArrestPlayer(player); + return; + } + if (IsPedInControl()) + SetIdle(); + } + if (m_bIsInPursuit) { + if (player->m_nPedState != PED_ARRESTED && !player->DyingOrDead()) { + switch (m_nCopType) { + case COP_FBI: + Say(SOUND_PED_PURSUIT_FBI); + break; + case COP_SWAT: + Say(SOUND_PED_PURSUIT_SWAT); + break; + case COP_ARMY: + Say(SOUND_PED_PURSUIT_ARMY); + break; + default: + Say(SOUND_PED_PURSUIT_COP); + break; + } + } + } + + if (IsPedInControl()) { + CopAI(); + /* switch (m_nCopType) + { + case COP_FBI: + CopAI(); + break; + case COP_SWAT: + CopAI(); + break; + case COP_ARMY: + CopAI(); + break; + default: + CopAI(); + break; + } */ + } else if (InVehicle()) { + if (m_pMyVehicle->pDriver == this && m_pMyVehicle->AutoPilot.m_nCarMission == MISSION_NONE && + CanPedDriveOff() && m_pMyVehicle->VehicleCreatedBy != MISSION_VEHICLE) { + + CCarCtrl::JoinCarWithRoadSystem(m_pMyVehicle); + m_pMyVehicle->AutoPilot.m_nCarMission = MISSION_CRUISE; + m_pMyVehicle->AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_STOP_FOR_CARS; + m_pMyVehicle->AutoPilot.m_nCruiseSpeed = 17; + } + } + if (IsPedInControl() || m_nPedState == PED_DRIVING) + ScanForCrimes(); + + // They may have used goto to jump here in case of PED_ATTACK. + if (m_nPedState == PED_IDLE || m_nPedState == PED_ATTACK) { + if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT && + player && player->EnteringCar() && m_fDistanceToTarget < 1.3f) { + SetArrestPlayer(player); + } + } else { + if (m_nPedState == PED_SEEK_POS) { + if (player->m_nPedState == PED_ARRESTED) { + SetIdle(); + SetLookFlag(player, false); + SetLookTimer(1000); + RestorePreviousObjective(); + } else { + if (player->m_pMyVehicle && player->m_pMyVehicle->m_nNumGettingIn != 0) { + // This is 1.3f when arresting in car without seeking first (in above) +#if defined(VC_PED_PORTS) || defined(FIX_BUGS) + m_distanceToCountSeekDone = 1.3f; +#else + m_distanceToCountSeekDone = 2.0f; +#endif + } + + if (bDuckAndCover) { + if (!bNotAllowedToDuck && Seek()) { + SetMoveState(PEDMOVE_STILL); + SetMoveAnim(); + SetPointGunAt(m_pedInObjective); + } + } else if (Seek()) { + CVehicle *playerVeh = FindPlayerVehicle(); + if (!playerVeh && player && player->EnteringCar()) { + SetArrestPlayer(player); + } else if (1.5f + GetPosition().z <= m_vecSeekPos.z || GetPosition().z - 0.3f >= m_vecSeekPos.z) { + SetMoveState(PEDMOVE_STILL); + } else if (playerVeh && playerVeh->CanPedEnterCar() && playerVeh->m_nNumGettingIn == 0) { + SetCarJack(playerVeh); + } + } + } + } else if (m_nPedState == PED_SEEK_ENTITY) { + if (!m_pSeekTarget) { + RestorePreviousState(); + } else { + m_vecSeekPos = m_pSeekTarget->GetPosition(); + if (Seek()) { + if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT && m_fDistanceToTarget < 2.5f && player) { + if (player->m_nPedState == PED_ARRESTED || player->m_nPedState == PED_ENTER_CAR || + (player->m_nPedState == PED_CARJACK && m_fDistanceToTarget < 1.3f)) { + SetArrestPlayer(player); + } else + RestorePreviousState(); + } else { + RestorePreviousState(); + } + + } + } + } + } + if (!m_bStopAndShootDisabledZone) + return; + + bool dontShoot = false; + if (GetIsOnScreen() && CRenderer::IsEntityCullZoneVisible(this)) { + if (((CTimer::GetFrameCounter() + m_randomSeed) & 0x1F) == 17) { + CEntity *foundBuilding = nil; + CColPoint foundCol; + CVector lookPos = GetPosition() + CVector(0.0f, 0.0f, 0.7f); + CVector camPos = TheCamera.GetGameCamPosition(); + CWorld::ProcessLineOfSight(camPos, lookPos, foundCol, foundBuilding, + true, false, false, false, false, false, false); + + // He's at least 15.0 far, in disabled zone, collided into somewhere (that's why m_bStopAndShootDisabledZone set), + // and now has building on front of him. He's stupid, we don't need him. + if (foundBuilding) { + FlagToDestroyWhenNextProcessed(); + dontShoot = true; + } + } + } else { + FlagToDestroyWhenNextProcessed(); + dontShoot = true; + } + + if (!dontShoot) { + bStopAndShoot = true; + bKindaStayInSamePlace = true; + bIsPointingGunAt = true; + SetAttack(m_pedInObjective); + } +} + #include <new> class CCopPed_ : public CCopPed @@ -558,11 +744,13 @@ class CCopPed_ : public CCopPed public: CCopPed *ctor(eCopType type) { return ::new (this) CCopPed(type); }; void dtor(void) { CCopPed::~CCopPed(); } + void ProcessControl_(void) { CCopPed::ProcessControl(); } }; STARTPATCHES InjectHook(0x4C11B0, &CCopPed_::ctor, PATCH_JUMP); InjectHook(0x4C13E0, &CCopPed_::dtor, PATCH_JUMP); + InjectHook(0x4C1400, &CCopPed_::ProcessControl_, PATCH_JUMP); InjectHook(0x4C28C0, &CCopPed::ClearPursuit, PATCH_JUMP); InjectHook(0x4C2B00, &CCopPed::SetArrestPlayer, PATCH_JUMP); InjectHook(0x4C27D0, &CCopPed::SetPursuit, PATCH_JUMP); diff --git a/src/peds/CopPed.h b/src/peds/CopPed.h index 142be56a..625cae49 100644 --- a/src/peds/CopPed.h +++ b/src/peds/CopPed.h @@ -17,10 +17,10 @@ public: int8 field_1343; float m_fDistanceToTarget; int8 m_bIsInPursuit; - int8 m_bIsDisabledCop; // What disabled cop actually is? + int8 m_bIsDisabledCop; int8 field_1350; bool m_bBeatingSuspect; - int8 m_bZoneDisabledButClose; + int8 m_bStopAndShootDisabledZone; int8 m_bZoneDisabled; int8 field_1354; int8 field_1355; diff --git a/src/peds/EmergencyPed.cpp b/src/peds/EmergencyPed.cpp index 0d27a532..3a5067e7 100644 --- a/src/peds/EmergencyPed.cpp +++ b/src/peds/EmergencyPed.cpp @@ -1,6 +1,7 @@ #include "common.h" #include "patcher.h" #include "EmergencyPed.h" +#include "DMAudio.h" #include "ModelIndices.h" #include "Vehicle.h" #include "Fire.h" diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 05cac3a7..8b83d976 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -7,13 +7,21 @@ #include "World.h" #include "RpAnimBlend.h" #include "Ped.h" +#include "Wanted.h" #include "PlayerPed.h" +#include "PedType.h" +#include "AnimBlendClumpData.h" +#include "AnimBlendAssociation.h" +#include "Fire.h" +#include "DMAudio.h" #include "General.h" #include "SurfaceTable.h" #include "VisibilityPlugins.h" #include "AudioManager.h" #include "HandlingMgr.h" #include "Replay.h" +#include "Camera.h" +#include "Radar.h" #include "PedPlacement.h" #include "Shadows.h" #include "Weather.h" @@ -552,7 +560,7 @@ CPed::CPed(uint32 pedType) : m_pedIK(this) bScriptObjectiveCompleted = false; bKindaStayInSamePlace = false; - m_ped_flagE2 = false; + bBeingChasedByPolice = false; bNotAllowedToDuck = false; bCrouchWhenShooting = false; bIsDucking = false; @@ -9597,7 +9605,7 @@ CPed::ProcessControl(void) float neededTurnToCriminal = angleToLookCriminal - angleToFace; if (neededTurnToCriminal > DEGTORAD(150.0f) && neededTurnToCriminal < DEGTORAD(210.0f)) { - ((CCopPed*)this)->m_bZoneDisabledButClose = true; + ((CCopPed*)this)->m_bStopAndShootDisabledZone = true; } } } diff --git a/src/peds/Ped.h b/src/peds/Ped.h index a19dc9f0..2edd5d68 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -3,14 +3,9 @@ #include "Physical.h" #include "Weapon.h" #include "PedStats.h" -#include "PedType.h" #include "PedIK.h" #include "AnimManager.h" -#include "AnimBlendClumpData.h" -#include "AnimBlendAssociation.h" #include "WeaponInfo.h" -#include "Fire.h" -#include "DMAudio.h" #include "EventList.h" #define FEET_OFFSET 1.04f @@ -19,6 +14,10 @@ struct CPathNode; class CAccident; class CObject; +class CFire; +struct AnimBlendFrameData; +class CAnimBlendAssociation; +enum eCrimeType; struct PedAudioData { @@ -339,7 +338,7 @@ public: uint8 bScriptObjectiveCompleted : 1; uint8 bKindaStayInSamePlace : 1; - uint8 m_ped_flagE2 : 1; // bBeingChasedByPolice? + uint8 bBeingChasedByPolice : 1; // Unused VC leftover. Should've been set for criminal/gang members uint8 bNotAllowedToDuck : 1; uint8 bCrouchWhenShooting : 1; uint8 bIsDucking : 1; diff --git a/src/peds/PedIK.cpp b/src/peds/PedIK.cpp index 38ab429e..cc4b0dd0 100644 --- a/src/peds/PedIK.cpp +++ b/src/peds/PedIK.cpp @@ -80,7 +80,7 @@ CPedIK::RotateTorso(AnimBlendFrameData *animBlend, LimbOrientation *limb, bool c } void -CPedIK::GetComponentPosition(RwV3d *pos, PedNode node) +CPedIK::GetComponentPosition(RwV3d *pos, uint32 node) { RwFrame *f; RwMatrix *mat; diff --git a/src/peds/PedIK.h b/src/peds/PedIK.h index dc3f8dda..df9017f3 100644 --- a/src/peds/PedIK.h +++ b/src/peds/PedIK.h @@ -1,6 +1,5 @@ #pragma once #include "common.h" -#include "PedModelInfo.h" #include "AnimBlendClumpData.h" struct LimbOrientation @@ -52,7 +51,7 @@ public: bool PointGunInDirection(float phi, float theta); bool PointGunInDirectionUsingArm(float phi, float theta); bool PointGunAtPosition(CVector const& position); - void GetComponentPosition(RwV3d *pos, PedNode node); + void GetComponentPosition(RwV3d *pos, uint32 node); static RwMatrix *GetWorldMatrix(RwFrame *source, RwMatrix *destination); void RotateTorso(AnimBlendFrameData* animBlend, LimbOrientation* limb, bool changeRoll); void ExtractYawAndPitchLocal(RwMatrixTag *mat, float *yaw, float *pitch); diff --git a/src/peds/PedPlacement.cpp b/src/peds/PedPlacement.cpp index b22e1d58..e5f6a077 100644 --- a/src/peds/PedPlacement.cpp +++ b/src/peds/PedPlacement.cpp @@ -1,5 +1,6 @@ #include "common.h" #include "patcher.h" +#include "Ped.h" #include "PedPlacement.h" #include "World.h" diff --git a/src/peds/PedPlacement.h b/src/peds/PedPlacement.h index b1b5be93..6ba4ae71 100644 --- a/src/peds/PedPlacement.h +++ b/src/peds/PedPlacement.h @@ -1,7 +1,5 @@ #pragma once -#include "Ped.h" - class CPedPlacement { public: static void FindZCoorForPed(CVector* pos); diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp index 49d0183e..5275f716 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -1,11 +1,16 @@ #include "common.h"
#include "patcher.h"
#include "PlayerPed.h"
+#include "Wanted.h"
+#include "Fire.h"
+#include "DMAudio.h"
+#include "Pad.h"
#include "Camera.h"
#include "WeaponEffects.h"
#include "ModelIndices.h"
#include "World.h"
#include "RpAnimBlend.h"
+#include "AnimBlendAssociation.h"
#include "General.h"
#include "Pools.h"
#include "Darkel.h"
diff --git a/src/peds/PlayerPed.h b/src/peds/PlayerPed.h index b27cd983..c139bbbc 100644 --- a/src/peds/PlayerPed.h +++ b/src/peds/PlayerPed.h @@ -1,8 +1,10 @@ #pragma once #include "Ped.h" -#include "Wanted.h" -#include "Pad.h" + +class CPad; +class CCopPed; +class CWanted; class CPlayerPed : public CPed { diff --git a/src/peds/Population.cpp b/src/peds/Population.cpp index 6b674dd3..3bf81066 100644 --- a/src/peds/Population.cpp +++ b/src/peds/Population.cpp @@ -4,6 +4,8 @@ #include "General.h" #include "World.h" #include "Population.h" +#include "CopPed.h" +#include "Wanted.h" #include "FileMgr.h" #include "Gangs.h" #include "ModelIndices.h" @@ -11,6 +13,7 @@ #include "CivilianPed.h" #include "EmergencyPed.h" #include "Replay.h" +#include "Camera.h" #include "CutsceneMgr.h" #include "CarCtrl.h" #include "IniFile.h" @@ -110,7 +113,8 @@ CPopulation::ChooseCivilianOccupation(int32 group) return ms_pPedGroups[group].models[CGeneral::GetRandomNumberInRange(0, NUMMODELSPERPEDGROUP)]; } -eCopType +// returns eCopType +int32 CPopulation::ChoosePolicePedOccupation() { CGeneral::GetRandomNumber(); @@ -512,9 +516,9 @@ CPopulation::AddPed(ePedType pedType, uint32 miOrCopType, CVector const &coors) uint32 weapon; if (CGeneral::GetRandomNumberInRange(0, 100) >= 50) - weapon = ped->GiveWeapon(CGangs::GetGangInfo(pedType - PEDTYPE_GANG1)->m_Weapon2, 25001); + weapon = ped->GiveWeapon((eWeaponType)CGangs::GetGangInfo(pedType - PEDTYPE_GANG1)->m_Weapon2, 25001); else - weapon = ped->GiveWeapon(CGangs::GetGangInfo(pedType - PEDTYPE_GANG1)->m_Weapon1, 25001); + weapon = ped->GiveWeapon((eWeaponType)CGangs::GetGangInfo(pedType - PEDTYPE_GANG1)->m_Weapon1, 25001); ped->SetCurrentWeapon(weapon); return ped; } diff --git a/src/peds/Population.h b/src/peds/Population.h index b299c0a1..f9e6c3b7 100644 --- a/src/peds/Population.h +++ b/src/peds/Population.h @@ -2,11 +2,11 @@ #include "Game.h" #include "PedType.h" -#include "CopPed.h" class CPed; class CVehicle; class CDummyObject; +class CObject; struct PedGroup { @@ -71,7 +71,7 @@ public: static bool IsPointInSafeZone(CVector *coors); static void RemovePed(CPed *ent); static int32 ChooseCivilianOccupation(int32); - static eCopType ChoosePolicePedOccupation(); + static int32 ChoosePolicePedOccupation(); static int32 ChooseGangOccupation(int); static void FindCollisionZoneForCoors(CVector*, int*, eLevelName*); static void FindClosestZoneForCoors(CVector*, int*, eLevelName, eLevelName); diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp index 52930067..51aa390f 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -11,6 +11,7 @@ #include "Pad.h" #include "Radar.h" #include "Replay.h" +#include "Wanted.h" #include "Sprite.h" #include "Sprite2d.h" #include "Text.h" diff --git a/src/render/WaterCannon.cpp b/src/render/WaterCannon.cpp index 7a9aa4d9..e848fb43 100644 --- a/src/render/WaterCannon.cpp +++ b/src/render/WaterCannon.cpp @@ -1,10 +1,320 @@ #include "common.h" #include "patcher.h" #include "WaterCannon.h" +#include "Vector.h" +#include "General.h" +#include "main.h" +#include "Timer.h" +#include "Pools.h" +#include "Ped.h" +#include "AnimManager.h" +#include "Fire.h" +#include "WaterLevel.h" +#include "Camera.h" -CWaterCannon (&aCannons)[NUM_WATERCANNONS] = *(CWaterCannon(*)[NUM_WATERCANNONS])*(uintptr*)0x8F2CA8; +#define WATERCANNONVERTS 4 +#define WATERCANNONINDEXES 12 -WRAPPER void CWaterCannons::Update(void) { EAXJMP(0x522510); } -WRAPPER void CWaterCannons::UpdateOne(uint32 id, CVector *pos, CVector *dir) { EAXJMP(0x522470); } -WRAPPER void CWaterCannons::Render(void) { EAXJMP(0x522550); } -WRAPPER void CWaterCannons::Init(void) { EAXJMP(0x522440); } +RwIm3DVertex WaterCannonVertices[WATERCANNONVERTS]; +RwImVertexIndex WaterCannonIndexList[WATERCANNONINDEXES]; + +CWaterCannon CWaterCannons::aCannons[NUM_WATERCANNONS]; + +void CWaterCannon::Init(void) +{ + m_nId = 0; + m_nCur = 0; + m_nTimeCreated = CTimer::GetTimeInMilliseconds(); + + for ( int32 i = 0; i < NUM_SEGMENTPOINTS; i++ ) + m_abUsed[i] = false; + + RwIm3DVertexSetU(&WaterCannonVertices[0], 0.0f); + RwIm3DVertexSetV(&WaterCannonVertices[0], 0.0f); + + RwIm3DVertexSetU(&WaterCannonVertices[1], 1.0f); + RwIm3DVertexSetV(&WaterCannonVertices[1], 0.0f); + + RwIm3DVertexSetU(&WaterCannonVertices[2], 0.0f); + RwIm3DVertexSetV(&WaterCannonVertices[2], 0.0f); + + RwIm3DVertexSetU(&WaterCannonVertices[3], 1.0f); + RwIm3DVertexSetV(&WaterCannonVertices[3], 0.0f); + + WaterCannonIndexList[0] = 0; + WaterCannonIndexList[1] = 1; + WaterCannonIndexList[2] = 2; + + WaterCannonIndexList[3] = 1; + WaterCannonIndexList[4] = 3; + WaterCannonIndexList[5] = 2; + + WaterCannonIndexList[6] = 0; + WaterCannonIndexList[7] = 2; + WaterCannonIndexList[8] = 1; + + WaterCannonIndexList[9] = 1; + WaterCannonIndexList[10] = 2; + WaterCannonIndexList[11] = 3; +} + +void CWaterCannon::Update_OncePerFrame(int16 index) +{ + ASSERT(index < NUM_WATERCANNONS); + + if (CTimer::GetTimeInMilliseconds() > m_nTimeCreated + WATERCANNON_LIFETIME ) + { + m_nCur = (m_nCur + 1) % -NUM_SEGMENTPOINTS; + m_abUsed[m_nCur] = false; + } + + for ( int32 i = 0; i < NUM_SEGMENTPOINTS; i++ ) + { + if ( m_abUsed[i] ) + { + m_avecVelocity[i].z += -WATERCANNON_GRAVITY * CTimer::GetTimeStep(); + m_avecPos[i] += m_avecVelocity[i] * CTimer::GetTimeStep(); + } + } + + int32 extinguishingPoint = CGeneral::GetRandomNumber() & (NUM_SEGMENTPOINTS - 1); + if ( m_abUsed[extinguishingPoint] ) + gFireManager.ExtinguishPoint(m_avecPos[extinguishingPoint], 3.0f); + + if ( ((index + CTimer::GetFrameCounter()) & 3) == 0 ) + PushPeds(); + + // free if unused + + int32 i = 0; + while ( 1 ) + { + if ( m_abUsed[i] ) + break; + + if ( ++i >= NUM_SEGMENTPOINTS ) + { + m_nId = 0; + return; + } + } +} + +void CWaterCannon::Update_NewInput(CVector *pos, CVector *dir) +{ + ASSERT(pos != NULL); + ASSERT(dir != NULL); + + m_avecPos[m_nCur] = *pos; + m_avecVelocity[m_nCur] = *dir; + m_abUsed[m_nCur] = true; +} + +void CWaterCannon::Render(void) +{ + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE); + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)TRUE); + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)gpWaterRaster); + + float v = float(CGeneral::GetRandomNumber() & 255) / 256; + + RwIm3DVertexSetV(&WaterCannonVertices[0], v); + RwIm3DVertexSetV(&WaterCannonVertices[1], v); + RwIm3DVertexSetV(&WaterCannonVertices[2], v); + RwIm3DVertexSetV(&WaterCannonVertices[3], v); + + int16 pointA = m_nCur % -NUM_SEGMENTPOINTS; + + int16 pointB = pointA - 1; + if ( (pointA - 1) < 0 ) + pointB += NUM_SEGMENTPOINTS; + + bool bInit = false; + CVector norm; + + for ( int32 i = 0; i < NUM_SEGMENTPOINTS - 1; i++ ) + { + if ( m_abUsed[pointA] && m_abUsed[pointB] ) + { + if ( !bInit ) + { + CVector cp = CrossProduct(m_avecPos[pointB] - m_avecPos[pointA], TheCamera.GetForward()); + cp.Normalise(0.05f); + norm = cp; + bInit = true; + } + + float dist = float(i*i*i) / 300.0f + 1.0f; + float brightness = float(i) / NUM_SEGMENTPOINTS; + + int32 color = (int32)((1.0f - brightness*brightness) * 255.0f); + CVector offset = dist * norm; + + RwIm3DVertexSetRGBA(&WaterCannonVertices[0], color, color, color, color); + RwIm3DVertexSetPos (&WaterCannonVertices[0], m_avecPos[pointA].x - offset.x, m_avecPos[pointA].y - offset.y, m_avecPos[pointA].z - offset.z); + + RwIm3DVertexSetRGBA(&WaterCannonVertices[1], color, color, color, color); + RwIm3DVertexSetPos (&WaterCannonVertices[1], m_avecPos[pointA].x + offset.x, m_avecPos[pointA].y + offset.y, m_avecPos[pointA].z + offset.z); + + RwIm3DVertexSetRGBA(&WaterCannonVertices[2], color, color, color, color); + RwIm3DVertexSetPos (&WaterCannonVertices[2], m_avecPos[pointB].x - offset.x, m_avecPos[pointB].y - offset.y, m_avecPos[pointB].z - offset.z); + + RwIm3DVertexSetRGBA(&WaterCannonVertices[3], color, color, color, color); + RwIm3DVertexSetPos (&WaterCannonVertices[3], m_avecPos[pointB].x + offset.x, m_avecPos[pointB].y + offset.y, m_avecPos[pointB].z + offset.z); + + LittleTest(); + + if ( RwIm3DTransform(WaterCannonVertices, WATERCANNONVERTS, NULL, rwIM3D_VERTEXUV) ) + { + RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, WaterCannonIndexList, WATERCANNONINDEXES); + RwIm3DEnd(); + } + } + + pointA = pointB--; + if ( pointB < 0 ) + pointB += NUM_SEGMENTPOINTS; + } + + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)TRUE); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)FALSE); + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)FALSE); +} + +void CWaterCannon::PushPeds(void) +{ + float minx = 10000.0f; + float maxx = -10000.0f; + float miny = 10000.0f; + float maxy = -10000.0f; + float minz = 10000.0f; + float maxz = -10000.0f; + + for ( int32 i = 0; i < NUM_SEGMENTPOINTS; i++ ) + { + if ( m_abUsed[i] ) + { + minx = min(minx, m_avecPos[i].x); + maxx = max(maxx, m_avecPos[i].x); + + miny = min(miny, m_avecPos[i].y); + maxy = max(maxy, m_avecPos[i].y); + + minz = min(minz, m_avecPos[i].z); + maxz = max(maxz, m_avecPos[i].z); + } + } + + for ( int32 i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) + { + CPed *ped = CPools::GetPedPool()->GetSlot(i); + if ( ped ) + { + if ( ped->GetPosition().x > minx && ped->GetPosition().x < maxx + && ped->GetPosition().y > miny && ped->GetPosition().y < maxy + && ped->GetPosition().z > minz && ped->GetPosition().z < maxz ) + { + for ( int32 j = 0; j < NUM_SEGMENTPOINTS; j++ ) + { + if ( m_abUsed[j] ) + { + CVector dist = m_avecPos[j] - ped->GetPosition(); + + if ( dist.MagnitudeSqr() < 5.0f ) + { + int32 localDir = ped->GetLocalDirection(CVector2D(1.0f, 0.0f)); + + ped->bIsStanding = false; + + ped->ApplyMoveForce(0.0f, 0.0f, 2.0f * CTimer::GetTimeStep()); + + ped->m_vecMoveSpeed.x = (0.6f * m_avecVelocity[j].x + ped->m_vecMoveSpeed.x) * 0.5f; + ped->m_vecMoveSpeed.y = (0.6f * m_avecVelocity[j].y + ped->m_vecMoveSpeed.y) * 0.5f; + + ped->SetFall(2000, AnimationId(ANIM_KO_SKID_FRONT + localDir), 0); + + CFire *fire = ped->m_pFire; + if ( fire ) + fire->Extinguish(); + + j = NUM_SEGMENTPOINTS; + } + } + } + } + } + } +} + +void CWaterCannons::Init(void) +{ + for ( int32 i = 0; i < NUM_WATERCANNONS; i++ ) + aCannons[i].Init(); +} + +void CWaterCannons::UpdateOne(uint32 id, CVector *pos, CVector *dir) +{ + ASSERT(pos != NULL); + ASSERT(dir != NULL); + + // find the one by id + { + int32 n = 0; + while ( n < NUM_WATERCANNONS && id != aCannons[n].m_nId ) + n++; + + if ( n < NUM_WATERCANNONS ) + { + aCannons[n].Update_NewInput(pos, dir); + return; + } + } + + // if no luck then find a free one + { + int32 n = 0; + while ( n < NUM_WATERCANNONS && 0 != aCannons[n].m_nId ) + n++; + + if ( n < NUM_WATERCANNONS ) + { + aCannons[n].Init(); + aCannons[n].m_nId = id; + aCannons[n].Update_NewInput(pos, dir); + return; + } + } +} + +void CWaterCannons::Update(void) +{ + for ( int32 i = 0; i < NUM_WATERCANNONS; i++ ) + { + if ( aCannons[i].m_nId != 0 ) + aCannons[i].Update_OncePerFrame(i); + } +} + +void CWaterCannons::Render(void) +{ + for ( int32 i = 0; i < NUM_WATERCANNONS; i++ ) + { + if ( aCannons[i].m_nId != 0 ) + aCannons[i].Render(); + } +} + +STARTPATCHES + InjectHook(0x521A30, &CWaterCannon::Init, PATCH_JUMP); + InjectHook(0x521B80, &CWaterCannon::Update_OncePerFrame, PATCH_JUMP); + InjectHook(0x521CC0, &CWaterCannon::Update_NewInput, PATCH_JUMP); + InjectHook(0x521D30, &CWaterCannon::Render, PATCH_JUMP); + InjectHook(0x5220B0, &CWaterCannon::PushPeds, PATCH_JUMP); + InjectHook(0x522440, CWaterCannons::Init, PATCH_JUMP); + InjectHook(0x522470, CWaterCannons::UpdateOne, PATCH_JUMP); + InjectHook(0x522510, CWaterCannons::Update, PATCH_JUMP); + InjectHook(0x522550, CWaterCannons::Render, PATCH_JUMP); + //InjectHook(0x522B40, `global constructor keyed to'watercannon.cpp, PATCH_JUMP); + //InjectHook(0x522B60, CWaterCannon::CWaterCannon, PATCH_JUMP); +ENDPATCHES
\ No newline at end of file diff --git a/src/render/WaterCannon.h b/src/render/WaterCannon.h index c2b288f2..826dc78e 100644 --- a/src/render/WaterCannon.h +++ b/src/render/WaterCannon.h @@ -1,15 +1,29 @@ #pragma once +#define WATERCANNON_GRAVITY (0.009f) +#define WATERCANNON_LIFETIME (150) + class CWaterCannon { public: + enum + { + NUM_SEGMENTPOINTS = 16, + }; + int32 m_nId; - int16 m_wIndex; - char gap_6[2]; - int32 m_nTimeCreated; - CVector m_avecPos[16]; - CVector m_avecVelocity[16]; - char m_abUsed[16]; + int16 m_nCur; + char _pad0[2]; + uint32 m_nTimeCreated; + CVector m_avecPos[NUM_SEGMENTPOINTS]; + CVector m_avecVelocity[NUM_SEGMENTPOINTS]; + bool m_abUsed[NUM_SEGMENTPOINTS]; + + void Init(void); + void Update_OncePerFrame(int16 index); + void Update_NewInput(CVector *pos, CVector *dir); + void Render(void); + void PushPeds(void); }; static_assert(sizeof(CWaterCannon) == 412, "CWaterCannon: error"); @@ -17,11 +31,10 @@ static_assert(sizeof(CWaterCannon) == 412, "CWaterCannon: error"); class CWaterCannons { public: - static void Update(); + static CWaterCannon aCannons[NUM_WATERCANNONS]; + + static void Init(void); static void UpdateOne(uint32 id, CVector *pos, CVector *dir); + static void Update(); static void Render(void); - static void Init(void); -}; - -extern CWaterCannon (&aCannons)[NUM_WATERCANNONS]; - +};
\ No newline at end of file diff --git a/src/skel/win/resource.h b/src/skel/win/resource.h index 2fb3dc50..84dffb95 100644 --- a/src/skel/win/resource.h +++ b/src/skel/win/resource.h @@ -8,6 +8,7 @@ #define IDEXIT 1002 #define IDC_SELECTDEVICE 1005 +#define IDI_MAIN_ICON 1042 // Next default values for new objects // #ifdef APSTUDIO_INVOKED diff --git a/src/skel/win/win.rc b/src/skel/win/win.rc index 676b8ef7..379c473d 100644 --- a/src/skel/win/win.rc +++ b/src/skel/win/win.rc @@ -30,8 +30,18 @@ BEGIN WS_TABSTOP DEFPUSHBUTTON "EXIT",IDEXIT,103,69,52,14 DEFPUSHBUTTON "OK",IDOK,28,69,50,14 - LTEXT "Please select the device to use:",IDC_SELECTDEVICE,7,7, + LTEXT "Please select the Device To Use:",IDC_SELECTDEVICE,7,7, 137,8 END +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MAIN_ICON ICON DISCARDABLE "gta3.ico" + +/////////////////////////////////////////////////////////////////////////////
\ No newline at end of file diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index 44ff6b6d..8cb0cfa4 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -39,6 +39,7 @@ #include "PathFind.h" #include "AnimManager.h" #include "RpAnimBlend.h" +#include "AnimBlendAssociation.h" #include "Ped.h" #include "PlayerPed.h" #include "Object.h" diff --git a/src/vehicles/Heli.cpp b/src/vehicles/Heli.cpp index 9fc50651..3dc1deeb 100644 --- a/src/vehicles/Heli.cpp +++ b/src/vehicles/Heli.cpp @@ -19,6 +19,8 @@ #include "World.h" #include "WaterLevel.h" #include "PlayerPed.h" +#include "Wanted.h" +#include "DMAudio.h" #include "Object.h" #include "HandlingMgr.h" #include "Heli.h" diff --git a/src/vehicles/Plane.cpp b/src/vehicles/Plane.cpp index e44ff996..c2b9e493 100644 --- a/src/vehicles/Plane.cpp +++ b/src/vehicles/Plane.cpp @@ -7,6 +7,8 @@ #include "Streaming.h" #include "Replay.h" #include "Camera.h" +#include "DMAudio.h" +#include "Wanted.h" #include "Coronas.h" #include "Particle.h" #include "Explosion.h" diff --git a/src/vehicles/Train.cpp b/src/vehicles/Train.cpp index 6446e6d1..7d81fd57 100644 --- a/src/vehicles/Train.cpp +++ b/src/vehicles/Train.cpp @@ -10,6 +10,7 @@ #include "Coronas.h" #include "World.h" #include "Ped.h" +#include "DMAudio.h" #include "HandlingMgr.h" #include "Train.h" diff --git a/src/vehicles/Vehicle.cpp b/src/vehicles/Vehicle.cpp index 16e61e5f..1fe02953 100644 --- a/src/vehicles/Vehicle.cpp +++ b/src/vehicles/Vehicle.cpp @@ -16,6 +16,7 @@ #include "Renderer.h" #include "DMAudio.h" #include "Radar.h" +#include "Fire.h" #include "Darkel.h" bool &CVehicle::bWheelsOnlyCheat = *(bool *)0x95CD78; diff --git a/src/weapons/WeaponInfo.cpp b/src/weapons/WeaponInfo.cpp index 6884d347..a4a1a085 100644 --- a/src/weapons/WeaponInfo.cpp +++ b/src/weapons/WeaponInfo.cpp @@ -3,7 +3,9 @@ #include "main.h" #include "FileMgr.h" #include "WeaponInfo.h" +#include "AnimManager.h" #include "AnimBlendAssociation.h" +#include "Weapon.h" //CWeaponInfo (&CWeaponInfo::ms_apWeaponInfos)[14] = * (CWeaponInfo(*)[14]) * (uintptr*)0x6503EC; CWeaponInfo CWeaponInfo::ms_apWeaponInfos[WEAPONTYPE_TOTALWEAPONS]; diff --git a/src/weapons/WeaponInfo.h b/src/weapons/WeaponInfo.h index faa8bf7b..e2e71d23 100644 --- a/src/weapons/WeaponInfo.h +++ b/src/weapons/WeaponInfo.h @@ -1,7 +1,8 @@ #pragma once -#include "common.h" -#include "Weapon.h" -#include "AnimManager.h" + +enum AnimationId; +enum eWeaponFire; +enum eWeaponType; class CWeaponInfo { // static CWeaponInfo(&ms_apWeaponInfos)[14]; |