Browse Source

copy-on-reload -- The datablock copy op, ":" is modified to copy on reload as well as on creation.
reload-reset -- adds virtual method that is called when a datablock is reloaded.

Marc Chapman 8 years ago
parent
commit
39b62b1461
2 changed files with 35 additions and 0 deletions
  1. 33 0
      Engine/source/console/compiledEval.cpp
  2. 2 0
      Engine/source/console/simObject.h

+ 33 - 0
Engine/source/console/compiledEval.cpp

@@ -24,6 +24,7 @@
 // Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames
 // Copyright (C) 2015 Faust Logic, Inc.
 //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
+
 #include "platform/platform.h"
 #include "console/console.h"
 
@@ -965,6 +966,38 @@ breakContinue:
                   currentNewObject->setModDynamicFields(true);
                }
             }
+            else
+            {
+               currentNewObject->reloadReset(); // AFX (reload-reset)
+               // Does it have a parent object? (ie, the copy constructor : syntax, not inheriance)
+               if(*objParent)
+               {
+                  // Find it!
+                  SimObject *parent;
+                  if(Sim::findObject(objParent, parent))
+                  {
+                     // Con::printf(" - Parent object found: %s", parent->getClassName());
+
+                     // temporarily block name change
+                     SimObject::preventNameChanging = true;
+                     currentNewObject->setCopySource( parent );
+                     currentNewObject->assignFieldsFrom(parent);
+                     // restore name changing
+                     SimObject::preventNameChanging = false;
+
+                     // copy any substitution statements
+                     SimDataBlock* parent_db = dynamic_cast<SimDataBlock*>(parent);
+                     if (parent_db)
+                     {
+                        SimDataBlock* currentNewObject_db = dynamic_cast<SimDataBlock*>(currentNewObject);
+                        if (currentNewObject_db)
+                           currentNewObject_db->copySubstitutionsFrom(parent_db);
+                     }
+                  }
+                  else
+                     Con::errorf(ConsoleLogEntry::General, "%d: Unable to find parent object %s for %s.", lineNumber, objParent, (const char*)callArgv[1]);
+               }
+            }
 
             // Advance the IP past the create info...
             ip += 7;

+ 2 - 0
Engine/source/console/simObject.h

@@ -980,6 +980,8 @@ public:
    /*C*/  SimObject(const SimObject&, bool = false);
    bool   isTempClone() const { return is_temp_clone; }
    virtual bool allowSubstitutions() const { return false; }
+public:
+   virtual void reloadReset() { }
 };