From 4f639a16b54b4b8e73efefce0539c5d455659bdc Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Sat, 27 Dec 2025 09:02:21 -0600 Subject: [PATCH] trip onadd in additional places by request, adds a per object-instance onadd for datablocks if an object instance *also* defines a class. be mindful not to mix up which namespace is in use there, as you can not tag two different core class instances the same scripted class implements the same with the same restrictions for simobjects in general --- Engine/source/T3D/gameBase/gameBase.cpp | 6 ++++++ Engine/source/T3D/gameBase/gameBase.h | 2 ++ Engine/source/console/simObject.cpp | 14 ++++++++++++++ Engine/source/console/simObject.h | 3 +++ 4 files changed, 25 insertions(+) diff --git a/Engine/source/T3D/gameBase/gameBase.cpp b/Engine/source/T3D/gameBase/gameBase.cpp index 9e5a770b7..e603549a6 100644 --- a/Engine/source/T3D/gameBase/gameBase.cpp +++ b/Engine/source/T3D/gameBase/gameBase.cpp @@ -125,6 +125,11 @@ IMPLEMENT_CALLBACK( GameBase, setControl, void, ( bool controlled ), ( controlle "client controls this object.\n" ); +IMPLEMENT_CALLBACK(GameBase, onAdd, void, (SimObjectId ID), (ID), + "Called when this ScriptObject is added to the system.\n" + "@param ID Unique object ID assigned when created (%this in script).\n" +); + GameBaseData::GameBaseData() { mCategory = StringTable->EmptyString(); @@ -518,6 +523,7 @@ void GameBase::scriptOnAdd() // everything is ready. if (mDataBlock && !isGhost()) mDataBlock->onAdd_callback( this ); + onAdd_callback(getId()); } void GameBase::scriptOnNewDataBlock(bool reload) diff --git a/Engine/source/T3D/gameBase/gameBase.h b/Engine/source/T3D/gameBase/gameBase.h index cfdc10bf4..7d13b79b2 100644 --- a/Engine/source/T3D/gameBase/gameBase.h +++ b/Engine/source/T3D/gameBase/gameBase.h @@ -469,6 +469,8 @@ private: void _onDatablockModified(); protected: void onScopeIdChange() override { setMaskBits(ScopeIdMask); } + + DECLARE_CALLBACK(void, onAdd, (SimObjectId ID)); }; diff --git a/Engine/source/console/simObject.cpp b/Engine/source/console/simObject.cpp index cfcbbd72b..8eff6f01d 100644 --- a/Engine/source/console/simObject.cpp +++ b/Engine/source/console/simObject.cpp @@ -88,6 +88,16 @@ EndImplementBitfieldType; IMPLEMENT_CONOBJECT( SimObject ); +IMPLEMENT_CALLBACK(SimObject, onAdd, void, (SimObjectId ID), (ID), + "Called when this SimObject is added to the system, if the className is set to something\n" + "@param ID Unique object ID assigned when created (%this in script).\n" +); + +IMPLEMENT_CALLBACK(SimObject, onRemove, void, (SimObjectId ID), (ID), + "Called when this SimObject is removed from the system, if the className is set to something\n" + "@param ID Unique object ID assigned when created (%this in script).\n" +); + // See full description in the new CHM manual ConsoleDocClass( SimObject, "@brief Base class for almost all objects involved in the simulation.\n\n" @@ -1689,6 +1699,8 @@ bool SimObject::onAdd() linkNamespaces(); + onAdd_callback(getId()); + return true; } @@ -1698,6 +1710,8 @@ void SimObject::onRemove() { mFlags.clear(Added); + onRemove_callback(getId()); + unlinkNamespaces(); } diff --git a/Engine/source/console/simObject.h b/Engine/source/console/simObject.h index 4868a4585..5885e16e6 100644 --- a/Engine/source/console/simObject.h +++ b/Engine/source/console/simObject.h @@ -987,6 +987,9 @@ class SimObject: public ConsoleObject, public TamlCallbacks DECLARE_CALLBACK(void, onInspectPostApply, (SimObject* obj)); DECLARE_CALLBACK(void, onSelected, (SimObject* obj)); DECLARE_CALLBACK(void, onUnselected, (SimObject* obj)); + + DECLARE_CALLBACK(void, onAdd, (SimObjectId ID)); + DECLARE_CALLBACK(void, onRemove, (SimObjectId ID)); static SimObject* __findObject( const char* id ) { return Sim::findObject( id ); } static const char* __getObjectId( ConsoleObject* object )