Fix and cancellable car enter

This commit is contained in:
eray orçunus 2019-09-05 22:59:44 +03:00
parent e232b664be
commit 0f028edae9
3 changed files with 42 additions and 32 deletions

View file

@ -131,3 +131,4 @@ enum Config {
#define USE_DEBUG_SCRIPT_LOADER #define USE_DEBUG_SCRIPT_LOADER
#define EXPLODING_AIRTRAIN // can blow up jumbo jet with rocket launcher #define EXPLODING_AIRTRAIN // can blow up jumbo jet with rocket launcher
#define ANIMATE_PED_COL_MODEL #define ANIMATE_PED_COL_MODEL
#define CANCELLABLE_CAR_ENTER

View file

@ -134,8 +134,8 @@ static char ObjectiveText[34][28] = {
"Mug Char", "Mug Char",
}; };
static char StateText[56][18] = { static char StateText[57][18] = {
"None", // 1 "None",
"Idle", "Idle",
"Look Entity", "Look Entity",
"Look Heading", "Look Heading",
@ -167,8 +167,9 @@ static char StateText[56][18] = {
"Buy IceCream", "Buy IceCream",
"Investigate", "Investigate",
"Step away", "Step away",
"STATES_NO_AI",
"On Fire", "On Fire",
"Unknown",
"STATES_NO_AI",
"Jump", "Jump",
"Fall", "Fall",
"GetUp", "GetUp",
@ -312,16 +313,14 @@ CPed::~CPed(void)
if (m_pMyVehicle->pDriver == this) if (m_pMyVehicle->pDriver == this)
m_pMyVehicle->pDriver = nil; m_pMyVehicle->pDriver = nil;
else { else {
for (int i = 0; i < m_pMyVehicle->m_nNumMaxPassengers; i++) { // FIX: Passenger counter now decreasing after removing ourself from vehicle.
if (m_pMyVehicle->pPassengers[i] == this) m_pMyVehicle->RemovePassenger(this);
m_pMyVehicle->pPassengers[i] = nil;
}
} }
if (m_nPedState == PED_EXIT_CAR || m_nPedState == PED_DRAG_FROM_CAR) if (m_nPedState == PED_EXIT_CAR || m_nPedState == PED_DRAG_FROM_CAR)
m_pMyVehicle->m_nGettingOutFlags &= ~door_flag; m_pMyVehicle->m_nGettingOutFlags &= ~door_flag;
bInVehicle = false; bInVehicle = false;
m_pMyVehicle = nil; m_pMyVehicle = nil;
}else if (m_nPedState == PED_ENTER_CAR || m_nPedState == PED_CARJACK){ } else if (m_nPedState == PED_ENTER_CAR || m_nPedState == PED_CARJACK){
QuitEnteringCar(); QuitEnteringCar();
} }
if (m_pFire) if (m_pFire)
@ -495,7 +494,7 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
m_ped_flagF4 = false; m_ped_flagF4 = false;
m_ped_flagF8 = false; m_ped_flagF8 = false;
bWillBeQuickJacked = false; bWillBeQuickJacked = false;
m_ped_flagF20 = false; bCancelEnteringCar = false;
m_ped_flagF40 = false; m_ped_flagF40 = false;
bDuckAndCover = false; bDuckAndCover = false;
@ -1498,12 +1497,7 @@ CPed::PedSetDraggedOutCarCB(CAnimBlendAssociation *dragAssoc, void *arg)
if (ped->m_nPedType == PEDTYPE_COP && vehicle->IsLawEnforcementVehicle()) if (ped->m_nPedType == PEDTYPE_COP && vehicle->IsLawEnforcementVehicle())
vehicle->ChangeLawEnforcerState(false); vehicle->ChangeLawEnforcerState(false);
} else { } else {
for (int i = 0; i < vehicle->m_nNumMaxPassengers; i++) { vehicle->RemovePassenger(ped);
if (vehicle->pPassengers[i] == ped) {
vehicle->pPassengers[i] = nil;
vehicle->m_nNumPassengers--;
}
}
} }
ped->bInVehicle = false; ped->bInVehicle = false;
@ -1861,7 +1855,6 @@ CPed::LineUpPedWithCar(PedLineUpPhase phase)
GetPosition() = neededPos; GetPosition() = neededPos;
} else { } else {
CMatrix vehDoorMat(veh->GetMatrix()); CMatrix vehDoorMat(veh->GetMatrix());
vehDoorMat.GetPosition() += Multiply3x3(vehDoorMat, GetLocalPositionToOpenCarDoor(veh, m_vehEnterType, 0.0f)); vehDoorMat.GetPosition() += Multiply3x3(vehDoorMat, GetLocalPositionToOpenCarDoor(veh, m_vehEnterType, 0.0f));
GetMatrix() = vehDoorMat; GetMatrix() = vehDoorMat;
} }
@ -8765,7 +8758,7 @@ CPed::PedAnimAlignCB(CAnimBlendAssociation *animAssoc, void *arg)
animToPlay = ANIM_CAR_DOORLOCKED_LHS; animToPlay = ANIM_CAR_DOORLOCKED_LHS;
ped->m_pVehicleAnim = CAnimManager::AddAnimation(ped->GetClump(), ASSOCGRP_STD, animToPlay); ped->m_pVehicleAnim = CAnimManager::AddAnimation(ped->GetClump(), ASSOCGRP_STD, animToPlay);
ped->m_ped_flagF20 = true; ped->bCancelEnteringCar = true;
ped->m_pVehicleAnim->SetFinishCallback(PedAnimDoorOpenCB, ped); ped->m_pVehicleAnim->SetFinishCallback(PedAnimDoorOpenCB, ped);
} }
} }
@ -9533,12 +9526,31 @@ CPed::ProcessControl(void)
case PED_TAXI_PASSENGER: case PED_TAXI_PASSENGER:
case PED_OPEN_DOOR: case PED_OPEN_DOOR:
case PED_DEAD: case PED_DEAD:
case PED_CARJACK:
case PED_DRAG_FROM_CAR: case PED_DRAG_FROM_CAR:
case PED_ENTER_CAR:
case PED_STEAL_CAR:
case PED_EXIT_CAR: case PED_EXIT_CAR:
case PED_STEAL_CAR:
break; break;
case PED_ENTER_CAR:
case PED_CARJACK:
{
#ifdef CANCELLABLE_CAR_ENTER
if (!IsPlayer() || !m_pVehicleAnim)
break;
int vehAnim = m_pVehicleAnim->animId;
int16 padWalkX = CPad::GetPad(0)->GetPedWalkLeftRight();
int16 padWalkY = CPad::GetPad(0)->GetPedWalkUpDown();
if (Abs(padWalkX) > 0.0f || Abs(padWalkY) > 0.0f) {
if (vehAnim == ANIM_CAR_OPEN_LHS || vehAnim == ANIM_CAR_OPEN_RHS || vehAnim == ANIM_COACH_OPEN_L || vehAnim == ANIM_COACH_OPEN_R ||
vehAnim == ANIM_VAN_OPEN_L || vehAnim == ANIM_VAN_OPEN) {
bCancelEnteringCar = true;
} else if (vehAnim == ANIM_CAR_ALIGN_LHS || vehAnim == ANIM_CAR_ALIGN_RHS || vehAnim == ANIM_CAR_ALIGNHI_LHS || vehAnim == ANIM_CAR_ALIGNHI_RHS)
SetIdle();
}
#endif
break;
}
case PED_FLEE_POS: case PED_FLEE_POS:
ms_vec2DFleePosition.x = m_fleeFromPosX; ms_vec2DFleePosition.x = m_fleeFromPosX;
ms_vec2DFleePosition.y = m_fleeFromPosY; ms_vec2DFleePosition.y = m_fleeFromPosY;
@ -9641,7 +9653,7 @@ CPed::ProcessControl(void)
if (m_pMyVehicle->bLowVehicle) { if (m_pMyVehicle->bLowVehicle) {
sitAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_LSIT); sitAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_LSIT);
if (!sitAssoc || sitAssoc->blendAmount >= 1.0f) { if (!sitAssoc || sitAssoc->blendAmount < 1.0f) {
break; break;
} }
@ -9651,14 +9663,14 @@ CPed::ProcessControl(void)
} else { } else {
sitAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_SIT); sitAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_SIT);
if (!sitAssoc || sitAssoc->blendAmount >= 1.0f) { if (!sitAssoc || sitAssoc->blendAmount < 1.0f) {
break; break;
} }
lDriveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DRIVE_L); lDriveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DRIVE_L);
rDriveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DRIVE_R); rDriveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DRIVE_R);
lbAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_LB); lbAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_LB);
}
if (lbAssoc) {
if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FIRSTPERSON if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FIRSTPERSON
&& TheCamera.Cams[TheCamera.ActiveCam].DirectionWasLooking == LOOKING_LEFT) { && TheCamera.Cams[TheCamera.ActiveCam].DirectionWasLooking == LOOKING_LEFT) {
lbAssoc->blendDelta = -1000.0f; lbAssoc->blendDelta = -1000.0f;
@ -9676,8 +9688,7 @@ CPed::ProcessControl(void)
lDriveAssoc->blendAmount = 0.0f; lDriveAssoc->blendAmount = 0.0f;
if (rDriveAssoc) if (rDriveAssoc)
rDriveAssoc->blendAmount = 0.0f; rDriveAssoc->blendAmount = 0.0f;
if (lbAssoc)
lbAssoc->blendDelta = -4.0f;
} else if (steerAngle <= 0.0f) { } else if (steerAngle <= 0.0f) {
if (lDriveAssoc) if (lDriveAssoc)
lDriveAssoc->blendAmount = 0.0f; lDriveAssoc->blendAmount = 0.0f;
@ -9689,8 +9700,6 @@ CPed::ProcessControl(void)
else else
CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_DRIVE_R); CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_DRIVE_R);
if (lbAssoc)
lbAssoc->blendDelta = -4.0f;
} else { } else {
if (rDriveAssoc) if (rDriveAssoc)
rDriveAssoc->blendAmount = 0.0f; rDriveAssoc->blendAmount = 0.0f;
@ -9701,10 +9710,10 @@ CPed::ProcessControl(void)
CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_DRIVE_LOW_L); CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_DRIVE_LOW_L);
else else
CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_DRIVE_L); CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_DRIVE_L);
if (lbAssoc)
lbAssoc->blendDelta = -4.0f;
} }
if (lbAssoc)
lbAssoc->blendDelta = -4.0f;
} else { } else {
if ((TheCamera.Cams[TheCamera.ActiveCam].Mode != CCam::MODE_FIRSTPERSON if ((TheCamera.Cams[TheCamera.ActiveCam].Mode != CCam::MODE_FIRSTPERSON

View file

@ -311,7 +311,7 @@ public:
uint8 m_ped_flagF4 : 1; uint8 m_ped_flagF4 : 1;
uint8 m_ped_flagF8 : 1; uint8 m_ped_flagF8 : 1;
uint8 bWillBeQuickJacked : 1; uint8 bWillBeQuickJacked : 1;
uint8 m_ped_flagF20 : 1; // set when couldn't open locked car door uint8 bCancelEnteringCar : 1; // after door is opened or couldn't be opened due to it's locked
uint8 m_ped_flagF40 : 1; uint8 m_ped_flagF40 : 1;
uint8 bDuckAndCover : 1; uint8 bDuckAndCover : 1;