Skip to content

Commit

Permalink
Added effects "Time Based Timer" and "Distance Based Timer"
Browse files Browse the repository at this point in the history
  • Loading branch information
Regynate committed Jan 27, 2025
1 parent 51b4994 commit 8f94412
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 11 deletions.
59 changes: 48 additions & 11 deletions ChaosMod/Components/EffectDispatchTimer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,13 @@ void EffectDispatchTimer::UpdateTimer(int deltaTime)
if (!m_EnableTimer || (ComponentExists<MetaModifiers>() && GetComponent<MetaModifiers>()->DisableChaos))
return;

int effectSpawnTime = ComponentExists<MetaModifiers>() && GetComponent<MetaModifiers>()->TimeToDispatchEffect > 0
? GetComponent<MetaModifiers>()->TimeToDispatchEffect
: m_EffectSpawnTime;

m_TimerPercentage += deltaTime
* (!ComponentExists<MetaModifiers>() ? 1.f : GetComponent<MetaModifiers>()->TimerSpeedModifier)
/ m_EffectSpawnTime / 1000.f;
/ effectSpawnTime / 1000.f;

if (m_TimerPercentage >= 1.f && m_DispatchEffectsOnTimer && ComponentExists<EffectDispatcher>())
{
Expand Down Expand Up @@ -66,14 +70,22 @@ void EffectDispatchTimer::UpdateTravelledDistance()
return;
}

int effectSpawnDistance =
ComponentExists<MetaModifiers>() && GetComponent<MetaModifiers>()->DistanceToDispatchEffect > 0
? GetComponent<MetaModifiers>()->DistanceToDispatchEffect
: m_DistanceChaosState.DistanceToActivateEffect;

auto distance =
GET_DISTANCE_BETWEEN_COORDS(position.x, position.y, position.z, m_DistanceChaosState.SavedPosition.x,
m_DistanceChaosState.SavedPosition.y, m_DistanceChaosState.SavedPosition.z, true);

if (m_DistanceChaosState.DistanceType == DistanceChaosState::TravelledDistanceType::Displacement)
{
if (distance * (ComponentExists<MetaModifiers>() ? GetComponent<MetaModifiers>()->TimerSpeedModifier : 1.f)
>= m_DistanceChaosState.DistanceToActivateEffect)
m_TimerPercentage =
(distance * (ComponentExists<MetaModifiers>() ? GetComponent<MetaModifiers>()->TimerSpeedModifier : 1.f))
/ effectSpawnDistance;

if (m_TimerPercentage >= 1.f)
{
if (m_DispatchEffectsOnTimer && ComponentExists<EffectDispatcher>())
{
Expand All @@ -86,17 +98,13 @@ void EffectDispatchTimer::UpdateTravelledDistance()

m_DistanceChaosState.SavedPosition = position;
}

m_TimerPercentage =
(distance * (ComponentExists<MetaModifiers>() ? GetComponent<MetaModifiers>()->TimerSpeedModifier : 1.f))
/ m_DistanceChaosState.DistanceToActivateEffect;
}
else if (m_DistanceChaosState.DistanceType == DistanceChaosState::TravelledDistanceType::Distance)
{
m_DistanceChaosState.SavedPosition = position;
m_TimerPercentage +=
(distance * (ComponentExists<MetaModifiers>() ? GetComponent<MetaModifiers>()->TimerSpeedModifier : 1.f))
/ m_DistanceChaosState.DistanceToActivateEffect;
/ effectSpawnDistance;

if (m_TimerPercentage >= 1.f && m_DispatchEffectsOnTimer && ComponentExists<EffectDispatcher>())
{
Expand All @@ -121,6 +129,21 @@ void EffectDispatchTimer::SetTimerEnabled(bool state)
m_EnableTimer = state;
}

int EffectDispatchTimer::GetDefaultEffectSpawnTime() const
{
return m_EffectSpawnTime;
}

int EffectDispatchTimer::GetDefaultEffectSpawnDistance() const
{
return m_DistanceChaosState.DistanceToActivateEffect;
}

void EffectDispatchTimer::ResetSavedPosition()
{
m_DistanceChaosState.SavedPosition = GET_ENTITY_COORDS(PLAYER_PED_ID(), false);
}

std::uint64_t EffectDispatchTimer::GetTimer() const
{
return m_Timer;
Expand Down Expand Up @@ -203,10 +226,24 @@ void EffectDispatchTimer::OnRun()

if (!m_PauseTimer)
{
if (m_DistanceChaosState.EnableDistanceBasedEffectDispatch)
UpdateTravelledDistance();
else
const TimerMode modeOverride =
ComponentExists<MetaModifiers>() ? GetComponent<MetaModifiers>()->OverrideTimerMode : TimerMode::None;

switch (modeOverride)
{
case TimerMode::Time:
UpdateTimer(deltaTime);
break;
case TimerMode::Distance:
UpdateTravelledDistance();
break;
default:
if (m_DistanceChaosState.EnableDistanceBasedEffectDispatch)
UpdateTravelledDistance();
else
UpdateTimer(deltaTime);
break;
}
}

m_Timer = curTime;
Expand Down
5 changes: 5 additions & 0 deletions ChaosMod/Components/EffectDispatchTimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ class EffectDispatchTimer : public Component
bool IsTimerEnabled() const;
void SetTimerEnabled(bool state);

int GetDefaultEffectSpawnTime() const;
int GetDefaultEffectSpawnDistance() const;

void ResetSavedPosition();

std::uint64_t GetTimer() const;
void ResetTimer();

Expand Down
4 changes: 4 additions & 0 deletions ChaosMod/Components/MetaModifiers.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "Components/Component.h"
#include "Util/TimerMode.h"

#include <cstdint>

Expand All @@ -13,4 +14,7 @@ class MetaModifiers : public Component
bool HideChaosUI = false;
bool DisableChaos = false;
bool FlipChaosUI = false;
TimerMode OverrideTimerMode = TimerMode::None;
int TimeToDispatchEffect = 0;
int DistanceToDispatchEffect = 0;
};
11 changes: 11 additions & 0 deletions ChaosMod/Effects/Condition/ConditionUsingDistanceTimer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#include <stdafx.h>

#include "Components/EffectDispatchTimer.h"
#include "Effects/Condition/EffectCondition.h"

static bool OnCondition()
{
return ComponentExists<EffectDispatchTimer>() && GetComponent<EffectDispatchTimer>()->IsUsingDistanceBasedDispatch();
}

REGISTER_EFFECT_CONDITION(EffectConditionType::UsingDistanceTimer, OnCondition);
11 changes: 11 additions & 0 deletions ChaosMod/Effects/Condition/ConditionUsingTimeTimer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#include <stdafx.h>

#include "Components/EffectDispatchTimer.h"
#include "Effects/Condition/EffectCondition.h"

static bool OnCondition()
{
return ComponentExists<EffectDispatchTimer>() && !GetComponent<EffectDispatchTimer>()->IsUsingDistanceBasedDispatch();
}

REGISTER_EFFECT_CONDITION(EffectConditionType::UsingTimeTimer, OnCondition);
2 changes: 2 additions & 0 deletions ChaosMod/Effects/Condition/EffectCondition.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ enum class EffectConditionType
{
None,
VotingEnabled, // Voting is enabled
UsingDistanceTimer,
UsingTimeTimer,
};

#define REGISTER_EFFECT_CONDITION(conditionType, condition) \
Expand Down
71 changes: 71 additions & 0 deletions ChaosMod/Effects/db/Meta/MetaTimerMode.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
Effects by Regynate
*/

#include <stdafx.h>

#include "Components/MetaModifiers.h"
#include "Effects/Register/RegisterEffect.h"
#include <Components/EffectDispatchTimer.h>

static void OnStop()
{
if (ComponentExists<MetaModifiers>())
GetComponent<MetaModifiers>()->OverrideTimerMode = TimerMode::None;
GetComponent<MetaModifiers>()->DistanceToDispatchEffect = 0;
GetComponent<MetaModifiers>()->TimeToDispatchEffect = 0;
if (ComponentExists<EffectDispatchTimer>())
GetComponent<EffectDispatchTimer>()->ResetSavedPosition();
}

static void OnTick_Time()
{
if (ComponentExists<MetaModifiers>())
GetComponent<MetaModifiers>()->OverrideTimerMode = TimerMode::Time;

int defaultDistance = ComponentExists<EffectDispatchTimer>()
? GetComponent<EffectDispatchTimer>()->GetDefaultEffectSpawnDistance()
: 0;
GetComponent<MetaModifiers>()->TimeToDispatchEffect = defaultDistance ? defaultDistance / 10 : 30;
}

// clang-format off
REGISTER_EFFECT(nullptr, OnStop, OnTick_Time,
{
.Name = "Time Based Timer",
.Id = "meta_timer_timebased",
.IsTimed = true,
.IncompatibleWith = { "meta_timer_distancebased" },
.ExecutionType = EffectExecutionType::Meta,
.ConditionType = EffectConditionType::UsingDistanceTimer
}
);
// clang-format on

static void OnTick_Distance()
{
if (ComponentExists<MetaModifiers>())
GetComponent<MetaModifiers>()->OverrideTimerMode = TimerMode::Distance;
int defaultTime =
ComponentExists<EffectDispatchTimer>() ? GetComponent<EffectDispatchTimer>()->GetDefaultEffectSpawnTime() : 0;
GetComponent<MetaModifiers>()->DistanceToDispatchEffect = defaultTime ? defaultTime * 10 : 300;
}

static void OnStart_Distance()
{
if (ComponentExists<EffectDispatchTimer>())
GetComponent<EffectDispatchTimer>()->ResetSavedPosition();
}

// clang-format off
REGISTER_EFFECT(OnStart_Distance, OnStop, OnTick_Distance,
{
.Name = "Distance Based Timer",
.Id = "meta_timer_distancebased",
.IsTimed = true,
.IncompatibleWith = { "meta_timer_timebased" },
.ExecutionType = EffectExecutionType::Meta,
.ConditionType = EffectConditionType::UsingTimeTimer
}
);
// clang-format on
6 changes: 6 additions & 0 deletions ChaosMod/Util/TimerMode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
enum class TimerMode
{
None,
Time,
Distance
};
2 changes: 2 additions & 0 deletions ConfigApp/Effects.cs
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,8 @@ public enum EffectTimedType
{ "screen_hueshift", new EffectInfo("Hue Shift", EffectCategory.Screen, true) },
{ "player_copyforce", new EffectInfo("Use The Force", EffectCategory.Player, true, true) },
{ "player_tptowaypointopposite", new EffectInfo("Teleport To The Opposite Side Of Waypoint", EffectCategory.Player) },
{ "meta_timer_distancebased", new EffectInfo("Distance Based Timer", EffectCategory.Meta, true) },
{ "meta_timer_timebased", new EffectInfo("Time Based Timer", EffectCategory.Meta, true) },
};
}
}

0 comments on commit 8f94412

Please sign in to comment.