IL-GSC/BO1/PC/ZM/clientscripts/_callbacks.csc
2024-02-18 17:32:07 -05:00

496 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 );
}
}