2023-04-13 17:30:38 +02:00

401 lines
20 KiB
Plaintext

#using scripts\shared\scene_shared;
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;
}