From c1ad2bb8739ece3e708bac9c05dfc62072650899 Mon Sep 17 00:00:00 2001 From: CrimRecya <335958461@qq.com> Date: Sat, 28 Dec 2024 02:03:49 +0800 Subject: [PATCH 1/4] Core --- CREDITS.md | 1 + docs/Fixed-or-Improved-Logics.md | 1 + docs/Whats-New.md | 1 + src/Ext/Bullet/Hooks.DetonateLogics.cpp | 68 ++++++++++++++++++++++--- src/Ext/WeaponType/Body.cpp | 11 ++++ src/Ext/WeaponType/Body.h | 14 +++++ src/Ext/WeaponType/Hook.EBolt.cpp | 23 ++++----- 7 files changed, 99 insertions(+), 20 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 4c788fe55f..8eb5c9040f 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -372,6 +372,7 @@ This page lists all the individual contributions to the project by their author. - Allow to change the speed of gas particles - **CrimRecya** - Fix `LimboKill` not working reliably + - Draw visual effects for airburst weapons - **Ollerus** - Build limit group enhancement - Customizable rocker amplitude diff --git a/docs/Fixed-or-Improved-Logics.md b/docs/Fixed-or-Improved-Logics.md index 6d56a1369f..a031f7b0c5 100644 --- a/docs/Fixed-or-Improved-Logics.md +++ b/docs/Fixed-or-Improved-Logics.md @@ -177,6 +177,7 @@ This page describes all ingame logics that are fixed or improved in Phobos witho - Follower vehicle index for preplaced vehicles in maps is now explicitly constrained to `[Units]` list in map files and is no longer thrown off by vehicles that could not be created or created vehicles having other vehicles as initial passengers. - Drive/Jumpjet/Ship/Teleport locomotor did not power on when it is un-piggybacked bugfix - Unit `Speed` setting now accepts floating-point values. Internally parsed values are clamped down to maximum of 100, multiplied by 256 and divided by 100, the result (which at this point is converted to an integer) then clamped down to maximum of 255 giving effective internal speed value range of 0 to 255, e.g leptons traveled per game frame. +- `AirburstWeapon` now supports `IsLaser` (with Ares `LaserThickness`), `IsElectricBolt` (with Phobos `Bolt.Disable1`, `Bolt.Disable2`, `Bolt.Disable3`, `Bolt.Arcs`, without Ares `Bolt.Color1` 、`Bolt.Color2` 、`Bolt.Color3`), `IsRadBeam` (with Ares `Beam.Color` 、`Beam.Duration` 、`Beam.Amplitude` 、`Beam.IsHouseColor`), and `AttachedParticleSystem`. - Subterranean movement now benefits from speed multipliers from all sources such as veterancy, AttachEffect etc. ## Fixes / interactions with other extensions diff --git a/docs/Whats-New.md b/docs/Whats-New.md index 37c9f39e2f..f3732fd395 100644 --- a/docs/Whats-New.md +++ b/docs/Whats-New.md @@ -469,6 +469,7 @@ New: - Allow infantry to use land sequences in water (by Starkku) - `` can now be used as owner for pre-placed objects on skirmish and multiplayer maps (by Starkku) - Allow customizing charge turret delays per burst on a weapon (by Starkku) +- Draw visual effects for airburst weapons (by CrimRecya) - Unit `Speed` setting now accepts floating point values (by Starkku) Vanilla fixes: diff --git a/src/Ext/Bullet/Hooks.DetonateLogics.cpp b/src/Ext/Bullet/Hooks.DetonateLogics.cpp index 2d727dd1a2..66166de5c1 100644 --- a/src/Ext/Bullet/Hooks.DetonateLogics.cpp +++ b/src/Ext/Bullet/Hooks.DetonateLogics.cpp @@ -442,7 +442,15 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) if ((pType->Airburst || pTypeExt->Splits) && pWeapon) { auto const pSource = pThis->Owner; - auto const pOwner = pSource ? pSource->Owner : BulletExt::ExtMap.Find(pThis)->FirerHouse; + auto pOwner = pSource ? pSource->Owner : BulletExt::ExtMap.Find(pThis)->FirerHouse; + + if (!pOwner || pOwner->Defeated) + { + if (const auto pNeutral = HouseClass::FindNeutral()) + pOwner = pNeutral; + else + return SkipGameCode; + } auto& random = ScenarioClass::Instance->Random; int clusterCount = pType->Cluster; @@ -530,12 +538,13 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) } } - int projectileRange = WeaponTypeExt::ExtMap.Find(pWeapon)->ProjectileRange.Get(); + auto const pWeaponExt = WeaponTypeExt::ExtMap.Find(pWeapon); + int projectileRange = pWeaponExt->ProjectileRange.Get(); auto const pTypeSplits = pWeapon->Projectile; int damage = pWeapon->Damage; - if (pTypeExt->AirburstWeapon_ApplyFirepowerMult && pThis->Owner) - damage = static_cast(damage * pThis->Owner->FirepowerMultiplier * TechnoExt::ExtMap.Find(pThis->Owner)->AE.FirepowerMultiplier); + if (pTypeExt->AirburstWeapon_ApplyFirepowerMult && pSource) + damage = static_cast(damage * pSource->FirepowerMultiplier * TechnoExt::ExtMap.Find(pSource)->AE.FirepowerMultiplier); for (int i = 0; i < clusterCount; ++i) { @@ -550,7 +559,7 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) int index = random.RandomRanged(0, targets.Count - 1); pTarget = targets.GetItem(index); - if (pTarget == pThis->Owner) + if (pTarget == pSource) { if (random.RandomDouble() > pTypeExt->RetargetSelf_Probability) { @@ -564,8 +573,7 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) if (pTarget) { - - if (auto const pBullet = pTypeSplits->CreateBullet(pTarget, pThis->Owner, damage, pWeapon->Warhead, pWeapon->Speed, pWeapon->Bright)) + if (auto const pBullet = pTypeSplits->CreateBullet(pTarget, pSource, damage, pWeapon->Warhead, pWeapon->Speed, pWeapon->Bright)) { BulletExt::ExtMap.Find(pBullet)->FirerHouse = pOwner; pBullet->WeaponType = pWeapon; @@ -587,6 +595,52 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) pBullet->MoveTo(pThis->Location, velocity); } + + if (pWeapon->IsLaser) + { + if (pWeapon->IsHouseColor || pWeaponExt->Laser_IsSingleColor) + { + auto const pLaser = GameCreate(pThis->Location, pTarget->GetCoords(), (pWeapon->IsHouseColor ? pOwner->LaserColor : pWeapon->LaserInnerColor), ColorStruct { 0, 0, 0 }, ColorStruct { 0, 0, 0 }, pWeapon->LaserDuration); + pLaser->IsHouseColor = true; + pLaser->Thickness = pWeaponExt->LaserThickness; + pLaser->IsSupported = (pLaser->Thickness > 3); + } + else + { + auto const pLaser = GameCreate(pThis->Location, pTarget->GetCoords(), pWeapon->LaserInnerColor, pWeapon->LaserOuterColor, pWeapon->LaserOuterSpread, pWeapon->LaserDuration); + pLaser->IsHouseColor = false; + pLaser->Thickness = 3; + pLaser->IsSupported = false; + } + } + + if (pWeapon->IsElectricBolt) + { + if (auto const pEBolt = GameCreate()) + { + pEBolt->AlternateColor = pWeapon->IsAlternateColor; + //TODO Weapon's Bolt.Color1, Bolt.Color2, Bolt.Color3(Ares) + WeaponTypeExt::BoltWeaponMap[pEBolt] = pWeaponExt; + pEBolt->Fire(pThis->Location, pTarget->GetCoords(), 0); + } + } + + if (pWeapon->IsRadBeam) + { + const bool isTemporal = pWeapon->Warhead && pWeapon->Warhead->Temporal; + + if (const auto pRadBeam = RadBeam::Allocate(isTemporal ? RadBeamType::Temporal : RadBeamType::RadBeam)) + { + pRadBeam->SetCoordsSource(pThis->Location); + pRadBeam->SetCoordsTarget(pTarget->GetCoords()); + pRadBeam->Color = pWeaponExt->Beam_IsHouseColor ? pOwner->LaserColor : pWeaponExt->Beam_Color.Get(isTemporal ? RulesClass::Instance->ChronoBeamColor : RulesClass::Instance->RadColor); + pRadBeam->Period = pWeaponExt->Beam_Duration; + pRadBeam->Amplitude = pWeaponExt->Beam_Amplitude; + } + } + + if (const auto pPSType = pWeapon->AttachedParticleSystem) + GameCreate(pPSType, pThis->Location, pTarget, pThis->Owner, pTarget->GetCoords(), pOwner); } } } diff --git a/src/Ext/WeaponType/Body.cpp b/src/Ext/WeaponType/Body.cpp index 3e82a2b5bc..2d171eb0f6 100644 --- a/src/Ext/WeaponType/Body.cpp +++ b/src/Ext/WeaponType/Body.cpp @@ -115,6 +115,12 @@ void WeaponTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI) this->AttachEffect_CheckOnFirer.Read(exINI, pSection, "AttachEffect.CheckOnFirer"); this->AttachEffect_IgnoreFromSameSource.Read(exINI, pSection, "AttachEffect.IgnoreFromSameSource"); this->KickOutPassengers.Read(exINI, pSection, "KickOutPassengers"); + + this->Beam_Color.Read(exINI, pSection, "Beam.Color"); + this->Beam_Duration.Read(exINI, pSection, "Beam.Duration"); + this->Beam_Amplitude.Read(exINI, pSection, "Beam.Amplitude"); + this->Beam_IsHouseColor.Read(exINI, pSection, "Beam.IsHouseColor"); + this->LaserThickness.Read(exINI, pSection, "LaserThickness"); } template @@ -160,6 +166,11 @@ void WeaponTypeExt::ExtData::Serialize(T& Stm) .Process(this->AttachEffect_CheckOnFirer) .Process(this->AttachEffect_IgnoreFromSameSource) .Process(this->KickOutPassengers) + .Process(this->Beam_Color) + .Process(this->Beam_Duration) + .Process(this->Beam_Amplitude) + .Process(this->Beam_IsHouseColor) + .Process(this->LaserThickness) ; }; diff --git a/src/Ext/WeaponType/Body.h b/src/Ext/WeaponType/Body.h index 2a979bece1..d054e05970 100644 --- a/src/Ext/WeaponType/Body.h +++ b/src/Ext/WeaponType/Body.h @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -61,6 +62,12 @@ class WeaponTypeExt Valueable AttachEffect_IgnoreFromSameSource; Valueable KickOutPassengers; + Nullable Beam_Color; + Valueable Beam_Duration; + Valueable Beam_Amplitude; + Valueable Beam_IsHouseColor; + Valueable LaserThickness; + ExtData(WeaponTypeClass* OwnerObject) : Extension(OwnerObject) , DiskLaser_Radius { DiskLaserClass::Radius } , ProjectileRange { Leptons(100000) } @@ -101,6 +108,11 @@ class WeaponTypeExt , AttachEffect_CheckOnFirer { false } , AttachEffect_IgnoreFromSameSource { false } , KickOutPassengers { true } + , Beam_Color {} + , Beam_Duration { 15 } + , Beam_Amplitude { 40.0 } + , Beam_IsHouseColor { false } + , LaserThickness { 3 } { } int GetBurstDelay(int burstIndex) const; @@ -136,6 +148,8 @@ class WeaponTypeExt static bool SaveGlobals(PhobosStreamWriter& Stm); static double OldRadius; + static PhobosMap BoltWeaponMap; + static const WeaponTypeExt::ExtData* BoltWeaponType; static void DetonateAt(WeaponTypeClass* pThis, AbstractClass* pTarget, TechnoClass* pOwner, HouseClass* pFiringHouse = nullptr); static void DetonateAt(WeaponTypeClass* pThis, AbstractClass* pTarget, TechnoClass* pOwner, int damage, HouseClass* pFiringHouse = nullptr); diff --git a/src/Ext/WeaponType/Hook.EBolt.cpp b/src/Ext/WeaponType/Hook.EBolt.cpp index 6d2ead1b8f..f9c827c883 100644 --- a/src/Ext/WeaponType/Hook.EBolt.cpp +++ b/src/Ext/WeaponType/Hook.EBolt.cpp @@ -3,11 +3,8 @@ #include #include -namespace BoltTemp -{ - PhobosMap boltWeaponTypeExt; - const WeaponTypeExt::ExtData* pType = nullptr; -} +PhobosMap WeaponTypeExt::BoltWeaponMap; +const WeaponTypeExt::ExtData* WeaponTypeExt::BoltWeaponType = nullptr; DEFINE_HOOK(0x6FD494, TechnoClass_FireEBolt_SetExtMap_AfterAres, 0x7) { @@ -15,7 +12,7 @@ DEFINE_HOOK(0x6FD494, TechnoClass_FireEBolt_SetExtMap_AfterAres, 0x7) GET(EBolt*, pBolt, EAX); if (pWeapon) - BoltTemp::boltWeaponTypeExt[pBolt] = WeaponTypeExt::ExtMap.Find(pWeapon); + WeaponTypeExt::BoltWeaponMap[pBolt] = WeaponTypeExt::ExtMap.Find(pWeapon); return 0; } @@ -24,7 +21,7 @@ DEFINE_HOOK(0x4C2951, EBolt_DTOR, 0x5) { GET(EBolt*, pBolt, ECX); - BoltTemp::boltWeaponTypeExt.erase(pBolt); + WeaponTypeExt::BoltWeaponMap.erase(pBolt); return 0; } @@ -34,11 +31,11 @@ DEFINE_HOOK(0x4C20BC, EBolt_DrawArcs, 0xB) enum { DoLoop = 0x4C20C7, Break = 0x4C2400 }; GET_STACK(EBolt*, pBolt, 0x40); - BoltTemp::pType = BoltTemp::boltWeaponTypeExt.get_or_default(pBolt); + WeaponTypeExt::BoltWeaponType = WeaponTypeExt::BoltWeaponMap.get_or_default(pBolt); GET_STACK(int, plotIndex, STACK_OFFSET(0x408, -0x3E0)); - int arcCount = BoltTemp::pType ? BoltTemp::pType->Bolt_Arcs : 8; + int arcCount = WeaponTypeExt::BoltWeaponType ? WeaponTypeExt::BoltWeaponType->Bolt_Arcs : 8; return plotIndex < arcCount ? DoLoop : Break; } @@ -46,17 +43,17 @@ DEFINE_HOOK(0x4C20BC, EBolt_DrawArcs, 0xB) DEFINE_HOOK(0x4C24E4, Ebolt_DrawFist_Disable, 0x8) { GET_STACK(EBolt*, pBolt, 0x40); - BoltTemp::pType = BoltTemp::boltWeaponTypeExt.get_or_default(pBolt); + WeaponTypeExt::BoltWeaponType = WeaponTypeExt::BoltWeaponMap.get_or_default(pBolt); - return (BoltTemp::pType && BoltTemp::pType->Bolt_Disable1) ? 0x4C2515 : 0; + return (WeaponTypeExt::BoltWeaponType && WeaponTypeExt::BoltWeaponType->Bolt_Disable1) ? 0x4C2515 : 0; } DEFINE_HOOK(0x4C25FD, Ebolt_DrawSecond_Disable, 0xA) { - return (BoltTemp::pType && BoltTemp::pType->Bolt_Disable2) ? 0x4C262A : 0; + return (WeaponTypeExt::BoltWeaponType && WeaponTypeExt::BoltWeaponType->Bolt_Disable2) ? 0x4C262A : 0; } DEFINE_HOOK(0x4C26EE, Ebolt_DrawThird_Disable, 0x8) { - return (BoltTemp::pType && BoltTemp::pType->Bolt_Disable3) ? 0x4C2710 : 0; + return (WeaponTypeExt::BoltWeaponType && WeaponTypeExt::BoltWeaponType->Bolt_Disable3) ? 0x4C2710 : 0; } From 3498aef3d611e937b7c0418a2101d4ffd0115d63 Mon Sep 17 00:00:00 2001 From: CrimRecya <335958461@qq.com> Date: Mon, 30 Dec 2024 23:09:33 +0800 Subject: [PATCH 2/4] Encapsulate function --- src/Ext/Bullet/Body.cpp | 136 ++++++++++++++++++++++++ src/Ext/Bullet/Body.h | 9 ++ src/Ext/Bullet/Hooks.DetonateLogics.cpp | 71 ++----------- 3 files changed, 151 insertions(+), 65 deletions(-) diff --git a/src/Ext/Bullet/Body.cpp b/src/Ext/Bullet/Body.cpp index f89cee974b..fbcb7adf34 100644 --- a/src/Ext/Bullet/Body.cpp +++ b/src/Ext/Bullet/Body.cpp @@ -1,5 +1,6 @@ #include "Body.h" +#include #include #include #include @@ -155,6 +156,141 @@ void BulletExt::ExtData::InitializeLaserTrails() } } +// Make sure pBullet is not empty before call +inline void BulletExt::SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange) +{ + pBullet->WeaponType = pWeapon; + pBullet->Range = projectileRange; + BulletExt::ExtMap.Find(pBullet)->FirerHouse = pHouse; +} + +// Make sure pBullet is not empty before call +inline void BulletExt::SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity) +{ + auto velocity = BulletVelocity::Empty; + + if (randomVelocity) + { + DirStruct dir; + dir.SetValue<5>(ScenarioClass::Instance->Random.RandomRanged(0, 31)); + + const auto cos_factor = -2.44921270764e-16; // cos(1.5 * Math::Pi * 1.00001) + const auto flatSpeed = cos_factor * pBullet->Speed; + + const auto radians = dir.GetRadian<32>(); + velocity = BulletVelocity { Math::cos(radians) * flatSpeed, Math::sin(radians) * flatSpeed, static_cast(-pBullet->Speed) }; + } + + pBullet->MoveTo(sourceCoords, velocity); +} + +// Make sure pBullet and pWeapon is not empty before call +inline void BulletExt::SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool attach) +{ + const auto animCounts = pWeapon->Anim.Count; + + if (animCounts <= 0) + return; + + const auto pAnimType = pWeapon->Anim[(animCounts % 8 == 0) ? // Have direction ? + (static_cast(((BulletExt::ExtMap.Find(pBullet)->Trajectory ? // (Trajectory ? + Math::atan2(pBullet->Velocity.Y , pBullet->Velocity.X) : // Velocity : + Math::atan2(pBullet->TargetCoords.Y - pBullet->SourceCoords.Y , pBullet->TargetCoords.X - pBullet->SourceCoords.X)) // Connection) + / Math::TwoPi + 1.5) * animCounts - (animCounts / 8) + 0.5) % animCounts) : // Calculate direction : + ScenarioClass::Instance->Random.RandomRanged(0 , animCounts - 1)]; // Simple random; + + if (!pAnimType) + return; + + const auto pAnim = GameCreate(pAnimType, pBullet->SourceCoords); + pAnim->SetOwnerObject(pBullet->Owner); + pAnim->Owner = pHouse; + + if (attach) + AnimExt::ExtMap.Find(pAnim)->SetInvoker(pBullet->Owner, pHouse); +} + +// Make sure pBullet and pWeapon is not empty before call +inline void BulletExt::SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon) +{ + if (pWeapon->Report.Count <= 0) + return; + + const auto pFirer = pBullet->Owner; + const auto reportIndex = pWeapon->Report[(pFirer ? pFirer->unknown_short_3C8 : ScenarioClass::Instance->Random.Random()) % pWeapon->Report.Count]; + + if (reportIndex != -1) + VocClass::PlayAt(reportIndex, pBullet->Location, nullptr); +} + +// Make sure pBullet and pWeapon is not empty before call +inline void BulletExt::SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +{ + if (!pWeapon->IsLaser) + return; + + const auto pWeaponExt = WeaponTypeExt::ExtMap.Find(pWeapon); + + if (pWeapon->IsHouseColor || pWeaponExt->Laser_IsSingleColor) + { + const auto black = ColorStruct { 0, 0, 0 }; + const auto pLaser = GameCreate(pBullet->SourceCoords, pBullet->TargetCoords, ((pWeapon->IsHouseColor && pHouse) ? pHouse->LaserColor : pWeapon->LaserInnerColor), black, black, pWeapon->LaserDuration); + pLaser->IsHouseColor = true; + pLaser->Thickness = pWeaponExt->LaserThickness; + pLaser->IsSupported = (pLaser->Thickness > 3); + } + else + { + const auto pLaser = GameCreate(pBullet->SourceCoords, pBullet->TargetCoords, pWeapon->LaserInnerColor, pWeapon->LaserOuterColor, pWeapon->LaserOuterSpread, pWeapon->LaserDuration); + pLaser->IsHouseColor = false; + pLaser->Thickness = 3; + pLaser->IsSupported = false; + } +} + +// Make sure pBullet and pWeapon is not empty before call +inline void BulletExt::SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon) +{ + if (!pWeapon->IsElectricBolt) + return; + + if (auto const pEBolt = GameCreate()) + { + pEBolt->AlternateColor = pWeapon->IsAlternateColor; + //TODO Weapon's Bolt.Color1, Bolt.Color2, Bolt.Color3(Ares) + WeaponTypeExt::BoltWeaponMap[pEBolt] = WeaponTypeExt::ExtMap.Find(pWeapon); + pEBolt->Fire(pBullet->SourceCoords, pBullet->TargetCoords, 0); + } +} + +// Make sure pBullet and pWeapon is not empty before call +inline void BulletExt::SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +{ + if (!pWeapon->IsRadBeam) + return; + + const bool isTemporal = pWeapon->Warhead && pWeapon->Warhead->Temporal; + + if (const auto pRadBeam = RadBeam::Allocate(isTemporal ? RadBeamType::Temporal : RadBeamType::RadBeam)) + { + pRadBeam->SetCoordsSource(pBullet->SourceCoords); + pRadBeam->SetCoordsTarget(pBullet->TargetCoords); + + const auto pWeaponExt = WeaponTypeExt::ExtMap.Find(pWeapon); + + pRadBeam->Color = (pWeaponExt->Beam_IsHouseColor && pHouse) ? pHouse->LaserColor : pWeaponExt->Beam_Color.Get(isTemporal ? RulesClass::Instance->ChronoBeamColor : RulesClass::Instance->RadColor); + pRadBeam->Period = pWeaponExt->Beam_Duration; + pRadBeam->Amplitude = pWeaponExt->Beam_Amplitude; + } +} + +// Make sure pBullet and pWeapon is not empty before call +inline void BulletExt::SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +{ + if (const auto pPSType = pWeapon->AttachedParticleSystem) + GameCreate(pPSType, pBullet->SourceCoords, pBullet->Target, pBullet->Owner, pBullet->TargetCoords, pHouse); +} + // ============================= // load / save diff --git a/src/Ext/Bullet/Body.h b/src/Ext/Bullet/Body.h index 700f9620a6..3e16e76ee5 100644 --- a/src/Ext/Bullet/Body.h +++ b/src/Ext/Bullet/Body.h @@ -68,4 +68,13 @@ class BulletExt }; static ExtContainer ExtMap; + + static inline void SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange); + static inline void SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity); + static inline void SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool attach); + static inline void SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon); + static inline void SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); + static inline void SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon); + static inline void SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); + static inline void SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); }; diff --git a/src/Ext/Bullet/Hooks.DetonateLogics.cpp b/src/Ext/Bullet/Hooks.DetonateLogics.cpp index 66166de5c1..750914a023 100644 --- a/src/Ext/Bullet/Hooks.DetonateLogics.cpp +++ b/src/Ext/Bullet/Hooks.DetonateLogics.cpp @@ -575,72 +575,13 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) { if (auto const pBullet = pTypeSplits->CreateBullet(pTarget, pSource, damage, pWeapon->Warhead, pWeapon->Speed, pWeapon->Bright)) { - BulletExt::ExtMap.Find(pBullet)->FirerHouse = pOwner; - pBullet->WeaponType = pWeapon; - pBullet->Range = projectileRange; - - DirStruct dir; - dir.SetValue<5>(random.RandomRanged(0, 31)); - - auto const radians = dir.GetRadian<32>(); - auto const sin_rad = Math::sin(radians); - auto const cos_rad = Math::cos(radians); - auto const cos_factor = -2.44921270764e-16; // cos(1.5 * Math::Pi * 1.00001) - auto const flatSpeed = cos_factor * pBullet->Speed; - - BulletVelocity velocity; - velocity.X = cos_rad * flatSpeed; - velocity.Y = sin_rad * flatSpeed; - velocity.Z = -pBullet->Speed; - - pBullet->MoveTo(pThis->Location, velocity); - } - - if (pWeapon->IsLaser) - { - if (pWeapon->IsHouseColor || pWeaponExt->Laser_IsSingleColor) - { - auto const pLaser = GameCreate(pThis->Location, pTarget->GetCoords(), (pWeapon->IsHouseColor ? pOwner->LaserColor : pWeapon->LaserInnerColor), ColorStruct { 0, 0, 0 }, ColorStruct { 0, 0, 0 }, pWeapon->LaserDuration); - pLaser->IsHouseColor = true; - pLaser->Thickness = pWeaponExt->LaserThickness; - pLaser->IsSupported = (pLaser->Thickness > 3); - } - else - { - auto const pLaser = GameCreate(pThis->Location, pTarget->GetCoords(), pWeapon->LaserInnerColor, pWeapon->LaserOuterColor, pWeapon->LaserOuterSpread, pWeapon->LaserDuration); - pLaser->IsHouseColor = false; - pLaser->Thickness = 3; - pLaser->IsSupported = false; - } + BulletExt::SimulatedFiringInfos(pBullet, pWeapon, pOwner, projectileRange); + BulletExt::SimulatedFiringVelocity(pBullet, pThis->Location, true); + BulletExt::SimulatedFiringLaser(pBullet, pWeapon, pOwner); + BulletExt::SimulatedFiringElectricBolt(pBullet, pWeapon); + BulletExt::SimulatedFiringRadBeam(pBullet, pWeapon, pOwner); + BulletExt::SimulatedFiringParticleSystem(pBullet, pWeapon, pOwner); } - - if (pWeapon->IsElectricBolt) - { - if (auto const pEBolt = GameCreate()) - { - pEBolt->AlternateColor = pWeapon->IsAlternateColor; - //TODO Weapon's Bolt.Color1, Bolt.Color2, Bolt.Color3(Ares) - WeaponTypeExt::BoltWeaponMap[pEBolt] = pWeaponExt; - pEBolt->Fire(pThis->Location, pTarget->GetCoords(), 0); - } - } - - if (pWeapon->IsRadBeam) - { - const bool isTemporal = pWeapon->Warhead && pWeapon->Warhead->Temporal; - - if (const auto pRadBeam = RadBeam::Allocate(isTemporal ? RadBeamType::Temporal : RadBeamType::RadBeam)) - { - pRadBeam->SetCoordsSource(pThis->Location); - pRadBeam->SetCoordsTarget(pTarget->GetCoords()); - pRadBeam->Color = pWeaponExt->Beam_IsHouseColor ? pOwner->LaserColor : pWeaponExt->Beam_Color.Get(isTemporal ? RulesClass::Instance->ChronoBeamColor : RulesClass::Instance->RadColor); - pRadBeam->Period = pWeaponExt->Beam_Duration; - pRadBeam->Amplitude = pWeaponExt->Beam_Amplitude; - } - } - - if (const auto pPSType = pWeapon->AttachedParticleSystem) - GameCreate(pPSType, pThis->Location, pTarget, pThis->Owner, pTarget->GetCoords(), pOwner); } } } From d60f69a47f50066c45272bc2dcbe9a787b79e09a Mon Sep 17 00:00:00 2001 From: CrimRecya <335958461@qq.com> Date: Tue, 31 Dec 2024 00:09:09 +0800 Subject: [PATCH 3/4] Fix package --- src/Ext/Bullet/Body.cpp | 18 +++++++++--------- src/Ext/Bullet/Body.h | 16 ++++++++-------- src/Ext/Bullet/Hooks.DetonateLogics.cpp | 2 ++ 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/Ext/Bullet/Body.cpp b/src/Ext/Bullet/Body.cpp index fbcb7adf34..9f68630b55 100644 --- a/src/Ext/Bullet/Body.cpp +++ b/src/Ext/Bullet/Body.cpp @@ -157,7 +157,7 @@ void BulletExt::ExtData::InitializeLaserTrails() } // Make sure pBullet is not empty before call -inline void BulletExt::SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange) +void BulletExt::SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange) { pBullet->WeaponType = pWeapon; pBullet->Range = projectileRange; @@ -165,7 +165,7 @@ inline void BulletExt::SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClas } // Make sure pBullet is not empty before call -inline void BulletExt::SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity) +void BulletExt::SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity) { auto velocity = BulletVelocity::Empty; @@ -185,7 +185,7 @@ inline void BulletExt::SimulatedFiringVelocity(BulletClass* pBullet, const Coord } // Make sure pBullet and pWeapon is not empty before call -inline void BulletExt::SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool attach) +void BulletExt::SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool trajectory, bool attach) { const auto animCounts = pWeapon->Anim.Count; @@ -193,7 +193,7 @@ inline void BulletExt::SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass return; const auto pAnimType = pWeapon->Anim[(animCounts % 8 == 0) ? // Have direction ? - (static_cast(((BulletExt::ExtMap.Find(pBullet)->Trajectory ? // (Trajectory ? + (static_cast(((trajectory ? // (Trajectory ? Math::atan2(pBullet->Velocity.Y , pBullet->Velocity.X) : // Velocity : Math::atan2(pBullet->TargetCoords.Y - pBullet->SourceCoords.Y , pBullet->TargetCoords.X - pBullet->SourceCoords.X)) // Connection) / Math::TwoPi + 1.5) * animCounts - (animCounts / 8) + 0.5) % animCounts) : // Calculate direction : @@ -211,7 +211,7 @@ inline void BulletExt::SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass } // Make sure pBullet and pWeapon is not empty before call -inline void BulletExt::SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon) +void BulletExt::SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon) { if (pWeapon->Report.Count <= 0) return; @@ -224,7 +224,7 @@ inline void BulletExt::SimulatedFiringReport(BulletClass* pBullet, WeaponTypeCla } // Make sure pBullet and pWeapon is not empty before call -inline void BulletExt::SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +void BulletExt::SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) { if (!pWeapon->IsLaser) return; @@ -249,7 +249,7 @@ inline void BulletExt::SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClas } // Make sure pBullet and pWeapon is not empty before call -inline void BulletExt::SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon) +void BulletExt::SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon) { if (!pWeapon->IsElectricBolt) return; @@ -264,7 +264,7 @@ inline void BulletExt::SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponT } // Make sure pBullet and pWeapon is not empty before call -inline void BulletExt::SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +void BulletExt::SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) { if (!pWeapon->IsRadBeam) return; @@ -285,7 +285,7 @@ inline void BulletExt::SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeCl } // Make sure pBullet and pWeapon is not empty before call -inline void BulletExt::SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +void BulletExt::SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) { if (const auto pPSType = pWeapon->AttachedParticleSystem) GameCreate(pPSType, pBullet->SourceCoords, pBullet->Target, pBullet->Owner, pBullet->TargetCoords, pHouse); diff --git a/src/Ext/Bullet/Body.h b/src/Ext/Bullet/Body.h index 3e16e76ee5..44fc4c24ee 100644 --- a/src/Ext/Bullet/Body.h +++ b/src/Ext/Bullet/Body.h @@ -69,12 +69,12 @@ class BulletExt static ExtContainer ExtMap; - static inline void SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange); - static inline void SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity); - static inline void SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool attach); - static inline void SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon); - static inline void SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); - static inline void SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon); - static inline void SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); - static inline void SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); + static void SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange); + static void SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity); + static void SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool trajectory, bool attach); + static void SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon); + static void SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); + static void SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon); + static void SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); + static void SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); }; diff --git a/src/Ext/Bullet/Hooks.DetonateLogics.cpp b/src/Ext/Bullet/Hooks.DetonateLogics.cpp index 750914a023..1c74621146 100644 --- a/src/Ext/Bullet/Hooks.DetonateLogics.cpp +++ b/src/Ext/Bullet/Hooks.DetonateLogics.cpp @@ -577,6 +577,8 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) { BulletExt::SimulatedFiringInfos(pBullet, pWeapon, pOwner, projectileRange); BulletExt::SimulatedFiringVelocity(pBullet, pThis->Location, true); + // BulletExt::SimulatedFiringAnim(pBullet, pWeapon, pOwner, BulletExt::ExtMap.Find(pBullet)->Trajectory, false); + // BulletExt::SimulatedFiringReport(pBullet, pWeapon); BulletExt::SimulatedFiringLaser(pBullet, pWeapon, pOwner); BulletExt::SimulatedFiringElectricBolt(pBullet, pWeapon); BulletExt::SimulatedFiringRadBeam(pBullet, pWeapon, pOwner); From 3a7e210feb6b9de2725c61110ea5f027ecd074d3 Mon Sep 17 00:00:00 2001 From: CrimRecya <335958461@qq.com> Date: Tue, 31 Dec 2024 14:06:55 +0800 Subject: [PATCH 4/4] Try merging and inlining --- src/Ext/Bullet/Body.cpp | 137 ++++++++++++++++-------- src/Ext/Bullet/Body.h | 16 +-- src/Ext/Bullet/Hooks.DetonateLogics.cpp | 12 +-- 3 files changed, 103 insertions(+), 62 deletions(-) diff --git a/src/Ext/Bullet/Body.cpp b/src/Ext/Bullet/Body.cpp index 9f68630b55..612232f1fc 100644 --- a/src/Ext/Bullet/Body.cpp +++ b/src/Ext/Bullet/Body.cpp @@ -156,63 +156,56 @@ void BulletExt::ExtData::InitializeLaserTrails() } } -// Make sure pBullet is not empty before call -void BulletExt::SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange) +static inline int SetBuildingFireAnimZAdjust(BuildingClass* pBuilding, int animY) { - pBullet->WeaponType = pWeapon; - pBullet->Range = projectileRange; - BulletExt::ExtMap.Find(pBullet)->FirerHouse = pHouse; -} - -// Make sure pBullet is not empty before call -void BulletExt::SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity) -{ - auto velocity = BulletVelocity::Empty; - - if (randomVelocity) - { - DirStruct dir; - dir.SetValue<5>(ScenarioClass::Instance->Random.RandomRanged(0, 31)); - - const auto cos_factor = -2.44921270764e-16; // cos(1.5 * Math::Pi * 1.00001) - const auto flatSpeed = cos_factor * pBullet->Speed; + if (pBuilding->GetOccupantCount() > 0) + return -200; - const auto radians = dir.GetRadian<32>(); - velocity = BulletVelocity { Math::cos(radians) * flatSpeed, Math::sin(radians) * flatSpeed, static_cast(-pBullet->Speed) }; - } - - pBullet->MoveTo(sourceCoords, velocity); + const auto renderCoords = pBuilding->GetRenderCoords(); + const auto zAdj = (animY - renderCoords.Y) / -4; + return (zAdj >= 0) ? 0 : zAdj; } -// Make sure pBullet and pWeapon is not empty before call -void BulletExt::SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool trajectory, bool attach) +// Make sure pBullet and pBullet->WeaponType is not empty before call +inline void BulletExt::SimulatedFiringAnim(BulletClass* pBullet, HouseClass* pHouse, ObjectClass* pAttach) { + const auto pWeapon = pBullet->WeaponType; const auto animCounts = pWeapon->Anim.Count; if (animCounts <= 0) return; + const auto pFirer = pBullet->Owner; const auto pAnimType = pWeapon->Anim[(animCounts % 8 == 0) ? // Have direction ? - (static_cast(((trajectory ? // (Trajectory ? - Math::atan2(pBullet->Velocity.Y , pBullet->Velocity.X) : // Velocity : - Math::atan2(pBullet->TargetCoords.Y - pBullet->SourceCoords.Y , pBullet->TargetCoords.X - pBullet->SourceCoords.X)) // Connection) - / Math::TwoPi + 1.5) * animCounts - (animCounts / 8) + 0.5) % animCounts) : // Calculate direction : + (static_cast((Math::atan2(pBullet->Velocity.Y , pBullet->Velocity.X) / Math::TwoPi + 1.5) * animCounts - (animCounts / 8) + 0.5) % animCounts) : // Calculate direction : ScenarioClass::Instance->Random.RandomRanged(0 , animCounts - 1)]; // Simple random; if (!pAnimType) return; const auto pAnim = GameCreate(pAnimType, pBullet->SourceCoords); - pAnim->SetOwnerObject(pBullet->Owner); + pAnim->Owner = pHouse; + AnimExt::ExtMap.Find(pAnim)->SetInvoker(pFirer, pHouse); - if (attach) - AnimExt::ExtMap.Find(pAnim)->SetInvoker(pBullet->Owner, pHouse); + if (pAttach) + { + if (pAttach->WhatAmI() == AbstractType::Building) + pAnim->ZAdjust = SetBuildingFireAnimZAdjust(static_cast(pAttach), pBullet->SourceCoords.Y); + else + pAnim->SetOwnerObject(pAttach); + } + else if (const auto pBuilding = abstract_cast(pFirer)) + { + pAnim->ZAdjust = SetBuildingFireAnimZAdjust(pBuilding, pBullet->SourceCoords.Y); + } } -// Make sure pBullet and pWeapon is not empty before call -void BulletExt::SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon) +// Make sure pBullet and pBullet->WeaponType is not empty before call +inline void BulletExt::SimulatedFiringReport(BulletClass* pBullet) { + const auto pWeapon = pBullet->WeaponType; + if (pWeapon->Report.Count <= 0) return; @@ -223,9 +216,11 @@ void BulletExt::SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWe VocClass::PlayAt(reportIndex, pBullet->Location, nullptr); } -// Make sure pBullet and pWeapon is not empty before call -void BulletExt::SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +// Make sure pBullet and pBullet->WeaponType is not empty before call +inline void BulletExt::SimulatedFiringLaser(BulletClass* pBullet, HouseClass* pHouse) { + const auto pWeapon = pBullet->WeaponType; + if (!pWeapon->IsLaser) return; @@ -248,9 +243,11 @@ void BulletExt::SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWea } } -// Make sure pBullet and pWeapon is not empty before call -void BulletExt::SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon) +// Make sure pBullet and pBullet->WeaponType is not empty before call +inline void BulletExt::SimulatedFiringElectricBolt(BulletClass* pBullet) { + const auto pWeapon = pBullet->WeaponType; + if (!pWeapon->IsElectricBolt) return; @@ -263,9 +260,11 @@ void BulletExt::SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClas } } -// Make sure pBullet and pWeapon is not empty before call -void BulletExt::SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +// Make sure pBullet and pBullet->WeaponType is not empty before call +inline void BulletExt::SimulatedFiringRadBeam(BulletClass* pBullet, HouseClass* pHouse) { + const auto pWeapon = pBullet->WeaponType; + if (!pWeapon->IsRadBeam) return; @@ -284,13 +283,63 @@ void BulletExt::SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pW } } -// Make sure pBullet and pWeapon is not empty before call -void BulletExt::SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse) +// Make sure pBullet and pBullet->WeaponType is not empty before call +inline void BulletExt::SimulatedFiringParticleSystem(BulletClass* pBullet, HouseClass* pHouse) { - if (const auto pPSType = pWeapon->AttachedParticleSystem) + if (const auto pPSType = pBullet->WeaponType->AttachedParticleSystem) GameCreate(pPSType, pBullet->SourceCoords, pBullet->Target, pBullet->Owner, pBullet->TargetCoords, pHouse); } +// Make sure pBullet is not empty before call +void BulletExt::SimulatedFiringUnlimbo(BulletClass* pBullet, HouseClass* pHouse, WeaponTypeClass* pWeapon, const CoordStruct& sourceCoords, bool randomVelocity) +{ + // Weapon + pBullet->WeaponType = pWeapon; + + // Range + int projectileRange = WeaponTypeExt::ExtMap.Find(pWeapon)->ProjectileRange.Get(); + pBullet->Range = projectileRange; + + // House + BulletExt::ExtMap.Find(pBullet)->FirerHouse = pHouse; + + // Velocity + auto velocity = BulletVelocity::Empty; + + if (randomVelocity) + { + DirStruct dir; + dir.SetValue<5>(ScenarioClass::Instance->Random.RandomRanged(0, 31)); + + const auto cos_factor = -2.44921270764e-16; // cos(1.5 * Math::Pi * 1.00001) + const auto flatSpeed = cos_factor * pBullet->Speed; + + const auto radians = dir.GetRadian<32>(); + velocity = BulletVelocity { Math::cos(radians) * flatSpeed, Math::sin(radians) * flatSpeed, static_cast(-pBullet->Speed) }; + } + + // Unlimbo + pBullet->MoveTo(sourceCoords, velocity); +} + +// Make sure pBullet and pBullet->WeaponType is not empty before call +void BulletExt::SimulatedFiringEffects(BulletClass* pBullet, HouseClass* pHouse, ObjectClass* pAttach, bool firingEffect, bool visualEffect) +{ + if (firingEffect) + { + BulletExt::SimulatedFiringAnim(pBullet, pHouse, pAttach); + BulletExt::SimulatedFiringReport(pBullet); + } + + if (visualEffect) + { + BulletExt::SimulatedFiringLaser(pBullet, pHouse); + BulletExt::SimulatedFiringElectricBolt(pBullet); + BulletExt::SimulatedFiringRadBeam(pBullet, pHouse); + BulletExt::SimulatedFiringParticleSystem(pBullet, pHouse); + } +} + // ============================= // load / save diff --git a/src/Ext/Bullet/Body.h b/src/Ext/Bullet/Body.h index 44fc4c24ee..2bc3d6c33d 100644 --- a/src/Ext/Bullet/Body.h +++ b/src/Ext/Bullet/Body.h @@ -69,12 +69,12 @@ class BulletExt static ExtContainer ExtMap; - static void SimulatedFiringInfos(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, int projectileRange); - static void SimulatedFiringVelocity(BulletClass* pBullet, const CoordStruct& sourceCoords, bool randomVelocity); - static void SimulatedFiringAnim(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse, bool trajectory, bool attach); - static void SimulatedFiringReport(BulletClass* pBullet, WeaponTypeClass* pWeapon); - static void SimulatedFiringLaser(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); - static void SimulatedFiringElectricBolt(BulletClass* pBullet, WeaponTypeClass* pWeapon); - static void SimulatedFiringRadBeam(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); - static void SimulatedFiringParticleSystem(BulletClass* pBullet, WeaponTypeClass* pWeapon, HouseClass* pHouse); + static void SimulatedFiringUnlimbo(BulletClass* pBullet, HouseClass* pHouse, WeaponTypeClass* pWeapon, const CoordStruct& sourceCoords, bool randomVelocity); + static void SimulatedFiringEffects(BulletClass* pBullet, HouseClass* pHouse, ObjectClass* pAttach, bool firingEffect, bool visualEffect); + static inline void SimulatedFiringAnim(BulletClass* pBullet, HouseClass* pHouse, ObjectClass* pAttach); + static inline void SimulatedFiringReport(BulletClass* pBullet); + static inline void SimulatedFiringLaser(BulletClass* pBullet, HouseClass* pHouse); + static inline void SimulatedFiringElectricBolt(BulletClass* pBullet); + static inline void SimulatedFiringRadBeam(BulletClass* pBullet, HouseClass* pHouse); + static inline void SimulatedFiringParticleSystem(BulletClass* pBullet, HouseClass* pHouse); }; diff --git a/src/Ext/Bullet/Hooks.DetonateLogics.cpp b/src/Ext/Bullet/Hooks.DetonateLogics.cpp index 1c74621146..ada5ccd472 100644 --- a/src/Ext/Bullet/Hooks.DetonateLogics.cpp +++ b/src/Ext/Bullet/Hooks.DetonateLogics.cpp @@ -538,8 +538,6 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) } } - auto const pWeaponExt = WeaponTypeExt::ExtMap.Find(pWeapon); - int projectileRange = pWeaponExt->ProjectileRange.Get(); auto const pTypeSplits = pWeapon->Projectile; int damage = pWeapon->Damage; @@ -575,14 +573,8 @@ DEFINE_HOOK(0x469EC0, BulletClass_Logics_AirburstWeapon, 0x6) { if (auto const pBullet = pTypeSplits->CreateBullet(pTarget, pSource, damage, pWeapon->Warhead, pWeapon->Speed, pWeapon->Bright)) { - BulletExt::SimulatedFiringInfos(pBullet, pWeapon, pOwner, projectileRange); - BulletExt::SimulatedFiringVelocity(pBullet, pThis->Location, true); - // BulletExt::SimulatedFiringAnim(pBullet, pWeapon, pOwner, BulletExt::ExtMap.Find(pBullet)->Trajectory, false); - // BulletExt::SimulatedFiringReport(pBullet, pWeapon); - BulletExt::SimulatedFiringLaser(pBullet, pWeapon, pOwner); - BulletExt::SimulatedFiringElectricBolt(pBullet, pWeapon); - BulletExt::SimulatedFiringRadBeam(pBullet, pWeapon, pOwner); - BulletExt::SimulatedFiringParticleSystem(pBullet, pWeapon, pOwner); + BulletExt::SimulatedFiringUnlimbo(pBullet, pOwner, pWeapon, pThis->Location, true); + BulletExt::SimulatedFiringEffects(pBullet, pOwner, nullptr, false, true); } } }