merge with master
This commit is contained in:
commit
101c21e064
@ -38,13 +38,12 @@ to reverse at the time, calling the original functions is acceptable.
|
|||||||
|
|
||||||
### Unreversed / incomplete classes (at least the ones we know)
|
### Unreversed / incomplete classes (at least the ones we know)
|
||||||
```
|
```
|
||||||
cAudioManager - being worked on
|
cAudioManager - WIP
|
||||||
CBoat
|
CBoat
|
||||||
CBrightLights
|
CBrightLights
|
||||||
CBulletInfo
|
CBulletInfo
|
||||||
CBulletTraces
|
CBulletTraces
|
||||||
CCamera
|
CCamera
|
||||||
CCopPed
|
|
||||||
CCrane
|
CCrane
|
||||||
CCranes
|
CCranes
|
||||||
CCullZone
|
CCullZone
|
||||||
@ -57,7 +56,7 @@ CGame
|
|||||||
CGarage
|
CGarage
|
||||||
CGarages
|
CGarages
|
||||||
CGlass
|
CGlass
|
||||||
CMenuManager
|
CMenuManager - WIP
|
||||||
CMotionBlurStreaks
|
CMotionBlurStreaks
|
||||||
CObject
|
CObject
|
||||||
CPacManPickups
|
CPacManPickups
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "MusicManager.h"
|
#include "MusicManager.h"
|
||||||
#include "Pad.h"
|
#include "Pad.h"
|
||||||
#include "Ped.h"
|
#include "Ped.h"
|
||||||
|
#include "Fire.h"
|
||||||
#include "Physical.h"
|
#include "Physical.h"
|
||||||
#include "Placeable.h"
|
#include "Placeable.h"
|
||||||
#include "Plane.h"
|
#include "Plane.h"
|
||||||
@ -7533,8 +7534,8 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
|
|||||||
void cAudioManager::ProcessWaterCannon(int32)
|
void cAudioManager::ProcessWaterCannon(int32)
|
||||||
{
|
{
|
||||||
for(int32 i = 0; i < NUM_WATERCANNONS; i++) {
|
for(int32 i = 0; i < NUM_WATERCANNONS; i++) {
|
||||||
if(aCannons[i].m_nId) {
|
if(CWaterCannons::aCannons[i].m_nId) {
|
||||||
m_sQueueSample.m_vecPos = aCannons[0].m_avecPos[aCannons[i].m_wIndex];
|
m_sQueueSample.m_vecPos = CWaterCannons::aCannons[0].m_avecPos[CWaterCannons::aCannons[i].m_nCur];
|
||||||
float distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos);
|
float distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos);
|
||||||
if(distSquared < 900.f) {
|
if(distSquared < 900.f) {
|
||||||
m_sQueueSample.m_fDistance = Sqrt(distSquared);
|
m_sQueueSample.m_fDistance = Sqrt(distSquared);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
#include "AudioScriptObject.h"
|
#include "AudioScriptObject.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
|
|
||||||
WRAPPER void cAudioScriptObject::SaveAllAudioScriptObjects(uint8 *buf, uint32 *size) { EAXJMP(0x57c460); }
|
WRAPPER void cAudioScriptObject::SaveAllAudioScriptObjects(uint8 *buf, uint32 *size) { EAXJMP(0x57c460); }
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "audio_enums.h"
|
#include "audio_enums.h"
|
||||||
#include "Wanted.h"
|
|
||||||
|
|
||||||
enum eSound : int16
|
enum eSound : int16
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "Hud.h"
|
#include "Hud.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
|
#include "Pad.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Wanted.h"
|
||||||
|
|
||||||
struct cAMCrime {
|
struct cAMCrime {
|
||||||
int32 type;
|
int32 type;
|
||||||
CVector position;
|
CVector position;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Entity.h"
|
|
||||||
|
class CEntity;
|
||||||
|
|
||||||
enum bridgeStates {
|
enum bridgeStates {
|
||||||
STATE_BRIDGE_LOCKED,
|
STATE_BRIDGE_LOCKED,
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
#include "HandlingMgr.h"
|
#include "HandlingMgr.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
|
#include "Fire.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "TrafficLights.h"
|
#include "TrafficLights.h"
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "Ped.h"
|
#include "Ped.h"
|
||||||
#include "PlayerInfo.h"
|
#include "PlayerInfo.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
#include "RoadBlocks.h"
|
#include "RoadBlocks.h"
|
||||||
@ -27,7 +28,7 @@
|
|||||||
#include "Streaming.h"
|
#include "Streaming.h"
|
||||||
#include "VisibilityPlugins.h"
|
#include "VisibilityPlugins.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
#include "Wanted.h"
|
#include "Fire.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "Zones.h"
|
#include "Zones.h"
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "Darkel.h"
|
#include "Darkel.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "DMAudio.h"
|
#include "DMAudio.h"
|
||||||
#include "Population.h"
|
#include "Population.h"
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Weapon.h"
|
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
|
|
||||||
class CVehicle;
|
class CVehicle;
|
||||||
class CPed;
|
class CPed;
|
||||||
|
enum eWeaponType;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "CutsceneMgr.h"
|
#include "CutsceneMgr.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "Messages.h"
|
#include "Messages.h"
|
||||||
#include "CarCtrl.h"
|
#include "CarCtrl.h"
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
#include "ModelIndices.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] = *(CGangInfo(*)[NUM_GANGS])*(uintptr*)0x6EDF78;
|
||||||
CGangInfo CGangs::Gang[NUM_GANGS];
|
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)
|
void CGangs::SetGangWeapons(int16 gang, int32 weapon1, int32 weapon2)
|
||||||
{
|
{
|
||||||
CGangInfo *gi = GetGangInfo(gang);
|
CGangInfo *gi = GetGangInfo(gang);
|
||||||
gi->m_Weapon1 = (eWeaponType)weapon1;
|
gi->m_Weapon1 = weapon1;
|
||||||
gi->m_Weapon2 = (eWeaponType)weapon2;
|
gi->m_Weapon2 = weapon2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGangs::SetGangPedModelOverride(int16 gang, int8 ovrd)
|
void CGangs::SetGangPedModelOverride(int16 gang, int8 ovrd)
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Weapon.h"
|
|
||||||
|
|
||||||
struct CGangInfo
|
struct CGangInfo
|
||||||
{
|
{
|
||||||
int32 m_nVehicleMI;
|
int32 m_nVehicleMI;
|
||||||
int8 m_nPedModelOverride;
|
int8 m_nPedModelOverride;
|
||||||
eWeaponType m_Weapon1;
|
int32 m_Weapon1;
|
||||||
eWeaponType m_Weapon2;
|
int32 m_Weapon2;
|
||||||
|
|
||||||
CGangInfo();
|
CGangInfo();
|
||||||
};
|
};
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "General.h"
|
#include "General.h"
|
||||||
#include "AudioScriptObject.h"
|
#include "AudioScriptObject.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
|
|
||||||
CPhoneInfo &gPhoneInfo = *(CPhoneInfo*)0x732A20;
|
CPhoneInfo &gPhoneInfo = *(CPhoneInfo*)0x732A20;
|
||||||
|
|
||||||
|
@ -15,6 +15,9 @@
|
|||||||
#include "Pad.h"
|
#include "Pad.h"
|
||||||
#include "Pickups.h"
|
#include "Pickups.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
|
#include "Fire.h"
|
||||||
#include "PointLights.h"
|
#include "PointLights.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Script.h"
|
#include "Script.h"
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "SpecialFX.h"
|
#include "SpecialFX.h"
|
||||||
#include "CarCtrl.h"
|
#include "CarCtrl.h"
|
||||||
#include "CivilianPed.h"
|
#include "CivilianPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "Clock.h"
|
#include "Clock.h"
|
||||||
#include "DMAudio.h"
|
#include "DMAudio.h"
|
||||||
#include "Draw.h"
|
#include "Draw.h"
|
||||||
@ -22,6 +23,8 @@
|
|||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Population.h"
|
#include "Population.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
|
#include "References.h"
|
||||||
|
#include "Pools.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
#include "RwHelper.h"
|
#include "RwHelper.h"
|
||||||
#include "CutsceneMgr.h"
|
#include "CutsceneMgr.h"
|
||||||
@ -33,6 +36,8 @@
|
|||||||
#include "Zones.h"
|
#include "Zones.h"
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
|
#include "Camera.h"
|
||||||
|
#include "Radar.h"
|
||||||
|
|
||||||
uint8 &CReplay::Mode = *(uint8*)0x95CD5B;
|
uint8 &CReplay::Mode = *(uint8*)0x95CD5B;
|
||||||
CAddressInReplayBuffer &CReplay::Record = *(CAddressInReplayBuffer*)0x942F7C;
|
CAddressInReplayBuffer &CReplay::Record = *(CAddressInReplayBuffer*)0x942F7C;
|
||||||
|
@ -1,14 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Camera.h"
|
|
||||||
#include "Ped.h"
|
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Radar.h"
|
|
||||||
#include "References.h"
|
|
||||||
#include "Vehicle.h"
|
|
||||||
#include "Wanted.h"
|
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
#ifndef DONT_FIX_REPLAY_BUGS
|
#ifndef DONT_FIX_REPLAY_BUGS
|
||||||
@ -16,6 +9,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class CVehicle;
|
||||||
|
struct CReference;
|
||||||
|
|
||||||
struct CAddressInReplayBuffer
|
struct CAddressInReplayBuffer
|
||||||
{
|
{
|
||||||
uint32 m_nOffset;
|
uint32 m_nOffset;
|
||||||
|
@ -53,6 +53,8 @@
|
|||||||
#include "Restart.h"
|
#include "Restart.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
|
#include "Fire.h"
|
||||||
#include "Rubbish.h"
|
#include "Rubbish.h"
|
||||||
#include "Shadows.h"
|
#include "Shadows.h"
|
||||||
#include "SpecialFX.h"
|
#include "SpecialFX.h"
|
||||||
@ -65,6 +67,7 @@
|
|||||||
#include "Weather.h"
|
#include "Weather.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "Zones.h"
|
#include "Zones.h"
|
||||||
|
#include "Radar.h"
|
||||||
|
|
||||||
#define PICKUP_PLACEMENT_OFFSET 0.5f
|
#define PICKUP_PLACEMENT_OFFSET 0.5f
|
||||||
#define PED_FIND_Z_OFFSET 5.0f
|
#define PED_FIND_Z_OFFSET 5.0f
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "Clock.h"
|
#include "Clock.h"
|
||||||
#include "Timecycle.h"
|
#include "Timecycle.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
#include "Shadows.h"
|
#include "Shadows.h"
|
||||||
#include "Radar.h"
|
#include "Radar.h"
|
||||||
#include "Hud.h"
|
#include "Hud.h"
|
||||||
@ -207,6 +208,7 @@ PlayAnimation(RpClump *clump, AssocGroupId animGroup, AnimationId anim)
|
|||||||
animAssoc->SetRun();
|
animAssoc->SetRun();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void (*DebugMenuProcess)(void);
|
||||||
void
|
void
|
||||||
CAnimViewer::Update(void)
|
CAnimViewer::Update(void)
|
||||||
{
|
{
|
||||||
@ -246,6 +248,9 @@ CAnimViewer::Update(void)
|
|||||||
}
|
}
|
||||||
CPad::UpdatePads();
|
CPad::UpdatePads();
|
||||||
CPad* pad = CPad::GetPad(0);
|
CPad* pad = CPad::GetPad(0);
|
||||||
|
|
||||||
|
DebugMenuProcess();
|
||||||
|
|
||||||
CStreaming::UpdateForAnimViewer();
|
CStreaming::UpdateForAnimViewer();
|
||||||
CStreaming::RequestModel(modelId, 0);
|
CStreaming::RequestModel(modelId, 0);
|
||||||
if (CStreaming::HasModelLoaded(modelId)) {
|
if (CStreaming::HasModelLoaded(modelId)) {
|
||||||
|
@ -1530,7 +1530,7 @@ CCam::Process_FollowPedWithMouse(const CVector &CameraTarget, float TargetOrient
|
|||||||
CamDist = fBaseDist + Cos(Alpha)*fAngleDist;
|
CamDist = fBaseDist + Cos(Alpha)*fAngleDist;
|
||||||
|
|
||||||
if(TheCamera.m_bUseTransitionBeta)
|
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)
|
if(TheCamera.m_bCamDirectlyBehind)
|
||||||
Beta = TheCamera.m_PedOrientForBehindOrInFront;
|
Beta = TheCamera.m_PedOrientForBehindOrInFront;
|
||||||
|
@ -9,12 +9,14 @@
|
|||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "AnimManager.h"
|
#include "AnimManager.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
#include "AnimBlendAssocGroup.h"
|
#include "AnimBlendAssocGroup.h"
|
||||||
#include "AnimBlendClumpData.h"
|
#include "AnimBlendClumpData.h"
|
||||||
#include "Pad.h"
|
#include "Pad.h"
|
||||||
#include "DMAudio.h"
|
#include "DMAudio.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "CutsceneHead.h"
|
#include "CutsceneHead.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
|
@ -212,7 +212,7 @@ CEventList::ReportCrimeForEvent(eEventType type, int32 crimeId, bool copsDontCar
|
|||||||
|
|
||||||
#ifdef VC_PED_PORTS
|
#ifdef VC_PED_PORTS
|
||||||
if (crime == CRIME_HIT_PED && ((CPed*)crimeId)->IsPointerValid() &&
|
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()) {
|
if(!((CPed*)crimeId)->DyingOrDead()) {
|
||||||
sprintf(gString, "$50 Good Citizen Bonus!");
|
sprintf(gString, "$50 Good Citizen Bonus!");
|
||||||
|
@ -94,7 +94,6 @@ int32 *&pControlEdit = *(int32**)0x628D08;
|
|||||||
bool &DisplayComboButtonErrMsg = *(bool*)0x628D14;
|
bool &DisplayComboButtonErrMsg = *(bool*)0x628D14;
|
||||||
int32 &MouseButtonJustClicked = *(int32*)0x628D0C;
|
int32 &MouseButtonJustClicked = *(int32*)0x628D0C;
|
||||||
int32 &JoyButtonJustClicked = *(int32*)0x628D10;
|
int32 &JoyButtonJustClicked = *(int32*)0x628D10;
|
||||||
uint32 &nTimeForSomething = *(uint32*)0x628D54;
|
|
||||||
bool &holdingScrollBar = *(bool*)0x628D59;
|
bool &holdingScrollBar = *(bool*)0x628D59;
|
||||||
//int32 *pControlTemp = 0;
|
//int32 *pControlTemp = 0;
|
||||||
|
|
||||||
@ -2202,15 +2201,15 @@ CMenuManager::ProcessButtonPresses(void)
|
|||||||
field_535 = false;
|
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_bPressedPgUpOnList = false;
|
||||||
m_bPressedPgDnOnList = false;
|
m_bPressedPgDnOnList = false;
|
||||||
m_bPressedUpOnList = false;
|
m_bPressedUpOnList = false;
|
||||||
m_bPressedDownOnList = false;
|
m_bPressedDownOnList = false;
|
||||||
m_bPressedScrollButton = false;
|
m_bPressedScrollButton = false;
|
||||||
nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode();
|
lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CPad::GetPad(0)->GetTabJustDown()) {
|
if (CPad::GetPad(0)->GetTabJustDown()) {
|
||||||
@ -2249,7 +2248,7 @@ CMenuManager::ProcessButtonPresses(void)
|
|||||||
m_nCurrExLayer = 19;
|
m_nCurrExLayer = 19;
|
||||||
if (!m_bPressedUpOnList) {
|
if (!m_bPressedUpOnList) {
|
||||||
m_bPressedUpOnList = true;
|
m_bPressedUpOnList = true;
|
||||||
nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode();
|
lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode();
|
||||||
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
||||||
ScrollUpListByOne();
|
ScrollUpListByOne();
|
||||||
}
|
}
|
||||||
@ -2271,7 +2270,7 @@ CMenuManager::ProcessButtonPresses(void)
|
|||||||
m_nCurrExLayer = 19;
|
m_nCurrExLayer = 19;
|
||||||
if (!m_bPressedDownOnList) {
|
if (!m_bPressedDownOnList) {
|
||||||
m_bPressedDownOnList = true;
|
m_bPressedDownOnList = true;
|
||||||
nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode();
|
lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode();
|
||||||
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
||||||
ScrollDownListByOne();
|
ScrollDownListByOne();
|
||||||
}
|
}
|
||||||
@ -2286,7 +2285,7 @@ CMenuManager::ProcessButtonPresses(void)
|
|||||||
m_nCurrExLayer = 19;
|
m_nCurrExLayer = 19;
|
||||||
if (!m_bPressedPgUpOnList) {
|
if (!m_bPressedPgUpOnList) {
|
||||||
m_bPressedPgUpOnList = true;
|
m_bPressedPgUpOnList = true;
|
||||||
nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode();
|
lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode();
|
||||||
m_bShowMouse = false;
|
m_bShowMouse = false;
|
||||||
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
||||||
PageUpList(false);
|
PageUpList(false);
|
||||||
@ -2298,7 +2297,7 @@ CMenuManager::ProcessButtonPresses(void)
|
|||||||
m_nCurrExLayer = 19;
|
m_nCurrExLayer = 19;
|
||||||
if (!m_bPressedPgDnOnList) {
|
if (!m_bPressedPgDnOnList) {
|
||||||
m_bPressedPgDnOnList = true;
|
m_bPressedPgDnOnList = true;
|
||||||
nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode();
|
lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode();
|
||||||
m_bShowMouse = false;
|
m_bShowMouse = false;
|
||||||
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0);
|
||||||
PageDownList(false);
|
PageDownList(false);
|
||||||
@ -2384,7 +2383,7 @@ CMenuManager::ProcessButtonPresses(void)
|
|||||||
case HOVEROPTION_CLICKED_SCROLL_UP:
|
case HOVEROPTION_CLICKED_SCROLL_UP:
|
||||||
if (!m_bPressedScrollButton) {
|
if (!m_bPressedScrollButton) {
|
||||||
m_bPressedScrollButton = true;
|
m_bPressedScrollButton = true;
|
||||||
nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode();
|
lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode();
|
||||||
ScrollUpListByOne();
|
ScrollUpListByOne();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2392,7 +2391,7 @@ CMenuManager::ProcessButtonPresses(void)
|
|||||||
case HOVEROPTION_CLICKED_SCROLL_DOWN:
|
case HOVEROPTION_CLICKED_SCROLL_DOWN:
|
||||||
if (!m_bPressedScrollButton) {
|
if (!m_bPressedScrollButton) {
|
||||||
m_bPressedScrollButton = true;
|
m_bPressedScrollButton = true;
|
||||||
nTimeForSomething = CTimer::GetTimeInMillisecondsPauseMode();
|
lastTimeClickedScrollButton = CTimer::GetTimeInMillisecondsPauseMode();
|
||||||
ScrollDownListByOne();
|
ScrollDownListByOne();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -3593,7 +3592,7 @@ void CMenuManager::SwitchMenuOnAndOff()
|
|||||||
PcSaveHelper.PopulateSlotInfo();
|
PcSaveHelper.PopulateSlotInfo();
|
||||||
m_nCurrOption = 0;
|
m_nCurrOption = 0;
|
||||||
}
|
}
|
||||||
/* // PS2 leftover?
|
/* // PS2 leftover
|
||||||
if (m_nCurrScreen != MENUPAGE_SOUND_SETTINGS && gMusicPlaying)
|
if (m_nCurrScreen != MENUPAGE_SOUND_SETTINGS && gMusicPlaying)
|
||||||
{
|
{
|
||||||
DMAudio.StopFrontEndTrack();
|
DMAudio.StopFrontEndTrack();
|
||||||
|
@ -41,6 +41,8 @@
|
|||||||
#include "Record.h"
|
#include "Record.h"
|
||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
|
#include "References.h"
|
||||||
|
#include "Radar.h"
|
||||||
#include "Restart.h"
|
#include "Restart.h"
|
||||||
#include "RoadBlocks.h"
|
#include "RoadBlocks.h"
|
||||||
#include "PedRoutes.h"
|
#include "PedRoutes.h"
|
||||||
|
@ -574,8 +574,9 @@ void CPad::AffectFromXinput(uint32 pad)
|
|||||||
PCTempJoyState.RightShoulder2 = xstate.Gamepad.bRightTrigger;
|
PCTempJoyState.RightShoulder2 = xstate.Gamepad.bRightTrigger;
|
||||||
|
|
||||||
PCTempJoyState.Select = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 255 : 0;
|
PCTempJoyState.Select = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 255 : 0;
|
||||||
|
#ifdef REGISTER_START_BUTTON
|
||||||
PCTempJoyState.Start = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 255 : 0;
|
PCTempJoyState.Start = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 255 : 0;
|
||||||
|
#endif
|
||||||
float lx = (float)xstate.Gamepad.sThumbLX / (float)0x7FFF;
|
float lx = (float)xstate.Gamepad.sThumbLX / (float)0x7FFF;
|
||||||
float ly = (float)xstate.Gamepad.sThumbLY / (float)0x7FFF;
|
float ly = (float)xstate.Gamepad.sThumbLY / (float)0x7FFF;
|
||||||
float rx = (float)xstate.Gamepad.sThumbRX / (float)0x7FFF;
|
float rx = (float)xstate.Gamepad.sThumbRX / (float)0x7FFF;
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "PlayerInfo.h"
|
#include "PlayerInfo.h"
|
||||||
|
#include "Fire.h"
|
||||||
#include "Frontend.h"
|
#include "Frontend.h"
|
||||||
#include "PlayerSkin.h"
|
#include "PlayerSkin.h"
|
||||||
#include "Darkel.h"
|
#include "Darkel.h"
|
||||||
@ -12,6 +14,7 @@
|
|||||||
#include "Remote.h"
|
#include "Remote.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
|
#include "Camera.h"
|
||||||
#include "Pad.h"
|
#include "Pad.h"
|
||||||
#include "ProjectileInfo.h"
|
#include "ProjectileInfo.h"
|
||||||
#include "Explosion.h"
|
#include "Explosion.h"
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "TxdStore.h"
|
#include "TxdStore.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "Directory.h"
|
#include "Directory.h"
|
||||||
#include "RwHelper.h"
|
#include "RwHelper.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
@ -39,6 +39,14 @@ public:
|
|||||||
x = 1.0f;
|
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) {
|
const CVector &operator+=(CVector const &right) {
|
||||||
x += right.x;
|
x += right.x;
|
||||||
y += right.y;
|
y += right.y;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Radar.h"
|
#include "Radar.h"
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
|
#include "DummyObject.h"
|
||||||
|
|
||||||
WRAPPER void CObject::ObjectDamage(float amount) { EAXJMP(0x4BB240); }
|
WRAPPER void CObject::ObjectDamage(float amount) { EAXJMP(0x4BB240); }
|
||||||
WRAPPER void CObject::DeleteAllTempObjectInArea(CVector, float) { EAXJMP(0x4BBED0); }
|
WRAPPER void CObject::DeleteAllTempObjectInArea(CVector, float) { EAXJMP(0x4BBED0); }
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Physical.h"
|
#include "Physical.h"
|
||||||
#include "DummyObject.h"
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
GAME_OBJECT = 1,
|
GAME_OBJECT = 1,
|
||||||
@ -26,6 +25,7 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class CVehicle;
|
class CVehicle;
|
||||||
|
class CDummyObject;
|
||||||
|
|
||||||
class CObject : public CPhysical
|
class CObject : public CPhysical
|
||||||
{
|
{
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#include "Phones.h"
|
#include "Phones.h"
|
||||||
#include "General.h"
|
#include "General.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
#include "SurfaceTable.h"
|
#include "SurfaceTable.h"
|
||||||
|
@ -3,15 +3,19 @@
|
|||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
#include "CopPed.h"
|
#include "CopPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
#include "General.h"
|
#include "General.h"
|
||||||
#include "ZoneCull.h"
|
#include "ZoneCull.h"
|
||||||
#include "PathFind.h"
|
#include "PathFind.h"
|
||||||
#include "RoadBlocks.h"
|
#include "RoadBlocks.h"
|
||||||
|
#include "CarCtrl.h"
|
||||||
WRAPPER void CCopPed::ProcessControl() { EAXJMP(0x4C1400); }
|
#include "Renderer.h"
|
||||||
|
#include "Camera.h"
|
||||||
|
|
||||||
CCopPed::CCopPed(eCopType copType) : CPed(PEDTYPE_COP)
|
CCopPed::CCopPed(eCopType copType) : CPed(PEDTYPE_COP)
|
||||||
{
|
{
|
||||||
@ -62,12 +66,12 @@ CCopPed::CCopPed(eCopType copType) : CPed(PEDTYPE_COP)
|
|||||||
field_1356 = 0;
|
field_1356 = 0;
|
||||||
m_attackTimer = 0;
|
m_attackTimer = 0;
|
||||||
m_bBeatingSuspect = false;
|
m_bBeatingSuspect = false;
|
||||||
m_bZoneDisabledButClose = false;
|
m_bStopAndShootDisabledZone = false;
|
||||||
m_bZoneDisabled = false;
|
m_bZoneDisabled = false;
|
||||||
field_1364 = -1;
|
field_1364 = -1;
|
||||||
m_pPointGunAt = nil;
|
m_pPointGunAt = nil;
|
||||||
|
|
||||||
// VC also initializes in here, but it keeps object
|
// VC also initializes in here, but as nil
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
m_wRoadblockNode = -1;
|
m_wRoadblockNode = -1;
|
||||||
#endif
|
#endif
|
||||||
@ -171,7 +175,7 @@ CCopPed::ClearPursuit(void)
|
|||||||
bIsRunning = false;
|
bIsRunning = false;
|
||||||
bNotAllowedToDuck = false;
|
bNotAllowedToDuck = false;
|
||||||
bKindaStayInSamePlace = false;
|
bKindaStayInSamePlace = false;
|
||||||
m_bZoneDisabledButClose = false;
|
m_bStopAndShootDisabledZone = false;
|
||||||
m_bZoneDisabled = false;
|
m_bZoneDisabled = false;
|
||||||
ClearObjective();
|
ClearObjective();
|
||||||
if (IsPedInControl()) {
|
if (IsPedInControl()) {
|
||||||
@ -213,7 +217,7 @@ CCopPed::SetPursuit(bool ignoreCopLimit)
|
|||||||
SetObjectiveTimer(0);
|
SetObjectiveTimer(0);
|
||||||
bNotAllowedToDuck = true;
|
bNotAllowedToDuck = true;
|
||||||
bIsRunning = true;
|
bIsRunning = true;
|
||||||
m_bZoneDisabledButClose = false;
|
m_bStopAndShootDisabledZone = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -315,13 +319,15 @@ CCopPed::CopAI(void)
|
|||||||
m_prevObjective = OBJECTIVE_NONE;
|
m_prevObjective = OBJECTIVE_NONE;
|
||||||
m_nLastPedState = PED_NONE;
|
m_nLastPedState = PED_NONE;
|
||||||
SetAttackTimer(0);
|
SetAttackTimer(0);
|
||||||
|
|
||||||
|
// Safe distance for disabled zone? Or to just make game easier?
|
||||||
if (m_fDistanceToTarget > 15.0f)
|
if (m_fDistanceToTarget > 15.0f)
|
||||||
m_bZoneDisabledButClose = true;
|
m_bStopAndShootDisabledZone = true;
|
||||||
}
|
}
|
||||||
} else if (m_bZoneDisabled && !CCullZones::NoPolice()) {
|
} else if (m_bZoneDisabled && !CCullZones::NoPolice()) {
|
||||||
m_bZoneDisabled = false;
|
m_bZoneDisabled = false;
|
||||||
m_bIsDisabledCop = false;
|
m_bIsDisabledCop = false;
|
||||||
m_bZoneDisabledButClose = false;
|
m_bStopAndShootDisabledZone = false;
|
||||||
bKindaStayInSamePlace = false;
|
bKindaStayInSamePlace = false;
|
||||||
bCrouchWhenShooting = false;
|
bCrouchWhenShooting = false;
|
||||||
bDuckAndCover = false;
|
bDuckAndCover = false;
|
||||||
@ -524,7 +530,7 @@ CCopPed::CopAI(void)
|
|||||||
if (!anotherCopChasesHim) {
|
if (!anotherCopChasesHim) {
|
||||||
SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, nearPed);
|
SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, nearPed);
|
||||||
nearPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, this);
|
nearPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, this);
|
||||||
nearPed->m_ped_flagE2 = true;
|
nearPed->bBeingChasedByPolice = true;
|
||||||
return;
|
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>
|
#include <new>
|
||||||
|
|
||||||
class CCopPed_ : public CCopPed
|
class CCopPed_ : public CCopPed
|
||||||
@ -558,11 +744,13 @@ class CCopPed_ : public CCopPed
|
|||||||
public:
|
public:
|
||||||
CCopPed *ctor(eCopType type) { return ::new (this) CCopPed(type); };
|
CCopPed *ctor(eCopType type) { return ::new (this) CCopPed(type); };
|
||||||
void dtor(void) { CCopPed::~CCopPed(); }
|
void dtor(void) { CCopPed::~CCopPed(); }
|
||||||
|
void ProcessControl_(void) { CCopPed::ProcessControl(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
STARTPATCHES
|
STARTPATCHES
|
||||||
InjectHook(0x4C11B0, &CCopPed_::ctor, PATCH_JUMP);
|
InjectHook(0x4C11B0, &CCopPed_::ctor, PATCH_JUMP);
|
||||||
InjectHook(0x4C13E0, &CCopPed_::dtor, PATCH_JUMP);
|
InjectHook(0x4C13E0, &CCopPed_::dtor, PATCH_JUMP);
|
||||||
|
InjectHook(0x4C1400, &CCopPed_::ProcessControl_, PATCH_JUMP);
|
||||||
InjectHook(0x4C28C0, &CCopPed::ClearPursuit, PATCH_JUMP);
|
InjectHook(0x4C28C0, &CCopPed::ClearPursuit, PATCH_JUMP);
|
||||||
InjectHook(0x4C2B00, &CCopPed::SetArrestPlayer, PATCH_JUMP);
|
InjectHook(0x4C2B00, &CCopPed::SetArrestPlayer, PATCH_JUMP);
|
||||||
InjectHook(0x4C27D0, &CCopPed::SetPursuit, PATCH_JUMP);
|
InjectHook(0x4C27D0, &CCopPed::SetPursuit, PATCH_JUMP);
|
||||||
|
@ -17,10 +17,10 @@ public:
|
|||||||
int8 field_1343;
|
int8 field_1343;
|
||||||
float m_fDistanceToTarget;
|
float m_fDistanceToTarget;
|
||||||
int8 m_bIsInPursuit;
|
int8 m_bIsInPursuit;
|
||||||
int8 m_bIsDisabledCop; // What disabled cop actually is?
|
int8 m_bIsDisabledCop;
|
||||||
int8 field_1350;
|
int8 field_1350;
|
||||||
bool m_bBeatingSuspect;
|
bool m_bBeatingSuspect;
|
||||||
int8 m_bZoneDisabledButClose;
|
int8 m_bStopAndShootDisabledZone;
|
||||||
int8 m_bZoneDisabled;
|
int8 m_bZoneDisabled;
|
||||||
int8 field_1354;
|
int8 field_1354;
|
||||||
int8 field_1355;
|
int8 field_1355;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
#include "EmergencyPed.h"
|
#include "EmergencyPed.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
#include "Fire.h"
|
#include "Fire.h"
|
||||||
|
@ -7,13 +7,21 @@
|
|||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
#include "Ped.h"
|
#include "Ped.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "PedType.h"
|
||||||
|
#include "AnimBlendClumpData.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
|
#include "Fire.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
#include "General.h"
|
#include "General.h"
|
||||||
#include "SurfaceTable.h"
|
#include "SurfaceTable.h"
|
||||||
#include "VisibilityPlugins.h"
|
#include "VisibilityPlugins.h"
|
||||||
#include "AudioManager.h"
|
#include "AudioManager.h"
|
||||||
#include "HandlingMgr.h"
|
#include "HandlingMgr.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
|
#include "Camera.h"
|
||||||
|
#include "Radar.h"
|
||||||
#include "PedPlacement.h"
|
#include "PedPlacement.h"
|
||||||
#include "Shadows.h"
|
#include "Shadows.h"
|
||||||
#include "Weather.h"
|
#include "Weather.h"
|
||||||
@ -552,7 +560,7 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
|
|||||||
bScriptObjectiveCompleted = false;
|
bScriptObjectiveCompleted = false;
|
||||||
|
|
||||||
bKindaStayInSamePlace = false;
|
bKindaStayInSamePlace = false;
|
||||||
m_ped_flagE2 = false;
|
bBeingChasedByPolice = false;
|
||||||
bNotAllowedToDuck = false;
|
bNotAllowedToDuck = false;
|
||||||
bCrouchWhenShooting = false;
|
bCrouchWhenShooting = false;
|
||||||
bIsDucking = false;
|
bIsDucking = false;
|
||||||
@ -9597,7 +9605,7 @@ CPed::ProcessControl(void)
|
|||||||
float neededTurnToCriminal = angleToLookCriminal - angleToFace;
|
float neededTurnToCriminal = angleToLookCriminal - angleToFace;
|
||||||
|
|
||||||
if (neededTurnToCriminal > DEGTORAD(150.0f) && neededTurnToCriminal < DEGTORAD(210.0f)) {
|
if (neededTurnToCriminal > DEGTORAD(150.0f) && neededTurnToCriminal < DEGTORAD(210.0f)) {
|
||||||
((CCopPed*)this)->m_bZoneDisabledButClose = true;
|
((CCopPed*)this)->m_bStopAndShootDisabledZone = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,14 +3,9 @@
|
|||||||
#include "Physical.h"
|
#include "Physical.h"
|
||||||
#include "Weapon.h"
|
#include "Weapon.h"
|
||||||
#include "PedStats.h"
|
#include "PedStats.h"
|
||||||
#include "PedType.h"
|
|
||||||
#include "PedIK.h"
|
#include "PedIK.h"
|
||||||
#include "AnimManager.h"
|
#include "AnimManager.h"
|
||||||
#include "AnimBlendClumpData.h"
|
|
||||||
#include "AnimBlendAssociation.h"
|
|
||||||
#include "WeaponInfo.h"
|
#include "WeaponInfo.h"
|
||||||
#include "Fire.h"
|
|
||||||
#include "DMAudio.h"
|
|
||||||
#include "EventList.h"
|
#include "EventList.h"
|
||||||
|
|
||||||
#define FEET_OFFSET 1.04f
|
#define FEET_OFFSET 1.04f
|
||||||
@ -19,6 +14,10 @@
|
|||||||
struct CPathNode;
|
struct CPathNode;
|
||||||
class CAccident;
|
class CAccident;
|
||||||
class CObject;
|
class CObject;
|
||||||
|
class CFire;
|
||||||
|
struct AnimBlendFrameData;
|
||||||
|
class CAnimBlendAssociation;
|
||||||
|
enum eCrimeType;
|
||||||
|
|
||||||
struct PedAudioData
|
struct PedAudioData
|
||||||
{
|
{
|
||||||
@ -339,7 +338,7 @@ public:
|
|||||||
uint8 bScriptObjectiveCompleted : 1;
|
uint8 bScriptObjectiveCompleted : 1;
|
||||||
|
|
||||||
uint8 bKindaStayInSamePlace : 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 bNotAllowedToDuck : 1;
|
||||||
uint8 bCrouchWhenShooting : 1;
|
uint8 bCrouchWhenShooting : 1;
|
||||||
uint8 bIsDucking : 1;
|
uint8 bIsDucking : 1;
|
||||||
|
@ -80,7 +80,7 @@ CPedIK::RotateTorso(AnimBlendFrameData *animBlend, LimbOrientation *limb, bool c
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CPedIK::GetComponentPosition(RwV3d *pos, PedNode node)
|
CPedIK::GetComponentPosition(RwV3d *pos, uint32 node)
|
||||||
{
|
{
|
||||||
RwFrame *f;
|
RwFrame *f;
|
||||||
RwMatrix *mat;
|
RwMatrix *mat;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "PedModelInfo.h"
|
|
||||||
#include "AnimBlendClumpData.h"
|
#include "AnimBlendClumpData.h"
|
||||||
|
|
||||||
struct LimbOrientation
|
struct LimbOrientation
|
||||||
@ -52,7 +51,7 @@ public:
|
|||||||
bool PointGunInDirection(float phi, float theta);
|
bool PointGunInDirection(float phi, float theta);
|
||||||
bool PointGunInDirectionUsingArm(float phi, float theta);
|
bool PointGunInDirectionUsingArm(float phi, float theta);
|
||||||
bool PointGunAtPosition(CVector const& position);
|
bool PointGunAtPosition(CVector const& position);
|
||||||
void GetComponentPosition(RwV3d *pos, PedNode node);
|
void GetComponentPosition(RwV3d *pos, uint32 node);
|
||||||
static RwMatrix *GetWorldMatrix(RwFrame *source, RwMatrix *destination);
|
static RwMatrix *GetWorldMatrix(RwFrame *source, RwMatrix *destination);
|
||||||
void RotateTorso(AnimBlendFrameData* animBlend, LimbOrientation* limb, bool changeRoll);
|
void RotateTorso(AnimBlendFrameData* animBlend, LimbOrientation* limb, bool changeRoll);
|
||||||
void ExtractYawAndPitchLocal(RwMatrixTag *mat, float *yaw, float *pitch);
|
void ExtractYawAndPitchLocal(RwMatrixTag *mat, float *yaw, float *pitch);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
|
#include "Ped.h"
|
||||||
#include "PedPlacement.h"
|
#include "PedPlacement.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Ped.h"
|
|
||||||
|
|
||||||
class CPedPlacement {
|
class CPedPlacement {
|
||||||
public:
|
public:
|
||||||
static void FindZCoorForPed(CVector* pos);
|
static void FindZCoorForPed(CVector* pos);
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
|
#include "Fire.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
|
#include "Pad.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "WeaponEffects.h"
|
#include "WeaponEffects.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
#include "General.h"
|
#include "General.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Darkel.h"
|
#include "Darkel.h"
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Ped.h"
|
#include "Ped.h"
|
||||||
#include "Wanted.h"
|
|
||||||
#include "Pad.h"
|
class CPad;
|
||||||
|
class CCopPed;
|
||||||
|
class CWanted;
|
||||||
|
|
||||||
class CPlayerPed : public CPed
|
class CPlayerPed : public CPed
|
||||||
{
|
{
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#include "General.h"
|
#include "General.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "Population.h"
|
#include "Population.h"
|
||||||
|
#include "CopPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
#include "Gangs.h"
|
#include "Gangs.h"
|
||||||
#include "ModelIndices.h"
|
#include "ModelIndices.h"
|
||||||
@ -11,6 +13,7 @@
|
|||||||
#include "CivilianPed.h"
|
#include "CivilianPed.h"
|
||||||
#include "EmergencyPed.h"
|
#include "EmergencyPed.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
|
#include "Camera.h"
|
||||||
#include "CutsceneMgr.h"
|
#include "CutsceneMgr.h"
|
||||||
#include "CarCtrl.h"
|
#include "CarCtrl.h"
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
@ -110,7 +113,8 @@ CPopulation::ChooseCivilianOccupation(int32 group)
|
|||||||
return ms_pPedGroups[group].models[CGeneral::GetRandomNumberInRange(0, NUMMODELSPERPEDGROUP)];
|
return ms_pPedGroups[group].models[CGeneral::GetRandomNumberInRange(0, NUMMODELSPERPEDGROUP)];
|
||||||
}
|
}
|
||||||
|
|
||||||
eCopType
|
// returns eCopType
|
||||||
|
int32
|
||||||
CPopulation::ChoosePolicePedOccupation()
|
CPopulation::ChoosePolicePedOccupation()
|
||||||
{
|
{
|
||||||
CGeneral::GetRandomNumber();
|
CGeneral::GetRandomNumber();
|
||||||
@ -512,9 +516,9 @@ CPopulation::AddPed(ePedType pedType, uint32 miOrCopType, CVector const &coors)
|
|||||||
|
|
||||||
uint32 weapon;
|
uint32 weapon;
|
||||||
if (CGeneral::GetRandomNumberInRange(0, 100) >= 50)
|
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
|
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);
|
ped->SetCurrentWeapon(weapon);
|
||||||
return ped;
|
return ped;
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "PedType.h"
|
#include "PedType.h"
|
||||||
#include "CopPed.h"
|
|
||||||
|
|
||||||
class CPed;
|
class CPed;
|
||||||
class CVehicle;
|
class CVehicle;
|
||||||
class CDummyObject;
|
class CDummyObject;
|
||||||
|
class CObject;
|
||||||
|
|
||||||
struct PedGroup
|
struct PedGroup
|
||||||
{
|
{
|
||||||
@ -71,7 +71,7 @@ public:
|
|||||||
static bool IsPointInSafeZone(CVector *coors);
|
static bool IsPointInSafeZone(CVector *coors);
|
||||||
static void RemovePed(CPed *ent);
|
static void RemovePed(CPed *ent);
|
||||||
static int32 ChooseCivilianOccupation(int32);
|
static int32 ChooseCivilianOccupation(int32);
|
||||||
static eCopType ChoosePolicePedOccupation();
|
static int32 ChoosePolicePedOccupation();
|
||||||
static int32 ChooseGangOccupation(int);
|
static int32 ChooseGangOccupation(int);
|
||||||
static void FindCollisionZoneForCoors(CVector*, int*, eLevelName*);
|
static void FindCollisionZoneForCoors(CVector*, int*, eLevelName*);
|
||||||
static void FindClosestZoneForCoors(CVector*, int*, eLevelName, eLevelName);
|
static void FindClosestZoneForCoors(CVector*, int*, eLevelName, eLevelName);
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "Pad.h"
|
#include "Pad.h"
|
||||||
#include "Radar.h"
|
#include "Radar.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "Sprite.h"
|
#include "Sprite.h"
|
||||||
#include "Sprite2d.h"
|
#include "Sprite2d.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
|
@ -1,10 +1,320 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "patcher.h"
|
#include "patcher.h"
|
||||||
#include "WaterCannon.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); }
|
RwIm3DVertex WaterCannonVertices[WATERCANNONVERTS];
|
||||||
WRAPPER void CWaterCannons::UpdateOne(uint32 id, CVector *pos, CVector *dir) { EAXJMP(0x522470); }
|
RwImVertexIndex WaterCannonIndexList[WATERCANNONINDEXES];
|
||||||
WRAPPER void CWaterCannons::Render(void) { EAXJMP(0x522550); }
|
|
||||||
WRAPPER void CWaterCannons::Init(void) { EAXJMP(0x522440); }
|
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
|
@ -1,15 +1,29 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#define WATERCANNON_GRAVITY (0.009f)
|
||||||
|
#define WATERCANNON_LIFETIME (150)
|
||||||
|
|
||||||
class CWaterCannon
|
class CWaterCannon
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
NUM_SEGMENTPOINTS = 16,
|
||||||
|
};
|
||||||
|
|
||||||
int32 m_nId;
|
int32 m_nId;
|
||||||
int16 m_wIndex;
|
int16 m_nCur;
|
||||||
char gap_6[2];
|
char _pad0[2];
|
||||||
int32 m_nTimeCreated;
|
uint32 m_nTimeCreated;
|
||||||
CVector m_avecPos[16];
|
CVector m_avecPos[NUM_SEGMENTPOINTS];
|
||||||
CVector m_avecVelocity[16];
|
CVector m_avecVelocity[NUM_SEGMENTPOINTS];
|
||||||
char m_abUsed[16];
|
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");
|
static_assert(sizeof(CWaterCannon) == 412, "CWaterCannon: error");
|
||||||
@ -17,11 +31,10 @@ static_assert(sizeof(CWaterCannon) == 412, "CWaterCannon: error");
|
|||||||
class CWaterCannons
|
class CWaterCannons
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Update();
|
static CWaterCannon aCannons[NUM_WATERCANNONS];
|
||||||
static void UpdateOne(uint32 id, CVector *pos, CVector *dir);
|
|
||||||
static void Render(void);
|
|
||||||
static void Init(void);
|
static void Init(void);
|
||||||
|
static void UpdateOne(uint32 id, CVector *pos, CVector *dir);
|
||||||
|
static void Update();
|
||||||
|
static void Render(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CWaterCannon (&aCannons)[NUM_WATERCANNONS];
|
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#define IDEXIT 1002
|
#define IDEXIT 1002
|
||||||
#define IDC_SELECTDEVICE 1005
|
#define IDC_SELECTDEVICE 1005
|
||||||
|
|
||||||
|
#define IDI_MAIN_ICON 1042
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
@ -30,8 +30,18 @@ BEGIN
|
|||||||
WS_TABSTOP
|
WS_TABSTOP
|
||||||
DEFPUSHBUTTON "EXIT",IDEXIT,103,69,52,14
|
DEFPUSHBUTTON "EXIT",IDEXIT,103,69,52,14
|
||||||
DEFPUSHBUTTON "OK",IDOK,28,69,50,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
|
137,8
|
||||||
END
|
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"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
@ -39,6 +39,7 @@
|
|||||||
#include "PathFind.h"
|
#include "PathFind.h"
|
||||||
#include "AnimManager.h"
|
#include "AnimManager.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
|
#include "AnimBlendAssociation.h"
|
||||||
#include "Ped.h"
|
#include "Ped.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "WaterLevel.h"
|
#include "WaterLevel.h"
|
||||||
#include "PlayerPed.h"
|
#include "PlayerPed.h"
|
||||||
|
#include "Wanted.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
#include "HandlingMgr.h"
|
#include "HandlingMgr.h"
|
||||||
#include "Heli.h"
|
#include "Heli.h"
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include "Streaming.h"
|
#include "Streaming.h"
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
|
#include "Wanted.h"
|
||||||
#include "Coronas.h"
|
#include "Coronas.h"
|
||||||
#include "Particle.h"
|
#include "Particle.h"
|
||||||
#include "Explosion.h"
|
#include "Explosion.h"
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "Coronas.h"
|
#include "Coronas.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "Ped.h"
|
#include "Ped.h"
|
||||||
|
#include "DMAudio.h"
|
||||||
#include "HandlingMgr.h"
|
#include "HandlingMgr.h"
|
||||||
#include "Train.h"
|
#include "Train.h"
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
#include "DMAudio.h"
|
#include "DMAudio.h"
|
||||||
#include "Radar.h"
|
#include "Radar.h"
|
||||||
|
#include "Fire.h"
|
||||||
#include "Darkel.h"
|
#include "Darkel.h"
|
||||||
|
|
||||||
bool &CVehicle::bWheelsOnlyCheat = *(bool *)0x95CD78;
|
bool &CVehicle::bWheelsOnlyCheat = *(bool *)0x95CD78;
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
#include "WeaponInfo.h"
|
#include "WeaponInfo.h"
|
||||||
|
#include "AnimManager.h"
|
||||||
#include "AnimBlendAssociation.h"
|
#include "AnimBlendAssociation.h"
|
||||||
|
#include "Weapon.h"
|
||||||
|
|
||||||
//CWeaponInfo (&CWeaponInfo::ms_apWeaponInfos)[14] = * (CWeaponInfo(*)[14]) * (uintptr*)0x6503EC;
|
//CWeaponInfo (&CWeaponInfo::ms_apWeaponInfos)[14] = * (CWeaponInfo(*)[14]) * (uintptr*)0x6503EC;
|
||||||
CWeaponInfo CWeaponInfo::ms_apWeaponInfos[WEAPONTYPE_TOTALWEAPONS];
|
CWeaponInfo CWeaponInfo::ms_apWeaponInfos[WEAPONTYPE_TOTALWEAPONS];
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "common.h"
|
|
||||||
#include "Weapon.h"
|
enum AnimationId;
|
||||||
#include "AnimManager.h"
|
enum eWeaponFire;
|
||||||
|
enum eWeaponType;
|
||||||
|
|
||||||
class CWeaponInfo {
|
class CWeaponInfo {
|
||||||
// static CWeaponInfo(&ms_apWeaponInfos)[14];
|
// static CWeaponInfo(&ms_apWeaponInfos)[14];
|
||||||
|
Loading…
Reference in New Issue
Block a user