Merge pull request #1327 from Nick007J/lcs

some lcs stuff
This commit is contained in:
Nikolay 2021-08-31 23:16:52 +03:00 committed by GitHub
commit 9bd80324d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 487 additions and 238 deletions

View File

@ -3094,10 +3094,10 @@ cAudioManager::ProcessCarBombTick(cVehicleParams& params)
if (params.m_pVehicle->bEngineOn) { if (params.m_pVehicle->bEngineOn) {
switch (params.m_VehicleType) { switch (params.m_VehicleType) {
case VEHICLE_TYPE_CAR: case VEHICLE_TYPE_CAR:
bombType = params.m_pVehicle->m_bombType; bombType = ((CAutomobile*)params.m_pVehicle)->m_bombType;
break; break;
case VEHICLE_TYPE_BIKE: case VEHICLE_TYPE_BIKE:
bombType = params.m_pVehicle->m_bombType; bombType = ((CBike*)params.m_pVehicle)->m_bombType;
break; break;
default: default:
debug("\n * AUDIOLOG: ProcessCarBombTick() Unsupported vehicle type %d * \n", params.m_VehicleType); debug("\n * AUDIOLOG: ProcessCarBombTick() Unsupported vehicle type %d * \n", params.m_VehicleType);

View File

@ -600,7 +600,7 @@ cAudioManager::SetupSuspectLastSeenReport()
case MI_COACH: case MI_COACH:
sample = SFX_SFX_POLICE_RADIO_COACH; sample = SFX_SFX_POLICE_RADIO_COACH;
break; break;
case MI_ROMERO: case MI_HEARSE:
sample = SFX_SFX_POLICE_RADIO_HEARSE; sample = SFX_SFX_POLICE_RADIO_HEARSE;
break; break;
case MI_PIZZABOY: case MI_PIZZABOY:

View File

@ -627,13 +627,24 @@ void CGarage::Update()
case GS_OPENED: case GS_OPENED:
UpdateDoorsHeight(); UpdateDoorsHeight();
if (IsStaticPlayerCarEntirelyInside()) { if (IsStaticPlayerCarEntirelyInside()) {
#ifndef BOMBS_ON_BIKES
if (FindPlayerVehicle()->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE) { if (FindPlayerVehicle()->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE) {
CGarages::TriggerMessage("GA_22", -1, 4000, -1); CGarages::TriggerMessage("GA_22", -1, 4000, -1);
m_eGarageState = GS_OPENEDCONTAINSCAR; m_eGarageState = GS_OPENEDCONTAINSCAR;
DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB_ALREADY_SET, 1); DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB_ALREADY_SET, 1);
break; break;
} }
if (!FindPlayerVehicle() || FindPlayerVehicle()->m_bombType) { #endif
if (!FindPlayerVehicle()
#ifdef FIX_BUGS
|| (FindPlayerVehicle()->IsCar() && ((CAutomobile*)FindPlayerVehicle())->m_bombType)
#else
|| ((CAutomobile*)FindPlayerVehicle())->m_bombType
#endif
#ifdef BOMBS_ON_BIKES
|| (FindPlayerVehicle()->IsBike() && ((CBike*)FindPlayerVehicle())->m_bombType)
#endif
) {
CGarages::TriggerMessage("GA_5", -1, 4000, -1); //"Your car is already fitted with a bomb" CGarages::TriggerMessage("GA_5", -1, 4000, -1); //"Your car is already fitted with a bomb"
m_eGarageState = GS_OPENEDCONTAINSCAR; m_eGarageState = GS_OPENEDCONTAINSCAR;
DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB_ALREADY_SET, 1); DMAudio.PlayFrontEndSound(SOUND_GARAGE_BOMB_ALREADY_SET, 1);
@ -677,10 +688,16 @@ void CGarage::Update()
if (!CGarages::BombsAreFree) if (!CGarages::BombsAreFree)
CWorld::Players[CWorld::PlayerInFocus].m_nMoney = Max(0, CWorld::Players[CWorld::PlayerInFocus].m_nMoney - BOMB_PRICE); CWorld::Players[CWorld::PlayerInFocus].m_nMoney = Max(0, CWorld::Players[CWorld::PlayerInFocus].m_nMoney - BOMB_PRICE);
if (FindPlayerVehicle() && (FindPlayerVehicle()->IsCar() || FindPlayerVehicle()->IsBike())) { if (FindPlayerVehicle() && (FindPlayerVehicle()->IsCar() || FindPlayerVehicle()->IsBike())) {
#if (!defined GTA_PS2 || defined FIX_BUGS) // <- this remained in CAutomobile in LCS #ifdef BOMBS_ON_BIKES
FindPlayerVehicle()->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType); if (FindPlayerVehicle()->IsCar()) {
FindPlayerVehicle()->m_pBombRigger = FindPlayerPed(); ((CAutomobile*)(FindPlayerVehicle()))->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType);
#else // PS2 version contained a bug: CBike was casted to CAutomobile, but due to coincidence it didn't corrupt memory ((CAutomobile*)(FindPlayerVehicle()))->m_pBombRigger = FindPlayerPed();
}
else {
((CBike*)(FindPlayerVehicle()))->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType);
((CBike*)(FindPlayerVehicle()))->m_pBombRigger = FindPlayerPed();
}
#else
((CAutomobile*)(FindPlayerVehicle()))->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType); ((CAutomobile*)(FindPlayerVehicle()))->m_bombType = CGarages::GetBombTypeForGarageType(m_eGarageType);
((CAutomobile*)(FindPlayerVehicle()))->m_pBombRigger = FindPlayerPed(); ((CAutomobile*)(FindPlayerVehicle()))->m_pBombRigger = FindPlayerPed();
#endif #endif
@ -694,6 +711,13 @@ void CGarage::Update()
pCar->m_pBombRigger = nil; pCar->m_pBombRigger = nil;
pCar->m_pBlowUpEntity = nil; pCar->m_pBlowUpEntity = nil;
} }
#ifdef BOMBS_ON_BIKES
if (pVehicle->IsBike() && pVehicle->GetStatus() == STATUS_WRECKED) {
CBike* pBike = (CBike*)pVehicle;
pBike->m_pBombRigger = nil;
pBike->m_pBlowUpEntity = nil;
}
#endif
} }
} }
if (m_eGarageType == GARAGE_BOMBSHOP3) if (m_eGarageType == GARAGE_BOMBSHOP3)

View File

@ -709,8 +709,10 @@ bool
CPickups::TestForPickupsInBubble(CVector pos, float range) CPickups::TestForPickupsInBubble(CVector pos, float range)
{ {
for (int i = 0; i < NUMPICKUPS; i++) { for (int i = 0; i < NUMPICKUPS; i++) {
if ((aPickUps[i].m_vecPos - pos).Magnitude() < range) if (aPickUps[i].m_eType != PICKUP_NONE) {
return true; if ((aPickUps[i].m_vecPos - pos).Magnitude() < range)
return true;
}
} }
return false; return false;
} }

View File

@ -179,65 +179,6 @@ static const char* MissionScripts[] = {
"TOSH4" "TOSH4"
}; };
static const char* MissionScripts[] = {
"LAWYER1",
"LAWYER2",
"LAWYER3",
"LAWYER4",
"GENERL1",
"COL2",
"GENERL3",
"COL_4",
"COL_5",
"baron1",
"baron2",
"baron3",
"baron4",
"kent1",
"baron5",
"serg1",
"serg2",
"serg3",
"bankjo1",
"bankjo2",
"bankjo3",
"bankjo4",
"phil1",
"phil2",
"porno1",
"porno2",
"porno3",
"porno4",
"protec1",
"protec2",
"protec3",
"count1",
"count2",
"CAP_1",
"FIN_1",
"bike1",
"bike2",
"bike3",
"rockb1",
"rockb2",
"rockb3",
"cuban1",
"cuban2",
"cuban3",
"cuban4",
"hait1",
"hait2",
"hait3",
"assin1",
"assin2",
"assin3",
"assin4",
"assin5",
"taxwar1",
"taxwar2",
"taxwar3"
};
int AllowMissionReplay; int AllowMissionReplay;
uint32 NextMissionDelay; uint32 NextMissionDelay;
uint32 MissionStartTime; uint32 MissionStartTime;
@ -501,7 +442,7 @@ void CMissionCleanup::Process()
#endif #endif
CStreaming::ms_disableStreaming = false; CStreaming::ms_disableStreaming = false;
if (CHud::m_ItemToFlash != ITEM_ARMOUR && CHud::m_ItemToFlash != ITEM_HEALTH) if (CHud::m_ItemToFlash != ITEM_ARMOUR && CHud::m_ItemToFlash != ITEM_HEALTH)
CHud::m_ItemToFlash = -1; CHud::m_ItemToFlash = ITEM_NONE;
CHud::SetHelpMessage(nil, false); // nil, false, false, true TODO(LCS) CHud::SetHelpMessage(nil, false); // nil, false, false, true TODO(LCS)
CUserDisplay::OnscnTimer.m_bDisabled = false; CUserDisplay::OnscnTimer.m_bDisabled = false;
CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByCops = false; CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByCops = false;
@ -1851,7 +1792,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command)
if (ped) { // great time to check if (ped) { // great time to check
for (int i = 0; i < ped->m_numNearPeds; i++) { for (int i = 0; i < ped->m_numNearPeds; i++) {
CPed* pTestedPed = ped->m_nearPeds[i]; CPed* pTestedPed = ped->m_nearPeds[i];
if (!pTestedPed || !IsPedPointerValid(pTestedPed)) if (!pTestedPed || !IsPedPointerValid(pTestedPed) || pTestedPed->bIsFrozen)
continue; continue;
if (pTestedPed->m_pedInObjective == ped && pTestedPed->m_objective == OBJECTIVE_FOLLOW_CHAR_IN_FORMATION) { if (pTestedPed->m_pedInObjective == ped && pTestedPed->m_objective == OBJECTIVE_FOLLOW_CHAR_IN_FORMATION) {
CVector vFollowerPos = pTestedPed->GetFormationPosition(); CVector vFollowerPos = pTestedPed->GetFormationPosition();
@ -1864,7 +1805,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command)
} }
} }
} }
else if (pTestedPed->m_leader == ped) { else if (pTestedPed->m_leader == ped && !pTestedPed->bIsFrozen) {
CVector vFollowerPos; CVector vFollowerPos;
if (pTestedPed->m_pedFormation) if (pTestedPed->m_pedFormation)
vFollowerPos = pTestedPed->GetFormationPosition(); vFollowerPos = pTestedPed->GetFormationPosition();
@ -2551,6 +2492,9 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
} }
SET_INTEGER_PARAM(0, handle); SET_INTEGER_PARAM(0, handle);
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
#ifdef GTA_NETWORK
// TODO(LCS): register car
#endif
if (m_bIsMissionScript) if (m_bIsMissionScript)
CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR); CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR);
return 0; return 0;
@ -3128,6 +3072,8 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
case COMMAND_DELETE_OBJECT: case COMMAND_DELETE_OBJECT:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
if (GET_INTEGER_PARAM(0) > (NUMOBJECTS + 2) << 8)
return 0;
CObject* pObj = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); CObject* pObj = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0));
if (pObj){ if (pObj){
CWorld::Remove(pObj); CWorld::Remove(pObj);

View File

@ -104,7 +104,11 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command)
return 0; return 0;
} }
case COMMAND_IS_DEVELOPER: case COMMAND_IS_DEVELOPER:
#ifdef GTA_NETWORK
UpdateCompareFlag(gDeveloperFlag || gIsMultiplayerGame);
#else
UpdateCompareFlag(gDeveloperFlag); UpdateCompareFlag(gDeveloperFlag);
#endif
return 0; return 0;
case COMMAND_SET_DEVELOPER_FLAG: case COMMAND_SET_DEVELOPER_FLAG:
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);

View File

@ -373,10 +373,19 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
case COMMAND_IS_CAR_ARMED_WITH_ANY_BOMB: case COMMAND_IS_CAR_ARMED_WITH_ANY_BOMB:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
script_assert(pCar); script_assert(pVehicle);
script_assert(pCar->m_vehType == VEHICLE_TYPE_CAR); #ifdef FIX_BUGS
if (pVehicle->IsCar())
UpdateCompareFlag(((CAutomobile*)pVehicle)->m_bombType != 0);
else if (pVehicle->IsBike())
UpdateCompareFlag(((CBike*)pVehicle)->m_bombType != 0);
else
UpdateCompareFlag(false);
#else
CAutomobile* pCar = (CVehicle*)pVehicle;
UpdateCompareFlag(pCar->m_bombType != 0); //TODO: enum UpdateCompareFlag(pCar->m_bombType != 0); //TODO: enum
#endif
return 0; return 0;
} }
case COMMAND_APPLY_BRAKES_TO_PLAYERS_CAR: case COMMAND_APPLY_BRAKES_TO_PLAYERS_CAR:
@ -447,10 +456,19 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
case COMMAND_IS_CAR_ARMED_WITH_BOMB: case COMMAND_IS_CAR_ARMED_WITH_BOMB:
{ {
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); CAutomobile* pVehicle = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
script_assert(pCar); script_assert(pVehicle);
//script_assert(pCar->m_vehType == VEHICLE_TYPE_CAR); #ifdef FIX_BUGS
UpdateCompareFlag(pCar->m_bombType == GET_INTEGER_PARAM(1)); if (pVehicle->IsCar())
UpdateCompareFlag(((CAutomobile*)pVehicle)->m_bombType == GET_INTEGER_PARAM(1));
else if (pVehicle->IsBike())
UpdateCompareFlag(((CBike*)pVehicle)->m_bombType == GET_INTEGER_PARAM(1));
else
UpdateCompareFlag(false);
#else
CAutomobile* pCar = (CVehicle*)pVehicle;
UpdateCompareFlag(pCar->m_bombType != 0); //TODO: enum
#endif
return 0; return 0;
} }
case COMMAND_CHANGE_CAR_COLOUR: case COMMAND_CHANGE_CAR_COLOUR:
@ -710,9 +728,19 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
script_assert(pVehicle); script_assert(pVehicle);
script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); #ifdef FIX_BUGS
if (pVehicle->IsCar()) {
((CAutomobile*)pVehicle)->m_bombType = GET_INTEGER_PARAM(1);
((CAutomobile*)pVehicle)->m_pBombRigger = FindPlayerPed();
}
else if (pVehicle->IsBike()) {
((CBike*)pVehicle)->m_bombType = GET_INTEGER_PARAM(1);
((CBike*)pVehicle)->m_pBombRigger = FindPlayerPed();
}
#else
((CAutomobile*)pVehicle)->m_bombType = GET_INTEGER_PARAM(1); ((CAutomobile*)pVehicle)->m_bombType = GET_INTEGER_PARAM(1);
((CAutomobile*)pVehicle)->m_pBombRigger = FindPlayerPed(); ((CAutomobile*)pVehicle)->m_pBombRigger = FindPlayerPed();
#endif
return 0; return 0;
} }
case COMMAND_SET_CHAR_PERSONALITY: case COMMAND_SET_CHAR_PERSONALITY:
@ -776,7 +804,10 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
int model = GET_INTEGER_PARAM(0); int model = GET_INTEGER_PARAM(0);
if (model < 0) if (model < 0)
model = CTheScripts::UsedObjectArray[-model].index; model = CTheScripts::UsedObjectArray[-model].index;
CStreaming::SetMissionDoesntRequireModel(model); if (m_bIsMissionScript)
CStreaming::SetMissionDoesntRequireModel(model);
else
CStreaming::SetAmbientMissionDoesntRequireModel(model);
return 0; return 0;
} }
case COMMAND_GRAB_PHONE: case COMMAND_GRAB_PHONE:
@ -1243,8 +1274,8 @@ int8 CRunningScript::ProcessCommands600To699(int32 command)
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
if (m_bIsMissionScript) if (m_bIsMissionScript)
CStreaming::SetMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); CStreaming::SetMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1);
//else else
// CStreaming::SetAmbientMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); // TODO CStreaming::SetAmbientMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1);
return 0; return 0;
case COMMAND_RESET_NUM_OF_MODELS_KILLED_BY_PLAYER: case COMMAND_RESET_NUM_OF_MODELS_KILLED_BY_PLAYER:
CDarkel::ResetModelsKilledByPlayer(); CDarkel::ResetModelsKilledByPlayer();
@ -1393,7 +1424,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command)
if (GET_INTEGER_PARAM(0) != 0) if (GET_INTEGER_PARAM(0) != 0)
TheCamera.SetWideScreenOn(); TheCamera.SetWideScreenOn();
else { else {
// TODO: unknown field // TODO(LCS): unknown field
TheCamera.SetWideScreenOff(); TheCamera.SetWideScreenOff();
} }
return 0; return 0;
@ -1944,7 +1975,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
if (pos.z <= MAP_Z_LOW_LIMIT) if (pos.z <= MAP_Z_LOW_LIMIT)
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET;
CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, GET_INTEGER_PARAM(3))); // MI_MONEY -> gpModelIndices[...] SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, GET_INTEGER_PARAM(3)));
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
return 0; return 0;
} }
@ -1953,7 +1984,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0));
script_assert(pPed); script_assert(pPed);
pPed->m_wepAccuracy = GET_INTEGER_PARAM(1) * 1.25f; pPed->m_wepAccuracy = Min(100, GET_INTEGER_PARAM(1) * 1.25f);
return 0; return 0;
} }
case COMMAND_GET_CAR_SPEED: case COMMAND_GET_CAR_SPEED:
@ -1969,7 +2000,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
{ {
char name[KEY_LENGTH_IN_SCRIPT]; char name[KEY_LENGTH_IN_SCRIPT];
strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT);
// unknown call FUN_29df68(name) on PS2 // unknown call FUN_29df68(name) on PS2 - not on PSP
m_nIp += KEY_LENGTH_IN_SCRIPT; m_nIp += KEY_LENGTH_IN_SCRIPT;
CColStore::RemoveAllCollision(); CColStore::RemoveAllCollision();
CCutsceneMgr::LoadCutsceneData(name); CCutsceneMgr::LoadCutsceneData(name);
@ -2010,7 +2041,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
return 0; return 0;
} }
case COMMAND_CLEAR_CUTSCENE: case COMMAND_CLEAR_CUTSCENE:
// unknown call on PS2 FUN_29DFA0(); // unknown call on PS2 FUN_29DFA0() - not on PSP
printf("clear cutscene\n"); printf("clear cutscene\n");
CCutsceneMgr::DeleteCutsceneData(); CCutsceneMgr::DeleteCutsceneData();
return 0; return 0;

View File

@ -789,7 +789,22 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
pPed->m_pMyVehicle->RemovePassenger(pPed); pPed->m_pMyVehicle->RemovePassenger(pPed);
} }
if (pPed->m_vehDoor) { if (pPed->m_vehDoor) {
if (pPed->GetPedState() == PED_EXIT_CAR || pPed->GetPedState() == PED_DRAG_FROM_CAR) { eDoors door;
switch (pPed->m_vehDoor) {
case CAR_DOOR_LF:
door = DOOR_FRONT_LEFT;
break;
case CAR_DOOR_RF:
door = DOOR_FRONT_RIGHT;
break;
case CAR_DOOR_LR:
door = DOOR_REAR_LEFT;
break;
case CAR_DOOR_RR:
door = DOOR_REAR_RIGHT;
break;
}
if (pPed->GetPedState() == PED_EXIT_CAR || pPed->GetPedState() == PED_DRAG_FROM_CAR || !pPed->m_pMyVehicle->IsDoorClosed(door)) {
uint8 flags = 0; uint8 flags = 0;
if (pPed->m_pMyVehicle->IsBike()) { if (pPed->m_pMyVehicle->IsBike()) {
if (pPed->m_vehDoor == CAR_DOOR_LF || if (pPed->m_vehDoor == CAR_DOOR_LF ||
@ -1397,7 +1412,9 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND); DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
DMAudio.PlayFrontEndTrack(GET_INTEGER_PARAM(0) + STREAMED_SOUND_MISSION_COMPLETED - 1, FALSE); DMAudio.PlayFrontEndTrack(GET_INTEGER_PARAM(0) + STREAMED_SOUND_MISSION_COMPLETED - 1, FALSE);
#ifndef GTA_PSP
//DMAudio.SaveAnnouncementsWhenMissionPassedPlayed(); // TODO! //DMAudio.SaveAnnouncementsWhenMissionPassedPlayed(); // TODO!
#endif
return 0; return 0;
} }
case COMMAND_CLEAR_AREA: case COMMAND_CLEAR_AREA:
@ -1407,6 +1424,9 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
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);
CWorld::ClearExcitingStuffFromArea(pos, GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4)); CWorld::ClearExcitingStuffFromArea(pos, GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4));
#ifdef GTA_MOBILE
// CPopulation::ms_blockPedCreationForAFrame = true;
#endif
return 0; return 0;
} }
case COMMAND_FREEZE_ONSCREEN_TIMER: case COMMAND_FREEZE_ONSCREEN_TIMER:
@ -1471,7 +1491,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
float size = Max(0.0f, GET_FLOAT_PARAM(7)); float size = Max(0.0f, GET_FLOAT_PARAM(7));
eParticleObjectType type = (eParticleObjectType)GET_INTEGER_PARAM(0); eParticleObjectType type = (eParticleObjectType)GET_INTEGER_PARAM(0);
RwRGBA color; RwRGBA color;
if (type == POBJECT_SMOKE_TRAIL){ // 17 in LCS -- assuming enum is the same if (type == POBJECT_SMOKE_TRAIL){
color.alpha = -1; color.alpha = -1;
color.red = GET_INTEGER_PARAM(8); color.red = GET_INTEGER_PARAM(8);
color.green = GET_INTEGER_PARAM(9); color.green = GET_INTEGER_PARAM(9);
@ -1790,8 +1810,6 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
continue; continue;
if (CModelInfo::IsCarModel(model) || CModelInfo::IsBikeModel(model)) { if (CModelInfo::IsCarModel(model) || CModelInfo::IsBikeModel(model)) {
switch (model) { switch (model) {
// TODO(LCS): do it right
// apparently leeds didn't :lmao:
case MI_LANDSTAL: case MI_LANDSTAL:
case MI_LINERUN: case MI_LINERUN:
case MI_RIO: case MI_RIO:
@ -1804,6 +1822,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
case MI_FBICAR: case MI_FBICAR:
case MI_MRWHOOP: case MI_MRWHOOP:
case MI_BFINJECT: case MI_BFINJECT:
case MI_HEARSE:
case MI_HUNTER: case MI_HUNTER:
case MI_POLICE: case MI_POLICE:
case MI_ENFORCER: case MI_ENFORCER:
@ -1817,13 +1836,15 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
case MI_ANGEL: case MI_ANGEL:
case MI_COACH: case MI_COACH:
case MI_RCBANDIT: case MI_RCBANDIT:
//case MI_ROMERO: case MI_PACKER:
//case MI_PACKER: case MI_SENTXS:
//case MI_SENTXS:
case MI_SQUALO: case MI_SQUALO:
case MI_SEASPAR: case MI_SEASPAR:
case MI_PIZZABOY: case MI_PIZZABOY:
//case MI_GANGBUR: case MI_NOODLEBOY:
case MI_ANGEL2:
case MI_SANCHEZ2:
case MI_GANGBUR:
case MI_AIRTRAIN: case MI_AIRTRAIN:
case MI_DEADDODO: case MI_DEADDODO:
case MI_SPEEDER: case MI_SPEEDER:
@ -1832,45 +1853,49 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
case MI_FLATBED: case MI_FLATBED:
case MI_YANKEE: case MI_YANKEE:
case MI_CADDY: case MI_CADDY:
//case MI_ZEBRA: case MI_BORGNINE:
case MI_TOPFUN: case MI_TOPFUN:
case MI_CAMPVAN:
case MI_BALLOT:
case MI_SKIMMER: case MI_SKIMMER:
case MI_RCBARON: case MI_RCBARON:
case MI_RCRAIDER: case MI_RCRAIDER:
case MI_SPARROW: case MI_SPARROW:
case MI_PATRIOT: case MI_PATRIOT:
//case MI_LOVEFIST: case MI_LOVEFIST:
case MI_COASTG: case MI_COASTG:
case MI_DINGHY: case MI_DINGHY:
//case MI_HERMES: case MI_HERMES:
//case MI_SABRETUR: case MI_SABRETUR:
case MI_PHEONIX: case MI_PHEONIX:
//case MI_WALTON: case MI_WALTON:
case MI_COMET: case MI_COMET:
//case MI_DELUXO: case MI_DELUXO:
//case MI_BURRITO: case MI_BURRITO:
//case MI_SPAND: case MI_SPAND:
case MI_MARQUIS: case MI_MARQUIS:
case MI_BAGGAGE: case MI_BAGGAGE:
//case MI_KAUFMAN: case MI_KAUFMAN:
case MI_MAVERICK: case MI_MAVERICK:
case MI_VCNMAV: case MI_VCNMAV:
//case MI_RANCHER: case MI_RANCHER:
case MI_FBIRANCH: case MI_FBIRANCH:
case MI_JETMAX: case MI_JETMAX:
//case MI_HOTRING: case MI_HOTRING:
case MI_SANDKING: case MI_SANDKING:
//case MI_BLISTAC: case MI_BLISTAC:
case MI_POLMAV: case MI_POLMAV:
//case MI_BOXVILLE: case MI_BOXVILLE:
//case MI_BENSON: case MI_BENSON:
//case MI_MESA: case MI_MESA:
case MI_RCGOBLIN: case MI_RCGOBLIN:
//case MI_HOTRINA: case MI_HOTRINA:
//case MI_HOTRINB: case MI_HOTRINB:
//case MI_BLOODRA: case MI_BLOODRA:
//case MI_BLOODRB: case MI_BLOODRB:
case MI_VICECHEE: case MI_VICECHEE:
case MI_CABBIE:
case MI_MAFIA:
model = -1; model = -1;
break; break;
case MI_IDAHO: case MI_IDAHO:
@ -1884,23 +1909,22 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
case MI_MOONBEAM: case MI_MOONBEAM:
case MI_ESPERANT: case MI_ESPERANT:
case MI_TAXI: case MI_TAXI:
//case MI_WASHING: case MI_WASHING:
case MI_BOBCAT: case MI_BOBCAT:
case MI_BANSHEE: case MI_BANSHEE:
//case MI_CABBIE:
case MI_STALLION: case MI_STALLION:
case MI_RUMPO: case MI_RUMPO:
//case MI_ADMIRAL: case MI_ADMIRAL:
case MI_PCJ600: case MI_PCJ600:
case MI_FAGGIO: case MI_FAGGIO:
case MI_FREEWAY: case MI_FREEWAY:
//case MI_GLENDALE: case MI_GLENDALE:
//case MI_OCEANIC: case MI_OCEANIC:
case MI_SANCHEZ: case MI_SANCHEZ:
//case MI_SABRE: case MI_SABRE:
//case MI_REGINA: case MI_REGINA:
//case MI_VIRGO: case MI_VIRGO:
//case MI_GREENWOO: case MI_GREENWOO:
break; break;
default: default:
printf("CREATE_RANDOM_CAR_FOR_CAR_PARK - Unknown car model %d\n", CStreaming::ms_vehiclesLoaded[index]); printf("CREATE_RANDOM_CAR_FOR_CAR_PARK - Unknown car model %d\n", CStreaming::ms_vehiclesLoaded[index]);
@ -1973,7 +1997,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
#else #else
CTimer::Stop(); CTimer::Stop();
#endif #endif
CStreaming::LoadScene(pos); CStreaming::LoadSceneCollision(pos);
#ifdef FIX_BUGS #ifdef FIX_BUGS
CTimer::Suspend(); CTimer::Suspend();
#else #else

View File

@ -2476,7 +2476,7 @@ void CTheScripts::HighlightImportantArea(uint32 id, float x1, float y1, float x2
center.x = (infX + supX) / 2; center.x = (infX + supX) / 2;
center.y = (infY + supY) / 2; center.y = (infY + supY) / 2;
center.z = (z <= MAP_Z_LOW_LIMIT) ? CWorld::FindGroundZForCoord(center.x, center.y) : z; center.z = (z <= MAP_Z_LOW_LIMIT) ? CWorld::FindGroundZForCoord(center.x, center.y) : z;
CShadows::RenderIndicatorShadow(id, 2, gpGoalTex, &center, supX - center.x, 0.0f, 0.0f, center.y - supY, 0); CShadows::RenderIndicatorShadow(id, 2, nil, &center, supX - center.x, 0.0f, 0.0f, center.y - supY, 0);
} }
void CTheScripts::HighlightImportantAngledArea(uint32 id, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float z) void CTheScripts::HighlightImportantAngledArea(uint32 id, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float z)
@ -2670,7 +2670,10 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob
} }
else { else {
pPed->bScriptObjectiveCompleted = false; pPed->bScriptObjectiveCompleted = false;
pPed->SetObjective(objective); if (objective == OBJECTIVE_LEAVE_CAR)
pPed->SetObjective(objective);
else
pPed->SetObjective(objective, pPed->m_pMyVehicle);
} }
} }
} }
@ -2766,7 +2769,7 @@ void CTheScripts::CleanUpThisPed(CPed* pPed)
flees = true; flees = true;
} }
pPed->ClearObjective(); pPed->ClearObjective();
pPed->SetWaitState(WAITSTATE_FALSE, nil); // third parameter is 0 TODO? pPed->SetWaitState(WAITSTATE_FALSE, nil);
pPed->bRespondsToThreats = true; pPed->bRespondsToThreats = true;
pPed->bScriptObjectiveCompleted = false; pPed->bScriptObjectiveCompleted = false;
pPed->bKindaStayInSamePlace = false; pPed->bKindaStayInSamePlace = false;

View File

@ -38,6 +38,7 @@
#include "CarAI.h" #include "CarAI.h"
#include "Pickups.h" #include "Pickups.h"
#include "Fluff.h" #include "Fluff.h"
#include "CustomSoundTrack.h"
// LCS: file done except TODOs // LCS: file done except TODOs
@ -109,9 +110,12 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
script_assert(pVehicle); script_assert(pVehicle);
script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); //assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR);
CAutomobile* pCar = (CAutomobile*)pVehicle; // they call this for bikes again, we don't really want to destroy the structure...
pCar->bNotDamagedUpsideDown = (GET_INTEGER_PARAM(1) != 0); #ifdef FIX_BUGS
if (pVehicle->m_vehType == VEHICLE_TYPE_CAR)
#endif
((CAutomobile*)pVehicle)->bNotDamagedUpsideDown = (GET_INTEGER_PARAM(1) != 0);
return 0; return 0;
} }
case COMMAND_CAN_PLAYER_START_MISSION: case COMMAND_CAN_PLAYER_START_MISSION:
@ -400,7 +404,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
if (size <= 0) if (size <= 0)
size = CTheScripts::LargestMissionScriptSize; size = CTheScripts::LargestMissionScriptSize;
CFileMgr::Seek(gScriptsFile, offset, 0); CFileMgr::Seek(gScriptsFile, offset, 0);
CFileMgr::Read(gScriptsFile, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], size); // TODO CFileMgr::Read(gScriptsFile, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], size);
CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize); CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize);
CTimer::Resume(); CTimer::Resume();
pMissionScript->m_bIsMissionScript = true; pMissionScript->m_bIsMissionScript = true;
@ -468,8 +472,8 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
return 0; return 0;
case COMMAND_SET_RADIO_CHANNEL: case COMMAND_SET_RADIO_CHANNEL:
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
// if (base::cSingleton<cCustomSoundTrack>::Instance()->unk()) - TODO on PS2, but it's not on mobile if (!cCustomSoundTrack::Instance()->IsPlaying())
DMAudio.SetRadioChannel(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); DMAudio.SetRadioChannel(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1));
return 0; return 0;
/* /*
case COMMAND_OVERRIDE_HOSPITAL_LEVEL: case COMMAND_OVERRIDE_HOSPITAL_LEVEL:
@ -1781,6 +1785,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
return 0; return 0;
} }
/*
case COMMAND_IS_CHAR_IN_ANY_BOAT: case COMMAND_IS_CHAR_IN_ANY_BOAT:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
@ -1789,6 +1794,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT);
return 0; return 0;
} }
*/
case COMMAND_IS_PLAYER_IN_ANY_BOAT: case COMMAND_IS_PLAYER_IN_ANY_BOAT:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
@ -1797,6 +1803,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT);
return 0; return 0;
} }
/*
case COMMAND_IS_CHAR_IN_ANY_HELI: case COMMAND_IS_CHAR_IN_ANY_HELI:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
@ -1805,6 +1812,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI);
return 0; return 0;
} }
*/
case COMMAND_IS_PLAYER_IN_ANY_HELI: case COMMAND_IS_PLAYER_IN_ANY_HELI:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
@ -1813,6 +1821,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI);
return 0; return 0;
} }
/*
case COMMAND_IS_CHAR_IN_ANY_PLANE: case COMMAND_IS_CHAR_IN_ANY_PLANE:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
@ -1821,6 +1830,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE);
return 0; return 0;
} }
*/
case COMMAND_IS_PLAYER_IN_ANY_PLANE: case COMMAND_IS_PLAYER_IN_ANY_PLANE:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);

View File

@ -373,6 +373,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
} }
case COMMAND_HAS_PHOTOGRAPH_BEEN_TAKEN: case COMMAND_HAS_PHOTOGRAPH_BEEN_TAKEN:
UpdateCompareFlag(CWeapon::bPhotographHasBeenTaken); UpdateCompareFlag(CWeapon::bPhotographHasBeenTaken);
CWeapon::bPhotographHasBeenTaken = false;
return 0; return 0;
case COMMAND_GET_CHAR_ARMOUR: case COMMAND_GET_CHAR_ARMOUR:
{ {
@ -508,7 +509,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
CTheScripts::ReadTextLabelFromScript(&m_nIp, key); CTheScripts::ReadTextLabelFromScript(&m_nIp, key);
m_nIp += KEY_LENGTH_IN_SCRIPT; m_nIp += KEY_LENGTH_IN_SCRIPT;
CStreaming::RemoveAnim(CAnimManager::GetAnimationBlockIndex(key)); CStreaming::RemoveAnim(CAnimManager::GetAnimationBlockIndex(key));
// + empty function on PS2 // + empty function on PS2 (not PSP)
return 0; return 0;
} }
case COMMAND_IS_CHAR_WAITING_FOR_WORLD_COLLISION: case COMMAND_IS_CHAR_WAITING_FOR_WORLD_COLLISION:
@ -636,11 +637,8 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
SET_INTEGER_PARAM(1, 0); SET_INTEGER_PARAM(1, 0);
else if (GET_INTEGER_PARAM(1) == 3) else if (GET_INTEGER_PARAM(1) == 3)
SET_INTEGER_PARAM(1, 1); SET_INTEGER_PARAM(1, 1);
pVehicle->BurstTyre(GET_INTEGER_PARAM(1), true);
}
else {
pVehicle->BurstTyre(GET_INTEGER_PARAM(1), true);
} }
pVehicle->BurstTyre(GET_INTEGER_PARAM(1), true);
return 0; return 0;
} }
case COMMAND_IS_CHAR_OBJ_NO_OBJ: case COMMAND_IS_CHAR_OBJ_NO_OBJ:
@ -812,7 +810,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
m_nIp += KEY_LENGTH_IN_SCRIPT; m_nIp += KEY_LENGTH_IN_SCRIPT;
// TheText.Get(key); // TheText.Get(key);
CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY, PICKUP_PROPERTY_LOCKED, 0, 0, false, key)); // TODO: gpModelIndices SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY, PICKUP_PROPERTY_LOCKED, 0, 0, false, key));
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
return 0; return 0;
} }
@ -825,9 +823,9 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
char key[KEY_LENGTH_IN_SCRIPT]; char key[KEY_LENGTH_IN_SCRIPT];
CTheScripts::ReadTextLabelFromScript(&m_nIp, key); CTheScripts::ReadTextLabelFromScript(&m_nIp, key);
m_nIp += KEY_LENGTH_IN_SCRIPT; m_nIp += KEY_LENGTH_IN_SCRIPT;
// TheText.Get(key); TheText.Get(key);
CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY_FORSALE, PICKUP_PROPERTY_FORSALE, GET_INTEGER_PARAM(3), 0, false, key)); // TODO: gpModelIndices SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_PICKUP_PROPERTY_FORSALE, PICKUP_PROPERTY_FORSALE, GET_INTEGER_PARAM(3), 0, false, key));
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
return 0; return 0;
} }

View File

@ -3,6 +3,7 @@
#include "Script.h" #include "Script.h"
#include "ScriptCommands.h" #include "ScriptCommands.h"
#include "Bike.h"
#include "DMAudio.h" #include "DMAudio.h"
#ifdef MORE_LANGUAGES #ifdef MORE_LANGUAGES
#include "Frontend.h" #include "Frontend.h"
@ -378,10 +379,20 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
if (pVehicle->m_bombType != CARBOMB_NONE) { if (pVehicle->IsCar()) {
pVehicle->m_bombType = CARBOMB_NONE; if (((CAutomobile*)pVehicle)->m_bombType != CARBOMB_NONE) {
pVehicle->m_pBombRigger = nil; ((CAutomobile*)pVehicle)->m_bombType = CARBOMB_NONE;
((CAutomobile*)pVehicle)->m_pBombRigger = nil;
}
} }
#ifdef FIX_BUGS
else if (pVehicle->IsBike()) {
if (((CBike*)pVehicle)->m_bombType != CARBOMB_NONE) {
((CBike*)pVehicle)->m_bombType = CARBOMB_NONE;
((CBike*)pVehicle)->m_pBombRigger = nil;
}
}
#endif
return 0; return 0;
} }
case COMMAND_IS_JAPANESE_GAME: case COMMAND_IS_JAPANESE_GAME:
@ -596,7 +607,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
} }
case COMMAND_SET_RC_HELI_HEIGHT_LIMIT: case COMMAND_SET_RC_HELI_HEIGHT_LIMIT:
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
// CVehicle::rcHeliHeightLimit = GET_FLOAT_PARAM(0); // TODO CVehicle::rcHeliHeightLimit = GET_FLOAT_PARAM(0);
return 0; return 0;
case COMMAND_CREATE_SCRIPT_CORONA: case COMMAND_CREATE_SCRIPT_CORONA:
{ {
@ -700,7 +711,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
//case COMMAND_1491: //case COMMAND_1491:
case COMMAND_SET_DEBUG_MENU_ACTIVE: case COMMAND_SET_DEBUG_MENU_ACTIVE:
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
// this sets two values on PS2, but not on mobile - TODO? // this sets two values on PS2 and PSP, but not on mobile - TODO?
return 0; return 0;
case COMMAND_SET_DRAW_HUD: case COMMAND_SET_DRAW_HUD:
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);

View File

@ -594,13 +594,18 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command)
// base::cWorldGeom::GetInstance()->StoreBuildingSwap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3) != 0); // base::cWorldGeom::GetInstance()->StoreBuildingSwap(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3) != 0);
return 0; return 0;
case COMMAND_IS_MULTIPLAYER_ACTIVE: case COMMAND_IS_MULTIPLAYER_ACTIVE:
UpdateCompareFlag(false); // TODO? #ifdef GTA_NETWORK
UpdateCompareFlag(gIsMultiplayerGame);
#else
UpdateCompareFlag(false);
#endif
return 0; return 0;
case COMMAND_GET_MULTIPLAYER_MODE: case COMMAND_GET_MULTIPLAYER_MODE:
SET_INTEGER_PARAM(0, 0); // TODO SET_INTEGER_PARAM(0, 0); // TODO
StoreParameters(&m_nIp, 1); StoreParameters(&m_nIp, 1);
return 0; return 0;
case COMMAND_MULTIPLAYER_SCRIPT_DONE: case COMMAND_MULTIPLAYER_SCRIPT_DONE:
printf("COMMAND_MULTIPLAYER_SCRIPT_DONE\n");
//gbStartingScriptsFromLua = false; TODO? //gbStartingScriptsFromLua = false; TODO?
return 0; return 0;
case COMMAND_IS_MULTIPLAYER_SERVER: case COMMAND_IS_MULTIPLAYER_SERVER:

View File

@ -1083,6 +1083,12 @@ CStreaming::SetMissionDoesntRequireSpecialChar(int32 id)
return SetMissionDoesntRequireModel(id + MI_SPECIAL01); return SetMissionDoesntRequireModel(id + MI_SPECIAL01);
} }
void
CStreaming::SetAmbientMissionDoesntRequireSpecialChar(int32 id)
{
return SetAmbientMissionDoesntRequireModel(id + MI_SPECIAL01);
}
void void
CStreaming::DecrementRef(int32 id) CStreaming::DecrementRef(int32 id)
{ {
@ -1625,9 +1631,11 @@ CStreaming::SetModelTxdIsDeletable(int32 id)
void void
CStreaming::SetMissionDoesntRequireModel(int32 id) CStreaming::SetMissionDoesntRequireModel(int32 id)
{ {
if (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED)
printf("SETTING MISSION DOESN'T REQUIRE MODEL %i\n", id);
ms_aInfoForModel[id].m_flags &= ~STREAMFLAGS_SCRIPTOWNED; ms_aInfoForModel[id].m_flags &= ~STREAMFLAGS_SCRIPTOWNED;
if ((id >= STREAM_OFFSET_TXD || CModelInfo::GetModelInfo(id)->GetModelType() != MITYPE_VEHICLE) && if ((id >= STREAM_OFFSET_TXD || CModelInfo::GetModelInfo(id)->GetModelType() != MITYPE_VEHICLE) &&
(ms_aInfoForModel[id].m_flags & STREAMFLAGS_DONT_REMOVE) == 0){ (ms_aInfoForModel[id].m_flags & (STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_AMBIENT_SCRIPT_OWNED)) == 0){
if(ms_aInfoForModel[id].m_loadState != STREAMSTATE_LOADED) if(ms_aInfoForModel[id].m_loadState != STREAMSTATE_LOADED)
RemoveModel(id); RemoveModel(id);
else if(ms_aInfoForModel[id].m_next == nil) else if(ms_aInfoForModel[id].m_next == nil)
@ -1635,6 +1643,21 @@ CStreaming::SetMissionDoesntRequireModel(int32 id)
} }
} }
void
CStreaming::SetAmbientMissionDoesntRequireModel(int32 id)
{
if (ms_aInfoForModel[id].m_flags & STREAMFLAGS_AMBIENT_SCRIPT_OWNED)
printf("SETTING AMBIENT MISSION DOESN'T REQUIRE MODEL %i\n", id);
ms_aInfoForModel[id].m_flags &= ~STREAMFLAGS_AMBIENT_SCRIPT_OWNED;
if ((id >= STREAM_OFFSET_TXD || CModelInfo::GetModelInfo(id)->GetModelType() != MITYPE_VEHICLE) &&
(ms_aInfoForModel[id].m_flags & (STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_SCRIPTOWNED)) == 0) {
if (ms_aInfoForModel[id].m_loadState != STREAMSTATE_LOADED)
RemoveModel(id);
else if (ms_aInfoForModel[id].m_next == nil)
ms_aInfoForModel[id].AddToList(&ms_startLoadedList);
}
}
void void
CStreaming::LoadInitialPeds(void) CStreaming::LoadInitialPeds(void)
{ {

View File

@ -151,6 +151,7 @@ public:
static void RequestSpecialChar(int32 charId, const char *modelName, int32 flags); static void RequestSpecialChar(int32 charId, const char *modelName, int32 flags);
static bool HasSpecialCharLoaded(int32 id); static bool HasSpecialCharLoaded(int32 id);
static void SetMissionDoesntRequireSpecialChar(int32 id); static void SetMissionDoesntRequireSpecialChar(int32 id);
static void SetAmbientMissionDoesntRequireSpecialChar(int32 id);
static void DecrementRef(int32 id); static void DecrementRef(int32 id);
static void RemoveModel(int32 id); static void RemoveModel(int32 id);
static void RemoveTxd(int32 id) { RemoveModel(id + STREAM_OFFSET_TXD); } static void RemoveTxd(int32 id) { RemoveModel(id + STREAM_OFFSET_TXD); }
@ -175,6 +176,7 @@ public:
static void SetModelIsDeletable(int32 id); static void SetModelIsDeletable(int32 id);
static void SetModelTxdIsDeletable(int32 id); static void SetModelTxdIsDeletable(int32 id);
static void SetMissionDoesntRequireModel(int32 id); static void SetMissionDoesntRequireModel(int32 id);
static void SetAmbientMissionDoesntRequireModel(int32 id);
static void LoadInitialPeds(void); static void LoadInitialPeds(void);
static void LoadInitialWeapons(void); static void LoadInitialWeapons(void);
static void LoadInitialVehicles(void); static void LoadInitialVehicles(void);

View File

@ -1,4 +1,5 @@
#include "common.h" #include "common.h"
#include "Bike.h"
#include "Camera.h" #include "Camera.h"
#include "CarCtrl.h" #include "CarCtrl.h"
#include "CopPed.h" #include "CopPed.h"
@ -2225,19 +2226,36 @@ CWorld::UseDetonator(CEntity *pEntity)
{ {
int32 i = CPools::GetVehiclePool()->GetSize(); int32 i = CPools::GetVehiclePool()->GetSize();
while(--i >= 0) { while(--i >= 0) {
#ifdef FIX_BUGS
CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i); CVehicle* pVehicle = CPools::GetVehiclePool()->GetSlot(i);
#else #if defined FIX_BUGS || defined BOMBS_ON_BIKES
CAutomobile *pVehicle = (CAutomobile *)CPools::GetVehiclePool()->GetSlot(i); if (pVehicle && pVehicle->IsCar())
#endif #endif
if(pVehicle && pVehicle->m_bombType == CARBOMB_REMOTE && {
pVehicle->m_pBombRigger == pEntity) { CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetSlot(i);
pVehicle->m_bombType = CARBOMB_NONE; if (pCar && pCar->m_bombType == CARBOMB_REMOTE &&
pVehicle->m_nBombTimer = 500; pCar->m_pBombRigger == pEntity) {
pVehicle->m_pBlowUpEntity = pVehicle->m_pBombRigger; pCar->m_bombType = CARBOMB_NONE;
if(pVehicle->m_pBlowUpEntity) pCar->m_nBombTimer = 500;
pVehicle->m_pBlowUpEntity->RegisterReference(&pVehicle->m_pBlowUpEntity); pCar->m_pBlowUpEntity = pCar->m_pBombRigger;
if (pCar->m_pBlowUpEntity)
pCar->m_pBlowUpEntity->RegisterReference(&pCar->m_pBlowUpEntity);
}
} }
#ifdef BOMBS_ON_BIKES
if (pVehicle && pVehicle->IsBike()) {
{
CBike* pBike = (CBike*)CPools::GetVehiclePool()->GetSlot(i);
if (pBike && pBike->m_bombType == CARBOMB_REMOTE &&
pBike->m_pBombRigger == pEntity) {
pBike->m_bombType = CARBOMB_NONE;
pBike->m_nBombTimer = 500;
pBike->m_pBlowUpEntity = pBike->m_pBombRigger;
if (pBike->m_pBlowUpEntity)
pBike->m_pBlowUpEntity->RegisterReference(&pBike->m_pBlowUpEntity);
}
}
}
#endif
} }
CProjectileInfo::RemoveDetonatorProjectiles(); CProjectileInfo::RemoveDetonatorProjectiles();
} }

View File

@ -435,6 +435,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
// Vehicles // Vehicles
#define EXPLODING_AIRTRAIN // can blow up jumbo jet with rocket launcher #define EXPLODING_AIRTRAIN // can blow up jumbo jet with rocket launcher
#define CPLANE_ROTORS // make the rotors of the NPC police heli rotate #define CPLANE_ROTORS // make the rotors of the NPC police heli rotate
#define BOMBS_ON_BIKES // allow player to set bombs on bikes
// Pickups // Pickups
//#define MONEY_MESSAGES //#define MONEY_MESSAGES
@ -462,6 +463,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
#define ATTACH_RELEASING_SOUNDS_TO_ENTITIES // sounds would follow ped and vehicles coordinates if not being queued otherwise #define ATTACH_RELEASING_SOUNDS_TO_ENTITIES // sounds would follow ped and vehicles coordinates if not being queued otherwise
#define USE_TIME_SCALE_FOR_AUDIO // slow down/speed up sounds according to the speed of the game #define USE_TIME_SCALE_FOR_AUDIO // slow down/speed up sounds according to the speed of the game
#define MULTITHREADED_AUDIO // for streams. requires C++11 or later #define MULTITHREADED_AUDIO // for streams. requires C++11 or later
#define CUSTOM_SOUND_TRACK // LCS PSP feature - TODO
#ifdef AUDIO_OPUS #ifdef AUDIO_OPUS
#define AUDIO_OAL_USE_OPUS // enable support of opus files #define AUDIO_OAL_USE_OPUS // enable support of opus files

View File

@ -0,0 +1,12 @@
#include "common.h"
#include "CustomSoundTrack.h"
// TODO - implement
template<>
cCustomSoundTrack* base::cSingleton<cCustomSoundTrack>::mspInstance = nil;
cCustomSoundTrack::cCustomSoundTrack() :
m_bIsPlaying(false)
{}

View File

@ -0,0 +1,20 @@
#pragma once
#include "common.h"
#include "singletonManager.h"
class cCustomSoundTrack : public base::cSingleton<cCustomSoundTrack>
{
public:
bool m_bIsPlaying;
cCustomSoundTrack();
bool IsPlaying()
{
#ifdef CUSTOM_SOUND_TRACK
return m_bIsPlaying;
#else
return false;
#endif
}
};

View File

@ -0,0 +1,36 @@
#include "common.h"
#include "singletonManager.h"
namespace base
{
cSingletonManager& SingletonManager()
{
static cSingletonManager manager;
return manager;
}
cSingletonManager::~cSingletonManager()
{
Purge();
}
void cSingletonManager::Add(cSingletonBase* node)
{
node->next = head;
if (!head)
tail = node;
head = node;
}
void cSingletonManager::Purge()
{
for (cSingletonBase* node = tail; node; node = tail) {
tail = node->next;
delete node;
}
}
}

View File

@ -0,0 +1,62 @@
#pragma once
#include "common.h"
namespace base
{
class cSingletonBase;
class cSingletonManager
{
cSingletonBase* head;
cSingletonBase* tail;
public:
cSingletonManager() :
head(nil),
tail(nil)
{}
void Add(cSingletonBase*);
void Purge();
~cSingletonManager();
};
cSingletonManager& SingletonManager();
class cSingletonBase
{
friend class cSingletonManager;
cSingletonBase* next;
public:
virtual ~cSingletonBase() {}
};
template<typename T>
class cSingleton : public cSingletonBase
{
static T* mspInstance;
static void CreateInstance()
{
mspInstance = new T();
SingletonManager().Add(mspInstance);
}
public:
static T* Instance()
{
if (!mspInstance)
CreateInstance();
return mspInstance;
}
~cSingleton<T>()
{
mspInstance = nil;
}
};
}

View File

@ -1111,31 +1111,40 @@ enum
MI_RCBARON = -955, MI_RCBARON = -955,
MI_VICECHEE = -954, MI_VICECHEE = -954,
// HACK HACK, hopefully temporary // 7 of the following MIs originally are in this set: {-998, -996, -979, -978, -977, -975, -969}
MI_JETMAX = -2000, MI_WASHING = -3000,
MI_CUBAN, MI_ADMIRAL,
MI_GLENDALE,
MI_OCEANIC,
MI_REGINA,
MI_SABRE, MI_SABRE,
MI_VIRGO, MI_VIRGO,
MI_GREENWOO,
// 22 of the following MIs originally are in this set:
// {-997, -995, -994, -993, -989, -983, -980, -976, -971, -970, -968, -966, -965, -964, -963, -962, -961, -960, -959, -958, -957, -956}
MI_JETMAX = -2000,
MI_CUBAN,
MI_RANCHER, MI_RANCHER,
MI_BLISTAC, MI_BLISTAC,
MI_WASHING,
MI_ADMIRAL,
MI_SABRETUR, MI_SABRETUR,
MI_DELUXO, MI_DELUXO,
MI_HOTRING, MI_HOTRING,
MI_REGINA,
MI_SENTXS, MI_SENTXS,
MI_GLENDALE,
MI_OCEANIC,
MI_HERMES, MI_HERMES,
MI_GREENWOO,
MI_LOVEFIST, MI_LOVEFIST,
MI_GANGBUR, MI_GANGBUR,
MI_BURRITO, MI_BURRITO,
MI_SPAND, MI_SPAND,
MI_PACKER, MI_PACKER,
MI_WALTON, MI_WALTON,
MI_ROMERO, MI_BOXVILLE,
MI_BENSON,
MI_MESA,
MI_HOTRINA,
MI_HOTRINB,
MI_BLOODRA,
MI_BLOODRB,
MI_WHEEL_RIM = 237, MI_WHEEL_RIM = 237,
MI_WHEEL_OFFROAD, MI_WHEEL_OFFROAD,

View File

@ -550,12 +550,13 @@ public:
uint32 bIsDrowning : 1; uint32 bIsDrowning : 1;
uint32 bDrownsInWater : 1; uint32 bDrownsInWater : 1;
uint32 bWaitForLeaderToComeCloser : 1; uint32 bWaitForLeaderToComeCloser : 1;
uint32 bHeldHostageInCar : 1; // one flag was added somewhere after this one (TODO: figure out where and which) uint32 bHeldHostageInCar : 1;
uint32 b19C_10 : 1;
uint32 bIsPlayerFriend : 1; uint32 bIsPlayerFriend : 1;
uint32 bHeadStuckInCollision : 1; uint32 bHeadStuckInCollision : 1;
uint32 bDeadPedInFrontOfCar : 1; uint32 bDeadPedInFrontOfCar : 1;
uint32 bStayInCarOnJack : 1;
uint32 bStayInCarOnJack : 1;
uint32 bDontFight : 1; uint32 bDontFight : 1;
uint32 bDoomAim : 1; uint32 bDoomAim : 1;
uint32 bCanBeShotInVehicle : 1; uint32 bCanBeShotInVehicle : 1;
@ -563,8 +564,8 @@ public:
uint32 bMakeFleeScream : 1; uint32 bMakeFleeScream : 1;
uint32 bPushedAlongByCar : 1; uint32 bPushedAlongByCar : 1;
uint32 bRemoveMeWhenIGotIntoCar : 1; uint32 bRemoveMeWhenIGotIntoCar : 1;
uint32 bIgnoreThreatsBehindObjects : 1; // one flag was added somewhere before this one (TODO: figure out where and which)
uint32 bIgnoreThreatsBehindObjects : 1;
uint32 bNeverEverTargetThisPed : 1; uint32 bNeverEverTargetThisPed : 1;
uint32 bCrouchWhenScared : 1; uint32 bCrouchWhenScared : 1;
uint32 bKnockedOffBike : 1; uint32 bKnockedOffBike : 1;
@ -704,7 +705,7 @@ public:
uint32 m_delayedWeaponAmmo; uint32 m_delayedWeaponAmmo;
uint8 m_currentWeapon; // eWeaponType uint8 m_currentWeapon; // eWeaponType
uint8 m_maxWeaponTypeAllowed; // eWeaponType uint8 m_maxWeaponTypeAllowed; // eWeaponType
uint8 m_wepSkills; uint8 m_wepSkills; // TODO - missing?
uint8 m_wepAccuracy; uint8 m_wepAccuracy;
CEntity *m_pPointGunAt; CEntity *m_pPointGunAt;
CVector m_vecHitLastPos; CVector m_vecHitLastPos;
@ -1091,8 +1092,13 @@ public:
PedState GetPedState(void) { return m_nPedState; } PedState GetPedState(void) { return m_nPedState; }
void SetPedState(PedState state) void SetPedState(PedState state)
{ {
if (GetPedState() == PED_FOLLOW_PATH && state != PED_FOLLOW_PATH) if (GetPedState() == PED_FOLLOW_PATH && state != PED_FOLLOW_PATH) {
if (m_followPathTargetEnt) {
m_followPathTargetEnt->CleanUpOldReference(&m_followPathTargetEnt);
m_followPathTargetEnt = nil;
}
ClearFollowPath(); ClearFollowPath();
}
m_nPedState = state; m_nPedState = state;
} }
bool Dead(void) { return m_nPedState == PED_DEAD; } bool Dead(void) { return m_nPedState == PED_DEAD; }

View File

@ -206,7 +206,7 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy)
m_pBombRigger = nil; m_pBombRigger = nil;
m_bombType = CARBOMB_NONE; m_bombType = CARBOMB_NONE;
bUnknownFlag = false; bDriverLastFrame = false;
if(m_nDoorLock == CARLOCK_UNLOCKED && if(m_nDoorLock == CARLOCK_UNLOCKED &&
(id == MI_POLICE || id == MI_ENFORCER || id == MI_RHINO)) (id == MI_POLICE || id == MI_ENFORCER || id == MI_RHINO))
@ -344,8 +344,19 @@ CAutomobile::ProcessControl(void)
ScanForCrimes(); ScanForCrimes();
} }
// TODO(LCS)? re-inline this and change where bDriverLastFrame is set if (pDriver) {
ActivateBombWhenEntered(); if (!bDriverLastFrame && m_bombType == CARBOMB_ONIGNITIONACTIVE) {
// If someone enters the car and there is a bomb, detonate
m_nBombTimer = 1000;
m_pBlowUpEntity = m_pBombRigger;
if (m_pBlowUpEntity)
m_pBlowUpEntity->RegisterReference((CEntity**)&m_pBlowUpEntity);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TICK, 1.0f);
}
bDriverLastFrame = true;
}
else
bDriverLastFrame = false;
// Process driver // Process driver
if(pDriver){ if(pDriver){
@ -939,9 +950,20 @@ CAutomobile::ProcessControl(void)
traction *= 4.0f; traction *= 4.0f;
if(FindPlayerVehicle() && FindPlayerVehicle() == this) if(FindPlayerVehicle() && FindPlayerVehicle() == this)
if(CPad::GetPad(0)->CarGunJustDown()) if (CPad::GetPad(0)->CarGunJustDown()) {
// TODO(LCS)? re-inline this from CVehicle if (m_bombType == CARBOMB_TIMED) {
ActivateBomb(); m_bombType = CARBOMB_TIMEDACTIVE;
m_nBombTimer = 7000;
m_pBlowUpEntity = FindPlayerPed();
CGarages::TriggerMessage("GA_12", -1, 3000, -1);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TIMED_ACTIVATED, 1.0f);
}
else if (m_bombType == CARBOMB_ONIGNITION) {
m_bombType = CARBOMB_ONIGNITIONACTIVE;
CGarages::TriggerMessage("GA_12", -1, 3000, -1);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_ONIGNITION_ACTIVATED, 1.0f);
}
}
if(FindPlayerVehicle() != this && (strongGrip1 || CVehicle::bCheat3)){ if(FindPlayerVehicle() != this && (strongGrip1 || CVehicle::bCheat3)){
traction *= 1.2f; traction *= 1.2f;

View File

@ -35,11 +35,9 @@ public:
float m_aWheelPosition[4]; float m_aWheelPosition[4];
float m_aWheelSpeed[4]; float m_aWheelSpeed[4];
uint8 m_auto_unused2; uint8 m_auto_unused2;
#if (defined GTA_PS2 && !defined FIX_BUGS)
uint8 m_bombType : 3; uint8 m_bombType : 3;
#endif
uint8 bTaxiLight : 1; uint8 bTaxiLight : 1;
uint8 bUnknownFlag : 1; // new in LCS uint8 bDriverLastFrame : 1;
uint8 bFixedColour : 1; uint8 bFixedColour : 1;
uint8 bBigWheels : 1; uint8 bBigWheels : 1;
uint8 bWaterTight : 1; // no damage for non-player peds uint8 bWaterTight : 1; // no damage for non-player peds
@ -48,9 +46,7 @@ public:
uint8 bTankDetonateCars : 1; uint8 bTankDetonateCars : 1;
uint8 bStuckInSand : 1; uint8 bStuckInSand : 1;
uint8 bHeliDestroyed : 1; uint8 bHeliDestroyed : 1;
#if (defined GTA_PS2 && !defined FIX_BUGS)
CEntity* m_pBombRigger; CEntity* m_pBombRigger;
#endif
int16 m_doingBurnout; int16 m_doingBurnout;
uint16 m_hydraulicState; uint16 m_hydraulicState;
uint32 m_nBusDoorTimerEnd; uint32 m_nBusDoorTimerEnd;

View File

@ -37,6 +37,7 @@
#include "Bike.h" #include "Bike.h"
#include "Debug.h" #include "Debug.h"
#include "SaveBuf.h" #include "SaveBuf.h"
#include "Garages.h"
const uint32 CBike::nSaveStructSize = const uint32 CBike::nSaveStructSize =
#ifdef COMPATIBLE_SAVES #ifdef COMPATIBLE_SAVES
@ -232,7 +233,19 @@ CBike::ProcessControl(void)
ProcessCarAlarm(); ProcessCarAlarm();
ActivateBombWhenEntered(); if (pDriver) {
if (!bDriverLastFrame && m_bombType == CARBOMB_ONIGNITIONACTIVE) {
// If someone enters the car and there is a bomb, detonate
m_nBombTimer = 1000;
m_pBlowUpEntity = m_pBombRigger;
if (m_pBlowUpEntity)
m_pBlowUpEntity->RegisterReference((CEntity**)&m_pBlowUpEntity);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TICK, 1.0f);
}
bDriverLastFrame = true;
}
else
bDriverLastFrame = false;
CRubbish::StirUp(this); CRubbish::StirUp(this);
@ -300,8 +313,23 @@ CBike::ProcessControl(void)
ApplyMoveForce(parallelSpeed * -CTimer::GetTimeStep()*SAND_SLOWDOWN*m_fMass); ApplyMoveForce(parallelSpeed * -CTimer::GetTimeStep()*SAND_SLOWDOWN*m_fMass);
} }
} }
if(CPad::GetPad(0)->WeaponJustDown())
ActivateBomb(); #ifdef BOMBS_ON_BIKES
if(CPad::GetPad(0)->WeaponJustDown()) {
if (m_bombType == CARBOMB_TIMED) {
m_bombType = CARBOMB_TIMEDACTIVE;
m_nBombTimer = 7000;
m_pBlowUpEntity = FindPlayerPed();
CGarages::TriggerMessage("GA_12", -1, 3000, -1);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TIMED_ACTIVATED, 1.0f);
}
else if (m_bombType == CARBOMB_ONIGNITION) {
m_bombType = CARBOMB_ONIGNITIONACTIVE;
CGarages::TriggerMessage("GA_12", -1, 3000, -1);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_ONIGNITION_ACTIVATED, 1.0f);
}
}
#endif
break; break;
case STATUS_PLAYER_PLAYBACKFROMBUFFER: case STATUS_PLAYER_PLAYBACKFROMBUFFER:

View File

@ -67,15 +67,18 @@ public:
float m_fPedLeanAmountUD; float m_fPedLeanAmountUD;
uint8 m_bike_unused2; uint8 m_bike_unused2;
uint8 unused[3]; // looks like padding..but for what? uint8 unused[3]; // looks like padding..but for what?
uint8 m_bombType : 3;
uint8 bDriverLastFrame : 1;
uint8 m_bike_flag01 : 1; uint8 m_bike_flag01 : 1;
uint8 m_bike_flag02 : 1; uint8 m_bike_flag02 : 1;
uint8 bWaterTight : 1; uint8 bWaterTight : 1; // 535_40
uint8 bIsBeingPickedUp : 1; uint8 bIsBeingPickedUp : 1;
uint8 bIsStanding : 1; uint8 bIsStanding : 1;
uint8 bExtraSpeed : 1; // leaning forward uint8 bExtraSpeed : 1; // leaning forward
uint8 bIsOnFire : 1; uint8 bIsOnFire : 1;
uint8 bWheelieCam : 1; uint8 bWheelieCam : 1;
uint8 bFixedColour : 1; // <- figure out its actual place (TODO) uint8 bFixedColour : 1; // <- figure out its actual place (TODO)
CEntity* m_pBombRigger;
int16 m_doingBurnout; int16 m_doingBurnout;
float m_fTireTemperature; float m_fTireTemperature;
float m_fBrakeDestabilization; float m_fBrakeDestabilization;

View File

@ -159,10 +159,6 @@ CVehicle::CVehicle(uint8 CreatedBy)
bIsBig = false; bIsBig = false;
bLowVehicle = false; bLowVehicle = false;
m_bombType = CARBOMB_NONE;
m_pBombRigger = nil;
bDriverLastFrame = false;
m_nSetPieceExtendedRangeTime = 0; m_nSetPieceExtendedRangeTime = 0;
m_nAlarmState = 0; m_nAlarmState = 0;
m_nDoorLock = CARLOCK_UNLOCKED; m_nDoorLock = CARLOCK_UNLOCKED;
@ -1465,41 +1461,6 @@ CVehicle::FireFixedMachineGuns(void)
} }
} }
//LCS: in CAutomobile
void
CVehicle::ActivateBomb(void)
{
if(m_bombType == CARBOMB_TIMED){
m_bombType = CARBOMB_TIMEDACTIVE;
m_nBombTimer = 7000;
m_pBlowUpEntity = FindPlayerPed();
CGarages::TriggerMessage("GA_12", -1, 3000, -1);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TIMED_ACTIVATED, 1.0f);
}else if(m_bombType == CARBOMB_ONIGNITION){
m_bombType = CARBOMB_ONIGNITIONACTIVE;
CGarages::TriggerMessage("GA_12", -1, 3000, -1);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_ONIGNITION_ACTIVATED, 1.0f);
}
}
//LCS: in CAutomobile and CBike
void
CVehicle::ActivateBombWhenEntered(void)
{
if(pDriver){
if(!bDriverLastFrame && m_bombType == CARBOMB_ONIGNITIONACTIVE){
// If someone enters the car and there is a bomb, detonate
m_nBombTimer = 1000;
m_pBlowUpEntity = m_pBombRigger;
if(m_pBlowUpEntity)
m_pBlowUpEntity->RegisterReference((CEntity**)&m_pBlowUpEntity);
DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TICK, 1.0f);
}
bDriverLastFrame = true;
}else
bDriverLastFrame = false;
}
void void
CVehicle::ExtinguishCarFire(void) CVehicle::ExtinguishCarFire(void)
{ {

View File

@ -245,10 +245,6 @@ public:
uint8 bRestingOnPhysical : 1; // Dont go static cause car is sitting on a physical object that might get removed uint8 bRestingOnPhysical : 1; // Dont go static cause car is sitting on a physical object that might get removed
uint8 bParking : 1; uint8 bParking : 1;
uint8 bCanPark : 1; uint8 bCanPark : 1;
#if (!defined GTA_PS2 || defined FIX_BUGS) // <- I think this can be moved back to CAutomobile?
uint8 m_bombType : 3;
#endif
uint8 bDriverLastFrame : 1; // originally not in CVehicle (TODO - carbomb stuff)
uint8 bRewardVehicle : 1; // 25B_40 uint8 bRewardVehicle : 1; // 25B_40
int8 m_numPedsUseItAsCover; int8 m_numPedsUseItAsCover;
@ -261,9 +257,6 @@ public:
float m_fEngineEnergy; // TODO(LCS): better name. it adds up acceleration force, so possibly kinetic energy?? float m_fEngineEnergy; // TODO(LCS): better name. it adds up acceleration force, so possibly kinetic energy??
uint8 m_nCurrentGear; uint8 m_nCurrentGear;
float m_fChangeGearTime; float m_fChangeGearTime;
#if (!defined GTA_PS2 || defined FIX_BUGS)
CEntity* m_pBombRigger;
#endif
uint32 m_nSetPieceExtendedRangeTime; uint32 m_nSetPieceExtendedRangeTime;
uint32 m_nGunFiringTime; // last time when gun on vehicle was fired (used on boats) uint32 m_nGunFiringTime; // last time when gun on vehicle was fired (used on boats)
uint32 m_nTimeOfDeath; uint32 m_nTimeOfDeath;
@ -395,8 +388,6 @@ public:
void InflictDamage(CEntity *damagedBy, eWeaponType weaponType, float damage, CVector pos = CVector(0.0f, 0.0f, 0.0f)); void InflictDamage(CEntity *damagedBy, eWeaponType weaponType, float damage, CVector pos = CVector(0.0f, 0.0f, 0.0f));
void DoFixedMachineGuns(void); void DoFixedMachineGuns(void);
void FireFixedMachineGuns(void); void FireFixedMachineGuns(void);
void ActivateBomb(void);
void ActivateBombWhenEntered(void);
void KillPedsInVehicle(void); void KillPedsInVehicle(void);
void SetComponentAtomicAlpha(RpAtomic *atomic, int32 alpha); void SetComponentAtomicAlpha(RpAtomic *atomic, int32 alpha);
@ -407,7 +398,7 @@ public:
bool IsAlarmOn(void) { return m_nAlarmState != 0 && m_nAlarmState != -1 && GetStatus() != STATUS_WRECKED; } bool IsAlarmOn(void) { return m_nAlarmState != 0 && m_nAlarmState != -1 && GetStatus() != STATUS_WRECKED; }
CVehicleModelInfo* GetModelInfo() { return (CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()); } CVehicleModelInfo* GetModelInfo() { return (CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()); }
bool IsTaxi(void) { return GetModelIndex() == MI_TAXI || GetModelIndex() == MI_CABBIE || GetModelIndex() == MI_BORGNINE; } bool IsTaxi(void) { return GetModelIndex() == MI_TAXI || GetModelIndex() == MI_CABBIE || GetModelIndex() == MI_BORGNINE || GetModelIndex() == MI_KAUFMAN; }
bool IsLimo(void) { return GetModelIndex() == MI_STRETCH; } bool IsLimo(void) { return GetModelIndex() == MI_STRETCH; }
bool IsRealHeli(void) { return !!(pHandling->Flags & HANDLING_IS_HELI); } bool IsRealHeli(void) { return !!(pHandling->Flags & HANDLING_IS_HELI); }
bool IsRealPlane(void) { return !!(pHandling->Flags & HANDLING_IS_PLANE); } bool IsRealPlane(void) { return !!(pHandling->Flags & HANDLING_IS_PLANE); }