|
@@ -202,7 +202,7 @@ function updateTSShapeLoadProgress(%progress, %msg)
|
|
|
{
|
|
|
// Check if the loading GUI is visible and use that instead of the
|
|
|
// separate import progress GUI if possible
|
|
|
- if ( isObject(LoadingGui) && LoadingGui.isAwake() )
|
|
|
+ /* if ( isObject(LoadingGui) && LoadingGui.isAwake() )
|
|
|
{
|
|
|
// Save/Restore load progress at the start/end of the import process
|
|
|
if ( %progress == 0 )
|
|
@@ -245,7 +245,7 @@ function updateTSShapeLoadProgress(%progress, %msg)
|
|
|
%textCtrl.setText(%msg);
|
|
|
}
|
|
|
|
|
|
- Canvas.repaint(33);
|
|
|
+ Canvas.repaint(33);*/
|
|
|
}
|
|
|
|
|
|
/// A helper function which will return the ghosted client object
|
|
@@ -952,3 +952,207 @@ function TestPManager::testObjectRemove(%doNotSave)
|
|
|
TestPManager.removeObjectFromFile(AudioSim);
|
|
|
}
|
|
|
|
|
|
+//Game Object management
|
|
|
+function findGameObject(%name)
|
|
|
+{
|
|
|
+ //find all GameObjectAssets
|
|
|
+ %assetQuery = new AssetQuery();
|
|
|
+ if(!AssetDatabase.findAssetType(%assetQuery, "GameObjectAsset"))
|
|
|
+ return 0; //if we didn't find ANY, just exit
|
|
|
+
|
|
|
+ %count = %assetQuery.getCount();
|
|
|
+
|
|
|
+ for(%i=0; %i < %count; %i++)
|
|
|
+ {
|
|
|
+ %assetId = %assetQuery.getAsset(%i);
|
|
|
+
|
|
|
+ %assetName = AssetDatabase.getAssetName(%assetId);
|
|
|
+
|
|
|
+ if(%assetName $= %name)
|
|
|
+ {
|
|
|
+ %gameObjectAsset = AssetDatabase.acquireAsset(%assetId);
|
|
|
+
|
|
|
+ %assetQuery.delete();
|
|
|
+ return %gameObjectAsset;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ %assetQuery.delete();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+function spawnGameObject(%name, %addToMissionGroup)
|
|
|
+{
|
|
|
+ if(%addToMissionGroup $= "")
|
|
|
+ %addToMissionGroup = true;
|
|
|
+
|
|
|
+ //First, check if this already exists in our GameObjectPool
|
|
|
+ if(isObject(GameObjectPool))
|
|
|
+ {
|
|
|
+ %goCount = GameObjectPool.countKey(%name);
|
|
|
+
|
|
|
+ //if we have some already in the pool, pull it out and use that
|
|
|
+ if(%goCount != 0)
|
|
|
+ {
|
|
|
+ %goIdx = GameObjectPool.getIndexFromKey(%name);
|
|
|
+ %go = GameObjectPool.getValue(%goIdx);
|
|
|
+
|
|
|
+ %go.setHidden(false);
|
|
|
+ %go.setScopeAlways();
|
|
|
+
|
|
|
+ if(%addToMissionGroup == true) //save instance when saving level
|
|
|
+ MissionGroup.add(%go);
|
|
|
+ else // clear instance on level exit
|
|
|
+ MissionCleanup.add(%go);
|
|
|
+
|
|
|
+ //remove from the object pool's list
|
|
|
+ GameObjectPool.erase(%goIdx);
|
|
|
+
|
|
|
+ return %go;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //We have no existing pool, or no existing game objects of this type, so spawn a new one
|
|
|
+
|
|
|
+ %gameObjectAsset = findGameObject(%name);
|
|
|
+
|
|
|
+ if(isObject(%gameObjectAsset))
|
|
|
+ {
|
|
|
+ %newSGOObject = TamlRead(%gameObjectAsset.TAMLFilePath);
|
|
|
+
|
|
|
+ if(%addToMissionGroup == true) //save instance when saving level
|
|
|
+ MissionGroup.add(%newSGOObject);
|
|
|
+ else // clear instance on level exit
|
|
|
+ MissionCleanup.add(%newSGOObject);
|
|
|
+
|
|
|
+ return %newSGOObject;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+function saveGameObject(%name, %tamlPath, %scriptPath)
|
|
|
+{
|
|
|
+ %gameObjectAsset = findGameObject(%name);
|
|
|
+
|
|
|
+ //find if it already exists. If it does, we'll update it, if it does not, we'll make a new asset
|
|
|
+ if(isObject(%gameObjectAsset))
|
|
|
+ {
|
|
|
+ %assetID = %gameObjectAsset.getAssetId();
|
|
|
+
|
|
|
+ %gameObjectAsset.TAMLFilePath = %tamlPath;
|
|
|
+ %gameObjectAsset.scriptFilePath = %scriptPath;
|
|
|
+
|
|
|
+ TAMLWrite(%gameObjectAsset, AssetDatabase.getAssetFilePath(%assetID));
|
|
|
+ AssetDatabase.refreshAsset(%assetID);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Doesn't exist, so make a new one
|
|
|
+ %gameObjectAsset = new GameObjectAsset()
|
|
|
+ {
|
|
|
+ assetName = %name @ "Asset";
|
|
|
+ gameObjectName = %name;
|
|
|
+ TAMLFilePath = %tamlPath;
|
|
|
+ scriptFilePath = %scriptPath;
|
|
|
+ };
|
|
|
+
|
|
|
+ //Save it alongside the taml file
|
|
|
+ %path = filePath(%tamlPath);
|
|
|
+
|
|
|
+ TAMLWrite(%gameObjectAsset, %path @ "/" @ %name @ ".asset.taml");
|
|
|
+ AssetDatabase.refreshAllAssets(true);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//Allocates a number of a game object into a pool to be pulled from as needed
|
|
|
+function allocateGameObjects(%name, %amount)
|
|
|
+{
|
|
|
+ //First, we need to make sure our pool exists
|
|
|
+ if(!isObject(GameObjectPool))
|
|
|
+ {
|
|
|
+ new ArrayObject(GameObjectPool);
|
|
|
+ }
|
|
|
+
|
|
|
+ //Next, we loop and generate our game objects, and add them to the pool
|
|
|
+ for(%i=0; %i < %amount; %i++)
|
|
|
+ {
|
|
|
+ %go = spawnGameObject(%name, false);
|
|
|
+
|
|
|
+ //When our object is in the pool, it's not "real", so we need to make sure
|
|
|
+ //that we don't ghost it to clients untill we actually spawn it.
|
|
|
+ %go.clearScopeAlways();
|
|
|
+
|
|
|
+ //We also hide it, so that we don't 'exist' in the scene until we spawn
|
|
|
+ %go.hidden = true;
|
|
|
+
|
|
|
+ //Lastly, add us to the pool, with the key being our game object type
|
|
|
+ GameObjectPool.add(%name, %go);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function Entity::delete(%this)
|
|
|
+{
|
|
|
+ //we want to intercept the delete call, and add it to our GameObjectPool
|
|
|
+ //if it's a game object
|
|
|
+ if(%this.gameObjectAsset !$= "")
|
|
|
+ {
|
|
|
+ %this.setHidden(true);
|
|
|
+ %this.clearScopeAlways();
|
|
|
+
|
|
|
+ if(!isObject(GameObjectPool))
|
|
|
+ {
|
|
|
+ new ArrayObject(GameObjectPool);
|
|
|
+ }
|
|
|
+
|
|
|
+ GameObjectPool.add(%this.gameObjectAsset, %this);
|
|
|
+
|
|
|
+ %missionSet = %this.getGroup();
|
|
|
+ %missionSet.remove(%this);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ %this.superClass.delete();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function clearGameObjectPool()
|
|
|
+{
|
|
|
+ if(isObject(GameObjectPool))
|
|
|
+ {
|
|
|
+ %count = GameObjectPool.count();
|
|
|
+
|
|
|
+ for(%i=0; %i < %count; %i++)
|
|
|
+ {
|
|
|
+ %go = GameObjectPool.getValue(%i);
|
|
|
+
|
|
|
+ %go.superClass.delete();
|
|
|
+ }
|
|
|
+
|
|
|
+ GameObjectPool.empty();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+function switchCamera(%client, %newCamEntity)
|
|
|
+{
|
|
|
+ if(!isObject(%client) || !isObject(%newCamEntity))
|
|
|
+ return error("SwitchCamera: No client or target camera!");
|
|
|
+
|
|
|
+ %cam = %newCamEntity.getComponent(CameraComponent);
|
|
|
+
|
|
|
+ if(!isObject(%cam))
|
|
|
+ return error("SwitchCamera: Target camera doesn't have a camera behavior!");
|
|
|
+
|
|
|
+ //TODO: Cleanup clientOwner for previous camera!
|
|
|
+ if(%cam.clientOwner == 0 || %cam.clientOwner $= "")
|
|
|
+ %cam.clientOwner = 0;
|
|
|
+
|
|
|
+ %cam.scopeToClient(%client);
|
|
|
+ %cam.setDirty();
|
|
|
+
|
|
|
+ %client.setCameraObject(%newCamEntity);
|
|
|
+ %client.setControlCameraFov(%cam.FOV);
|
|
|
+
|
|
|
+ %client.camera = %newCamEntity;
|
|
|
+}
|