From caca14e27dab00f1d43754373f82044f208f349f Mon Sep 17 00:00:00 2001 From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com> Date: Mon, 6 Jun 2022 10:25:21 -0400 Subject: [PATCH 1/4] Added "Alien Invasion" effect Similar to zombies with the spawns, but when the effect starts a ufo is spawned above the player. Then when an alien is spawned, the ufo goes to the spawn location, and "drops off" the alien. --- ChaosMod/ChaosMod.vcxproj | 1 + ChaosMod/Effects/db/Peds/PedsAliens.cpp | 157 ++++++++++++++++++++++++ ConfigApp/Effects.cs | 1 + 3 files changed, 159 insertions(+) create mode 100644 ChaosMod/Effects/db/Peds/PedsAliens.cpp diff --git a/ChaosMod/ChaosMod.vcxproj b/ChaosMod/ChaosMod.vcxproj index c6cc7cdf9..5c32bc3c6 100644 --- a/ChaosMod/ChaosMod.vcxproj +++ b/ChaosMod/ChaosMod.vcxproj @@ -119,6 +119,7 @@ + diff --git a/ChaosMod/Effects/db/Peds/PedsAliens.cpp b/ChaosMod/Effects/db/Peds/PedsAliens.cpp new file mode 100644 index 000000000..3ed2ed90f --- /dev/null +++ b/ChaosMod/Effects/db/Peds/PedsAliens.cpp @@ -0,0 +1,157 @@ +/* + Effect By OnlyRealNubs +*/ + +#include + +#include "Util/Peds.h" + +static std::list m_aliens; +static const std::vector m_weapons = +{ + GET_HASH_KEY("WEAPON_RAYPISTOL"), + GET_HASH_KEY("WEAPON_RAYCARBINE"), + GET_HASH_KEY("WEAPON_RAYMINIGUN") +}; + +#pragma region UFO +static const Hash ufoModel = 0xB467C540; +static Object ufo; +static bool ufoBusy = false; +#pragma endregion + +#pragma region PTFX +static const char *ptfxDict = "scr_rcbarry1"; +static const char *ptfxCreate = "scr_alien_charging"; +#pragma endregion + +static void OnStart() +{ + m_aliens.clear(); + + LoadModel(ufoModel); + Vector3 pos = GET_ENTITY_COORDS(PLAYER_PED_ID(), true); + ufo = CreatePoolProp(ufoModel, pos.x, pos.y, pos.z + 40, true); + SET_MODEL_AS_NO_LONGER_NEEDED(ufoModel); + + REQUEST_NAMED_PTFX_ASSET(ptfxDict); + while (!HAS_NAMED_PTFX_ASSET_LOADED(ptfxDict)) + { + WAIT(0); + } + + Hash groupHash; + ADD_RELATIONSHIP_GROUP("_ALIENS", &groupHash); + SET_RELATIONSHIP_BETWEEN_GROUPS(5, groupHash, GET_HASH_KEY("PLAYER")); + SET_RELATIONSHIP_BETWEEN_GROUPS(5, groupHash, GET_HASH_KEY("CIVMALE")); + SET_RELATIONSHIP_BETWEEN_GROUPS(5, groupHash, GET_HASH_KEY("CIVFEMALE")); + + ENABLE_ALIEN_BLOOD_VFX(true); +} + +static void OnStop() +{ + for (Ped ped : m_aliens) + { + if (DOES_ENTITY_EXIST(ped)) + { + SET_PED_AS_NO_LONGER_NEEDED(&ped); + } + } + ufoBusy = false; + DELETE_OBJECT(&ufo); + + ENABLE_ALIEN_BLOOD_VFX(false); +} + +static void OnTick() +{ + static constexpr int MAX_ALIENS = 20; + static constexpr Hash MODEL_HASH = 0x64611296; + + static Hash alienGroupHash = GET_HASH_KEY("_ALIENS"); + + Ped playerPed = PLAYER_PED_ID(); + Vector3 playerPos = GET_ENTITY_COORDS(playerPed, false); + + if (m_aliens.size() <= MAX_ALIENS && !ufoBusy) + { + Vector3 spawnPos; + if (GET_NTH_CLOSEST_VEHICLE_NODE(playerPos.x, playerPos.y, playerPos.z, 15 + m_aliens.size(), &spawnPos, 0, 0, + 0) + && GET_DISTANCE_BETWEEN_COORDS(playerPos.x, playerPos.y, playerPos.z, spawnPos.x, spawnPos.y, spawnPos.z, + false) + < 300.f) + { + ufoBusy = true; + while (!SLIDE_OBJECT(ufo, spawnPos.x, spawnPos.y, GET_ENTITY_COORDS(ufo, true).z, 1.f, 1.f, 1.f, false)) + { + WAIT(0); + } + + LoadModel(MODEL_HASH); + + Ped alien = CreatePoolPed(26, MODEL_HASH, spawnPos.x, spawnPos.y, spawnPos.z, .0f); + + SET_PED_COMPONENT_VARIATION(alien, 0, 0, 0, 0); + SET_PED_COMPONENT_VARIATION(alien, 3, 0, 0, 0); + SET_PED_COMPONENT_VARIATION(alien, 4, 0, 0, 0); + SET_PED_COMPONENT_VARIATION(alien, 5, 0, 0, 0); + SET_PED_COMPONENT_VARIATION(alien, 6, 0, 0, 0); + + m_aliens.push_back(alien); + + SET_PED_RELATIONSHIP_GROUP_HASH(alien, alienGroupHash); + SET_PED_COMBAT_ATTRIBUTES(alien, 5, true); + SET_PED_COMBAT_ATTRIBUTES(alien, 46, true); + + SET_AMBIENT_VOICE_NAME(alien, "ALIENS"); + DISABLE_PED_PAIN_AUDIO(alien, true); + + GIVE_WEAPON_TO_PED(alien, m_weapons.at(g_Random.GetRandomInt(0, m_weapons.size()-1)), 9999, false, true); + + TASK_COMBAT_PED(alien, playerPed, 0, 16); + SET_PED_FIRING_PATTERN(alien, 0xC6EE6B4C); + + SET_MODEL_AS_NO_LONGER_NEEDED(MODEL_HASH); + + USE_PARTICLE_FX_ASSET(ptfxDict); + SET_PARTICLE_FX_SHOOTOUT_BOAT(0); + START_PARTICLE_FX_NON_LOOPED_ON_ENTITY(ptfxCreate, alien, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, false, false, + false); + + ufoBusy = false; + } + } + + for (std::list::iterator it = m_aliens.begin(); it != m_aliens.end();) + { + Ped alien = *it; + if (DOES_ENTITY_EXIST(alien)) + { + Vector3 alienPos = GET_ENTITY_COORDS(alien, false); + if (GET_DISTANCE_BETWEEN_COORDS(playerPos.x, playerPos.y, playerPos.z, alienPos.x, alienPos.y, alienPos.z, + false) + < 300.f) + { + if (IS_PED_DEAD_OR_DYING(alien, true)) + { + SET_PED_AS_NO_LONGER_NEEDED(&alien); + } + it++; + continue; + } + SET_PED_AS_NO_LONGER_NEEDED(&alien); + } + it = m_aliens.erase(it); + } +} + +// clang-format off +REGISTER_EFFECT(OnStart, OnStop, OnTick, EffectInfo + { + .Name = "Alien Invasion", + .Id = "aliens", + .IsTimed = true + } +); \ No newline at end of file diff --git a/ConfigApp/Effects.cs b/ConfigApp/Effects.cs index e045e76e7..8e2ad7b9a 100644 --- a/ConfigApp/Effects.cs +++ b/ConfigApp/Effects.cs @@ -372,6 +372,7 @@ public enum EffectTimedType { "screen_colorfulworld", new EffectInfo("Colorful World", EffectCategory.Screen, true) }, { "screen_arc", new EffectInfo("Arced Screen", EffectCategory.Screen, true, true) }, { "world_blackhole", new EffectInfo("Black Hole", EffectCategory.Misc, true, true) }, + { "aliens", new EffectInfo("Alien Invasion", EffectCategory.Peds, true) }, }; } } From f4b1b44fba3b06928d936f045ac8d6a168db91fd Mon Sep 17 00:00:00 2001 From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com> Date: Mon, 6 Jun 2022 10:43:26 -0400 Subject: [PATCH 2/4] Fixed OnStop bug --- ChaosMod/Effects/db/Peds/PedsAliens.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ChaosMod/Effects/db/Peds/PedsAliens.cpp b/ChaosMod/Effects/db/Peds/PedsAliens.cpp index 3ed2ed90f..38937a0c5 100644 --- a/ChaosMod/Effects/db/Peds/PedsAliens.cpp +++ b/ChaosMod/Effects/db/Peds/PedsAliens.cpp @@ -59,14 +59,18 @@ static void OnStop() } } ufoBusy = false; - DELETE_OBJECT(&ufo); + + if (DOES_ENTITY_EXIST(ufo)) + { + SET_OBJECT_AS_NO_LONGER_NEEDED(&ufo); + } ENABLE_ALIEN_BLOOD_VFX(false); } static void OnTick() { - static constexpr int MAX_ALIENS = 20; + static constexpr int MAX_ALIENS = 10; static constexpr Hash MODEL_HASH = 0x64611296; static Hash alienGroupHash = GET_HASH_KEY("_ALIENS"); From 4f489c3296f329221a322ed60bd9a2ae48e1d90b Mon Sep 17 00:00:00 2001 From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com> Date: Tue, 7 Jun 2022 09:41:48 -0400 Subject: [PATCH 3/4] Implemented Suggested Improvements --- ChaosMod/Effects/db/Peds/PedsAliens.cpp | 52 ++++++++++++++++++++----- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/ChaosMod/Effects/db/Peds/PedsAliens.cpp b/ChaosMod/Effects/db/Peds/PedsAliens.cpp index 38937a0c5..f3c11f838 100644 --- a/ChaosMod/Effects/db/Peds/PedsAliens.cpp +++ b/ChaosMod/Effects/db/Peds/PedsAliens.cpp @@ -4,6 +4,7 @@ #include +#include #include "Util/Peds.h" static std::list m_aliens; @@ -16,22 +17,24 @@ static const std::vector m_weapons = #pragma region UFO static const Hash ufoModel = 0xB467C540; +static const double beamTime = 1200; static Object ufo; static bool ufoBusy = false; #pragma endregion #pragma region PTFX static const char *ptfxDict = "scr_rcbarry1"; -static const char *ptfxCreate = "scr_alien_charging"; +static const char *ptfxCreate = "scr_alien_teleport"; #pragma endregion static void OnStart() { m_aliens.clear(); + Vector3 playerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), true); LoadModel(ufoModel); - Vector3 pos = GET_ENTITY_COORDS(PLAYER_PED_ID(), true); - ufo = CreatePoolProp(ufoModel, pos.x, pos.y, pos.z + 40, true); + ufo = CreatePoolProp(ufoModel, 0.f, -4000.f, playerPos.z + 40, true); + SET_ENTITY_AS_MISSION_ENTITY(ufo, false, false); SET_MODEL_AS_NO_LONGER_NEEDED(ufoModel); REQUEST_NAMED_PTFX_ASSET(ptfxDict); @@ -47,6 +50,14 @@ static void OnStart() SET_RELATIONSHIP_BETWEEN_GROUPS(5, groupHash, GET_HASH_KEY("CIVFEMALE")); ENABLE_ALIEN_BLOOD_VFX(true); + + SET_AI_MELEE_WEAPON_DAMAGE_MODIFIER(.1f); + SET_AI_WEAPON_DAMAGE_MODIFIER(.1f); + + while (!SLIDE_OBJECT(ufo, playerPos.x, playerPos.y, GET_ENTITY_COORDS(ufo, true).z, 10.f, 10.f, 1.f, false)) + { + WAIT(0); + } } static void OnStop() @@ -55,10 +66,19 @@ static void OnStop() { if (DOES_ENTITY_EXIST(ped)) { - SET_PED_AS_NO_LONGER_NEEDED(&ped); + Vector3 pedPos = GET_ENTITY_COORDS(ped, true); + USE_PARTICLE_FX_ASSET(ptfxDict); + START_PARTICLE_FX_NON_LOOPED_AT_COORD(ptfxCreate, pedPos.x, pedPos.y, pedPos.z, 0.f, 0.f, 0.f, 1.2f, + false, false, false); + DELETE_PED(&ped); } } ufoBusy = false; + + while (!SLIDE_OBJECT(ufo, 0.f, -4000.f, GET_ENTITY_COORDS(ufo, true).z, 10.f, 10.f, 1.f, false)) + { + WAIT(0); + } if (DOES_ENTITY_EXIST(ufo)) { @@ -66,11 +86,16 @@ static void OnStop() } ENABLE_ALIEN_BLOOD_VFX(false); + + RESET_AI_MELEE_WEAPON_DAMAGE_MODIFIER(); + RESET_AI_WEAPON_DAMAGE_MODIFIER(); } static void OnTick() { - static constexpr int MAX_ALIENS = 10; + static DWORD64 lastTick; + DWORD64 curTick = GetTickCount64(); + static constexpr int MAX_ALIENS = 5; static constexpr Hash MODEL_HASH = 0x64611296; static Hash alienGroupHash = GET_HASH_KEY("_ALIENS"); @@ -88,6 +113,7 @@ static void OnTick() < 300.f) { ufoBusy = true; + while (!SLIDE_OBJECT(ufo, spawnPos.x, spawnPos.y, GET_ENTITY_COORDS(ufo, true).z, 1.f, 1.f, 1.f, false)) { WAIT(0); @@ -115,14 +141,14 @@ static void OnTick() GIVE_WEAPON_TO_PED(alien, m_weapons.at(g_Random.GetRandomInt(0, m_weapons.size()-1)), 9999, false, true); TASK_COMBAT_PED(alien, playerPed, 0, 16); - SET_PED_FIRING_PATTERN(alien, 0xC6EE6B4C); + SET_PED_FIRING_PATTERN(alien, 0x7A845691); SET_MODEL_AS_NO_LONGER_NEEDED(MODEL_HASH); + Vector3 pedPos = GET_ENTITY_COORDS(alien, true); USE_PARTICLE_FX_ASSET(ptfxDict); - SET_PARTICLE_FX_SHOOTOUT_BOAT(0); - START_PARTICLE_FX_NON_LOOPED_ON_ENTITY(ptfxCreate, alien, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, false, false, - false); + START_PARTICLE_FX_NON_LOOPED_AT_COORD(ptfxCreate, pedPos.x, pedPos.y, pedPos.z, 0.f, 0.f, 0.f, 1.2f, false, + false, false); ufoBusy = false; } @@ -149,6 +175,14 @@ static void OnTick() } it = m_aliens.erase(it); } + + //Slowly rotate the ufo + if (lastTick < curTick - 10) + { + lastTick = curTick; + + SET_ENTITY_ROTATION(ufo, 0.f, 0.f, GET_ENTITY_HEADING(ufo) + 0.1f, 2, true); + } } // clang-format off From cd21abeb52f22fb70abf7c4089b12c362d3016a7 Mon Sep 17 00:00:00 2001 From: OnlyRealNubs <91900600+OnlyRealNubs@users.noreply.github.com> Date: Tue, 7 Jun 2022 09:47:25 -0400 Subject: [PATCH 4/4] Cleaned up. --- ChaosMod/Effects/db/Peds/PedsAliens.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/ChaosMod/Effects/db/Peds/PedsAliens.cpp b/ChaosMod/Effects/db/Peds/PedsAliens.cpp index f3c11f838..8af65f266 100644 --- a/ChaosMod/Effects/db/Peds/PedsAliens.cpp +++ b/ChaosMod/Effects/db/Peds/PedsAliens.cpp @@ -4,7 +4,6 @@ #include -#include #include "Util/Peds.h" static std::list m_aliens; @@ -17,7 +16,6 @@ static const std::vector m_weapons = #pragma region UFO static const Hash ufoModel = 0xB467C540; -static const double beamTime = 1200; static Object ufo; static bool ufoBusy = false; #pragma endregion