From e6c23ed355e1249eb7af37b05438d1b8bcb780c1 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 17:05:41 +1000 Subject: [PATCH 1/5] unify: Parse template references in the AssistedTargetingUpdate module by name --- .../GameLogic/Module/AssistedTargetingUpdate.h | 12 ++++++++---- .../Object/Update/AssistedTargetingUpdate.cpp | 12 ++++++------ .../GameLogic/Module/AssistedTargetingUpdate.h | 2 -- .../Object/Update/AssistedTargetingUpdate.cpp | 1 - 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index 04284c0f18a..9a0da2b6123 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -38,15 +38,16 @@ class AssistedTargetingUpdateModuleData : public UpdateModuleData public: Int m_clipSize; WeaponSlotType m_weaponSlot; - ThingTemplate *m_laserFromAssisted; - ThingTemplate *m_laserToTarget; + + AsciiString m_laserFromAssistedName; + AsciiString m_laserToTargetName; AssistedTargetingUpdateModuleData() { m_clipSize = 1; m_weaponSlot = PRIMARY_WEAPON; - m_laserFromAssisted = nullptr; - m_laserToTarget = nullptr; + m_laserFromAssistedName.clear(); + m_laserToTargetName.clear(); } static void buildFieldParse(MultiIniFieldParse& p); @@ -72,4 +73,7 @@ class AssistedTargetingUpdate : public UpdateModule private: void makeFeedbackLaser( const ThingTemplate *laserTemplate, const Object *from, const Object *to ); + + const ThingTemplate *m_laserFromAssisted; + const ThingTemplate *m_laserToTarget; }; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index 20f57f56049..d61e65a3eb2 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -54,8 +54,8 @@ void AssistedTargetingUpdateModuleData::buildFieldParse(MultiIniFieldParse& p) { { "AssistingClipSize", INI::parseInt, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_clipSize ) }, { "AssistingWeaponSlot", INI::parseLookupList, TheWeaponSlotTypeNamesLookupList, offsetof( AssistedTargetingUpdateModuleData, m_weaponSlot ) }, - { "LaserFromAssisted", INI::parseThingTemplate, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserFromAssisted ) }, - { "LaserToTarget", INI::parseThingTemplate, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserToTarget ) }, + { "LaserFromAssisted", INI::parseAsciiString, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserFromAssistedName ) }, + { "LaserToTarget", INI::parseAsciiString, nullptr, offsetof( AssistedTargetingUpdateModuleData, m_laserToTargetName ) }, { nullptr, nullptr, nullptr, 0 } }; p.add(dataFieldParse); @@ -100,10 +100,10 @@ void AssistedTargetingUpdate::assistAttack( const Object *requestingObject, Obje me->setWeaponLock( md->m_weaponSlot, LOCKED_TEMPORARILY ); me->getAI()->aiAttackObject( victimObject, md->m_clipSize, CMD_FROM_AI ); - if( md->m_laserFromAssisted ) - makeFeedbackLaser( md->m_laserFromAssisted, requestingObject, me ); - if( md->m_laserToTarget ) - makeFeedbackLaser( md->m_laserToTarget, me, victimObject ); + if( m_laserFromAssisted ) + makeFeedbackLaser( m_laserFromAssisted, requestingObject, me ); + if( m_laserToTarget ) + makeFeedbackLaser( m_laserToTarget, me, victimObject ); } //------------------------------------------------------------------------------------------------- diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index c784a12d450..6bcacd49741 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -76,6 +76,4 @@ class AssistedTargetingUpdate : public UpdateModule const ThingTemplate *m_laserFromAssisted; const ThingTemplate *m_laserToTarget; - - }; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index 9bb57e08351..7769f0a7ff5 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -101,7 +101,6 @@ void AssistedTargetingUpdate::assistAttack( const Object *requestingObject, Obje me->setWeaponLock( md->m_weaponSlot, LOCKED_TEMPORARILY ); me->getAI()->aiAttackObject( victimObject, md->m_clipSize, CMD_FROM_AI ); - if( m_laserFromAssisted ) makeFeedbackLaser( m_laserFromAssisted, requestingObject, me ); if( m_laserToTarget ) From ffa911abb7b5a716551400806b75d752039a3c90 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 17:38:57 +1000 Subject: [PATCH 2/5] bugfix: Correct copy-and-paste error that caused the laser to target to never be correctly assigned --- .../GameLogic/Object/Update/AssistedTargetingUpdate.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index 7769f0a7ff5..719f1abd9d7 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -138,14 +138,10 @@ void AssistedTargetingUpdate::makeFeedbackLaser( const ThingTemplate *laserTempl //------------------------------------------------------------------------------------------------- UpdateSleepTime AssistedTargetingUpdate::update() { - const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); - - - m_laserToTarget =TheThingFactory->findTemplate( d->m_laserFromAssistedName ); - + m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); return UPDATE_SLEEP_FOREVER; } @@ -187,7 +183,7 @@ void AssistedTargetingUpdate::loadPostProcess() const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); - m_laserToTarget =TheThingFactory->findTemplate( d->m_laserFromAssistedName ); + m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); // extend base class UpdateModule::loadPostProcess(); From 4098912a3479fec133dc7f044f8af967d17c0540 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 17:39:37 +1000 Subject: [PATCH 3/5] unify: Apply update and loadPostProcess logic from Zero Hour to Generals --- .../Object/Update/AssistedTargetingUpdate.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index d61e65a3eb2..d7660483ab6 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -137,6 +137,11 @@ void AssistedTargetingUpdate::makeFeedbackLaser( const ThingTemplate *laserTempl //------------------------------------------------------------------------------------------------- UpdateSleepTime AssistedTargetingUpdate::update() { + const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); + + m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); + m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); + return UPDATE_SLEEP_FOREVER; } @@ -174,8 +179,11 @@ void AssistedTargetingUpdate::xfer( Xfer *xfer ) // ------------------------------------------------------------------------------------------------ void AssistedTargetingUpdate::loadPostProcess() { + const AssistedTargetingUpdateModuleData *d = getAssistedTargetingUpdateModuleData(); + + m_laserFromAssisted = TheThingFactory->findTemplate( d->m_laserFromAssistedName ); + m_laserToTarget = TheThingFactory->findTemplate( d->m_laserToTargetName ); // extend base class UpdateModule::loadPostProcess(); - } From 818dfe983086750a2574a3d120ee3b977216686e Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 17:41:37 +1000 Subject: [PATCH 4/5] unity: Init instance members --- .../Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp index d7660483ab6..b291be7cb17 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AssistedTargetingUpdate.cpp @@ -65,6 +65,8 @@ void AssistedTargetingUpdateModuleData::buildFieldParse(MultiIniFieldParse& p) //------------------------------------------------------------------------------------------------- AssistedTargetingUpdate::AssistedTargetingUpdate( Thing *thing, const ModuleData* moduleData ) : UpdateModule( thing, moduleData ) { + m_laserFromAssisted = nullptr; + m_laserToTarget = nullptr; setWakeFrame(getObject(), UPDATE_SLEEP_FOREVER); } From 720da12487a79859860bfbf7abfd688ead3a7e2d Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Fri, 19 Jun 2026 18:13:24 +1000 Subject: [PATCH 5/5] refactor: Remove unnecessary ascii string clears --- .../Include/GameLogic/Module/AssistedTargetingUpdate.h | 2 -- .../Include/GameLogic/Module/AssistedTargetingUpdate.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index 9a0da2b6123..285643dd1fb 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -46,8 +46,6 @@ class AssistedTargetingUpdateModuleData : public UpdateModuleData { m_clipSize = 1; m_weaponSlot = PRIMARY_WEAPON; - m_laserFromAssistedName.clear(); - m_laserToTargetName.clear(); } static void buildFieldParse(MultiIniFieldParse& p); diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h index 6bcacd49741..6fc0c21f195 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/AssistedTargetingUpdate.h @@ -46,8 +46,6 @@ class AssistedTargetingUpdateModuleData : public UpdateModuleData { m_clipSize = 1; m_weaponSlot = PRIMARY_WEAPON; - m_laserFromAssistedName.clear(); - m_laserToTargetName.clear(); } static void buildFieldParse(MultiIniFieldParse& p);