From 7aebffe5d98636ff03bda7873a6b82261d5e92a1 Mon Sep 17 00:00:00 2001 From: Gareth YR Date: Mon, 5 Jul 2021 01:10:03 -0300 Subject: [PATCH 1/8] Unbroke all the mods :P Added flag for whether or not either throttle was redefined and, if it wasn't, defaulted it to 0 for AHumans' and ACrabs' jetpacks. Added setter for throttle values, and renamed the getters to be more consistent (though the throttle variables and getters and setters all need to be renamed at some point, there's an issue in for that) Added lua bindings for min and max throttle range. They've got garbage names because I don't want them bound til we get a better name for this stuff --- Entities/ACrab.cpp | 9 +++++++-- Entities/AEmitter.cpp | 4 ++++ Entities/AEmitter.h | 23 +++++++++++++++++++++-- Entities/AHuman.cpp | 9 +++++++-- Managers/LuaMan.cpp | 2 ++ 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Entities/ACrab.cpp b/Entities/ACrab.cpp index 7c74e2bf7..dee2bcb4d 100644 --- a/Entities/ACrab.cpp +++ b/Entities/ACrab.cpp @@ -505,6 +505,11 @@ void ACrab::SetJetpack(AEmitter *newJetpack) { if (m_pJetpack->HasNoSetDamageMultiplier()) { m_pJetpack->SetDamageMultiplier(0.0F); } m_pJetpack->SetApplyTransferredForcesAtOffset(false); m_pJetpack->SetDeleteWhenRemovedFromParent(true); + + if (!m_pJetpack->GetThrottleRangeRedefined()) { + m_pJetpack->SetMinThrottleRange(0); + m_pJetpack->SetMaxThrottleRange(0); + } } } @@ -2156,8 +2161,8 @@ void ACrab::Update() // Jetpack throttle depletes relative to jet time, but only if throttle range values have been defined float jetTimeRatio = std::max(m_JetTimeLeft / m_JetTimeTotal, 0.0F); m_pJetpack->SetThrottle(jetTimeRatio * 2.0F - 1.0F); - float minScale = 1.0F - m_pJetpack->GetMinThrottle(); - m_pJetpack->SetFlashScale(minScale + (1.0F + m_pJetpack->GetMaxThrottle() - minScale) * jetTimeRatio); + float minScale = 1.0F - m_pJetpack->GetMinThrottleRange(); + m_pJetpack->SetFlashScale(minScale + (1.0F + m_pJetpack->GetMaxThrottleRange() - minScale) * jetTimeRatio); } // Start Jetpack burn if (m_Controller.IsState(BODY_JUMPSTART) && m_JetTimeLeft > 0 && m_Status != INACTIVE) diff --git a/Entities/AEmitter.cpp b/Entities/AEmitter.cpp index 3e0a661d5..6af479e6b 100644 --- a/Entities/AEmitter.cpp +++ b/Entities/AEmitter.cpp @@ -40,6 +40,7 @@ void AEmitter::Clear() m_EmitCountLimit = 0; m_MinThrottleRange = 1.0F; m_MaxThrottleRange = 1.0F; + m_ThrottleRangeRedefined = false; m_Throttle = 0; m_EmissionsIgnoreThis = false; m_BurstScale = 1.0F; @@ -87,6 +88,7 @@ int AEmitter::Create(const AEmitter &reference) { m_EmitCountLimit = reference.m_EmitCountLimit; m_MinThrottleRange = reference.m_MinThrottleRange; m_MaxThrottleRange = reference.m_MaxThrottleRange; + m_ThrottleRangeRedefined = reference.m_ThrottleRangeRedefined; m_Throttle = reference.m_Throttle; m_EmissionsIgnoreThis = reference.m_EmissionsIgnoreThis; m_BurstScale = reference.m_BurstScale; @@ -140,8 +142,10 @@ int AEmitter::ReadProperty(const std::string_view &propName, Reader &reader) { for (Emission *emission : m_EmissionList) { emission->m_PPM = ppm / static_cast(m_EmissionList.size()); } } else if (propName == "MinThrottleRange") { reader >> m_MinThrottleRange; + m_ThrottleRangeRedefined = true; } else if (propName == "MaxThrottleRange") { reader >> m_MaxThrottleRange; + m_ThrottleRangeRedefined = true; } else if (propName == "Throttle") { reader >> m_Throttle; } else if (propName == "EmissionsIgnoreThis") { diff --git a/Entities/AEmitter.h b/Entities/AEmitter.h index 9676fc423..a333273a4 100644 --- a/Entities/AEmitter.h +++ b/Entities/AEmitter.h @@ -266,13 +266,31 @@ ClassInfoGetters /// Gets the minimum throttle range of this AEmitter. /// /// The minimum throttle range of this AEmitter. - float GetMinThrottle() const { return m_MinThrottleRange; } + float GetMinThrottleRange() const { return m_MinThrottleRange; } + + /// + /// Sets the minimum throttle range for this AEmitter. + /// + /// The new minimum throttle range for this AEmitter. + void SetMinThrottleRange(float minThrottleRange) { m_MinThrottleRange = minThrottleRange; m_ThrottleRangeRedefined = true; } /// /// Gets the maximum throttle range of this AEmitter. /// /// The maximum throttle range of this AEmitter. - float GetMaxThrottle() const { return m_MaxThrottleRange; } + float GetMaxThrottleRange() const { return m_MaxThrottleRange; } + + /// + /// Sets the maximum throttle range for this AEmitter. + /// + /// The new maximum throttle range for this AEmitter. + void SetMaxThrottleRange(float maxThrottleRange) { m_MaxThrottleRange = maxThrottleRange; m_ThrottleRangeRedefined = true; } + + /// + /// Gets whether or not the MinThrottleRange or MaxThrottleRange of this AEmitter have been redefined in INI. + /// + /// Whether or not the MinThrottleRange or MaxThrottleRange have been redefined in INI. + bool GetThrottleRangeRedefined() const { return m_ThrottleRangeRedefined; } /* ////////////////////////////////////////////////////////////////////////////////////////// // Method: SetEmitRate @@ -634,6 +652,7 @@ ClassInfoGetters long m_EmitCountLimit; float m_MinThrottleRange; //!< The range negative throttle has on emission rate. 1.0 means the rate can be throttled down to 0%, 0 means negative throttle has no effect float m_MaxThrottleRange; //!< The range positive throttle has on emission rate. 1.0 means the rate can be throttled up to 200%, 0 means positive throttle has no effect + bool m_ThrottleRangeRedefined; //!< Whether or not the MinThrottleRange or MaxThrottleRange has been redefined in INI. float m_Throttle; //!< The normalized throttle which controls the MSPE between 1.0 * m_MSPERange and -1.0 * m_MSPERange. 0 means emit the regular m_PPM amount. // Whether or not this' emissions ignore hits with itself, even if they are set to hit other MOs. bool m_EmissionsIgnoreThis; diff --git a/Entities/AHuman.cpp b/Entities/AHuman.cpp index fceaca0b7..c91492a18 100644 --- a/Entities/AHuman.cpp +++ b/Entities/AHuman.cpp @@ -553,6 +553,11 @@ void AHuman::SetJetpack(AEmitter *newJetpack) { if (m_pJetpack->HasNoSetDamageMultiplier()) { m_pJetpack->SetDamageMultiplier(0.0F); } m_pJetpack->SetApplyTransferredForcesAtOffset(false); + + if (!m_pJetpack->GetThrottleRangeRedefined()) { + m_pJetpack->SetMinThrottleRange(0); + m_pJetpack->SetMaxThrottleRange(0); + } } } @@ -3166,8 +3171,8 @@ void AHuman::Update() // Jetpack throttle depletes relative to jet time, but only if throttle range values have been defined float jetTimeRatio = std::max(m_JetTimeLeft / m_JetTimeTotal, 0.0F); m_pJetpack->SetThrottle(jetTimeRatio * 2.0F - 1.0F); - float minScale = 1.0F - m_pJetpack->GetMinThrottle(); - m_pJetpack->SetFlashScale(minScale + (1.0F + m_pJetpack->GetMaxThrottle() - minScale) * jetTimeRatio); + float minScale = 1.0F - m_pJetpack->GetMinThrottleRange(); + m_pJetpack->SetFlashScale(minScale + (1.0F + m_pJetpack->GetMaxThrottleRange() - minScale) * jetTimeRatio); } // Start Jetpack burn if (m_Controller.IsState(BODY_JUMPSTART) && m_JetTimeLeft > 0 && m_Status != INACTIVE) diff --git a/Managers/LuaMan.cpp b/Managers/LuaMan.cpp index 8b5d5ddb9..d25cb3be9 100644 --- a/Managers/LuaMan.cpp +++ b/Managers/LuaMan.cpp @@ -1020,6 +1020,8 @@ int LuaMan::Initialize() { .property("EmitAngle", &AEmitter::GetEmitAngle, &AEmitter::SetEmitAngle) .property("GetThrottle", &AEmitter::GetThrottle, &AEmitter::SetThrottle) .property("Throttle", &AEmitter::GetThrottle, &AEmitter::SetThrottle) + .property("MinThrottleRangeTODORENAME", &AEmitter::GetMinThrottleRange, &AEmitter::SetMinThrottleRange) + .property("MaxThrottleRangeTODORENAME", &AEmitter::GetMaxThrottleRange, &AEmitter::SetMaxThrottleRange) .property("BurstSpacing", &AEmitter::GetBurstSpacing, &AEmitter::SetBurstSpacing) .property("BurstDamage", &AEmitter::GetBurstDamage, &AEmitter::SetBurstDamage) .property("EmitterDamageMultiplier", &AEmitter::GetEmitterDamageMultiplier, &AEmitter::SetEmitterDamageMultiplier) From 1883cb236f0a644ffb421cda2336737c2fce1609 Mon Sep 17 00:00:00 2001 From: Gareth YR Date: Mon, 5 Jul 2021 01:16:15 -0300 Subject: [PATCH 2/8] Garbage changelog entry so it's not forgotten about --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6fe017e0..d98ace530 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -153,6 +153,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Added `MovableObject` Lua function `EnableOrDisableAllScripts` that allows you to enable or disable all scripts on a `MovableObject` based on the passed in value. +WARNING FIX THIS LINE BEFORE MERGING PR!!!!!!!!!!!! +- Added `AEmitter` Lua properties `MinThrottleRangeTODOFIXNAMEHERE` and `MaxThrottleRangeTODOFIXNAMEHERE` that allow you to 4zK PLEASE FILL IN + ### Changed - `AHuman` can now manually reload BG devices. From b764b1b5b14014d6db037c58514c7190323cc0bc Mon Sep 17 00:00:00 2001 From: Gareth YR Date: Tue, 14 Sep 2021 17:27:19 -0300 Subject: [PATCH 3/8] Moved lua bindings into LuaBindingsEntities --- Lua/LuaBindingsEntities.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lua/LuaBindingsEntities.cpp b/Lua/LuaBindingsEntities.cpp index 9cb6c0d84..a374804cc 100644 --- a/Lua/LuaBindingsEntities.cpp +++ b/Lua/LuaBindingsEntities.cpp @@ -364,6 +364,8 @@ namespace RTE { .property("EmitAngle", &AEmitter::GetEmitAngle, &AEmitter::SetEmitAngle) .property("GetThrottle", &AEmitter::GetThrottle, &AEmitter::SetThrottle) .property("Throttle", &AEmitter::GetThrottle, &AEmitter::SetThrottle) + .property("MinThrottleRangeTODORENAME", &AEmitter::GetMinThrottleRange, &AEmitter::SetMinThrottleRange) + .property("MaxThrottleRangeTODORENAME", &AEmitter::GetMaxThrottleRange, &AEmitter::SetMaxThrottleRange) .property("BurstSpacing", &AEmitter::GetBurstSpacing, &AEmitter::SetBurstSpacing) .property("BurstDamage", &AEmitter::GetBurstDamage, &AEmitter::SetBurstDamage) .property("EmitterDamageMultiplier", &AEmitter::GetEmitterDamageMultiplier, &AEmitter::SetEmitterDamageMultiplier) From 19fb486c7bfc518c21c9162260f53da4f125c020 Mon Sep 17 00:00:00 2001 From: Gareth YR Date: Tue, 14 Sep 2021 17:28:29 -0300 Subject: [PATCH 4/8] Undid empty line in luaman.cpp --- Managers/LuaMan.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Managers/LuaMan.cpp b/Managers/LuaMan.cpp index 425971e03..d32a8cd25 100644 --- a/Managers/LuaMan.cpp +++ b/Managers/LuaMan.cpp @@ -461,4 +461,4 @@ namespace RTE { void LuaMan::Update() const { lua_gc(m_MasterState, LUA_GCSTEP, 1); } -} +} \ No newline at end of file From 69b9c113b79eaefc6811f48c9d146a35cb00bc41 Mon Sep 17 00:00:00 2001 From: fourZK Date: Sat, 25 Sep 2021 21:39:30 +0300 Subject: [PATCH 5/8] Changed throttle logic and renamed `Min/MaxThrottleRange` as `Negative/PositiveThrottleMultiplier`, Added corresponding lua bindings, Removed "ThrottleRangeRedefined" tag for being useless --- Entities/AEmitter.cpp | 50 +++++++++++++++---------------- Entities/AEmitter.h | 42 +++++++++++--------------- Entities/PEmitter.cpp | 60 ++++++++++++++++++------------------- Entities/PEmitter.h | 6 ++-- Lua/LuaBindingsEntities.cpp | 4 +-- 5 files changed, 77 insertions(+), 85 deletions(-) diff --git a/Entities/AEmitter.cpp b/Entities/AEmitter.cpp index bb8a50e7f..9ba6f5e08 100644 --- a/Entities/AEmitter.cpp +++ b/Entities/AEmitter.cpp @@ -38,9 +38,8 @@ void AEmitter::Clear() m_WasEmitting = false; m_EmitCount = 0; m_EmitCountLimit = 0; - m_MinThrottleRange = 1.0F; - m_MaxThrottleRange = 1.0F; - m_ThrottleRangeRedefined = false; + m_NegativeThrottleMultiplier = 1.0F; + m_PositiveThrottleMultiplier = 1.0F; m_Throttle = 0; m_EmissionsIgnoreThis = false; m_BurstScale = 1.0F; @@ -86,9 +85,8 @@ int AEmitter::Create(const AEmitter &reference) { m_EmitEnabled = reference.m_EmitEnabled; m_EmitCount = reference.m_EmitCount; m_EmitCountLimit = reference.m_EmitCountLimit; - m_MinThrottleRange = reference.m_MinThrottleRange; - m_MaxThrottleRange = reference.m_MaxThrottleRange; - m_ThrottleRangeRedefined = reference.m_ThrottleRangeRedefined; + m_NegativeThrottleMultiplier = reference.m_NegativeThrottleMultiplier; + m_PositiveThrottleMultiplier = reference.m_PositiveThrottleMultiplier; m_Throttle = reference.m_Throttle; m_EmissionsIgnoreThis = reference.m_EmissionsIgnoreThis; m_BurstScale = reference.m_BurstScale; @@ -140,12 +138,10 @@ int AEmitter::ReadProperty(const std::string_view &propName, Reader &reader) { reader >> ppm; // Go through all emissions and set the rate so that it emulates the way it used to work, for mod backwards compatibility. for (Emission *emission : m_EmissionList) { emission->m_PPM = ppm / static_cast(m_EmissionList.size()); } - } else if (propName == "MinThrottleRange") { - reader >> m_MinThrottleRange; - m_ThrottleRangeRedefined = true; - } else if (propName == "MaxThrottleRange") { - reader >> m_MaxThrottleRange; - m_ThrottleRangeRedefined = true; + } else if (propName == "NegativeThrottleMultiplier") { + reader >> m_NegativeThrottleMultiplier; + } else if (propName == "PositiveThrottleMultiplier") { + reader >> m_PositiveThrottleMultiplier; } else if (propName == "Throttle") { reader >> m_Throttle; } else if (propName == "EmissionsIgnoreThis") { @@ -216,10 +212,10 @@ int AEmitter::Save(Writer &writer) const writer << m_EmitCountLimit; writer.NewProperty("EmissionsIgnoreThis"); writer << m_EmissionsIgnoreThis; - writer.NewProperty("MinThrottleRange"); - writer << m_MinThrottleRange; - writer.NewProperty("MaxThrottleRange"); - writer << m_MaxThrottleRange; + writer.NewProperty("NegativeThrottleMultiplier"); + writer << m_NegativeThrottleMultiplier; + writer.NewProperty("PositiveThrottleMultiplier"); + writer << m_PositiveThrottleMultiplier; writer.NewProperty("Throttle"); writer << m_Throttle; writer.NewProperty("BurstScale"); @@ -348,12 +344,13 @@ float AEmitter::EstimateImpulse(bool burst) } - // Figure out the throttle factor + // Scale the emission rate up or down according to the appropriate throttle multiplier. float throttleFactor = 1.0F; - if (m_Throttle < 0) { // Negative throttle, scale down according to the min throttle range - throttleFactor += std::abs(m_MinThrottleRange) * m_Throttle; - } else if (m_Throttle > 0) { // Positive throttle, scale up - throttleFactor += std::abs(m_MaxThrottleRange) * m_Throttle; + float absThrottle = std::abs(m_Throttle); + if (m_Throttle < 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_NegativeThrottleMultiplier * absThrottle); + } else if (m_Throttle > 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_PositiveThrottleMultiplier * absThrottle); } // Apply the throttle factor to the emission rate per update if (burst) { return m_AvgBurstImpulse * throttleFactor; } @@ -436,12 +433,15 @@ void AEmitter::Update() // TODO: Potentially get this once outside instead, like in attach/detach") MovableObject *pRootParent = GetRootParent(); + // Scale the emission rate up or down according to the appropriate throttle multiplier. float throttleFactor = 1.0F; - if (m_Throttle < 0) { // Negative throttle, scale down according to the min throttle range - throttleFactor += std::abs(m_MinThrottleRange) * m_Throttle; - } else if (m_Throttle > 0) { // Positive throttle, scale up - throttleFactor += std::abs(m_MaxThrottleRange) * m_Throttle; + float absThrottle = std::abs(m_Throttle); + if (m_Throttle < 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_NegativeThrottleMultiplier * absThrottle); + } else if (m_Throttle > 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_PositiveThrottleMultiplier * absThrottle); } + m_FlashScale = throttleFactor; // Check burst triggering against whether the spacing is fulfilled if (m_BurstTriggered && (m_BurstSpacing <= 0 || m_BurstTimer.IsPastSimMS(m_BurstSpacing))) { diff --git a/Entities/AEmitter.h b/Entities/AEmitter.h index 4fbc18b69..ab316d88d 100644 --- a/Entities/AEmitter.h +++ b/Entities/AEmitter.h @@ -263,34 +263,29 @@ ClassInfoGetters; float GetThrottle() const { return m_Throttle; } /// - /// Gets the minimum throttle range of this AEmitter. + /// Gets the negative throttle multiplier of this AEmitter. /// - /// The minimum throttle range of this AEmitter. - float GetMinThrottleRange() const { return m_MinThrottleRange; } + /// The negative throttle multiplier of this AEmitter. + float GetNegativeThrottleMultiplier() const { return m_NegativeThrottleMultiplier; } - /// - /// Sets the minimum throttle range for this AEmitter. - /// - /// The new minimum throttle range for this AEmitter. - void SetMinThrottleRange(float minThrottleRange) { m_MinThrottleRange = minThrottleRange; m_ThrottleRangeRedefined = true; } + /// + /// Gets the positive throttle multiplier of this AEmitter. + /// + /// The positive throttle multiplier of this AEmitter. + float GetPositiveThrottleMultiplier() const { return m_PositiveThrottleMultiplier; } /// - /// Gets the maximum throttle range of this AEmitter. + /// Sets the negative throttle multiplier of this AEmitter. /// - /// The maximum throttle range of this AEmitter. - float GetMaxThrottleRange() const { return m_MaxThrottleRange; } + /// The new throttle multiplier of this AEmitter. + void SetNegativeThrottleMultiplier(float newValue) { m_NegativeThrottleMultiplier = newValue; } - /// - /// Sets the maximum throttle range for this AEmitter. - /// - /// The new maximum throttle range for this AEmitter. - void SetMaxThrottleRange(float maxThrottleRange) { m_MaxThrottleRange = maxThrottleRange; m_ThrottleRangeRedefined = true; } + /// + /// Sets the positive throttle multiplier of this AEmitter. + /// + /// The new throttle multiplier of this AEmitter. + void SetPositiveThrottleMultiplier(float newValue) { m_PositiveThrottleMultiplier = newValue; } - /// - /// Gets whether or not the MinThrottleRange or MaxThrottleRange of this AEmitter have been redefined in INI. - /// - /// Whether or not the MinThrottleRange or MaxThrottleRange have been redefined in INI. - bool GetThrottleRangeRedefined() const { return m_ThrottleRangeRedefined; } /* ////////////////////////////////////////////////////////////////////////////////////////// // Method: SetEmitRate @@ -650,9 +645,8 @@ ClassInfoGetters; long m_EmitCount; // The max number of emissions to emit per emit being enabled long m_EmitCountLimit; - float m_MinThrottleRange; //!< The range negative throttle has on emission rate. 1.0 means the rate can be throttled down to 0%, 0 means negative throttle has no effect - float m_MaxThrottleRange; //!< The range positive throttle has on emission rate. 1.0 means the rate can be throttled up to 200%, 0 means positive throttle has no effect - bool m_ThrottleRangeRedefined; //!< Whether or not the MinThrottleRange or MaxThrottleRange has been redefined in INI. + float m_NegativeThrottleMultiplier; //!< The multiplier applied to the emission rate when throttle is negative. Relative to the absolute throttle value. + float m_PositiveThrottleMultiplier; //!< The multiplier applied to the emission rate when throttle is positive. Relative to the absolute throttle value. float m_Throttle; //!< The normalized throttle which controls the MSPE between 1.0 * m_MSPERange and -1.0 * m_MSPERange. 0 means emit the regular m_PPM amount. // Whether or not this' emissions ignore hits with itself, even if they are set to hit other MOs. bool m_EmissionsIgnoreThis; diff --git a/Entities/PEmitter.cpp b/Entities/PEmitter.cpp index 385e9c283..405658163 100644 --- a/Entities/PEmitter.cpp +++ b/Entities/PEmitter.cpp @@ -37,8 +37,8 @@ namespace RTE { m_WasEmitting = false; m_EmitCount = 0; m_EmitCountLimit = 0; - m_MinThrottleRange = -1; - m_MaxThrottleRange = 1; + m_NegativeThrottleMultiplier = 1.0F; + m_PositiveThrottleMultiplier = 1.0F; m_Throttle = 0; m_EmissionsIgnoreThis = false; m_BurstScale = 1.0; @@ -90,8 +90,8 @@ namespace RTE { m_EmitEnabled = reference.m_EmitEnabled; m_EmitCount = reference.m_EmitCount; m_EmitCountLimit = reference.m_EmitCountLimit; - m_MinThrottleRange = reference.m_MinThrottleRange; - m_MaxThrottleRange = reference.m_MaxThrottleRange; + m_NegativeThrottleMultiplier = reference.m_NegativeThrottleMultiplier; + m_PositiveThrottleMultiplier = reference.m_PositiveThrottleMultiplier; m_Throttle = reference.m_Throttle; m_EmissionsIgnoreThis = reference.m_EmissionsIgnoreThis; m_BurstScale = reference.m_BurstScale; @@ -143,10 +143,10 @@ namespace RTE { for (list::iterator eItr = m_EmissionList.begin(); eItr != m_EmissionList.end(); ++eItr) (*eItr).m_PPM = ppm / m_EmissionList.size(); } - else if (propName == "MinThrottleRange") - reader >> m_MinThrottleRange; - else if (propName == "MaxThrottleRange") - reader >> m_MaxThrottleRange; + else if (propName == "NegativeThrottleMultiplier") + reader >> m_NegativeThrottleMultiplier; + else if (propName == "PositiveThrottleMultiplier") + reader >> m_PositiveThrottleMultiplier; else if (propName == "Throttle") reader >> m_Throttle; else if (propName == "EmissionsIgnoreThis") @@ -213,10 +213,10 @@ namespace RTE { writer << m_EmitCountLimit; writer.NewProperty("EmissionsIgnoreThis"); writer << m_EmissionsIgnoreThis; - writer.NewProperty("MinThrottleRange"); - writer << m_MinThrottleRange; - writer.NewProperty("MaxThrottleRange"); - writer << m_MaxThrottleRange; + writer.NewProperty("NegativeThrottleMultiplier"); + writer << m_NegativeThrottleMultiplier; + writer.NewProperty("PositiveThrottleMultiplier"); + writer << m_PositiveThrottleMultiplier; writer.NewProperty("Throttle"); writer << m_Throttle; writer.NewProperty("BurstScale"); @@ -339,13 +339,14 @@ namespace RTE { } - // Figure out the throttle factor - float throttleFactor = 1.0f; - if (m_Throttle < 0) // Negative throttle, scale down according to the min throttle range - throttleFactor += fabs(m_MinThrottleRange) * m_Throttle; - else if (m_Throttle > 0) // Positive throttle, scale up - throttleFactor += fabs(m_MaxThrottleRange) * m_Throttle; - + // Scale the emission rate up or down according to the appropriate throttle multiplier. + float throttleFactor = 1.0F; + float absThrottle = std::abs(m_Throttle); + if (m_Throttle < 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_NegativeThrottleMultiplier * absThrottle); + } else if (m_Throttle > 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_PositiveThrottleMultiplier * absThrottle); + } // Apply the throttle factor to the emission rate per update if (burst) return m_AvgBurstImpulse * throttleFactor; @@ -397,15 +398,15 @@ namespace RTE { // TODO: Potentially get this once outside instead, like in attach/detach") MovableObject *pRootParent = GetRootParent(); - // Figure out the throttle factor - // Negative throttle, scale down according to the min throttle range - float throttleFactor = 1.0f; - if (m_Throttle < 0) - throttleFactor += fabs(m_MinThrottleRange) * m_Throttle; - // Positive throttle, scale up - else if (m_Throttle > 0) - throttleFactor += fabs(m_MaxThrottleRange) * m_Throttle; - + // Scale the emission rate up or down according to the appropriate throttle multiplier. + float throttleFactor = 1.0F; + float absThrottle = std::abs(m_Throttle); + if (m_Throttle < 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_NegativeThrottleMultiplier * absThrottle); + } else if (m_Throttle > 0) { + throttleFactor = throttleFactor * (1 - absThrottle) + (m_PositiveThrottleMultiplier * absThrottle); + } + m_FlashScale = throttleFactor; // Check burst triggering against whether the spacing is fulfilled if (m_BurstTriggered && (m_BurstSpacing <= 0 || m_BurstTimer.IsPastSimMS(m_BurstSpacing))) { @@ -477,8 +478,7 @@ namespace RTE { emitVel = RotateOffset(emitVel); pParticle->SetVel(parentVel + emitVel); - if (pParticle->GetLifetime() != 0) - pParticle->SetLifetime(pParticle->GetLifetime() * (1.0F + ((*eItr).GetLifeVariation() * RandomNormalNum()))); + if (pParticle->GetLifetime() != 0) { pParticle->SetLifetime(std::max(static_cast(pParticle->GetLifetime() * (1.0F + ((*eItr).GetLifeVariation() * RandomNormalNum()))), 1)); } pParticle->SetTeam(m_Team); pParticle->SetIgnoresTeamHits(true); diff --git a/Entities/PEmitter.h b/Entities/PEmitter.h index 3c9c8d07a..8bc0acb79 100644 --- a/Entities/PEmitter.h +++ b/Entities/PEmitter.h @@ -506,10 +506,8 @@ class PEmitter : long m_EmitCount; // The max number of emissions to emit per emit being enabled long m_EmitCountLimit; - // The range negative throttle has on emission rate. 1.0 means the rate can be throttled down to 0%, 0 means negative throttle has no effect - double m_MinThrottleRange; - // The range positive throttle has on emission rate. 1.0 means the rate can be throttled up to 200%, 0 means negative throttle has no effect - double m_MaxThrottleRange; + float m_NegativeThrottleMultiplier; //!< The multiplier applied to the emission rate when throttle is negative. Relative to the absolute throttle value. + float m_PositiveThrottleMultiplier; //!< The multiplier applied to the emission rate when throttle is positive. Relative to the absolute throttle value. // The normalized throttle which controls the MSPE between 1.0 * m_MSPERange and -1.0 * m_MSPERange. 0 means emit the regular m_PPM amount. float m_Throttle; // Whether or not this' emissions ignore hits with itself, even if they are set to hit other MOs. diff --git a/Lua/LuaBindingsEntities.cpp b/Lua/LuaBindingsEntities.cpp index a374804cc..3275592f3 100644 --- a/Lua/LuaBindingsEntities.cpp +++ b/Lua/LuaBindingsEntities.cpp @@ -364,8 +364,8 @@ namespace RTE { .property("EmitAngle", &AEmitter::GetEmitAngle, &AEmitter::SetEmitAngle) .property("GetThrottle", &AEmitter::GetThrottle, &AEmitter::SetThrottle) .property("Throttle", &AEmitter::GetThrottle, &AEmitter::SetThrottle) - .property("MinThrottleRangeTODORENAME", &AEmitter::GetMinThrottleRange, &AEmitter::SetMinThrottleRange) - .property("MaxThrottleRangeTODORENAME", &AEmitter::GetMaxThrottleRange, &AEmitter::SetMaxThrottleRange) + .property("NegativeThrottleMultiplier", &AEmitter::GetNegativeThrottleMultiplier, &AEmitter::SetNegativeThrottleMultiplier) + .property("PositiveThrottleMultiplier", &AEmitter::GetPositiveThrottleMultiplier, &AEmitter::SetPositiveThrottleMultiplier) .property("BurstSpacing", &AEmitter::GetBurstSpacing, &AEmitter::SetBurstSpacing) .property("BurstDamage", &AEmitter::GetBurstDamage, &AEmitter::SetBurstDamage) .property("EmitterDamageMultiplier", &AEmitter::GetEmitterDamageMultiplier, &AEmitter::SetEmitterDamageMultiplier) From f02114e0d3f3fbbf0143fa9f91cef9d2fb07e187 Mon Sep 17 00:00:00 2001 From: fourZK Date: Sun, 26 Sep 2021 17:01:00 +0300 Subject: [PATCH 6/8] Update CHANGELOG.md --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6db660072..5c2af8c99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -149,8 +149,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Added `MovableObject` Lua function `EnableOrDisableAllScripts` that allows you to enable or disable all scripts on a `MovableObject` based on the passed in value. -WARNING FIX THIS LINE BEFORE MERGING PR!!!!!!!!!!!! -- Added `AEmitter` Lua properties `MinThrottleRangeTODOFIXNAMEHERE` and `MaxThrottleRangeTODOFIXNAMEHERE` that allow you to 4zK PLEASE FILL IN +- Added `AEmitter` and `PEmitter` Lua (R/W) properties `NegativeThrottleMultiplier` and `PositiveThrottleMultiplier` that affect the emission rate relative to throttle. - Added `Attachable` Lua function and INI property `InheritsFrame` which lets `Attachables` inherit their parent's frame. It is set to false by default. @@ -189,6 +188,10 @@ WARNING FIX THIS LINE BEFORE MERGING PR!!!!!!!!!!!!
Changed +- `AEmitter` and `PEmitter` throttle logic has changed: + The properties `MinThrottleRange` and `MaxThrottleRange` have been changed to `NegativeThrottleMultiplier` and `PositiveThrottleMultiplier` respectively. + The new logic uses the multipliers to multiply the emission rate relative to the absolute throttle value. `NegativeThrottleMultiplier` is used when throttle is negative, and vice versa. + - Doors in `Team = -1` will now open up for all actors. - `MovableMan` function `KillAllActors` (commonly found in activities) has been appropriately renamed `KillAllEnemyActors`. From 015288ec5dbc08ae8c9cc773412cbced39da8657 Mon Sep 17 00:00:00 2001 From: fourZK Date: Thu, 30 Sep 2021 23:27:48 +0300 Subject: [PATCH 7/8] Missed cleanup --- Entities/ACrab.cpp | 5 ----- Entities/AHuman.cpp | 5 ----- 2 files changed, 10 deletions(-) diff --git a/Entities/ACrab.cpp b/Entities/ACrab.cpp index 290ef7d0a..79b7e43a0 100644 --- a/Entities/ACrab.cpp +++ b/Entities/ACrab.cpp @@ -492,11 +492,6 @@ void ACrab::SetJetpack(AEmitter *newJetpack) { if (m_pJetpack->HasNoSetDamageMultiplier()) { m_pJetpack->SetDamageMultiplier(0.0F); } m_pJetpack->SetApplyTransferredForcesAtOffset(false); m_pJetpack->SetDeleteWhenRemovedFromParent(true); - - if (!m_pJetpack->GetThrottleRangeRedefined()) { - m_pJetpack->SetMinThrottleRange(0); - m_pJetpack->SetMaxThrottleRange(0); - } } } diff --git a/Entities/AHuman.cpp b/Entities/AHuman.cpp index e00548b53..e33e1426a 100644 --- a/Entities/AHuman.cpp +++ b/Entities/AHuman.cpp @@ -537,11 +537,6 @@ void AHuman::SetJetpack(AEmitter *newJetpack) { if (m_pJetpack->HasNoSetDamageMultiplier()) { m_pJetpack->SetDamageMultiplier(0.0F); } m_pJetpack->SetApplyTransferredForcesAtOffset(false); - - if (!m_pJetpack->GetThrottleRangeRedefined()) { - m_pJetpack->SetMinThrottleRange(0); - m_pJetpack->SetMaxThrottleRange(0); - } } } From f215efca7eb44f09ab36e0e8aabbb58e3549860a Mon Sep 17 00:00:00 2001 From: fourZK Date: Thu, 30 Sep 2021 23:41:05 +0300 Subject: [PATCH 8/8] Missed cleanup --- Entities/ACrab.cpp | 2 -- Entities/AHuman.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/Entities/ACrab.cpp b/Entities/ACrab.cpp index 79b7e43a0..429020a4a 100644 --- a/Entities/ACrab.cpp +++ b/Entities/ACrab.cpp @@ -2130,8 +2130,6 @@ void ACrab::Update() // Jetpack throttle depletes relative to jet time, but only if throttle range values have been defined float jetTimeRatio = std::max(m_JetTimeLeft / m_JetTimeTotal, 0.0F); m_pJetpack->SetThrottle(jetTimeRatio * 2.0F - 1.0F); - float minScale = 1.0F - m_pJetpack->GetMinThrottleRange(); - m_pJetpack->SetFlashScale(minScale + (1.0F + m_pJetpack->GetMaxThrottleRange() - minScale) * jetTimeRatio); } // Start Jetpack burn if (m_Controller.IsState(BODY_JUMPSTART) && m_JetTimeLeft > 0 && m_Status != INACTIVE) diff --git a/Entities/AHuman.cpp b/Entities/AHuman.cpp index e33e1426a..825056c6b 100644 --- a/Entities/AHuman.cpp +++ b/Entities/AHuman.cpp @@ -3130,8 +3130,6 @@ void AHuman::Update() // Jetpack throttle depletes relative to jet time, but only if throttle range values have been defined float jetTimeRatio = std::max(m_JetTimeLeft / m_JetTimeTotal, 0.0F); m_pJetpack->SetThrottle(jetTimeRatio * 2.0F - 1.0F); - float minScale = 1.0F - m_pJetpack->GetMinThrottleRange(); - m_pJetpack->SetFlashScale(minScale + (1.0F + m_pJetpack->GetMaxThrottleRange() - minScale) * jetTimeRatio); } // Start Jetpack burn if (m_Controller.IsState(BODY_JUMPSTART) && m_JetTimeLeft > 0 && m_Status != INACTIVE)