mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-09 01:57:51 -05:00
496 lines
14 KiB
Plaintext
496 lines
14 KiB
Plaintext
|
||
#include clientscripts\_utility;
|
||
#include clientscripts\_vehicle;
|
||
#include clientscripts\_lights;
|
||
#include clientscripts\_fx;
|
||
statechange(clientNum, system, newState)
|
||
{
|
||
if(!isdefined(level._systemStates))
|
||
{
|
||
level._systemStates = [];
|
||
}
|
||
if(!isdefined(level._systemStates[system]))
|
||
{
|
||
level._systemStates[system] = spawnstruct();
|
||
}
|
||
level._systemStates[system].state = newState;
|
||
if(isdefined(level._systemStates[system].callback))
|
||
{
|
||
[[level._systemStates[system].callback]](clientNum, newState);
|
||
}
|
||
else
|
||
{
|
||
println("*** Unhandled client system state change - " + system + " - has no registered callback function.");
|
||
}
|
||
}
|
||
maprestart()
|
||
{
|
||
println("*** Client script VM map restart.");
|
||
}
|
||
glass_smash(org, dir)
|
||
{
|
||
level notify("glass_smash", org, dir);
|
||
}
|
||
init_fx(clientNum)
|
||
{
|
||
waitforclient(clientNum);
|
||
clientscripts\_fx::fx_init(clientNum);
|
||
}
|
||
AddCallback(event, func)
|
||
{
|
||
AssertEx(IsDefined(event), "Trying to set a callback on an undefined event.");
|
||
if (!IsDefined(level._callbacks) || !IsDefined(level._callbacks[event]))
|
||
{
|
||
level._callbacks[event] = [];
|
||
}
|
||
level._callbacks[event] = add_to_array(level._callbacks[event], func, false);
|
||
}
|
||
Callback(event,clientNum)
|
||
{
|
||
if (IsDefined(level._callbacks) && IsDefined(level._callbacks[event]))
|
||
{
|
||
for (i = 0; i < level._callbacks[event].size; i++)
|
||
{
|
||
callback = level._callbacks[event][i];
|
||
if (IsDefined(callback))
|
||
{
|
||
self thread [[callback]](clientNum);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
localclientconnect(clientNum)
|
||
{
|
||
println("*** Client script VM : Local client connect " + clientNum);
|
||
level.usetreadfx = 1;
|
||
if(isdefined(level._load_done) && clientNum > 0)
|
||
{
|
||
level notify( "kill_treads_forever" );
|
||
level.usetreadfx = 0;
|
||
}
|
||
if(!isdefined(level._laststand))
|
||
{
|
||
level._laststand = [];
|
||
}
|
||
level._laststand[clientNum] = false;
|
||
level notify("effects_init_"+clientNum);
|
||
level notify("connected", clientNum);
|
||
level thread localclientconnect_callback(clientNum);
|
||
}
|
||
localclientconnect_callback(clientNum)
|
||
{
|
||
wait .01;
|
||
player = GetLocalPlayers()[clientNum];
|
||
player Callback("on_player_connect",clientNum);
|
||
}
|
||
localclientdisconnect(clientNum)
|
||
{
|
||
println("*** Client script VM : Local client disconnect " + clientNum);
|
||
}
|
||
playerspawned(localClientNum)
|
||
{
|
||
self endon( "entityshutdown" );
|
||
self thread clientscripts\_flamethrower_plight::play_pilot_light_fx( localClientNum );
|
||
if(isdefined(level._faceAnimCBFunc))
|
||
self thread [[level._faceAnimCBFunc]](localClientNum);
|
||
if(isdefined(level._playerCBFunc))
|
||
self thread [[level._playerCBFunc]](localClientNum);
|
||
level thread localclientspawned_callback(localClientNum);
|
||
}
|
||
localclientspawned_callback(localClientNum)
|
||
{
|
||
wait .01;
|
||
player = GetLocalPlayers()[localClientNum];
|
||
player Callback( "playerspawned", localClientNum );
|
||
}
|
||
CodeCallback_GibEvent( localClientNum, type, locations )
|
||
{
|
||
if ( isdefined( level._gibEventCBFunc ) )
|
||
{
|
||
self thread [[level._gibEventCBFunc]]( localClientNum, type, locations );
|
||
}
|
||
}
|
||
get_gib_def()
|
||
{
|
||
if( !isdefined( level._gibbing_actor_models ) )
|
||
{
|
||
return -1;
|
||
}
|
||
for ( i = 0; i < level._gibbing_actor_models.size; i++ )
|
||
{
|
||
if ( self [[level._gibbing_actor_models[i].matches_me]]() )
|
||
{
|
||
self._original_model = self.model;
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
entityspawned(localClientNum)
|
||
{
|
||
self endon( "entityshutdown" );
|
||
if ( !isdefined( self.type ) )
|
||
{
|
||
PrintLn( "Entity type undefined!" );
|
||
return;
|
||
}
|
||
if ( self.type == "missile" )
|
||
{
|
||
switch( self.weapon )
|
||
{
|
||
case "explosive_bolt_sp":
|
||
self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false );
|
||
break;
|
||
case "explosive_bolt_zm":
|
||
self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false );
|
||
break;
|
||
case "explosive_bolt_upgraded_zm":
|
||
self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, true );
|
||
break;
|
||
case "crossbow_explosive_sp":
|
||
self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false );
|
||
break;
|
||
case "crossbow_explosive_zm":
|
||
self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false );
|
||
break;
|
||
case "crossbow_explosive_upgraded_zm":
|
||
self thread clientscripts\_explosive_bolt::spawned( localClientNum, false, true );
|
||
break;
|
||
case "sticky_grenade_zm":
|
||
if ( isdefined( level.zombie_sticky_grenade_spawned_func ) )
|
||
{
|
||
self thread [[level.zombie_sticky_grenade_spawned_func]]( localClientNum, true );
|
||
}
|
||
break;
|
||
case "zombie_quantum_bomb":
|
||
if( isdefined( level.zombie_quantum_bomb_spawned_func ) )
|
||
{
|
||
self thread [[level.zombie_quantum_bomb_spawned_func]]( localClientNum, true );
|
||
}
|
||
}
|
||
}
|
||
if( self.type == "vehicle" )
|
||
{
|
||
if( !isdefined( level.vehicles_inited ) )
|
||
{
|
||
clientscripts\_vehicle::init_vehicles();
|
||
}
|
||
clientscripts\_treadfx::loadtreadfx(self);
|
||
if( isdefined(level._customVehicleCBFunc) )
|
||
{
|
||
self thread [[level._customVehicleCBFunc]](localClientNum);
|
||
}
|
||
if ( !( self is_plane() ) && !(self is_helicopter()) && level.usetreadfx == 1 )
|
||
{
|
||
assert( isdefined( self.rumbleType ) );
|
||
precacherumble( self.rumbleType );
|
||
if( isdefined( self.exhaustfxname ) && self.exhaustfxname != "" )
|
||
{
|
||
self.exhaust_fx = loadfx( self.exhaustfxname );
|
||
}
|
||
self thread vehicle_treads(localClientNum);
|
||
self thread playTankExhaust(localClientNum);
|
||
self thread vehicle_rumble(localClientNum);
|
||
self thread vehicle_variants(localClientNum);
|
||
self thread vehicle_weapon_fired();
|
||
}
|
||
else if (self is_plane())
|
||
{
|
||
self thread aircraft_dustkick();
|
||
}
|
||
else if(self is_helicopter())
|
||
{
|
||
assert( isdefined( self.rumbleType ) );
|
||
precacherumble( self.rumbleType );
|
||
if( isdefined( self.exhaustfxname ) && self.exhaustfxname != "" )
|
||
{
|
||
self.exhaust_fx = loadfx( self.exhaustfxname );
|
||
}
|
||
self thread play_rotor_fx(localClientNum);
|
||
self thread delete_rotor_fx_on_save_restore(localClientNum);
|
||
self thread play_exhaust(localClientNum);
|
||
self thread aircraft_dustkick();
|
||
self clientscripts\_helicopter_sounds::start_helicopter_sounds();
|
||
}
|
||
self thread vehicle_clientmain(localClientNum);
|
||
}
|
||
else if (self.type == "actor" && GetDvarInt(#"zombiemode") > 0 )
|
||
{
|
||
if(isdefined(level._zombieCBFunc))
|
||
{
|
||
players = GetLocalPlayers();
|
||
for ( i = 0; i < players.size; i++ )
|
||
{
|
||
self thread [[level._zombieCBFunc]]( i );
|
||
}
|
||
}
|
||
}
|
||
if (self.type == "actor")
|
||
{
|
||
if(isdefined(level._faceAnimCBFunc))
|
||
self thread [[level._faceAnimCBFunc]](localClientNum);
|
||
if ( localClientNum == 0 )
|
||
{
|
||
self._gib_def = get_gib_def();
|
||
if( self._gib_def == -1 )
|
||
{
|
||
PrintLn( "*** Actor with model " + self.model + " not set for client-side gibbing." );
|
||
}
|
||
}
|
||
}
|
||
self.entity_spawned = true;
|
||
self notify("entity_spawned");
|
||
}
|
||
entityshutdown_callback( localClientNum, entity )
|
||
{
|
||
if( IsDefined( level._entityShutDownCBFunc ) )
|
||
{
|
||
[[level._entityShutDownCBFunc]]( localClientNum, entity );
|
||
}
|
||
}
|
||
airsupport( localClientNum, x, y, z, type, yaw, team, teamfaction, owner, exittype )
|
||
{
|
||
pos = ( x, y, z );
|
||
switch( teamFaction )
|
||
{
|
||
case "v":
|
||
teamfaction = "vietcong";
|
||
break;
|
||
case "n":
|
||
case "nva":
|
||
teamfaction = "nva";
|
||
break;
|
||
case "j":
|
||
teamfaction = "japanese";
|
||
break;
|
||
case "m":
|
||
teamfaction = "marines";
|
||
break;
|
||
case "s":
|
||
teamfaction = "specops";
|
||
break;
|
||
case "r":
|
||
teamfaction = "russian";
|
||
break;
|
||
default:
|
||
println( "Warning: Invalid team char provided, defaulted to marines" );
|
||
println( teamFaction + "\n" );
|
||
teamfaction = "marines";
|
||
break;
|
||
}
|
||
switch( team )
|
||
{
|
||
case "x":
|
||
team = "axis";
|
||
break;
|
||
case "l":
|
||
team = "allies";
|
||
break;
|
||
case "r":
|
||
team = "free";
|
||
break;
|
||
default:
|
||
println( "Invalid team used with playclientAirstike/napalm: " + team + "\n");
|
||
team = "allies";
|
||
break;
|
||
}
|
||
switch( exitType )
|
||
{
|
||
case "l":
|
||
exitType = "left";
|
||
break;
|
||
case "r":
|
||
exitType = "right";
|
||
break;
|
||
case "s":
|
||
exitType = "straight";
|
||
break;
|
||
case "b":
|
||
exitType = "barrelroll";
|
||
break;
|
||
default:
|
||
println( "Warning: Incorret exit type, defaulting to left" );
|
||
println( exitType + "\n" );
|
||
team = "left";
|
||
break;
|
||
}
|
||
if ( type == "n" )
|
||
{
|
||
clientscripts\_napalm::startNapalm( localClientNum, pos, yaw, teamfaction, team, owner, exitType );
|
||
}
|
||
else
|
||
{
|
||
println( "" );
|
||
println( "Unhandled airsupport type, only A (airstrike) and N (napalm) supported" );
|
||
println( type );
|
||
println( "" );
|
||
}
|
||
}
|
||
scriptmodelspawned(local_client_num, ent, destructable_index)
|
||
{
|
||
if(destructable_index == 0)
|
||
return;
|
||
if(!isdefined(level.createFXent))
|
||
return;
|
||
fixed = false;
|
||
for(i = 0; i < level.createFXent.size; i ++)
|
||
{
|
||
if(level.createFXent[i].v["type"] != "exploder")
|
||
continue;
|
||
exploder = level.createFXent[i];
|
||
if(!isdefined(exploder.needs_fixup))
|
||
continue;
|
||
if(exploder.needs_fixup == destructable_index)
|
||
{
|
||
exploder.v["angles"] = VectorToAngles( ent.origin - exploder.v["origin"] );
|
||
exploder clientscripts\_fx::set_forward_and_up_vectors();
|
||
exploder.needs_fixup = undefined;
|
||
fixed = true;
|
||
}
|
||
}
|
||
}
|
||
callback_activate_exploder(exploder_id)
|
||
{
|
||
if(!isdefined(level._exploder_ids))
|
||
return;
|
||
keys = getarraykeys(level._exploder_ids);
|
||
exploder = undefined;
|
||
for(i = 0; i < keys.size; i ++)
|
||
{
|
||
if(level._exploder_ids[keys[i]] == exploder_id)
|
||
{
|
||
exploder = keys[i];
|
||
break;
|
||
}
|
||
}
|
||
if(!isdefined(exploder))
|
||
{
|
||
println("*** Client : Exploder id " + exploder_id + " unknown.");
|
||
return;
|
||
}
|
||
println("*** Client callback - activate exploder " + exploder_id + " : " + exploder);
|
||
clientscripts\_fx::activate_exploder(exploder);
|
||
}
|
||
callback_deactivate_exploder(exploder_id)
|
||
{
|
||
if(!isdefined(level._exploder_ids))
|
||
return;
|
||
keys = getarraykeys(level._exploder_ids);
|
||
exploder = undefined;
|
||
for(i = 0; i < keys.size; i ++)
|
||
{
|
||
if(level._exploder_ids[keys[i]] == exploder_id)
|
||
{
|
||
exploder = keys[i];
|
||
break;
|
||
}
|
||
}
|
||
if(!isdefined(exploder))
|
||
{
|
||
println("*** Client : Exploder id " + exploder_id + " unknown.");
|
||
return;
|
||
}
|
||
println("*** Client callback - deactivate exploder " + exploder_id + " : " + exploder);
|
||
clientscripts\_fx::deactivate_exploder(exploder);
|
||
}
|
||
level_notify(notify_name, param1, param2)
|
||
{
|
||
level notify(notify_name, param1, param2);
|
||
}
|
||
sound_notify(client_num, entity, note )
|
||
{
|
||
if ( note == "sound_dogstep_run_default" )
|
||
{
|
||
entity playsound( client_num, "fly_dog_step_run_default" );
|
||
return true;
|
||
}
|
||
prefix = getsubstr( note, 0, 5 );
|
||
if ( prefix != "sound" )
|
||
return false;
|
||
alias = "aml" + getsubstr( note, 5 );
|
||
entity play_dog_sound( client_num, alias);
|
||
}
|
||
dog_sound_print( message )
|
||
{
|
||
}
|
||
play_dog_sound( localClientNum, sound, position )
|
||
{
|
||
dog_sound_print( "SOUND " + sound);
|
||
if ( isdefined( position ) )
|
||
{
|
||
return self playsound( localClientNum, sound, position );
|
||
}
|
||
return self playsound( localClientNum, sound );
|
||
}
|
||
client_flag_callback(localClientNum, flag, set, newEnt)
|
||
{
|
||
if ((self.type == "vehicle" || self.type == "actor" || self.type == "missle") && !IsDefined(self.entity_spawned))
|
||
{
|
||
self waittill("entity_spawned");
|
||
}
|
||
if(isdefined(level._client_flag_callbacks) && isdefined(level._client_flag_callbacks[self.type]) && IsDefined(level._client_flag_callbacks[self.type][flag]))
|
||
{
|
||
self thread [[level._client_flag_callbacks[self.type][flag]]](localClientNum, set, newEnt);
|
||
}
|
||
else
|
||
{
|
||
}
|
||
}
|
||
client_flagasval_callback(localClientNum, val)
|
||
{
|
||
if(isdefined(level._client_flagasval_callbacks) && isdefined(level._client_flagasval_callbacks[self.type]))
|
||
{
|
||
self thread [[level._client_flagasval_callbacks[self.type]]](localClientNum, val);
|
||
}
|
||
}
|
||
CodeCallback_PlayerFootstep(client_num, player, movementtype, ground_type, firstperson, quiet)
|
||
{
|
||
clientscripts\_footsteps::playerFootstep(client_num, player, movementtype, ground_type, firstperson, quiet);
|
||
}
|
||
CodeCallback_CreatingCorpse(localClientNum, player )
|
||
{
|
||
player notify( "face", "face_death" );
|
||
}
|
||
CodeCallback_PlayerJump(client_num, player, ground_type, firstperson, quiet)
|
||
{
|
||
clientscripts\_footsteps::playerJump(client_num, player, ground_type, firstperson, quiet);
|
||
}
|
||
CodeCallback_PlayerLand(client_num, player, ground_type, firstperson, quiet, damagePlayer)
|
||
{
|
||
clientscripts\_footsteps::playerLand(client_num, player, ground_type, firstperson, quiet, damagePlayer);
|
||
}
|
||
CodeCallback_PlayerFoliage(client_num, player, firstperson, quiet)
|
||
{
|
||
clientscripts\_footsteps::playerFoliage(client_num, player, firstperson, quiet);
|
||
}
|
||
AddPlayWeaponDeathEffectsCallback(weaponname, func)
|
||
{
|
||
if (!IsDefined(level._playweapondeatheffectscallbacks))
|
||
{
|
||
level._playweapondeatheffectscallbacks = [];
|
||
}
|
||
level._playweapondeatheffectscallbacks[weaponname] = func;
|
||
}
|
||
CodeCallback_PlayWeaponDeathEffects( localclientnum, weaponname, userdata )
|
||
{
|
||
if (IsDefined(level._playweapondeatheffectscallbacks) && IsDefined(level._playweapondeatheffectscallbacks[weaponname]))
|
||
{
|
||
self thread [[level._playweapondeatheffectscallbacks[weaponname]]]( localclientnum, weaponname, userdata );
|
||
}
|
||
}
|
||
AddPlayWeaponDamageEffectsCallback(weaponname, func)
|
||
{
|
||
if (!IsDefined(level._playweapondamageeffectscallbacks))
|
||
{
|
||
level._playweapondamageeffectscallbacks = [];
|
||
}
|
||
level._playweapondamageeffectscallbacks[weaponname] = func;
|
||
}
|
||
CodeCallback_PlayWeaponDamageEffects( localclientnum, weaponname, userdata )
|
||
{
|
||
if (IsDefined(level._playweapondamageeffectscallbacks) && IsDefined(level._playweapondamageeffectscallbacks[weaponname]))
|
||
{
|
||
self thread [[level._playweapondamageeffectscallbacks[weaponname]]]( localclientnum, weaponname, userdata );
|
||
}
|
||
}
|
||
|
||
|