init
This commit is contained in:
921 files changed
+337975
No files matched your search
@@ -0,0 +1,199 @@
|
||||
Line truncated
|
||||
|
||||
function setModelFromArray(a)
|
||||
{
|
||||
self setModel(a[randomint(a.size)]);
|
||||
}
|
||||
|
||||
function randomElement(a)
|
||||
{
|
||||
return a[randomint(a.size)];
|
||||
}
|
||||
|
||||
function attachFromArray(a)
|
||||
{
|
||||
self attach(randomElement(a), "", true);
|
||||
}
|
||||
|
||||
function newcharacter()
|
||||
{
|
||||
self detachAll();
|
||||
oldGunHand = self.anim_gunHand;
|
||||
if (!isdefined(oldGunHand))
|
||||
return;
|
||||
self.anim_gunHand = "none";
|
||||
self [[anim.PutGunInHand]](oldGunHand);
|
||||
}
|
||||
|
||||
function save()
|
||||
{
|
||||
info["gunHand"] = self.anim_gunHand;
|
||||
info["gunInHand"] = self.anim_gunInHand;
|
||||
info["model"] = self.model;
|
||||
info["hatModel"] = self.hatModel;
|
||||
info["gearModel"] = self.gearModel;
|
||||
if (isdefined (self.name))
|
||||
{
|
||||
info["name"] = self.name;
|
||||
/#println ("Save: Guy has name ", self.name);#/
|
||||
}
|
||||
else
|
||||
{
|
||||
/#println ("save: Guy had no name!");#/
|
||||
}
|
||||
|
||||
attachSize = self getAttachSize();
|
||||
for (i = 0; i < attachSize; i++)
|
||||
{
|
||||
info["attach"][i]["model"] = self getAttachModelName(i);
|
||||
info["attach"][i]["tag"] = self getAttachTagName(i);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
function load(info)
|
||||
{
|
||||
self detachAll();
|
||||
self.anim_gunHand = info["gunHand"];
|
||||
self.anim_gunInHand = info["gunInHand"];
|
||||
self setModel(info["model"]);
|
||||
self.hatModel = info["hatModel"];
|
||||
self.gearModel = info["gearModel"];
|
||||
if (isdefined (info["name"]))
|
||||
{
|
||||
self.name = info["name"];
|
||||
/#println ("Load: Guy has name ", self.name);#/
|
||||
}
|
||||
else
|
||||
{
|
||||
/#println ("Load: Guy had no name!");#/
|
||||
}
|
||||
|
||||
attachInfo = info["attach"];
|
||||
attachSize = attachInfo.size;
|
||||
for (i = 0; i < attachSize; i++)
|
||||
self attach(attachInfo[i]["model"], attachInfo[i]["tag"]);
|
||||
}
|
||||
|
||||
/*
|
||||
function sample save/precache/load usage (precache is only required if there are any waits in the level script before load):
|
||||
|
||||
save:
|
||||
info = foley character::save();
|
||||
game["foley"] = info;
|
||||
changelevel("burnville", 0, true);
|
||||
|
||||
precache:
|
||||
character::precache(game["foley"]);
|
||||
|
||||
load:
|
||||
foley character::load(game["foley"]);
|
||||
|
||||
*/
|
||||
|
||||
function get_random_character( amount )
|
||||
{
|
||||
self_info = strtok( self.classname, "_" );
|
||||
if ( self_info.size <= 2 )
|
||||
{
|
||||
// some custom guy that doesn't use standard naming convention
|
||||
return randomint( amount );
|
||||
}
|
||||
|
||||
|
||||
group = "auto"; // by default the type is an auto-selected character
|
||||
index = undefined;
|
||||
prefix = self_info[ 2 ]; // merc, marine, etc
|
||||
|
||||
// the designer can overwrite the character
|
||||
if ( isdefined( self.script_char_index ) )
|
||||
{
|
||||
index = self.script_char_index;
|
||||
}
|
||||
|
||||
// the designer can hint that this guy is a member of a group of like - spawned guys, so he should use a different index
|
||||
if ( isdefined( self.script_char_group ) )
|
||||
{
|
||||
type = "grouped";
|
||||
group = "group_" + self.script_char_group;
|
||||
}
|
||||
|
||||
if ( !isdefined( level.character_index_cache ) )
|
||||
{
|
||||
// separately store script grouped guys and auto guys so that they dont influence each other
|
||||
level.character_index_cache = [];
|
||||
}
|
||||
|
||||
if ( !isdefined( level.character_index_cache[ prefix ] ) )
|
||||
{
|
||||
// separately store script grouped guys and auto guys so that they dont influence each other
|
||||
level.character_index_cache[ prefix ] = [];
|
||||
}
|
||||
|
||||
if ( !isdefined( level.character_index_cache[ prefix ][ group ] ) )
|
||||
{
|
||||
initialize_character_group( prefix, group, amount );
|
||||
}
|
||||
|
||||
if ( !isdefined( index ) )
|
||||
{
|
||||
index = get_least_used_index( prefix, group );
|
||||
|
||||
if ( !isdefined( index ) )
|
||||
{
|
||||
// fail safe
|
||||
index = randomint( 5000 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
while ( index >= amount )
|
||||
{
|
||||
index -= amount;
|
||||
}
|
||||
|
||||
level.character_index_cache[ prefix ][ group ][ index ]++;
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
function get_least_used_index( prefix, group )
|
||||
{
|
||||
lowest_indices = [];
|
||||
lowest_use = level.character_index_cache[ prefix ][ group ][ 0 ];
|
||||
lowest_indices[ 0 ] = 0;
|
||||
|
||||
for ( i = 1; i < level.character_index_cache[ prefix ][ group ].size; i++ )
|
||||
{
|
||||
if ( level.character_index_cache[ prefix ][ group ][ i ] > lowest_use )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( level.character_index_cache[ prefix ][ group ][ i ] < lowest_use )
|
||||
{
|
||||
// if its the new lowest, start over on the array
|
||||
lowest_indices = [];
|
||||
lowest_use = level.character_index_cache[ prefix ][ group ][ i ];
|
||||
}
|
||||
|
||||
// the equal amounts end up in the array
|
||||
lowest_indices[ lowest_indices.size ] = i;
|
||||
}
|
||||
assert( lowest_indices.size, "Tried to spawn a character but the lowest indices didn't exist" );
|
||||
return random( lowest_indices );
|
||||
}
|
||||
|
||||
function initialize_character_group( prefix, group, amount )
|
||||
{
|
||||
for ( i = 0; i < amount; i++ )
|
||||
{
|
||||
level.character_index_cache[ prefix ][ group ][ i ] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function random( array )
|
||||
{
|
||||
keys = GetArrayKeys( array );
|
||||
return array[ keys[RandomInt( keys.size )] ];
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
Line truncated
|
||||
|
||||
function main()
|
||||
{
|
||||
assert(isdefined(self));
|
||||
wait 0;
|
||||
if (isdefined(self))
|
||||
{
|
||||
/#
|
||||
if(isdefined(self.classname))
|
||||
{
|
||||
if( self.classname == "trigger_once" || self.classname == "trigger_radius" || self.classname == "trigger_multiple" )
|
||||
{
|
||||
println( "" );
|
||||
println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin );
|
||||
|
||||
//players = GetPlayers( localClientNum );
|
||||
//println( "*** trigger debug: player origin is: " + players[0].origin );
|
||||
|
||||
println( "" );
|
||||
}
|
||||
}
|
||||
#/
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
Line truncated
|
||||
|
||||
function main()
|
||||
{
|
||||
assert(isdefined(self));
|
||||
wait 0;
|
||||
if (isdefined(self))
|
||||
{
|
||||
/#
|
||||
if(isdefined(self.classname))
|
||||
{
|
||||
if( self.classname == "trigger_once" || self.classname == "trigger_radius" || self.classname == "trigger_multiple" )
|
||||
{
|
||||
println( "" );
|
||||
println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin );
|
||||
|
||||
//players = GetPlayers();
|
||||
//println( "*** trigger debug: player origin is: " + players[0].origin );
|
||||
|
||||
println( "" );
|
||||
}
|
||||
}
|
||||
#/
|
||||
self delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
#using scripts\shared\scene_shared;
|
||||
|
||||
Line truncated
|
||||
|
||||
function autoexec __init__()
|
||||
{
|
||||
// set up arrays even if there are no structs in the level
|
||||
|
||||
if ( !isdefined( level.struct ) )
|
||||
{
|
||||
init_structs();
|
||||
}
|
||||
}
|
||||
|
||||
function init_structs()
|
||||
{
|
||||
level.struct = [];
|
||||
level.scriptbundles = [];
|
||||
level.scriptbundlelists = [];
|
||||
|
||||
level.struct_class_names = [];
|
||||
level.struct_class_names[ "target" ] = [];
|
||||
level.struct_class_names[ "targetname" ] = [];
|
||||
level.struct_class_names[ "script_noteworthy" ] = [];
|
||||
level.struct_class_names[ "script_linkname" ] = [];
|
||||
level.struct_class_names[ "script_label" ] = [];
|
||||
level.struct_class_names[ "classname" ] = [];
|
||||
level.struct_class_names[ "script_unitrigger_type" ] = [];
|
||||
level.struct_class_names[ "scriptbundlename" ] = [];
|
||||
}
|
||||
|
||||
function remove_unneeded_kvps( struct )
|
||||
{
|
||||
// struct.vmtype = undefined;
|
||||
// struct.type = undefined;
|
||||
struct.igdtseqnum = undefined;
|
||||
struct.configstringfiletype = undefined;
|
||||
/#devstate = struct.devstate;#/
|
||||
struct.devstate = undefined;
|
||||
/#struct.devstate = devstate;#/
|
||||
}
|
||||
|
||||
function CreateStruct( struct, type, name )
|
||||
{
|
||||
if ( !isdefined( level.struct ) )
|
||||
{
|
||||
init_structs();
|
||||
}
|
||||
|
||||
if ( isdefined( type ) )
|
||||
{
|
||||
isFrontend = ( GetDvarString( "mapname" ) == "core_frontend" );
|
||||
if ( !isdefined( level.scriptbundles[ type ] ) )
|
||||
{
|
||||
level.scriptbundles[ type ] = [];
|
||||
}
|
||||
|
||||
if ( isdefined( level.scriptbundles[ type ][ name ] ) )
|
||||
{
|
||||
return level.scriptbundles[ type ][ name ];
|
||||
}
|
||||
|
||||
if ( type == "scene" )
|
||||
{
|
||||
level.scriptbundles[ type ][ name ] = scene::remove_invalid_scene_objects( struct );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// clean out lots of shared data that is not specific to a game mode
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
else if( !( SessionModeIsMultiplayerGame() || isFrontend ) && type == "mpdialog_player" )
|
||||
{
|
||||
// do nothing, save vars
|
||||
}
|
||||
else if( !( SessionModeIsMultiplayerGame() || isFrontend ) && type == "gibcharacterdef" && IsSubStr(name,"c_t7_mp_") )
|
||||
{
|
||||
// do nothing, save vars
|
||||
}
|
||||
else if( !( SessionModeIsCampaignGame() || isFrontend ) && type == "collectibles" )
|
||||
{
|
||||
// do nothing, save vars
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
else
|
||||
{
|
||||
level.scriptbundles[ type ][ name ] = struct;
|
||||
}
|
||||
|
||||
remove_unneeded_kvps( struct );
|
||||
}
|
||||
else
|
||||
{
|
||||
struct init();
|
||||
}
|
||||
}
|
||||
|
||||
function CreateScriptBundleList( items, type, name )
|
||||
{
|
||||
if ( !isdefined( level.struct ) )
|
||||
{
|
||||
init_structs();
|
||||
}
|
||||
|
||||
level.scriptbundlelists[ type ][ name ] = items;
|
||||
}
|
||||
|
||||
function init()
|
||||
{
|
||||
if ( !isdefined( level.struct ) ) level.struct = []; else if ( !IsArray( level.struct ) ) level.struct = array( level.struct ); level.struct[level.struct.size]=self;;
|
||||
|
||||
if(!isdefined(self.angles))self.angles=( 0, 0, 0 );
|
||||
|
||||
if ( isdefined( self.targetname ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "targetname" ][ self.targetname ] ) ) level.struct_class_names[ "targetname" ][ self.targetname ] = []; else if ( !IsArray( level.struct_class_names[ "targetname" ][ self.targetname ] ) ) level.struct_class_names[ "targetname" ][ self.targetname ] = array( level.struct_class_names[ "targetname" ][ self.targetname ] ); level.struct_class_names[ "targetname" ][ self.targetname ][level.struct_class_names[ "targetname" ][ self.targetname ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "target" ][ self.target ] ) ) level.struct_class_names[ "target" ][ self.target ] = []; else if ( !IsArray( level.struct_class_names[ "target" ][ self.target ] ) ) level.struct_class_names[ "target" ][ self.target ] = array( level.struct_class_names[ "target" ][ self.target ] ); level.struct_class_names[ "target" ][ self.target ][level.struct_class_names[ "target" ][ self.target ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_noteworthy ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ) ) level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] = []; else if ( !IsArray( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ) ) level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] = array( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ); level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ][level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_linkname ) )
|
||||
{
|
||||
Assert( !isdefined( level.struct_class_names[ "script_linkname" ][ self.script_linkname ] ), "Two structs have the same linkname" );
|
||||
level.struct_class_names[ "script_linkname" ][ self.script_linkname ][ 0 ] = self;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_label ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "script_label" ][ self.script_label ] ) ) level.struct_class_names[ "script_label" ][ self.script_label ] = []; else if ( !IsArray( level.struct_class_names[ "script_label" ][ self.script_label ] ) ) level.struct_class_names[ "script_label" ][ self.script_label ] = array( level.struct_class_names[ "script_label" ][ self.script_label ] ); level.struct_class_names[ "script_label" ][ self.script_label ][level.struct_class_names[ "script_label" ][ self.script_label ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.classname ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "classname" ][ self.classname ] ) ) level.struct_class_names[ "classname" ][ self.classname ] = []; else if ( !IsArray( level.struct_class_names[ "classname" ][ self.classname ] ) ) level.struct_class_names[ "classname" ][ self.classname ] = array( level.struct_class_names[ "classname" ][ self.classname ] ); level.struct_class_names[ "classname" ][ self.classname ][level.struct_class_names[ "classname" ][ self.classname ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_unitrigger_type ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] ) ) level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] = []; else if ( !IsArray( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] ) ) level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] = array( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] ); level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ][level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.scriptbundlename ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] ) ) level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] = []; else if ( !IsArray( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] ) ) level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] = array( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] ); level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ][level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ].size]=self;;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/@
|
||||
"Name: get( <kvp_value> , [kvp_key] )"
|
||||
"Summary: Returns a struct with the specified kvp."
|
||||
"MandatoryArg: <kvp_value> : kvp value"
|
||||
"OptionalArg: [kvp_key] : defaults to targetname"
|
||||
"Example: struct::get( "some_value", "targetname" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get( kvp_value, kvp_key = "targetname" )
|
||||
{
|
||||
if ( !isdefined( kvp_value ) )
|
||||
{
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if ( isdefined( level.struct_class_names[ kvp_key ][ kvp_value ] ) )
|
||||
{
|
||||
/#
|
||||
if ( level.struct_class_names[ kvp_key ][ kvp_value ].size > 1 )
|
||||
{
|
||||
AssertMsg( "struct::get used for more than one struct with kvp '" + kvp_key + "' = '" + kvp_value + "'." );
|
||||
return undefined;
|
||||
}
|
||||
#/
|
||||
|
||||
return level.struct_class_names[ kvp_key ][ kvp_value ][ 0 ];
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: spawn( [v_origin], [v_angles] )"
|
||||
"Summary: Returns a new struct."
|
||||
"OptionalArg: [v_origin] : optional origin"
|
||||
"OptionalArg: [v_angles] : optional angles"
|
||||
"Example: s = struct::spawn( self GetTagOrigin( "tag_origin" ) );"
|
||||
@/
|
||||
function spawn( v_origin = (0, 0, 0), v_angles = (0, 0, 0) )
|
||||
{
|
||||
s = SpawnStruct();
|
||||
s.origin = v_origin;
|
||||
s.angles = v_angles;
|
||||
return s;
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_array( <kvp_value> , [kvp_key] )"
|
||||
"Summary: Returns an array of structs with the specified kvp."
|
||||
"MandatoryArg: <kvp_value> : kvp value"
|
||||
"OptionalArg: [kvp_key] : defaults to targetname"
|
||||
"Example: fxemitters = struct::get_array( "streetlights", "targetname" )"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_array( kvp_value, kvp_key = "targetname" )
|
||||
{
|
||||
if ( isdefined( level.struct_class_names[ kvp_key ][ kvp_value ] ) )
|
||||
{
|
||||
return ArrayCopy( level.struct_class_names[ kvp_key ][ kvp_value ] );
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
function delete()
|
||||
{
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "target" ][ self.target ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.targetname ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "targetname" ][ self.targetname ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_noteworthy ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_linkname ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_linkname" ][ self.script_linkname ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_label) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_label" ][ self.script_label ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.classname) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "classname" ][ self.classname ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_unitrigger_type ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.scriptbundlename ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ], self);
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundle( <str_type>, <str_name> )"
|
||||
"Summary: Returns a struct with the specified script bundle definition. This is the GDT data for the bundle."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"MandatoryArg: <str_name> : The name of the script bundle"
|
||||
"Example: struct::get_script_bundle( "scene", "my_scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundle( str_type, str_name )
|
||||
{
|
||||
if ( isdefined( level.scriptbundles[ str_type ] ) && isdefined( level.scriptbundles[ str_type ][ str_name ] ) )
|
||||
{
|
||||
return level.scriptbundles[ str_type ][ str_name ];
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: delete_script_bundle( <str_type>, <str_name> )"
|
||||
"Summary: Deletes the specified script bundle definition. This is the GDT data for the bundle."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"MandatoryArg: <str_name> : The name of the script bundle"
|
||||
"Example: struct::delete_script_bundle( "scene", "my_scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function delete_script_bundle( str_type, str_name )
|
||||
{
|
||||
if ( isdefined( level.scriptbundles[ str_type ] ) && isdefined( level.scriptbundles[ str_type ][ str_name ] ) )
|
||||
{
|
||||
level.scriptbundles[ str_type ][ str_name ] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundle( <str_type>, <str_name> )"
|
||||
"Summary: Returns a struct with the specified script bundle definition. This is the GDT data for the bundle."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"MandatoryArg: <str_name> : The name of the script bundle"
|
||||
"Example: struct::get_script_bundle( "scene", "my_scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundles_of_type( str_type )
|
||||
{
|
||||
if ( isdefined( level.scriptbundles[ str_type ] ) )
|
||||
{
|
||||
return ArrayCopy( level.scriptbundles[ str_type ] );
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundles( <str_type> )"
|
||||
"Summary: Returns all of the script bundle definition structs for the specified type."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"Example: struct::get_script_bundles( "scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundles( str_type )
|
||||
{
|
||||
if ( isdefined( level.scriptbundles ) && isdefined( level.scriptbundles[ str_type ] ) )
|
||||
{
|
||||
return level.scriptbundles[ str_type ];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundle_list( <str_type>, <str_name> )"
|
||||
"Summary: Returns a string array with the items specified by the script bundle list."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle in the list"
|
||||
"MandatoryArg: <str_name> : The name of the script bundle list"
|
||||
"Example: struct::get_script_bundle_list( "collectible", "completecollectibleslist" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundle_list( str_type, str_name )
|
||||
{
|
||||
if ( isdefined( level.scriptbundlelists[ str_type ] ) && isdefined( level.scriptbundlelists[ str_type ][ str_name ] ) )
|
||||
{
|
||||
return level.scriptbundlelists[ str_type ][ str_name ];
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundle_instances( <str_type>, [str_name] )"
|
||||
"Summary: Returns an array of all the script bundle instances with the specified script bundle definition and name."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"MandatoryArg: [str_name] : The name of the script bundle"
|
||||
"Example: struct::get_script_bundle_instances( "scene", "my_scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundle_instances( str_type, str_name = "" )
|
||||
{
|
||||
a_instances = struct::get_array( "scriptbundle_" + str_type, "classname" );
|
||||
|
||||
if ( str_name != "" )
|
||||
{
|
||||
foreach ( i, s_instance in a_instances )
|
||||
{
|
||||
if ( s_instance.name != str_name )
|
||||
{
|
||||
ArrayRemoveIndex( a_instances, i, true );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return a_instances;
|
||||
}
|
||||
|
||||
//please don't ever call this from script - it's only for radiant live
|
||||
// Search in each of the arrays for our desired struct
|
||||
// It is done this way because we have deleted the level.struct array
|
||||
// We are sacrificing performance in Radiant LiveUpdate in exchange
|
||||
// for freeing up variables in the game
|
||||
function FindStruct( position )
|
||||
{
|
||||
foreach ( key, _ in level.struct_class_names )
|
||||
{
|
||||
foreach ( val, s_array in level.struct_class_names[ key ] )
|
||||
{
|
||||
foreach ( struct in s_array )
|
||||
{
|
||||
if( DistanceSquared( struct.origin, position ) < 1 )
|
||||
{
|
||||
return struct;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( isdefined( level.struct ) )
|
||||
{
|
||||
foreach( struct in level.struct )
|
||||
{
|
||||
if( DistanceSquared( struct.origin, position ) < 1 )
|
||||
{
|
||||
return struct;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
@@ -0,0 +1,420 @@
|
||||
#using scripts\shared\scene_shared;
|
||||
|
||||
Line truncated
|
||||
|
||||
function autoexec __init__()
|
||||
{
|
||||
// set up arrays even if there are no structs in the level
|
||||
|
||||
if ( !isdefined( level.struct ) )
|
||||
{
|
||||
init_structs();
|
||||
}
|
||||
}
|
||||
|
||||
function init_structs()
|
||||
{
|
||||
level.struct = [];
|
||||
level.scriptbundles = [];
|
||||
level.scriptbundlelists = [];
|
||||
|
||||
level.struct_class_names = [];
|
||||
level.struct_class_names[ "target" ] = [];
|
||||
level.struct_class_names[ "targetname" ] = [];
|
||||
level.struct_class_names[ "script_noteworthy" ] = [];
|
||||
level.struct_class_names[ "script_linkname" ] = [];
|
||||
level.struct_class_names[ "script_label" ] = [];
|
||||
level.struct_class_names[ "classname" ] = [];
|
||||
level.struct_class_names[ "script_unitrigger_type" ] = [];
|
||||
level.struct_class_names[ "scriptbundlename" ] = [];
|
||||
level.struct_class_names[ "prefabname" ] = [];
|
||||
}
|
||||
|
||||
function remove_unneeded_kvps( struct )
|
||||
{
|
||||
// struct.vmtype = undefined;
|
||||
// struct.type = undefined;
|
||||
struct.igdtseqnum = undefined;
|
||||
struct.configstringfiletype = undefined;
|
||||
/#devstate = struct.devstate;#/
|
||||
struct.devstate = undefined;
|
||||
/#struct.devstate = devstate;#/
|
||||
}
|
||||
|
||||
function CreateStruct( struct, type, name )
|
||||
{
|
||||
if ( !isdefined( level.struct ) )
|
||||
{
|
||||
init_structs();
|
||||
}
|
||||
|
||||
if ( isdefined( type ) )
|
||||
{
|
||||
isFrontend = ( GetDvarString( "mapname" ) == "core_frontend" );
|
||||
if ( !isdefined( level.scriptbundles[ type ] ) )
|
||||
{
|
||||
level.scriptbundles[ type ] = [];
|
||||
}
|
||||
|
||||
if ( isdefined( level.scriptbundles[ type ][ name ] ) )
|
||||
{
|
||||
return level.scriptbundles[ type ][ name ];
|
||||
}
|
||||
|
||||
if ( type == "scene" )
|
||||
{
|
||||
level.scriptbundles[ type ][ name ] = scene::remove_invalid_scene_objects( struct );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// clean out lots of shared data that is not specific to a game mode
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
else if( !( SessionModeIsMultiplayerGame() || isFrontend ) && type == "mpdialog_player" )
|
||||
{
|
||||
// do nothing, save vars
|
||||
}
|
||||
else if( !( SessionModeIsMultiplayerGame() || isFrontend ) && type == "gibcharacterdef" && IsSubStr(name,"c_t7_mp_") )
|
||||
{
|
||||
// do nothing, save vars
|
||||
}
|
||||
else if( !( SessionModeIsCampaignGame() || isFrontend ) && type == "collectibles" )
|
||||
{
|
||||
// do nothing, save vars
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
else
|
||||
{
|
||||
level.scriptbundles[ type ][ name ] = struct;
|
||||
}
|
||||
|
||||
remove_unneeded_kvps(struct);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct init();
|
||||
}
|
||||
}
|
||||
|
||||
function CreateScriptBundleList( items, assetType, name )
|
||||
{
|
||||
if ( !isdefined( level.struct ) )
|
||||
{
|
||||
init_structs();
|
||||
}
|
||||
|
||||
level.scriptbundlelists[ assetType ][ name ] = items;
|
||||
}
|
||||
|
||||
function init()
|
||||
{
|
||||
if ( !isdefined( level.struct ) ) level.struct = []; else if ( !IsArray( level.struct ) ) level.struct = array( level.struct ); level.struct[level.struct.size]=self;;
|
||||
|
||||
if(!isdefined(self.angles))self.angles=( 0, 0, 0 );
|
||||
|
||||
if ( isdefined( self.targetname ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "targetname" ][ self.targetname ] ) ) level.struct_class_names[ "targetname" ][ self.targetname ] = []; else if ( !IsArray( level.struct_class_names[ "targetname" ][ self.targetname ] ) ) level.struct_class_names[ "targetname" ][ self.targetname ] = array( level.struct_class_names[ "targetname" ][ self.targetname ] ); level.struct_class_names[ "targetname" ][ self.targetname ][level.struct_class_names[ "targetname" ][ self.targetname ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "target" ][ self.target ] ) ) level.struct_class_names[ "target" ][ self.target ] = []; else if ( !IsArray( level.struct_class_names[ "target" ][ self.target ] ) ) level.struct_class_names[ "target" ][ self.target ] = array( level.struct_class_names[ "target" ][ self.target ] ); level.struct_class_names[ "target" ][ self.target ][level.struct_class_names[ "target" ][ self.target ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_noteworthy ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ) ) level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] = []; else if ( !IsArray( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ) ) level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] = array( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ); level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ][level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_linkname ) )
|
||||
{
|
||||
Assert( !isdefined( level.struct_class_names[ "script_linkname" ][ self.script_linkname ] ), "Two structs have the same linkname" );
|
||||
level.struct_class_names[ "script_linkname" ][ self.script_linkname ][ 0 ] = self;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_label ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "script_label" ][ self.script_label ] ) ) level.struct_class_names[ "script_label" ][ self.script_label ] = []; else if ( !IsArray( level.struct_class_names[ "script_label" ][ self.script_label ] ) ) level.struct_class_names[ "script_label" ][ self.script_label ] = array( level.struct_class_names[ "script_label" ][ self.script_label ] ); level.struct_class_names[ "script_label" ][ self.script_label ][level.struct_class_names[ "script_label" ][ self.script_label ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.classname ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "classname" ][ self.classname ] ) ) level.struct_class_names[ "classname" ][ self.classname ] = []; else if ( !IsArray( level.struct_class_names[ "classname" ][ self.classname ] ) ) level.struct_class_names[ "classname" ][ self.classname ] = array( level.struct_class_names[ "classname" ][ self.classname ] ); level.struct_class_names[ "classname" ][ self.classname ][level.struct_class_names[ "classname" ][ self.classname ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_unitrigger_type ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] ) ) level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] = []; else if ( !IsArray( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] ) ) level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] = array( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ] ); level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ][level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.scriptbundlename ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] ) ) level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] = []; else if ( !IsArray( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] ) ) level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] = array( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ] ); level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ][level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ].size]=self;;
|
||||
}
|
||||
|
||||
if ( isdefined( self.prefabname ) )
|
||||
{
|
||||
if ( !isdefined( level.struct_class_names[ "prefabname" ][ self.prefabname ] ) ) level.struct_class_names[ "prefabname" ][ self.prefabname ] = []; else if ( !IsArray( level.struct_class_names[ "prefabname" ][ self.prefabname ] ) ) level.struct_class_names[ "prefabname" ][ self.prefabname ] = array( level.struct_class_names[ "prefabname" ][ self.prefabname ] ); level.struct_class_names[ "prefabname" ][ self.prefabname ][level.struct_class_names[ "prefabname" ][ self.prefabname ].size]=self;;
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get( <kvp_value> , [kvp_key] )"
|
||||
"Summary: Returns a struct with the specified kvp."
|
||||
"MandatoryArg: <kvp_value> : kvp value"
|
||||
"OptionalArg: [kvp_key] : defaults to targetname"
|
||||
"Example: struct::get( "some_value", "targetname" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get( kvp_value, kvp_key = "targetname" )
|
||||
{
|
||||
if ( isdefined( level.struct_class_names[ kvp_key ] ) && isdefined( level.struct_class_names[ kvp_key ][ kvp_value ] ) )
|
||||
{
|
||||
/#
|
||||
if ( level.struct_class_names[ kvp_key ][ kvp_value ].size > 1 )
|
||||
{
|
||||
AssertMsg( "struct::get used for more than one struct with kvp '" + kvp_key + "' = '" + kvp_value + "'." );
|
||||
return undefined;
|
||||
}
|
||||
#/
|
||||
|
||||
return level.struct_class_names[ kvp_key ][ kvp_value ][ 0 ];
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: spawn( [v_origin], [v_angles] )"
|
||||
"Summary: Returns a new struct."
|
||||
"OptionalArg: [v_origin] : optional origin"
|
||||
"OptionalArg: [v_angles] : optional angles"
|
||||
"Example: s = struct::spawn( self GetTagOrigin( "tag_origin" ) );"
|
||||
@/
|
||||
function spawn( v_origin = (0, 0, 0), v_angles = (0, 0, 0) )
|
||||
{
|
||||
s = SpawnStruct();
|
||||
s.origin = v_origin;
|
||||
s.angles = v_angles;
|
||||
return s;
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_array( <kvp_value> , [kvp_key] )"
|
||||
"Summary: Returns an array of structs with the specified kvp."
|
||||
"MandatoryArg: <kvp_value> : kvp value"
|
||||
"OptionalArg: [kvp_key] : defaults to targetname"
|
||||
"Example: fxemitters = struct::get_array( "streetlights", "targetname" )"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_array( kvp_value, kvp_key = "targetname" )
|
||||
{
|
||||
if ( isdefined( level.struct_class_names[ kvp_key ][ kvp_value ] ) )
|
||||
{
|
||||
return ArrayCopy( level.struct_class_names[ kvp_key ][ kvp_value ] );
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
function delete()
|
||||
{
|
||||
if ( isdefined( self.target ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "target" ][ self.target ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.targetname ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "targetname" ][ self.targetname ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_noteworthy ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_linkname ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_linkname" ][ self.script_linkname ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_label) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_label" ][ self.script_label ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.classname) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "classname" ][ self.classname ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.script_unitrigger_type ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "script_unitrigger_type" ][ self.script_unitrigger_type ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.scriptbundlename ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "scriptbundlename" ][ self.scriptbundlename ], self);
|
||||
}
|
||||
|
||||
if ( isdefined( self.prefabname ) )
|
||||
{
|
||||
ArrayRemoveValue( level.struct_class_names[ "prefabname" ][ self.prefabname ], self);
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundle( <str_type>, <str_name> )"
|
||||
"Summary: Returns a struct with the specified script bundle definition. This is the GDT data for the bundle."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"MandatoryArg: <str_name> : The name of the script bundle"
|
||||
"Example: struct::get_script_bundle( "scene", "my_scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundle( str_type, str_name )
|
||||
{
|
||||
if ( isdefined( level.scriptbundles[ str_type ] ) && isdefined( level.scriptbundles[ str_type ][ str_name ] ) )
|
||||
{
|
||||
return level.scriptbundles[ str_type ][ str_name ];
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: delete_script_bundle( <str_type>, <str_name> )"
|
||||
"Summary: Deletes the specified script bundle definition. This is the GDT data for the bundle."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"MandatoryArg: <str_name> : The name of the script bundle"
|
||||
"Example: struct::delete_script_bundle( "scene", "my_scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function delete_script_bundle( str_type, str_name )
|
||||
{
|
||||
if ( isdefined( level.scriptbundles[ str_type ] ) && isdefined( level.scriptbundles[ str_type ][ str_name ] ) )
|
||||
{
|
||||
level.scriptbundles[ str_type ][ str_name ] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundles( <str_type> )"
|
||||
"Summary: Returns all of the script bundle definition structs for the specified type."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"Example: struct::get_script_bundles( "scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundles( str_type )
|
||||
{
|
||||
if ( isdefined( level.scriptbundles ) && isdefined( level.scriptbundles[ str_type ] ) )
|
||||
{
|
||||
return level.scriptbundles[ str_type ];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundle_list( <str_type>, <str_name> )"
|
||||
"Summary: Returns a string array with the items specified by the script bundle list."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle in the list"
|
||||
"MandatoryArg: <str_name> : The name of the script bundle list"
|
||||
"Example: struct::get_script_bundle_list( "collectible", "completecollectibleslist" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundle_list( str_type, str_name )
|
||||
{
|
||||
if ( isdefined( level.scriptbundlelists[ str_type ] ) && isdefined( level.scriptbundlelists[ str_type ][ str_name ] ) )
|
||||
{
|
||||
return level.scriptbundlelists[ str_type ][ str_name ];
|
||||
}
|
||||
}
|
||||
|
||||
/@
|
||||
"Name: get_script_bundle_instances( <str_type>, [str_name] )"
|
||||
"Summary: Returns an array of all the script bundle instances with the specified script bundle definition and name."
|
||||
"MandatoryArg: <str_type> : The type of the script bundle"
|
||||
"MandatoryArg: [str_name] : The name of the script bundle"
|
||||
"Example: struct::get_script_bundle_instances( "scene", "my_scene" );"
|
||||
"SPMP: both"
|
||||
@/
|
||||
function get_script_bundle_instances( str_type, str_name = "" )
|
||||
{
|
||||
a_instances = struct::get_array( "scriptbundle_" + str_type, "classname" );
|
||||
|
||||
if ( str_name != "" )
|
||||
{
|
||||
foreach ( i, s_instance in a_instances )
|
||||
{
|
||||
if ( s_instance.name != str_name )
|
||||
{
|
||||
ArrayRemoveIndex( a_instances, i, true );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return a_instances;
|
||||
}
|
||||
|
||||
//please don't ever call this from script - it's only for radiant live
|
||||
// Search in each of the arrays for our desired struct
|
||||
// It is done this way because we have deleted the level.struct array
|
||||
// We are sacrificing performance in Radiant LiveUpdate in exchange
|
||||
// for freeing up variables in the game
|
||||
function FindStruct( param1, name, index )
|
||||
{
|
||||
if( IsVec( param1 ) )
|
||||
{
|
||||
position = param1;
|
||||
|
||||
foreach ( key, _ in level.struct_class_names )
|
||||
{
|
||||
foreach ( val, s_array in level.struct_class_names[ key ] )
|
||||
{
|
||||
foreach ( struct in s_array )
|
||||
{
|
||||
if( DistanceSquared( struct.origin, position ) < 1 )
|
||||
{
|
||||
return struct;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( isdefined( level.struct ) )
|
||||
{
|
||||
foreach( struct in level.struct )
|
||||
{
|
||||
if( DistanceSquared( struct.origin, position ) < 1 )
|
||||
{
|
||||
return struct;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
s = get(param1);
|
||||
|
||||
if( isdefined(s) )
|
||||
{
|
||||
return s;
|
||||
}
|
||||
|
||||
s = get_script_bundle( param1, name );
|
||||
if( isdefined( s ) )
|
||||
{
|
||||
if( index < 0 )
|
||||
{
|
||||
return s;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( isdefined( s.objects ) )
|
||||
{
|
||||
return s.objects[index];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
Reference in new issue
Block a user