From 9edd880f222a8d8ebc36ac22fde90d615037cc2e Mon Sep 17 00:00:00 2001 From: Veloscocity Date: Fri, 22 Sep 2023 13:40:03 -0400 Subject: [PATCH 1/7] start work on six stars --- .../db/Player/PlayerWantedController.cpp | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp index a9d137817..23c36df17 100644 --- a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp +++ b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp @@ -116,6 +116,9 @@ static std::vector ms_FakeWantedLevels = { { "+2 Wanted Stars", ADD, 2 }, }; +int lastLevel; +int lastLevelf; + static void OnStartFake() { FakeWantedInfo selectedInfo = ms_FakeWantedLevels.at(g_Random.GetRandomInt(0, ms_FakeWantedLevels.size() - 1)); @@ -129,8 +132,8 @@ static void OnStartFake() } Player player = PLAYER_ID(); - int lastLevel = GET_PLAYER_WANTED_LEVEL(player); - int lastLevelf = GET_FAKE_WANTED_LEVEL(); + lastLevel = GET_PLAYER_WANTED_LEVEL(player); + lastLevelf = GET_FAKE_WANTED_LEVEL(); switch (selectedType) { @@ -169,3 +172,50 @@ REGISTER_EFFECT(OnStartFake, nullptr, nullptr, EffectInfo .EffectGroupType = EffectGroupType::WantedLevel } ); + +static void spawnMesa() +{ + Ped playerPed = PLAYER_PED_ID(); + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); + Vector3 spawnPoint; + // Try spawning on a vehicle node, fall back to random coord + int nodeId; + if (!GET_RANDOM_VEHICLE_NODE(playerPos.x, playerPos.y, playerPos.z, 150, false, false, false, &spawnPoint, &nodeId)) + { + spawnPoint = getRandomOffsetCoord(playerPos, 50, 50); + float groundZ; + if (GET_GROUND_Z_FOR_3D_COORD(spawnPoint.x, spawnPoint.y, spawnPoint.z, &groundZ, false, false)) + { + spawnPoint.z = groundZ; + } + } + float xDiff = playerPos.x - spawnPoint.x; + float yDiff = playerPos.y - spawnPoint.y; + float heading = GET_HEADING_FROM_VECTOR_2D(xDiff, yDiff); + Hash mesaHash = "Mesa3"_hash; + mesaGroup = EnemyGroup(); + LoadModel(mesaHash); + mesaGroup.vehicle = + CREATE_VEHICLE(mesaHash, spawnPoint.x, spawnPoint.y, spawnPoint.z + 5, heading, true, false, false); + SET_VEHICLE_ON_GROUND_PROPERLY(mesaGroup.vehicle, 5); + SET_VEHICLE_COLOURS(mesaGroup.vehicle, 0, 0); + SET_VEHICLE_ENGINE_ON(mesaGroup.vehicle, true, true, true); + SET_VEHICLE_CHEAT_POWER_INCREASE(mesaGroup.vehicle, 2); // Make it easier to catch up + fillVehicleWithPeds(mesaGroup.vehicle, playerPed, relationshipGroup, model, microSmgHash, mesaGroup.peds, true); +} + +static void OnStartSix(void) +{ + +} + +// clang-format off +REGISTER_EFFECT(OnStartSix, nullptr, nullptr, EffectInfo + { + .Name = "!6 Wanted Stars", + .Id = "player_6stars", + .IncompatibleWith = { "player_neverwanted" }, + .EffectGroupType = EffectGroupType::WantedLevel, + //.IsTimed = true + } +); From bbc72da0ac30b8c1cf5752141fcc9ac5d8693966 Mon Sep 17 00:00:00 2001 From: Veloscocity Date: Sun, 1 Oct 2023 02:06:12 -0400 Subject: [PATCH 2/7] Progress --- .../db/Player/PlayerWantedController.cpp | 490 +++++++++++++++++- ConfigApp/Effects.cs | 1 + 2 files changed, 466 insertions(+), 25 deletions(-) diff --git a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp index 23c36df17..4e6984263 100644 --- a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp +++ b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp @@ -1,3 +1,4 @@ +#include #include #include "Components/EffectDispatcher.h" @@ -173,49 +174,488 @@ REGISTER_EFFECT(OnStartFake, nullptr, nullptr, EffectInfo } ); -static void spawnMesa() +// +// Effect by Veloscocity and MoneyWasted +// + +struct Squad { + Vehicle veh; + std::vector soldiers; + bool operator==(const Squad& s) const + { + return this->veh == s.veh; + } + bool SoldiersOutOfRange(float range) + { + Vector3 playerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), false); + for(auto ped : soldiers) + { + Vector3 pos = GET_ENTITY_COORDS(ped, false); + if(pos.DistanceTo(playerPos) <= range) + { + return false; + } + } + + return true; + } +}; + +#define PI 3.1415927f +static const Hash marineModel = "s_m_y_marine_01"_hash; +static const Hash marineModel2 = "s_m_y_marine_02"_hash; +static const Hash marineModel3 = "s_m_y_marine_03"_hash; +static const Hash marineModel4 = "s_m_m_marine_01"_hash; +static const Hash armyGroup = "army"_hash; +static const Hash playerGroup = "PLAYER"_hash; + +static Ped AddSoldier(Vehicle veh, int seat) { - Ped playerPed = PLAYER_PED_ID(); + Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel, seat); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); + + GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, 9999, true, true); + SET_PED_ACCURACY(soldier, 40); + + return soldier; +} + +static Ped AddVeteranSoldier(Vehicle veh, int seat) +{ + Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel4, seat); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); + SET_PED_SUFFERS_CRITICAL_HITS(soldier, false); + + GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, 9999, true, true); + GIVE_WEAPON_COMPONENT_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, "COMPONENT_PISTOL_MK2_CLIP_FMJ"_hash); + GIVE_WEAPON_COMPONENT_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, "COMPONENT_CARBINERIFLE_MK2_CLIP_FMJ"_hash); + SET_PED_ACCURACY(soldier, 55); + return soldier; +} + +static Ped AddMachineGunner(Vehicle veh, int seat, bool barrage) +{ + Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel3, seat); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); + SET_PED_SUFFERS_CRITICAL_HITS(soldier, false); + + GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_COMBATMG_MK2"_hash, 9999, true, true); + SET_PED_ACCURACY(soldier, 35); + SET_PED_FIRING_PATTERN(soldier, 0xC6EE6B4C); + if(barrage) + { + SET_PED_COMBAT_ATTRIBUTES(soldier, 3, false); + } + else + { + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, false); + } + + return soldier; +} + +static Ped AddGrenadier(Vehicle veh, int seat) +{ + Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel2, seat); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + + //GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_RPG"_hash, 9999, true, true); + SET_PED_ACCURACY(soldier, 50); + SET_PED_MOVE_RATE_OVERRIDE(soldier, 1.3f); + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, false); + SET_PED_COMBAT_ATTRIBUTES(soldier, 13, true); + return soldier; +} + + +static Vehicle SpawnPersuingVehicle(Hash modelHash, float cheatPower) +{ + Ped playerPed = PLAYER_PED_ID(); Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); - Vector3 spawnPoint; - // Try spawning on a vehicle node, fall back to random coord - int nodeId; - if (!GET_RANDOM_VEHICLE_NODE(playerPos.x, playerPos.y, playerPos.z, 150, false, false, false, &spawnPoint, &nodeId)) + Vector3 playerVel = GET_ENTITY_VELOCITY(playerPed) * 6; + float aov = (ATAN(2/GET_GAMEPLAY_CAM_FOV()) / 2) * 57.29578; + Vector3 newPos; + float camHeading = GET_GAMEPLAY_CAM_ROT(2).z; + float newHeading; + int attempts = 0; + + while(true) + { + float heading = g_Random.GetRandomFloat(0.f, 360.f); + float x2 = sin((360 - heading) * PI / 180); + float y2 = cos((360 - heading) * PI / 180); + int distance = g_Random.GetRandomInt(60, 140 + (int)ceil(playerVel.Length()) / 6); + newPos = Vector3(playerPos.x + playerVel.x + (x2 * distance), playerPos.y + playerVel.y + (y2 * distance), playerPos.z); + if(!GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(newPos.x, newPos.y, newPos.z, &newPos, &newHeading, 1, 3.0, 0)) + { + continue; + } + Vector3 dis = newPos - GET_GAMEPLAY_CAM_COORD(); + float angle = fmod(360 - (atan2(dis.x, dis.y) * 57.29578), 360.f); + camHeading = fmod(360 + camHeading, 360.f); + if ((dis.Length() < 600 || attempts > 4) + && (dis.Length() >= 300 + || (abs(angle - camHeading) > aov + && 360 - abs(angle - camHeading) > aov))) + { + break; + } + attempts++; + } + + Vehicle veh = CreatePoolVehicle(modelHash, newPos.x, newPos.y, newPos.z+1, newHeading); + SET_VEHICLE_ENGINE_ON(veh, true, true, false); + SET_VEHICLE_ON_GROUND_PROPERLY(veh, 5); + SET_VEHICLE_FORWARD_SPEED(veh, GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED(modelHash)); + SET_VEHICLE_CHEAT_POWER_INCREASE(veh, cheatPower); // Make it easier to catch up + return veh; +} + +static Squad SpawnCrusader(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("crusader"_hash, 3); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + if (g_Random.GetRandomInt(0, 2) == 0) + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, false)); + } + if (g_Random.GetRandomInt(0, 3) == 0) + { + squad.soldiers.push_back(AddGrenadier(squad.veh, 2)); + } + for(auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static Squad SpawnBarrage(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("barrage"_hash, 4); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + int ran = g_Random.GetRandomInt(0, 2); + if (ran != 0) { - spawnPoint = getRandomOffsetCoord(playerPos, 50, 50); - float groundZ; - if (GET_GROUND_Z_FOR_3D_COORD(spawnPoint.x, spawnPoint.y, spawnPoint.z, &groundZ, false, false)) + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); + if(ran != 1) { - spawnPoint.z = groundZ; + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); } } - float xDiff = playerPos.x - spawnPoint.x; - float yDiff = playerPos.y - spawnPoint.y; - float heading = GET_HEADING_FROM_VECTOR_2D(xDiff, yDiff); - Hash mesaHash = "Mesa3"_hash; - mesaGroup = EnemyGroup(); - LoadModel(mesaHash); - mesaGroup.vehicle = - CREATE_VEHICLE(mesaHash, spawnPoint.x, spawnPoint.y, spawnPoint.z + 5, heading, true, false, false); - SET_VEHICLE_ON_GROUND_PROPERLY(mesaGroup.vehicle, 5); - SET_VEHICLE_COLOURS(mesaGroup.vehicle, 0, 0); - SET_VEHICLE_ENGINE_ON(mesaGroup.vehicle, true, true, true); - SET_VEHICLE_CHEAT_POWER_INCREASE(mesaGroup.vehicle, 2); // Make it easier to catch up - fillVehicleWithPeds(mesaGroup.vehicle, playerPed, relationshipGroup, model, microSmgHash, mesaGroup.peds, true); + else + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); + } + for(auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; } +static Squad SpawnBrickade(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("brickade"_hash, 4); + SET_VEHICLE_COLOURS(squad.veh, 110, 15); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 3)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 3)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, 1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 3)); + } + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 2)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 4)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 4)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, 2)); + squad.soldiers.push_back(AddSoldier(squad.veh, 4)); + } + for(auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static Squad SpawnTank(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("rhino"_hash, 4); + + squad.soldiers.push_back(AddGrenadier(squad.veh, -1)); + TASK_COMBAT_HATED_TARGETS_AROUND_PED(squad.soldiers.back(), 600, 0); + SET_PED_HEARING_RANGE(squad.soldiers.back(), 9999.f); + + return squad; +} + +class ShittyHash { +public: + size_t operator()(const Squad& p) const + { + return p.veh; + } +}; + +static std::unordered_set squads; +static DWORD64 lastTick = 0; + static void OnStartSix(void) { + LOG("starting"); + SET_RELATIONSHIP_BETWEEN_GROUPS(5, armyGroup, playerGroup); + SET_RELATIONSHIP_BETWEEN_GROUPS(5, playerGroup, armyGroup); + + LOG("wanted"); + Player player = PLAYER_ID(); + + lastLevel = GET_PLAYER_WANTED_LEVEL(player); + lastLevelf = GET_FAKE_WANTED_LEVEL(); + + SET_PLAYER_WANTED_LEVEL(player, 5, false); + SET_PLAYER_WANTED_LEVEL_NOW(player, false); + SET_FAKE_WANTED_LEVEL(6); + lastTick = GET_GAME_TIMER(); + + LOG("spawning"); + squads.insert(SpawnCrusader()); + squads.insert(SpawnCrusader()); + squads.insert(SpawnBarrage()); + LOG("started"); +} + +static void OnTickSix(void) +{ + auto curTick = GET_GAME_TIMER(); + + if (curTick > lastTick + 8000) + { + lastTick = curTick; + LOG("tick"); + Ped playerPed = PLAYER_PED_ID(); + + LOG("spawning"); + if(squads.size() < 10) + { + int rand = g_Random.GetRandomInt(0, 30); + if (rand >= 29) + { + squads.insert(SpawnTank()); + } + else if (rand >= 26) + { + squads.insert(SpawnBrickade()); + } + else if (rand >= 21) + { + + } + else if (rand >= 14) + { + squads.insert(SpawnBarrage()); + } + else + { + squads.insert(SpawnCrusader()); + } + } + LOG("despawning"); + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false) + (GET_ENTITY_VELOCITY(playerPed) * 4); + + std::vector tmp; + for(auto s : squads) + { + tmp.push_back(s); + } + for(auto s : tmp) + { + Vector3 vehPos = GET_ENTITY_COORDS(s.veh, false)+ (GET_ENTITY_VELOCITY(s.veh) * 4); + if (vehPos.DistanceTo(playerPos) > 500.f) + { + SET_VEHICLE_AS_NO_LONGER_NEEDED(&s.veh); + for(auto p : s.soldiers) + { + //CLEAR_PED_TASKS_IMMEDIATELY(p); + SET_PED_AS_NO_LONGER_NEEDED(&p); + } + squads.erase(s); + } + else if (IS_PED_IN_VEHICLE(playerPed, s.veh, true) + && GET_ENTITY_COORDS(s.soldiers.front(), false).DistanceTo(playerPos) > 300.f) + { + SET_VEHICLE_AS_NO_LONGER_NEEDED(&s.veh); + for(auto p : s.soldiers) + { + SET_PED_AS_NO_LONGER_NEEDED(&p); + } + squads.erase(s); + } + } + LOG("despawned"); + } +} + +static void OnStopSix(void) +{ + Player player = PLAYER_ID(); + SET_RELATIONSHIP_BETWEEN_GROUPS(3, armyGroup, playerGroup); + SET_RELATIONSHIP_BETWEEN_GROUPS(3, playerGroup, armyGroup); + if(lastLevel > 3) + { + SET_PLAYER_WANTED_LEVEL(player, lastLevel-1, false); + } + else + { + SET_PLAYER_WANTED_LEVEL(player, 0, false); + } + SET_PLAYER_WANTED_LEVEL_NOW(player, false); + SET_FAKE_WANTED_LEVEL(lastLevelf); + + for(Squad s : squads) + { + for(auto p : s.soldiers) + { + //CLEAR_PED_TASKS_IMMEDIATELY(p); + SET_PED_AS_NO_LONGER_NEEDED(&p); + } + SET_VEHICLE_AS_NO_LONGER_NEEDED(&s.veh); + } + squads.clear(); } // clang-format off -REGISTER_EFFECT(OnStartSix, nullptr, nullptr, EffectInfo +REGISTER_EFFECT(OnStartSix, OnStopSix, OnTickSix, EffectInfo { .Name = "!6 Wanted Stars", .Id = "player_6stars", + .IsTimed = true, .IncompatibleWith = { "player_neverwanted" }, .EffectGroupType = EffectGroupType::WantedLevel, - //.IsTimed = true } ); diff --git a/ConfigApp/Effects.cs b/ConfigApp/Effects.cs index 09d19fa67..cb41a76d6 100644 --- a/ConfigApp/Effects.cs +++ b/ConfigApp/Effects.cs @@ -411,6 +411,7 @@ public enum EffectTimedType { "misc_fakeuturn", new EffectInfo("Fake U-Turn", EffectCategory.Misc) }, { "misc_esp", new EffectInfo("ESP", EffectCategory.Misc, true) }, { "screen_bouncyradar", new EffectInfo("Bouncy Radar", EffectCategory.Screen, true) }, + { "player_6stars", new EffectInfo("6 Wanted Stars", EffectCategory.Player, true) }, }; } } From c6c044912287b677fdac3c15f546940c546886e7 Mon Sep 17 00:00:00 2001 From: Veloscocity Date: Wed, 4 Oct 2023 21:06:43 -0400 Subject: [PATCH 3/7] Working 6 wanted stars --- .../db/Player/PlayerWantedController.cpp | 491 ++++++++++++------ 1 file changed, 329 insertions(+), 162 deletions(-) diff --git a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp index 4e6984263..4b7fefe33 100644 --- a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp +++ b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp @@ -132,9 +132,9 @@ static void OnStartFake() GetComponent()->OverrideEffectName("player_fakestars", selectedInfo.Name); } - Player player = PLAYER_ID(); - lastLevel = GET_PLAYER_WANTED_LEVEL(player); - lastLevelf = GET_FAKE_WANTED_LEVEL(); + Player player = PLAYER_ID(); + lastLevel = GET_PLAYER_WANTED_LEVEL(player); + lastLevelf = GET_FAKE_WANTED_LEVEL(); switch (selectedType) { @@ -173,50 +173,37 @@ REGISTER_EFFECT(OnStartFake, nullptr, nullptr, EffectInfo .EffectGroupType = EffectGroupType::WantedLevel } ); +// clang-format on // // Effect by Veloscocity and MoneyWasted // -struct Squad { +struct Squad +{ Vehicle veh; - std::vector soldiers; - bool operator==(const Squad& s) const - { - return this->veh == s.veh; - } - bool SoldiersOutOfRange(float range) - { - Vector3 playerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), false); - for(auto ped : soldiers) - { - Vector3 pos = GET_ENTITY_COORDS(ped, false); - if(pos.DistanceTo(playerPos) <= range) - { - return false; - } - } - - return true; - } + mutable std::vector soldiers; }; #define PI 3.1415927f -static const Hash marineModel = "s_m_y_marine_01"_hash; -static const Hash marineModel2 = "s_m_y_marine_02"_hash; -static const Hash marineModel3 = "s_m_y_marine_03"_hash; -static const Hash marineModel4 = "s_m_m_marine_01"_hash; -static const Hash armyGroup = "army"_hash; -static const Hash playerGroup = "PLAYER"_hash; - -static Ped AddSoldier(Vehicle veh, int seat) +static const Hash marineModel = "s_m_y_marine_01"_hash; +static const Hash marineModel2 = "s_m_y_marine_02"_hash; +static const Hash marineModel3 = "s_m_y_marine_03"_hash; +static const Hash marineModel4 = "s_m_m_marine_01"_hash; +static const Hash armyGroup = "army"_hash; +static const Hash playerGroup = "PLAYER"_hash; + +static Ped AddSoldier(Vehicle veh, int seat, bool driveby = true) { - Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel, seat); + LoadModel(marineModel); + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel, seat); + SET_MODEL_AS_NO_LONGER_NEEDED(marineModel); SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); SET_PED_CONFIG_FLAG(soldier, 281, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); @@ -228,14 +215,15 @@ static Ped AddSoldier(Vehicle veh, int seat) return soldier; } -static Ped AddVeteranSoldier(Vehicle veh, int seat) +static Ped AddVeteranSoldier(Vehicle veh, int seat, bool driveby = true) { - Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel4, seat); + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel4, seat); SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); SET_PED_CONFIG_FLAG(soldier, 281, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); @@ -251,7 +239,7 @@ static Ped AddVeteranSoldier(Vehicle veh, int seat) static Ped AddMachineGunner(Vehicle veh, int seat, bool barrage) { - Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel3, seat); + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel3, seat); SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); @@ -266,7 +254,7 @@ static Ped AddMachineGunner(Vehicle veh, int seat, bool barrage) GIVE_WEAPON_TO_PED(soldier, "WEAPON_COMBATMG_MK2"_hash, 9999, true, true); SET_PED_ACCURACY(soldier, 35); SET_PED_FIRING_PATTERN(soldier, 0xC6EE6B4C); - if(barrage) + if (barrage) { SET_PED_COMBAT_ATTRIBUTES(soldier, 3, false); } @@ -278,9 +266,9 @@ static Ped AddMachineGunner(Vehicle veh, int seat, bool barrage) return soldier; } -static Ped AddGrenadier(Vehicle veh, int seat) +static Ped AddRocketeer(Vehicle veh, int seat, bool driveby = false) { - Ped soldier = CreatePoolPedInsideVehicle(veh, 4, marineModel2, seat); + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel2, seat); SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); @@ -289,55 +277,77 @@ static Ped AddGrenadier(Vehicle veh, int seat) SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); - //GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + // GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); GIVE_WEAPON_TO_PED(soldier, "WEAPON_RPG"_hash, 9999, true, true); - SET_PED_ACCURACY(soldier, 50); + SET_PED_ACCURACY(soldier, 67); SET_PED_MOVE_RATE_OVERRIDE(soldier, 1.3f); - SET_PED_COMBAT_ATTRIBUTES(soldier, 2, false); + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); SET_PED_COMBAT_ATTRIBUTES(soldier, 13, true); return soldier; } - -static Vehicle SpawnPersuingVehicle(Hash modelHash, float cheatPower) +// mode == 0: car +// mode == 1: boat +// mode == 2: helicopter +static Vehicle SpawnPersuingVehicle(Hash modelHash, float cheatPower, int mode) { - Ped playerPed = PLAYER_PED_ID(); + Ped playerPed = PLAYER_PED_ID(); Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); - Vector3 playerVel = GET_ENTITY_VELOCITY(playerPed) * 6; - float aov = (ATAN(2/GET_GAMEPLAY_CAM_FOV()) / 2) * 57.29578; + Vector3 playerVel = GET_ENTITY_VELOCITY(playerPed) * 4; + float aov = (ATAN(2 / GET_GAMEPLAY_CAM_FOV()) / 2) * 57.29578f; Vector3 newPos; float camHeading = GET_GAMEPLAY_CAM_ROT(2).z; float newHeading; int attempts = 0; - while(true) + while (true) { float heading = g_Random.GetRandomFloat(0.f, 360.f); float x2 = sin((360 - heading) * PI / 180); float y2 = cos((360 - heading) * PI / 180); - int distance = g_Random.GetRandomInt(60, 140 + (int)ceil(playerVel.Length()) / 6); - newPos = Vector3(playerPos.x + playerVel.x + (x2 * distance), playerPos.y + playerVel.y + (y2 * distance), playerPos.z); - if(!GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(newPos.x, newPos.y, newPos.z, &newPos, &newHeading, 1, 3.0, 0)) + int distance = g_Random.GetRandomInt(80, 180); + newPos = Vector3(playerPos.x + playerVel.x + (x2 * distance), playerPos.y + playerVel.y + (y2 * distance), + playerPos.z); + if (mode == 0) { - continue; + if (!GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(newPos.x, newPos.y, newPos.z, playerPos.x, playerPos.y, + playerPos.z, 1, &newPos, &newHeading, + attempts > 2 ? 1 : 0, 3.0, 0)) + { + continue; + } + } + else if (mode == 1) + { + if (!GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(newPos.x, newPos.y, newPos.z, playerPos.x, playerPos.y, + playerPos.z, 1, &newPos, &newHeading, 3, 3.0, 0)) + { + continue; + } + } + else if (mode == 2) + { + newPos.z += 50; + newHeading = 360 - heading; } Vector3 dis = newPos - GET_GAMEPLAY_CAM_COORD(); float angle = fmod(360 - (atan2(dis.x, dis.y) * 57.29578), 360.f); - camHeading = fmod(360 + camHeading, 360.f); - if ((dis.Length() < 600 || attempts > 4) - && (dis.Length() >= 300 - || (abs(angle - camHeading) > aov - && 360 - abs(angle - camHeading) > aov))) + camHeading = fmod(360 + camHeading, 360.f); + if ((dis.Length() < 500 || attempts > 4) + && (dis.Length() >= 300 || (abs(angle - camHeading) > aov && 360 - abs(angle - camHeading) > aov))) { break; } attempts++; } - Vehicle veh = CreatePoolVehicle(modelHash, newPos.x, newPos.y, newPos.z+1, newHeading); + Vehicle veh = CreatePoolVehicle(modelHash, newPos.x, newPos.y, newPos.z + (mode == 0), newHeading); SET_VEHICLE_ENGINE_ON(veh, true, true, false); - SET_VEHICLE_ON_GROUND_PROPERLY(veh, 5); - SET_VEHICLE_FORWARD_SPEED(veh, GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED(modelHash)); + if (mode == 0) + { + SET_VEHICLE_ON_GROUND_PROPERLY(veh, 5); + } + SET_VEHICLE_FORWARD_SPEED(veh, GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED(modelHash) / 2); SET_VEHICLE_CHEAT_POWER_INCREASE(veh, cheatPower); // Make it easier to catch up return veh; } @@ -345,8 +355,8 @@ static Vehicle SpawnPersuingVehicle(Hash modelHash, float cheatPower) static Squad SpawnCrusader(void) { Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("crusader"_hash, 3); + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("crusader"_hash, 4, 0); if (g_Random.GetRandomInt(0, 1) == 0) { @@ -370,11 +380,11 @@ static Squad SpawnCrusader(void) { squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, false)); } - if (g_Random.GetRandomInt(0, 3) == 0) + if (g_Random.GetRandomInt(0, 4) == 0) { - squad.soldiers.push_back(AddGrenadier(squad.veh, 2)); + squad.soldiers.push_back(AddRocketeer(squad.veh, 2)); } - for(auto s : squad.soldiers) + for (auto s : squad.soldiers) { TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); SET_PED_HEARING_RANGE(s, 9999.f); @@ -386,8 +396,8 @@ static Squad SpawnCrusader(void) static Squad SpawnBarrage(void) { Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("barrage"_hash, 4); + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("barrage"_hash, 6, 0); if (g_Random.GetRandomInt(0, 1) == 0) { @@ -411,7 +421,7 @@ static Squad SpawnBarrage(void) if (ran != 0) { squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); - if(ran != 1) + if (ran != 1) { squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); } @@ -420,20 +430,20 @@ static Squad SpawnBarrage(void) { squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); } - for(auto s : squad.soldiers) + for (auto s : squad.soldiers) { TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); SET_PED_HEARING_RANGE(s, 9999.f); } - + return squad; } static Squad SpawnBrickade(void) { Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("brickade"_hash, 4); + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("brickade"_hash, 4, 0); SET_VEHICLE_COLOURS(squad.veh, 110, 15); if (g_Random.GetRandomInt(0, 1) == 0) @@ -492,161 +502,318 @@ static Squad SpawnBrickade(void) squad.soldiers.push_back(AddSoldier(squad.veh, 2)); squad.soldiers.push_back(AddSoldier(squad.veh, 4)); } - for(auto s : squad.soldiers) + for (auto s : squad.soldiers) { TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); SET_PED_HEARING_RANGE(s, 9999.f); } + + return squad; +} + +static Squad SpawnBuzzard(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("buzzard2"_hash, 4, 2); + + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); + + switch(g_Random.GetRandomInt(0, 2)) + { + case 0: + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); + break; + case 1: + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 1)); + break; + default: + squad.soldiers.push_back(AddSoldier(squad.veh, 1)); + break; + } + + switch(g_Random.GetRandomInt(0, 4)) + { + case 0: + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); + break; + case 1: + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 2)); + break; + default: + squad.soldiers.push_back(AddSoldier(squad.veh, 2)); + break; + } + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + return squad; } static Squad SpawnTank(void) { Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("rhino"_hash, 4); + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("rhino"_hash, 4, 0); + + Ped ped = AddRocketeer(squad.veh, -1); + TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped, 600, 0); + SET_PED_HEARING_RANGE(ped, 9999.f); + squad.soldiers.push_back(ped); + + return squad; +} + +static Squad SpawnDinghy(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("dinghy5"_hash, 4, 1); - squad.soldiers.push_back(AddGrenadier(squad.veh, -1)); - TASK_COMBAT_HATED_TARGETS_AROUND_PED(squad.soldiers.back(), 600, 0); - SET_PED_HEARING_RANGE(squad.soldiers.back(), 9999.f); + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0, false)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1, false)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + squad.soldiers.push_back(AddMachineGunner(squad.veh, 3, true)); + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; } -class ShittyHash { -public: - size_t operator()(const Squad& p) const - { - return p.veh; - } -}; +static Squad SpawnPatrolBoat(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("patrolboat"_hash, 4, 1); -static std::unordered_set squads; + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0, false)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1, false)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); + } + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static std::vector squads; static DWORD64 lastTick = 0; +static void ClearSquad(Squad squad) +{ + for (auto p : squad.soldiers) + { + SET_PED_AS_NO_LONGER_NEEDED(&p); + } + SET_VEHICLE_AS_NO_LONGER_NEEDED(&squad.veh); +} + +static void ClearSquads(void) +{ + for (auto s : squads) + { + ClearSquad(s); + } + squads.clear(); +} + static void OnStartSix(void) { - LOG("starting"); SET_RELATIONSHIP_BETWEEN_GROUPS(5, armyGroup, playerGroup); SET_RELATIONSHIP_BETWEEN_GROUPS(5, playerGroup, armyGroup); - LOG("wanted"); Player player = PLAYER_ID(); - lastLevel = GET_PLAYER_WANTED_LEVEL(player); - lastLevelf = GET_FAKE_WANTED_LEVEL(); + lastLevelf = GET_FAKE_WANTED_LEVEL(); SET_PLAYER_WANTED_LEVEL(player, 5, false); SET_PLAYER_WANTED_LEVEL_NOW(player, false); SET_FAKE_WANTED_LEVEL(6); lastTick = GET_GAME_TIMER(); - LOG("spawning"); - squads.insert(SpawnCrusader()); - squads.insert(SpawnCrusader()); - squads.insert(SpawnBarrage()); - LOG("started"); + squads.push_back(SpawnCrusader()); + squads.push_back(SpawnBarrage()); + squads.push_back(SpawnBuzzard()); } static void OnTickSix(void) { - auto curTick = GET_GAME_TIMER(); - - if (curTick > lastTick + 8000) + auto curTick = GET_GAME_TIMER(); + Ped playerPed = PLAYER_PED_ID(); + if (IS_PED_DEAD_OR_DYING(playerPed, 1) && squads.size()) + { + ClearSquads(); + } + else if (curTick > lastTick + 4000) { - lastTick = curTick; - LOG("tick"); - Ped playerPed = PLAYER_PED_ID(); + lastTick += 4000; + Player player = PLAYER_ID(); + int level = GET_PLAYER_WANTED_LEVEL(player); + int levelf = GET_FAKE_WANTED_LEVEL(); - LOG("spawning"); - if(squads.size() < 10) + if (level != 5) { - int rand = g_Random.GetRandomInt(0, 30); - if (rand >= 29) - { - squads.insert(SpawnTank()); - } - else if (rand >= 26) - { - squads.insert(SpawnBrickade()); - } - else if (rand >= 21) - { - - } - else if (rand >= 14) - { - squads.insert(SpawnBarrage()); - } - else - { - squads.insert(SpawnCrusader()); - } + SET_PLAYER_WANTED_LEVEL(player, 5, false); + SET_PLAYER_WANTED_LEVEL_NOW(player, false); + } + if (levelf != 6) + { + lastLevelf = levelf; + SET_FAKE_WANTED_LEVEL(6); } - LOG("despawning"); - Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false) + (GET_ENTITY_VELOCITY(playerPed) * 4); + REPORT_POLICE_SPOTTED_PLAYER(player); - std::vector tmp; - for(auto s : squads) + if (squads.size() != 0) { - tmp.push_back(s); + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false) + (GET_ENTITY_VELOCITY(playerPed) * 4); + int s = 0; + int i = 0; + std::vector emptySquads; + + while (i < squads.size()) + { + Squad &squad = squads[i]; + float distance = GET_ENTITY_COORDS(squad.veh, false).DistanceTo(playerPos); + int j = 0; + while(j < squad.soldiers.size()) + { + Ped ped = squad.soldiers[j]; + if (!DOES_ENTITY_EXIST(ped) || IS_PED_DEAD_OR_DYING(ped, false) + || GET_ENTITY_COORDS(ped, false).DistanceTo(playerPos) > 450.f) + { + SET_PED_AS_NO_LONGER_NEEDED(&ped); + squad.soldiers.erase(squad.soldiers.begin() + j); + } + else + { + j++; + } + } + + if(squad.soldiers.empty()) + { + SET_VEHICLE_AS_NO_LONGER_NEEDED(&squad.veh); + squads.erase(squads.begin() + i); + } + else + { + i++; + } + } } - for(auto s : tmp) + + if (squads.size() < 4) { - Vector3 vehPos = GET_ENTITY_COORDS(s.veh, false)+ (GET_ENTITY_VELOCITY(s.veh) * 4); - if (vehPos.DistanceTo(playerPos) > 500.f) + int waterCount = 0; + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); + float waterZ; + + for(int i = 0; i < 3; i++) + { + GET_WATER_HEIGHT(playerPos.x + g_Random.GetRandomFloat(-100.f, 100.f), playerPos.y + g_Random.GetRandomFloat(-100.f, 100.f), playerPos.z + 100.f, &waterZ); + waterCount += (waterZ > 0); + } + + if(waterCount < 2) { - SET_VEHICLE_AS_NO_LONGER_NEEDED(&s.veh); - for(auto p : s.soldiers) + switch (g_Random.GetRandomInt(0, 5)) { - //CLEAR_PED_TASKS_IMMEDIATELY(p); - SET_PED_AS_NO_LONGER_NEEDED(&p); + case 0: + squads.push_back(SpawnTank()); + break; + case 1: + squads.push_back(SpawnBuzzard()); + break; + case 2: + squads.push_back(SpawnBarrage()); + break; + case 3: + squads.push_back(SpawnBrickade()); + break; + default: + squads.push_back(SpawnCrusader()); + break; } - squads.erase(s); } - else if (IS_PED_IN_VEHICLE(playerPed, s.veh, true) - && GET_ENTITY_COORDS(s.soldiers.front(), false).DistanceTo(playerPos) > 300.f) + else { - SET_VEHICLE_AS_NO_LONGER_NEEDED(&s.veh); - for(auto p : s.soldiers) + int r = g_Random.GetRandomInt(0, 5); + + if (r == 0) + { + squads.push_back(SpawnPatrolBoat()); + } + else if (r < 3) + { + squads.push_back(SpawnBuzzard()); + } + else { - SET_PED_AS_NO_LONGER_NEEDED(&p); + squads.push_back(SpawnDinghy()); } - squads.erase(s); } } - LOG("despawned"); } } static void OnStopSix(void) { Player player = PLAYER_ID(); + ClearSquads(); SET_RELATIONSHIP_BETWEEN_GROUPS(3, armyGroup, playerGroup); SET_RELATIONSHIP_BETWEEN_GROUPS(3, playerGroup, armyGroup); - if(lastLevel > 3) - { - SET_PLAYER_WANTED_LEVEL(player, lastLevel-1, false); - } - else - { - SET_PLAYER_WANTED_LEVEL(player, 0, false); - } + SET_PLAYER_WANTED_LEVEL(player, 0, false); SET_PLAYER_WANTED_LEVEL_NOW(player, false); - SET_FAKE_WANTED_LEVEL(lastLevelf); - - for(Squad s : squads) + if (GET_FAKE_WANTED_LEVEL() == 6) { - for(auto p : s.soldiers) - { - //CLEAR_PED_TASKS_IMMEDIATELY(p); - SET_PED_AS_NO_LONGER_NEEDED(&p); - } - SET_VEHICLE_AS_NO_LONGER_NEEDED(&s.veh); + SET_FAKE_WANTED_LEVEL(lastLevelf); } - squads.clear(); - } // clang-format off From 8f5ddf827c4a955be604cc1958a4fb2e1dc99cd0 Mon Sep 17 00:00:00 2001 From: Veloscocity Date: Wed, 4 Oct 2023 21:10:25 -0400 Subject: [PATCH 4/7] update credits --- ChaosMod/Effects/db/Player/PlayerWantedController.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp index 4b7fefe33..e8363ad2d 100644 --- a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp +++ b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp @@ -176,7 +176,8 @@ REGISTER_EFFECT(OnStartFake, nullptr, nullptr, EffectInfo // clang-format on // -// Effect by Veloscocity and MoneyWasted +// Effect by Veloscocity +// and moneywasted too i guess but he didnt really do anything // struct Squad From 2971c56f0cbcf2fc61ac037141b0c6a203218ca6 Mon Sep 17 00:00:00 2001 From: Veloscocity Date: Wed, 4 Oct 2023 21:12:29 -0400 Subject: [PATCH 5/7] clang format --- .../db/Player/PlayerWantedController.cpp | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp index e8363ad2d..443c0ab0b 100644 --- a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp +++ b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp @@ -520,7 +520,7 @@ static Squad SpawnBuzzard(void) squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); - switch(g_Random.GetRandomInt(0, 2)) + switch (g_Random.GetRandomInt(0, 2)) { case 0: squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); @@ -533,7 +533,7 @@ static Squad SpawnBuzzard(void) break; } - switch(g_Random.GetRandomInt(0, 4)) + switch (g_Random.GetRandomInt(0, 4)) { case 0: squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); @@ -545,7 +545,7 @@ static Squad SpawnBuzzard(void) squad.soldiers.push_back(AddSoldier(squad.veh, 2)); break; } - + for (auto s : squad.soldiers) { TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); @@ -561,7 +561,7 @@ static Squad SpawnTank(void) Ped playerPed = PLAYER_PED_ID(); squad.veh = SpawnPersuingVehicle("rhino"_hash, 4, 0); - Ped ped = AddRocketeer(squad.veh, -1); + Ped ped = AddRocketeer(squad.veh, -1); TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped, 600, 0); SET_PED_HEARING_RANGE(ped, 9999.f); squad.soldiers.push_back(ped); @@ -594,14 +594,13 @@ static Squad SpawnDinghy(void) squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); } squad.soldiers.push_back(AddMachineGunner(squad.veh, 3, true)); - + for (auto s : squad.soldiers) { TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); SET_PED_HEARING_RANGE(s, 9999.f); } - return squad; } @@ -719,14 +718,14 @@ static void OnTickSix(void) while (i < squads.size()) { - Squad &squad = squads[i]; + Squad &squad = squads[i]; float distance = GET_ENTITY_COORDS(squad.veh, false).DistanceTo(playerPos); - int j = 0; - while(j < squad.soldiers.size()) + int j = 0; + while (j < squad.soldiers.size()) { Ped ped = squad.soldiers[j]; - if (!DOES_ENTITY_EXIST(ped) || IS_PED_DEAD_OR_DYING(ped, false) - || GET_ENTITY_COORDS(ped, false).DistanceTo(playerPos) > 450.f) + if (!DOES_ENTITY_EXIST(ped) || IS_PED_DEAD_OR_DYING(ped, false) + || GET_ENTITY_COORDS(ped, false).DistanceTo(playerPos) > 450.f) { SET_PED_AS_NO_LONGER_NEEDED(&ped); squad.soldiers.erase(squad.soldiers.begin() + j); @@ -737,7 +736,7 @@ static void OnTickSix(void) } } - if(squad.soldiers.empty()) + if (squad.soldiers.empty()) { SET_VEHICLE_AS_NO_LONGER_NEEDED(&squad.veh); squads.erase(squads.begin() + i); @@ -751,17 +750,18 @@ static void OnTickSix(void) if (squads.size() < 4) { - int waterCount = 0; + int waterCount = 0; Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); float waterZ; - for(int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { - GET_WATER_HEIGHT(playerPos.x + g_Random.GetRandomFloat(-100.f, 100.f), playerPos.y + g_Random.GetRandomFloat(-100.f, 100.f), playerPos.z + 100.f, &waterZ); + GET_WATER_HEIGHT(playerPos.x + g_Random.GetRandomFloat(-100.f, 100.f), + playerPos.y + g_Random.GetRandomFloat(-100.f, 100.f), playerPos.z + 100.f, &waterZ); waterCount += (waterZ > 0); } - if(waterCount < 2) + if (waterCount < 2) { switch (g_Random.GetRandomInt(0, 5)) { @@ -785,7 +785,7 @@ static void OnTickSix(void) else { int r = g_Random.GetRandomInt(0, 5); - + if (r == 0) { squads.push_back(SpawnPatrolBoat()); From b38ea37264e3c090a9e313544894801bfdb439bf Mon Sep 17 00:00:00 2001 From: Veloscocity Date: Wed, 4 Oct 2023 21:21:03 -0400 Subject: [PATCH 6/7] oops HOW FUCKING EMBARASSING --- ChaosMod/Effects/db/Player/PlayerWantedController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp index 443c0ab0b..0c5fb1999 100644 --- a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp +++ b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp @@ -820,7 +820,7 @@ static void OnStopSix(void) // clang-format off REGISTER_EFFECT(OnStartSix, OnStopSix, OnTickSix, EffectInfo { - .Name = "!6 Wanted Stars", + .Name = "6 Wanted Stars", .Id = "player_6stars", .IsTimed = true, .IncompatibleWith = { "player_neverwanted" }, From 3ee49aff9ca4c1cc56af484b8797508a12d9109d Mon Sep 17 00:00:00 2001 From: Veloscocity Date: Sun, 22 Oct 2023 13:01:22 -0400 Subject: [PATCH 7/7] move to separate file --- ChaosMod/ChaosMod.vcxproj | 1 + ChaosMod/Effects/db/Player/PlayerSixStars.cpp | 661 ++++++++++++++++++ .../db/Player/PlayerWantedController.cpp | 658 +---------------- 3 files changed, 664 insertions(+), 656 deletions(-) create mode 100644 ChaosMod/Effects/db/Player/PlayerSixStars.cpp diff --git a/ChaosMod/ChaosMod.vcxproj b/ChaosMod/ChaosMod.vcxproj index 6d21948f5..22e012377 100644 --- a/ChaosMod/ChaosMod.vcxproj +++ b/ChaosMod/ChaosMod.vcxproj @@ -243,6 +243,7 @@ + diff --git a/ChaosMod/Effects/db/Player/PlayerSixStars.cpp b/ChaosMod/Effects/db/Player/PlayerSixStars.cpp new file mode 100644 index 000000000..cfa08007d --- /dev/null +++ b/ChaosMod/Effects/db/Player/PlayerSixStars.cpp @@ -0,0 +1,661 @@ +#include +#include + +#include "Components/EffectDispatcher.h" +#include "Memory/Hooks/ScriptThreadRunHook.h" + +// +// Effect by Veloscocity +// and moneywasted too i guess but he didnt really do anything +// + +struct Squad +{ + Vehicle veh; + mutable std::vector soldiers; +}; + +#define PI 3.1415927f +static const Hash marineModel = "s_m_y_marine_01"_hash; +static const Hash marineModel2 = "s_m_y_marine_02"_hash; +static const Hash marineModel3 = "s_m_y_marine_03"_hash; +static const Hash marineModel4 = "s_m_m_marine_01"_hash; +static const Hash armyGroup = "army"_hash; +static const Hash playerGroup = "PLAYER"_hash; + +static int lastLevel; +static int lastLevelf; + +static Ped AddSoldier(Vehicle veh, int seat, bool driveby = true) +{ + LoadModel(marineModel); + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel, seat); + SET_MODEL_AS_NO_LONGER_NEEDED(marineModel); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); + + GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, 9999, true, true); + SET_PED_ACCURACY(soldier, 40); + + return soldier; +} + +static Ped AddVeteranSoldier(Vehicle veh, int seat, bool driveby = true) +{ + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel4, seat); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); + SET_PED_SUFFERS_CRITICAL_HITS(soldier, false); + + GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, 9999, true, true); + GIVE_WEAPON_COMPONENT_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, "COMPONENT_PISTOL_MK2_CLIP_FMJ"_hash); + GIVE_WEAPON_COMPONENT_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, "COMPONENT_CARBINERIFLE_MK2_CLIP_FMJ"_hash); + SET_PED_ACCURACY(soldier, 55); + return soldier; +} + +static Ped AddMachineGunner(Vehicle veh, int seat, bool barrage) +{ + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel3, seat); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); + SET_PED_SUFFERS_CRITICAL_HITS(soldier, false); + + GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_COMBATMG_MK2"_hash, 9999, true, true); + SET_PED_ACCURACY(soldier, 35); + SET_PED_FIRING_PATTERN(soldier, 0xC6EE6B4C); + if (barrage) + { + SET_PED_COMBAT_ATTRIBUTES(soldier, 3, false); + } + else + { + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, false); + } + + return soldier; +} + +static Ped AddRocketeer(Vehicle veh, int seat, bool driveby = false) +{ + Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel2, seat); + SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); + + TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); + SET_PED_CONFIG_FLAG(soldier, 281, true); + + SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); + SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); + + // GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); + GIVE_WEAPON_TO_PED(soldier, "WEAPON_RPG"_hash, 9999, true, true); + SET_PED_ACCURACY(soldier, 67); + SET_PED_MOVE_RATE_OVERRIDE(soldier, 1.3f); + SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); + SET_PED_COMBAT_ATTRIBUTES(soldier, 13, true); + return soldier; +} + +// mode == 0: car +// mode == 1: boat +// mode == 2: helicopter +static Vehicle SpawnPersuingVehicle(Hash modelHash, float cheatPower, int mode) +{ + Ped playerPed = PLAYER_PED_ID(); + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); + Vector3 playerVel = GET_ENTITY_VELOCITY(playerPed) * 4; + float aov = (ATAN(2 / GET_GAMEPLAY_CAM_FOV()) / 2) * 57.29578f; + Vector3 newPos; + float camHeading = GET_GAMEPLAY_CAM_ROT(2).z; + float newHeading; + int attempts = 0; + + while (true) + { + float heading = g_Random.GetRandomFloat(0.f, 360.f); + float x2 = sin((360 - heading) * PI / 180); + float y2 = cos((360 - heading) * PI / 180); + int distance = g_Random.GetRandomInt(80, 180); + newPos = Vector3(playerPos.x + playerVel.x + (x2 * distance), playerPos.y + playerVel.y + (y2 * distance), + playerPos.z); + if (mode == 0) + { + if (!GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(newPos.x, newPos.y, newPos.z, playerPos.x, playerPos.y, + playerPos.z, 1, &newPos, &newHeading, + attempts > 2 ? 1 : 0, 3.0, 0)) + { + continue; + } + } + else if (mode == 1) + { + if (!GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(newPos.x, newPos.y, newPos.z, playerPos.x, playerPos.y, + playerPos.z, 1, &newPos, &newHeading, 3, 3.0, 0)) + { + continue; + } + } + else if (mode == 2) + { + newPos.z += 50; + newHeading = 360 - heading; + } + Vector3 dis = newPos - GET_GAMEPLAY_CAM_COORD(); + float angle = fmod(360 - (atan2(dis.x, dis.y) * 57.29578), 360.f); + camHeading = fmod(360 + camHeading, 360.f); + if ((dis.Length() < 500 || attempts > 4) + && (dis.Length() >= 300 || (abs(angle - camHeading) > aov && 360 - abs(angle - camHeading) > aov))) + { + break; + } + attempts++; + } + + Vehicle veh = CreatePoolVehicle(modelHash, newPos.x, newPos.y, newPos.z + (mode == 0), newHeading); + SET_VEHICLE_ENGINE_ON(veh, true, true, false); + if (mode == 0) + { + SET_VEHICLE_ON_GROUND_PROPERLY(veh, 5); + } + SET_VEHICLE_FORWARD_SPEED(veh, GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED(modelHash) / 2); + SET_VEHICLE_CHEAT_POWER_INCREASE(veh, cheatPower); // Make it easier to catch up + return veh; +} + +static Squad SpawnCrusader(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("crusader"_hash, 4, 0); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + if (g_Random.GetRandomInt(0, 2) == 0) + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, false)); + } + if (g_Random.GetRandomInt(0, 4) == 0) + { + squad.soldiers.push_back(AddRocketeer(squad.veh, 2)); + } + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static Squad SpawnBarrage(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("barrage"_hash, 6, 0); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + int ran = g_Random.GetRandomInt(0, 2); + if (ran != 0) + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); + if (ran != 1) + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); + } + } + else + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); + } + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static Squad SpawnBrickade(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("brickade"_hash, 4, 0); + SET_VEHICLE_COLOURS(squad.veh, 110, 15); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0)); + } + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 1)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 3)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 3)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, 1)); + squad.soldiers.push_back(AddSoldier(squad.veh, 3)); + } + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 2)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 4)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 4)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, 2)); + squad.soldiers.push_back(AddSoldier(squad.veh, 4)); + } + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static Squad SpawnBuzzard(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("buzzard2"_hash, 4, 2); + + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); + + switch (g_Random.GetRandomInt(0, 2)) + { + case 0: + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); + break; + case 1: + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 1)); + break; + default: + squad.soldiers.push_back(AddSoldier(squad.veh, 1)); + break; + } + + switch (g_Random.GetRandomInt(0, 4)) + { + case 0: + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); + break; + case 1: + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 2)); + break; + default: + squad.soldiers.push_back(AddSoldier(squad.veh, 2)); + break; + } + + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static Squad SpawnTank(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("rhino"_hash, 4, 0); + + Ped ped = AddRocketeer(squad.veh, -1); + TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped, 600, 0); + SET_PED_HEARING_RANGE(ped, 9999.f); + squad.soldiers.push_back(ped); + + return squad; +} + +static Squad SpawnDinghy(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("dinghy5"_hash, 4, 1); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0, false)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1, false)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + squad.soldiers.push_back(AddMachineGunner(squad.veh, 3, true)); + + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static Squad SpawnPatrolBoat(void) +{ + Squad squad; + Ped playerPed = PLAYER_PED_ID(); + squad.veh = SpawnPersuingVehicle("patrolboat"_hash, 4, 1); + + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); + int r = g_Random.GetRandomInt(0, 2); + if (r == 0) + { + squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0, false)); + } + else if (r == 1) + { + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + } + else + { + squad.soldiers.push_back(AddSoldier(squad.veh, -1, false)); + squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); + } + squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); + if (g_Random.GetRandomInt(0, 1) == 0) + { + squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); + } + for (auto s : squad.soldiers) + { + TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); + SET_PED_HEARING_RANGE(s, 9999.f); + } + + return squad; +} + +static std::vector squads; +static DWORD64 lastTick = 0; + +static void ClearSquad(Squad squad) +{ + for (auto p : squad.soldiers) + { + SET_PED_AS_NO_LONGER_NEEDED(&p); + } + SET_VEHICLE_AS_NO_LONGER_NEEDED(&squad.veh); +} + +static void ClearSquads(void) +{ + for (auto s : squads) + { + ClearSquad(s); + } + squads.clear(); +} + +static void OnStartSix(void) +{ + SET_RELATIONSHIP_BETWEEN_GROUPS(5, armyGroup, playerGroup); + SET_RELATIONSHIP_BETWEEN_GROUPS(5, playerGroup, armyGroup); + + Player player = PLAYER_ID(); + + lastLevelf = GET_FAKE_WANTED_LEVEL(); + + SET_PLAYER_WANTED_LEVEL(player, 5, false); + SET_PLAYER_WANTED_LEVEL_NOW(player, false); + SET_FAKE_WANTED_LEVEL(6); + lastTick = GET_GAME_TIMER(); + + squads.push_back(SpawnCrusader()); + squads.push_back(SpawnBarrage()); + squads.push_back(SpawnBuzzard()); +} + +static void OnTickSix(void) +{ + auto curTick = GET_GAME_TIMER(); + Ped playerPed = PLAYER_PED_ID(); + if (IS_PED_DEAD_OR_DYING(playerPed, 1) && squads.size()) + { + ClearSquads(); + } + else if (curTick > lastTick + 4000) + { + lastTick += 4000; + Player player = PLAYER_ID(); + int level = GET_PLAYER_WANTED_LEVEL(player); + int levelf = GET_FAKE_WANTED_LEVEL(); + + if (level != 5) + { + SET_PLAYER_WANTED_LEVEL(player, 5, false); + SET_PLAYER_WANTED_LEVEL_NOW(player, false); + } + if (levelf != 6) + { + lastLevelf = levelf; + SET_FAKE_WANTED_LEVEL(6); + } + REPORT_POLICE_SPOTTED_PLAYER(player); + + if (squads.size() != 0) + { + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false) + (GET_ENTITY_VELOCITY(playerPed) * 4); + int s = 0; + int i = 0; + std::vector emptySquads; + + while (i < squads.size()) + { + Squad &squad = squads[i]; + float distance = GET_ENTITY_COORDS(squad.veh, false).DistanceTo(playerPos); + int j = 0; + while (j < squad.soldiers.size()) + { + Ped ped = squad.soldiers[j]; + if (!DOES_ENTITY_EXIST(ped) || IS_PED_DEAD_OR_DYING(ped, false) + || GET_ENTITY_COORDS(ped, false).DistanceTo(playerPos) > 450.f) + { + SET_PED_AS_NO_LONGER_NEEDED(&ped); + squad.soldiers.erase(squad.soldiers.begin() + j); + } + else + { + j++; + } + } + + if (squad.soldiers.empty()) + { + SET_VEHICLE_AS_NO_LONGER_NEEDED(&squad.veh); + squads.erase(squads.begin() + i); + } + else + { + i++; + } + } + } + + if (squads.size() < 4) + { + int waterCount = 0; + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); + float waterZ; + + for (int i = 0; i < 3; i++) + { + GET_WATER_HEIGHT(playerPos.x + g_Random.GetRandomFloat(-100.f, 100.f), + playerPos.y + g_Random.GetRandomFloat(-100.f, 100.f), playerPos.z + 100.f, &waterZ); + waterCount += (waterZ > 0); + } + + if (waterCount < 2) + { + switch (g_Random.GetRandomInt(0, 5)) + { + case 0: + squads.push_back(SpawnTank()); + break; + case 1: + squads.push_back(SpawnBuzzard()); + break; + case 2: + squads.push_back(SpawnBarrage()); + break; + case 3: + squads.push_back(SpawnBrickade()); + break; + default: + squads.push_back(SpawnCrusader()); + break; + } + } + else + { + int r = g_Random.GetRandomInt(0, 5); + + if (r == 0) + { + squads.push_back(SpawnPatrolBoat()); + } + else if (r < 3) + { + squads.push_back(SpawnBuzzard()); + } + else + { + squads.push_back(SpawnDinghy()); + } + } + } + } +} + +static void OnStopSix(void) +{ + Player player = PLAYER_ID(); + ClearSquads(); + SET_RELATIONSHIP_BETWEEN_GROUPS(3, armyGroup, playerGroup); + SET_RELATIONSHIP_BETWEEN_GROUPS(3, playerGroup, armyGroup); + SET_PLAYER_WANTED_LEVEL(player, 0, false); + SET_PLAYER_WANTED_LEVEL_NOW(player, false); + if (GET_FAKE_WANTED_LEVEL() == 6) + { + SET_FAKE_WANTED_LEVEL(lastLevelf); + } +} + +// clang-format off +REGISTER_EFFECT(OnStartSix, OnStopSix, OnTickSix, EffectInfo + { + .Name = "6 Wanted Stars", + .Id = "player_6stars", + .IsTimed = true, + .IncompatibleWith = { "player_neverwanted" }, + .EffectGroupType = EffectGroupType::WantedLevel, + } +); diff --git a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp index 0c5fb1999..6b0ba1c6a 100644 --- a/ChaosMod/Effects/db/Player/PlayerWantedController.cpp +++ b/ChaosMod/Effects/db/Player/PlayerWantedController.cpp @@ -117,8 +117,8 @@ static std::vector ms_FakeWantedLevels = { { "+2 Wanted Stars", ADD, 2 }, }; -int lastLevel; -int lastLevelf; +static int lastLevel; +static int lastLevelf; static void OnStartFake() { @@ -173,657 +173,3 @@ REGISTER_EFFECT(OnStartFake, nullptr, nullptr, EffectInfo .EffectGroupType = EffectGroupType::WantedLevel } ); -// clang-format on - -// -// Effect by Veloscocity -// and moneywasted too i guess but he didnt really do anything -// - -struct Squad -{ - Vehicle veh; - mutable std::vector soldiers; -}; - -#define PI 3.1415927f -static const Hash marineModel = "s_m_y_marine_01"_hash; -static const Hash marineModel2 = "s_m_y_marine_02"_hash; -static const Hash marineModel3 = "s_m_y_marine_03"_hash; -static const Hash marineModel4 = "s_m_m_marine_01"_hash; -static const Hash armyGroup = "army"_hash; -static const Hash playerGroup = "PLAYER"_hash; - -static Ped AddSoldier(Vehicle veh, int seat, bool driveby = true) -{ - LoadModel(marineModel); - Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel, seat); - SET_MODEL_AS_NO_LONGER_NEEDED(marineModel); - SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); - - TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); - SET_PED_CONFIG_FLAG(soldier, 281, true); - - SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); - SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); - SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); - SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); - - GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); - GIVE_WEAPON_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, 9999, true, true); - SET_PED_ACCURACY(soldier, 40); - - return soldier; -} - -static Ped AddVeteranSoldier(Vehicle veh, int seat, bool driveby = true) -{ - Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel4, seat); - SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); - - TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); - SET_PED_CONFIG_FLAG(soldier, 281, true); - - SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); - SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); - SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); - SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); - SET_PED_SUFFERS_CRITICAL_HITS(soldier, false); - - GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); - GIVE_WEAPON_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, 9999, true, true); - GIVE_WEAPON_COMPONENT_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, "COMPONENT_PISTOL_MK2_CLIP_FMJ"_hash); - GIVE_WEAPON_COMPONENT_TO_PED(soldier, "WEAPON_CARBINERIFLE_MK2"_hash, "COMPONENT_CARBINERIFLE_MK2_CLIP_FMJ"_hash); - SET_PED_ACCURACY(soldier, 55); - return soldier; -} - -static Ped AddMachineGunner(Vehicle veh, int seat, bool barrage) -{ - Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel3, seat); - SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); - - TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); - SET_PED_CONFIG_FLAG(soldier, 281, true); - - SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); - SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); - SET_PED_COMBAT_ATTRIBUTES(soldier, 22, true); - SET_PED_SUFFERS_CRITICAL_HITS(soldier, false); - - GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); - GIVE_WEAPON_TO_PED(soldier, "WEAPON_COMBATMG_MK2"_hash, 9999, true, true); - SET_PED_ACCURACY(soldier, 35); - SET_PED_FIRING_PATTERN(soldier, 0xC6EE6B4C); - if (barrage) - { - SET_PED_COMBAT_ATTRIBUTES(soldier, 3, false); - } - else - { - SET_PED_COMBAT_ATTRIBUTES(soldier, 2, false); - } - - return soldier; -} - -static Ped AddRocketeer(Vehicle veh, int seat, bool driveby = false) -{ - Ped soldier = CreatePoolPedInsideVehicle(veh, 29, marineModel2, seat); - SET_PED_RELATIONSHIP_GROUP_HASH(soldier, armyGroup); - - TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(soldier, true); - SET_PED_CONFIG_FLAG(soldier, 281, true); - - SET_PED_COMBAT_ATTRIBUTES(soldier, 5, true); - SET_PED_COMBAT_ATTRIBUTES(soldier, 46, true); - - // GIVE_WEAPON_TO_PED(soldier, "WEAPON_PISTOL_MK2"_hash, 9999, true, true); - GIVE_WEAPON_TO_PED(soldier, "WEAPON_RPG"_hash, 9999, true, true); - SET_PED_ACCURACY(soldier, 67); - SET_PED_MOVE_RATE_OVERRIDE(soldier, 1.3f); - SET_PED_COMBAT_ATTRIBUTES(soldier, 2, driveby); - SET_PED_COMBAT_ATTRIBUTES(soldier, 13, true); - return soldier; -} - -// mode == 0: car -// mode == 1: boat -// mode == 2: helicopter -static Vehicle SpawnPersuingVehicle(Hash modelHash, float cheatPower, int mode) -{ - Ped playerPed = PLAYER_PED_ID(); - Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); - Vector3 playerVel = GET_ENTITY_VELOCITY(playerPed) * 4; - float aov = (ATAN(2 / GET_GAMEPLAY_CAM_FOV()) / 2) * 57.29578f; - Vector3 newPos; - float camHeading = GET_GAMEPLAY_CAM_ROT(2).z; - float newHeading; - int attempts = 0; - - while (true) - { - float heading = g_Random.GetRandomFloat(0.f, 360.f); - float x2 = sin((360 - heading) * PI / 180); - float y2 = cos((360 - heading) * PI / 180); - int distance = g_Random.GetRandomInt(80, 180); - newPos = Vector3(playerPos.x + playerVel.x + (x2 * distance), playerPos.y + playerVel.y + (y2 * distance), - playerPos.z); - if (mode == 0) - { - if (!GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(newPos.x, newPos.y, newPos.z, playerPos.x, playerPos.y, - playerPos.z, 1, &newPos, &newHeading, - attempts > 2 ? 1 : 0, 3.0, 0)) - { - continue; - } - } - else if (mode == 1) - { - if (!GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(newPos.x, newPos.y, newPos.z, playerPos.x, playerPos.y, - playerPos.z, 1, &newPos, &newHeading, 3, 3.0, 0)) - { - continue; - } - } - else if (mode == 2) - { - newPos.z += 50; - newHeading = 360 - heading; - } - Vector3 dis = newPos - GET_GAMEPLAY_CAM_COORD(); - float angle = fmod(360 - (atan2(dis.x, dis.y) * 57.29578), 360.f); - camHeading = fmod(360 + camHeading, 360.f); - if ((dis.Length() < 500 || attempts > 4) - && (dis.Length() >= 300 || (abs(angle - camHeading) > aov && 360 - abs(angle - camHeading) > aov))) - { - break; - } - attempts++; - } - - Vehicle veh = CreatePoolVehicle(modelHash, newPos.x, newPos.y, newPos.z + (mode == 0), newHeading); - SET_VEHICLE_ENGINE_ON(veh, true, true, false); - if (mode == 0) - { - SET_VEHICLE_ON_GROUND_PROPERLY(veh, 5); - } - SET_VEHICLE_FORWARD_SPEED(veh, GET_VEHICLE_MODEL_ESTIMATED_MAX_SPEED(modelHash) / 2); - SET_VEHICLE_CHEAT_POWER_INCREASE(veh, cheatPower); // Make it easier to catch up - return veh; -} - -static Squad SpawnCrusader(void) -{ - Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("crusader"_hash, 4, 0); - - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); - int r = g_Random.GetRandomInt(0, 2); - if (r == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); - } - else if (r == 1) - { - squad.soldiers.push_back(AddSoldier(squad.veh, 0)); - } - } - else - { - squad.soldiers.push_back(AddSoldier(squad.veh, -1)); - squad.soldiers.push_back(AddSoldier(squad.veh, 0)); - } - if (g_Random.GetRandomInt(0, 2) == 0) - { - squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, false)); - } - if (g_Random.GetRandomInt(0, 4) == 0) - { - squad.soldiers.push_back(AddRocketeer(squad.veh, 2)); - } - for (auto s : squad.soldiers) - { - TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); - SET_PED_HEARING_RANGE(s, 9999.f); - } - - return squad; -} - -static Squad SpawnBarrage(void) -{ - Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("barrage"_hash, 6, 0); - - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); - int r = g_Random.GetRandomInt(0, 2); - if (r == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); - } - else if (r == 1) - { - squad.soldiers.push_back(AddSoldier(squad.veh, 0)); - } - } - else - { - squad.soldiers.push_back(AddSoldier(squad.veh, -1)); - squad.soldiers.push_back(AddSoldier(squad.veh, 0)); - } - int ran = g_Random.GetRandomInt(0, 2); - if (ran != 0) - { - squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); - if (ran != 1) - { - squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); - } - } - else - { - squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); - } - for (auto s : squad.soldiers) - { - TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); - SET_PED_HEARING_RANGE(s, 9999.f); - } - - return squad; -} - -static Squad SpawnBrickade(void) -{ - Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("brickade"_hash, 4, 0); - SET_VEHICLE_COLOURS(squad.veh, 110, 15); - - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1)); - int r = g_Random.GetRandomInt(0, 2); - if (r == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0)); - } - else if (r == 1) - { - squad.soldiers.push_back(AddSoldier(squad.veh, 0)); - } - } - else - { - squad.soldiers.push_back(AddSoldier(squad.veh, -1)); - squad.soldiers.push_back(AddSoldier(squad.veh, 0)); - } - - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 1)); - int r = g_Random.GetRandomInt(0, 2); - if (r == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 3)); - } - else if (r == 1) - { - squad.soldiers.push_back(AddSoldier(squad.veh, 3)); - } - } - else - { - squad.soldiers.push_back(AddSoldier(squad.veh, 1)); - squad.soldiers.push_back(AddSoldier(squad.veh, 3)); - } - - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 2)); - int r = g_Random.GetRandomInt(0, 2); - if (r == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 4)); - } - else if (r == 1) - { - squad.soldiers.push_back(AddSoldier(squad.veh, 4)); - } - } - else - { - squad.soldiers.push_back(AddSoldier(squad.veh, 2)); - squad.soldiers.push_back(AddSoldier(squad.veh, 4)); - } - for (auto s : squad.soldiers) - { - TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); - SET_PED_HEARING_RANGE(s, 9999.f); - } - - return squad; -} - -static Squad SpawnBuzzard(void) -{ - Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("buzzard2"_hash, 4, 2); - - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); - - switch (g_Random.GetRandomInt(0, 2)) - { - case 0: - squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); - break; - case 1: - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 1)); - break; - default: - squad.soldiers.push_back(AddSoldier(squad.veh, 1)); - break; - } - - switch (g_Random.GetRandomInt(0, 4)) - { - case 0: - squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); - break; - case 1: - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 2)); - break; - default: - squad.soldiers.push_back(AddSoldier(squad.veh, 2)); - break; - } - - for (auto s : squad.soldiers) - { - TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); - SET_PED_HEARING_RANGE(s, 9999.f); - } - - return squad; -} - -static Squad SpawnTank(void) -{ - Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("rhino"_hash, 4, 0); - - Ped ped = AddRocketeer(squad.veh, -1); - TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped, 600, 0); - SET_PED_HEARING_RANGE(ped, 9999.f); - squad.soldiers.push_back(ped); - - return squad; -} - -static Squad SpawnDinghy(void) -{ - Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("dinghy5"_hash, 4, 1); - - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); - int r = g_Random.GetRandomInt(0, 2); - if (r == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0, false)); - } - else if (r == 1) - { - squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); - } - } - else - { - squad.soldiers.push_back(AddSoldier(squad.veh, -1, false)); - squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); - } - squad.soldiers.push_back(AddMachineGunner(squad.veh, 3, true)); - - for (auto s : squad.soldiers) - { - TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); - SET_PED_HEARING_RANGE(s, 9999.f); - } - - return squad; -} - -static Squad SpawnPatrolBoat(void) -{ - Squad squad; - Ped playerPed = PLAYER_PED_ID(); - squad.veh = SpawnPersuingVehicle("patrolboat"_hash, 4, 1); - - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, -1, false)); - int r = g_Random.GetRandomInt(0, 2); - if (r == 0) - { - squad.soldiers.push_back(AddVeteranSoldier(squad.veh, 0, false)); - } - else if (r == 1) - { - squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); - } - } - else - { - squad.soldiers.push_back(AddSoldier(squad.veh, -1, false)); - squad.soldiers.push_back(AddSoldier(squad.veh, 0, false)); - } - squad.soldiers.push_back(AddMachineGunner(squad.veh, 1, true)); - if (g_Random.GetRandomInt(0, 1) == 0) - { - squad.soldiers.push_back(AddMachineGunner(squad.veh, 2, true)); - } - for (auto s : squad.soldiers) - { - TASK_COMBAT_HATED_TARGETS_AROUND_PED(s, 600, 0); - SET_PED_HEARING_RANGE(s, 9999.f); - } - - return squad; -} - -static std::vector squads; -static DWORD64 lastTick = 0; - -static void ClearSquad(Squad squad) -{ - for (auto p : squad.soldiers) - { - SET_PED_AS_NO_LONGER_NEEDED(&p); - } - SET_VEHICLE_AS_NO_LONGER_NEEDED(&squad.veh); -} - -static void ClearSquads(void) -{ - for (auto s : squads) - { - ClearSquad(s); - } - squads.clear(); -} - -static void OnStartSix(void) -{ - SET_RELATIONSHIP_BETWEEN_GROUPS(5, armyGroup, playerGroup); - SET_RELATIONSHIP_BETWEEN_GROUPS(5, playerGroup, armyGroup); - - Player player = PLAYER_ID(); - - lastLevelf = GET_FAKE_WANTED_LEVEL(); - - SET_PLAYER_WANTED_LEVEL(player, 5, false); - SET_PLAYER_WANTED_LEVEL_NOW(player, false); - SET_FAKE_WANTED_LEVEL(6); - lastTick = GET_GAME_TIMER(); - - squads.push_back(SpawnCrusader()); - squads.push_back(SpawnBarrage()); - squads.push_back(SpawnBuzzard()); -} - -static void OnTickSix(void) -{ - auto curTick = GET_GAME_TIMER(); - Ped playerPed = PLAYER_PED_ID(); - if (IS_PED_DEAD_OR_DYING(playerPed, 1) && squads.size()) - { - ClearSquads(); - } - else if (curTick > lastTick + 4000) - { - lastTick += 4000; - Player player = PLAYER_ID(); - int level = GET_PLAYER_WANTED_LEVEL(player); - int levelf = GET_FAKE_WANTED_LEVEL(); - - if (level != 5) - { - SET_PLAYER_WANTED_LEVEL(player, 5, false); - SET_PLAYER_WANTED_LEVEL_NOW(player, false); - } - if (levelf != 6) - { - lastLevelf = levelf; - SET_FAKE_WANTED_LEVEL(6); - } - REPORT_POLICE_SPOTTED_PLAYER(player); - - if (squads.size() != 0) - { - Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false) + (GET_ENTITY_VELOCITY(playerPed) * 4); - int s = 0; - int i = 0; - std::vector emptySquads; - - while (i < squads.size()) - { - Squad &squad = squads[i]; - float distance = GET_ENTITY_COORDS(squad.veh, false).DistanceTo(playerPos); - int j = 0; - while (j < squad.soldiers.size()) - { - Ped ped = squad.soldiers[j]; - if (!DOES_ENTITY_EXIST(ped) || IS_PED_DEAD_OR_DYING(ped, false) - || GET_ENTITY_COORDS(ped, false).DistanceTo(playerPos) > 450.f) - { - SET_PED_AS_NO_LONGER_NEEDED(&ped); - squad.soldiers.erase(squad.soldiers.begin() + j); - } - else - { - j++; - } - } - - if (squad.soldiers.empty()) - { - SET_VEHICLE_AS_NO_LONGER_NEEDED(&squad.veh); - squads.erase(squads.begin() + i); - } - else - { - i++; - } - } - } - - if (squads.size() < 4) - { - int waterCount = 0; - Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); - float waterZ; - - for (int i = 0; i < 3; i++) - { - GET_WATER_HEIGHT(playerPos.x + g_Random.GetRandomFloat(-100.f, 100.f), - playerPos.y + g_Random.GetRandomFloat(-100.f, 100.f), playerPos.z + 100.f, &waterZ); - waterCount += (waterZ > 0); - } - - if (waterCount < 2) - { - switch (g_Random.GetRandomInt(0, 5)) - { - case 0: - squads.push_back(SpawnTank()); - break; - case 1: - squads.push_back(SpawnBuzzard()); - break; - case 2: - squads.push_back(SpawnBarrage()); - break; - case 3: - squads.push_back(SpawnBrickade()); - break; - default: - squads.push_back(SpawnCrusader()); - break; - } - } - else - { - int r = g_Random.GetRandomInt(0, 5); - - if (r == 0) - { - squads.push_back(SpawnPatrolBoat()); - } - else if (r < 3) - { - squads.push_back(SpawnBuzzard()); - } - else - { - squads.push_back(SpawnDinghy()); - } - } - } - } -} - -static void OnStopSix(void) -{ - Player player = PLAYER_ID(); - ClearSquads(); - SET_RELATIONSHIP_BETWEEN_GROUPS(3, armyGroup, playerGroup); - SET_RELATIONSHIP_BETWEEN_GROUPS(3, playerGroup, armyGroup); - SET_PLAYER_WANTED_LEVEL(player, 0, false); - SET_PLAYER_WANTED_LEVEL_NOW(player, false); - if (GET_FAKE_WANTED_LEVEL() == 6) - { - SET_FAKE_WANTED_LEVEL(lastLevelf); - } -} - -// clang-format off -REGISTER_EFFECT(OnStartSix, OnStopSix, OnTickSix, EffectInfo - { - .Name = "6 Wanted Stars", - .Id = "player_6stars", - .IsTimed = true, - .IncompatibleWith = { "player_neverwanted" }, - .EffectGroupType = EffectGroupType::WantedLevel, - } -);