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