Merge pull request #300 from Sergeanur/Remote

CRemote
This commit is contained in:
aap 2020-01-31 12:57:00 +01:00 committed by GitHub
commit e1e76f510e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 74 additions and 11 deletions

View file

@ -68,7 +68,6 @@ CPlayerPed
CPopulation CPopulation
CRadar CRadar
CRecordDataForChase CRecordDataForChase
CRemote
CRoadBlocks CRoadBlocks
CRubbish CRubbish
CSceneEdit CSceneEdit

View file

@ -2541,7 +2541,7 @@ bool CCarCtrl::JoinCarWithRoadSystemGotoCoors(CVehicle* pVehicle, CVector vecTar
pVehicle->AutoPilot.m_aPathFindNodesInfo, &pVehicle->AutoPilot.m_nPathFindNodesCount); pVehicle->AutoPilot.m_aPathFindNodesInfo, &pVehicle->AutoPilot.m_nPathFindNodesCount);
if (pVehicle->AutoPilot.m_nPathFindNodesCount < 2){ if (pVehicle->AutoPilot.m_nPathFindNodesCount < 2){
pVehicle->AutoPilot.m_nPrevRouteNode = pVehicle->AutoPilot.m_nCurrentRouteNode = pVehicle->AutoPilot.m_nNextRouteNode = 0; pVehicle->AutoPilot.m_nPrevRouteNode = pVehicle->AutoPilot.m_nCurrentRouteNode = pVehicle->AutoPilot.m_nNextRouteNode = 0;
return 1; return true;
} }
pVehicle->AutoPilot.m_nPrevRouteNode = 0; pVehicle->AutoPilot.m_nPrevRouteNode = 0;
pVehicle->AutoPilot.m_nCurrentRouteNode = pVehicle->AutoPilot.m_aPathFindNodesInfo[0] - ThePaths.m_pathNodes; pVehicle->AutoPilot.m_nCurrentRouteNode = pVehicle->AutoPilot.m_aPathFindNodesInfo[0] - ThePaths.m_pathNodes;
@ -2550,7 +2550,7 @@ bool CCarCtrl::JoinCarWithRoadSystemGotoCoors(CVehicle* pVehicle, CVector vecTar
pVehicle->AutoPilot.RemoveOnePathNode(); pVehicle->AutoPilot.RemoveOnePathNode();
FindLinksToGoWithTheseNodes(pVehicle); FindLinksToGoWithTheseNodes(pVehicle);
pVehicle->AutoPilot.m_nNextLane = pVehicle->AutoPilot.m_nCurrentLane = 0; pVehicle->AutoPilot.m_nNextLane = pVehicle->AutoPilot.m_nCurrentLane = 0;
return 0; return false;
} }
void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle) void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle)

View file

@ -1,6 +1,56 @@
#include "common.h" #include "common.h"
#include "patcher.h" #include "patcher.h"
#include "Automobile.h"
#include "CarCtrl.h"
#include "Camera.h"
#include "Remote.h" #include "Remote.h"
#include "Timer.h"
#include "World.h"
#include "PlayerInfo.h"
#include "Vehicle.h"
WRAPPER void CRemote::GivePlayerRemoteControlledCar(float, float, float, float, uint16) { EAXJMP(0x435C30); } void
WRAPPER void CRemote::TakeRemoteControlledCarFromPlayer(void) { EAXJMP(0x435DA0); } CRemote::GivePlayerRemoteControlledCar(float x, float y, float z, float rot, uint16 model)
{
CAutomobile *car = new CAutomobile(model, MISSION_VEHICLE);
bool found;
z = car->GetDistanceFromCentreOfMassToBaseOfModel() + CWorld::FindGroundZFor3DCoord(x, y, z + 2.0f, &found);
car->GetMatrix().SetRotateZOnly(rot);
car->GetPosition() = CVector(x, y, z);
car->m_status = STATUS_PLAYER_REMOTE;
car->bIsLocked = true;
CCarCtrl::JoinCarWithRoadSystem(car);
car->AutoPilot.m_nCarMission = MISSION_NONE;
car->AutoPilot.m_nTempAction = TEMPACT_NONE;
car->AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_STOP_FOR_CARS;
car->AutoPilot.m_nCruiseSpeed = car->AutoPilot.m_fMaxTrafficSpeed = 9.0f;
car->AutoPilot.m_nNextLane = car->AutoPilot.m_nCurrentLane = 0;
car->bEngineOn = true;
CWorld::Add(car);
if (FindPlayerVehicle() != nil)
FindPlayerVehicle()->m_status = STATUS_PLAYER_DISABLED;
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = car;
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->RegisterReference((CEntity**)&CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle);
TheCamera.TakeControl(car, CCam::MODE_BEHINDCAR, INTERPOLATION, CAM_CONTROLLER_1);
}
void
CRemote::TakeRemoteControlledCarFromPlayer(void)
{
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->VehicleCreatedBy = RANDOM_VEHICLE;
CCarCtrl::NumMissionCars--;
CCarCtrl::NumRandomCars++;
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bIsLocked = false;
CWorld::Players[CWorld::PlayerInFocus].m_nTimeLostRemoteCar = CTimer::GetTimeInMilliseconds();
CWorld::Players[CWorld::PlayerInFocus].m_bInRemoteMode = true;
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bRemoveFromWorld = true;
}
STARTPATCHES
InjectHook(0x435C30, &CRemote::GivePlayerRemoteControlledCar, PATCH_JUMP);
InjectHook(0x435DA0, &CRemote::TakeRemoteControlledCarFromPlayer, PATCH_JUMP);
ENDPATCHES

View file

@ -3081,7 +3081,7 @@ int8 CRunningScript::ProcessCommandsFrom300To399(int32 command)
{ {
CollectParameters(&m_nIp, 3); CollectParameters(&m_nIp, 3);
// ScriptParams[0] is unused. // ScriptParams[0] is unused.
TheCamera.TakeControl(nil, ScriptParams[1], ScriptParams[2], 1); TheCamera.TakeControl(nil, ScriptParams[1], ScriptParams[2], CAM_CONTROLLER_1);
return 0; return 0;
} }
case COMMAND_POINT_CAMERA_AT_CAR: case COMMAND_POINT_CAMERA_AT_CAR:
@ -3089,7 +3089,7 @@ int8 CRunningScript::ProcessCommandsFrom300To399(int32 command)
CollectParameters(&m_nIp, 3); CollectParameters(&m_nIp, 3);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
assert(pVehicle); assert(pVehicle);
TheCamera.TakeControl(pVehicle, ScriptParams[1], ScriptParams[2], 1); TheCamera.TakeControl(pVehicle, ScriptParams[1], ScriptParams[2], CAM_CONTROLLER_1);
return 0; return 0;
} }
case COMMAND_POINT_CAMERA_AT_CHAR: case COMMAND_POINT_CAMERA_AT_CHAR:
@ -3097,7 +3097,7 @@ int8 CRunningScript::ProcessCommandsFrom300To399(int32 command)
CollectParameters(&m_nIp, 3); CollectParameters(&m_nIp, 3);
CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]);
assert(pPed); assert(pPed);
TheCamera.TakeControl(pPed, ScriptParams[1], ScriptParams[2], 1); TheCamera.TakeControl(pPed, ScriptParams[1], ScriptParams[2], CAM_CONTROLLER_1);
return 0; return 0;
} }
case COMMAND_RESTORE_CAMERA: case COMMAND_RESTORE_CAMERA:
@ -3148,7 +3148,7 @@ int8 CRunningScript::ProcessCommandsFrom300To399(int32 command)
CVector pos = *(CVector*)&ScriptParams[0]; CVector pos = *(CVector*)&ScriptParams[0];
if (pos.z <= MAP_Z_LOW_LIMIT) if (pos.z <= MAP_Z_LOW_LIMIT)
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
TheCamera.TakeControlNoEntity(pos, ScriptParams[3], 1); TheCamera.TakeControlNoEntity(pos, ScriptParams[3], CAM_CONTROLLER_1);
return 0; return 0;
} }
case COMMAND_ADD_BLIP_FOR_CAR_OLD: case COMMAND_ADD_BLIP_FOR_CAR_OLD:

View file

@ -289,7 +289,7 @@ CAnimViewer::Update(void)
} }
newEntity->GetPosition() = CVector(0.0f, 0.0f, 0.0f); newEntity->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
CWorld::Add(newEntity); CWorld::Add(newEntity);
TheCamera.TakeControl(pTarget, 9, 2, 1); TheCamera.TakeControl(pTarget, CCam::MODE_MODELVIEW, JUMP_CUT, CAM_CONTROLLER_1);
} }
if (pTarget->m_type == ENTITY_TYPE_VEHICLE || pTarget->m_type == ENTITY_TYPE_PED || pTarget->m_type == ENTITY_TYPE_OBJECT) { if (pTarget->m_type == ENTITY_TYPE_VEHICLE || pTarget->m_type == ENTITY_TYPE_PED || pTarget->m_type == ENTITY_TYPE_OBJECT) {
((CPhysical*)pTarget)->m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f); ((CPhysical*)pTarget)->m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f);

View file

@ -239,6 +239,20 @@ enum
MBLUR_UNUSED, // pinkish MBLUR_UNUSED, // pinkish
}; };
enum
{
NONE = 0,
INTERPOLATION,
JUMP_CUT
};
enum
{
CAM_CONTROLLER_0,
CAM_CONTROLLER_1,
CAM_CONTROLLER_2
};
struct CCamera : public CPlaceable struct CCamera : public CPlaceable
{ {
bool m_bAboveGroundTrainNodesLoaded; bool m_bAboveGroundTrainNodesLoaded;

View file

@ -256,7 +256,7 @@ void
CCutsceneMgr::SetupCutsceneToStart(void) CCutsceneMgr::SetupCutsceneToStart(void)
{ {
TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset); TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset);
TheCamera.TakeControlWithSpline(2); TheCamera.TakeControlWithSpline(JUMP_CUT);
TheCamera.SetWideScreenOn(); TheCamera.SetWideScreenOn();
ms_cutsceneOffset.z++; ms_cutsceneOffset.z++;