1 #using scripts\shared\array_shared;
2 #using scripts\shared\audio_shared;
3 #using scripts\shared\flagsys_shared;
4 #using scripts\shared\hud_shared;
5 #using scripts\shared\simple_hostmigration;
6 #using scripts\shared\system_shared;
8 #insert scripts\shared\shared.gsh;
9 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
13 #precache( "eventstring", "open_side_mission_countdown" );
14 #precache( "eventstring", "close_side_mission_countdown" );
18 if ( isdefined( level._callbacks ) && isdefined( level._callbacks[event] ) )
20 for ( i = 0; i < level._callbacks[event].size; i++ )
22 callback = level._callbacks[event][i][0];
23 obj = level._callbacks[event][i][1];
30 if ( isdefined( obj ) )
32 if ( isdefined( params ) )
43 if ( isdefined( params ) )
58 assert( isdefined( event ),
"Trying to set a callback on an undefined event." );
60 if ( !isdefined( level._callbacks ) || !isdefined( level._callbacks[event] ) )
62 level._callbacks[event] = [];
65 foreach(
callback in level._callbacks[event] )
69 if( !isdefined( obj ) ||
callback[1] == obj )
78 if ( isdefined( obj ) )
86 self waittill(
"death" );
92 assert( isdefined( event ),
"Trying to remove a callback on an undefined event." );
93 assert( isdefined( level._callbacks[event] ),
"Trying to remove callback for unknown event." );
95 foreach ( index, func_group
in level._callbacks[event] )
97 if ( func_group[0] == func )
101 ArrayRemoveIndex( level._callbacks[event], index,
false );
582 if ( !isdefined( level.weapon_damage_callback_array ) )
584 level.weapon_damage_callback_array = [];
587 level.weapon_damage_callback_array[weapontype] =
callback;
592 if( isdefined( level.weapon_damage_callback_array ) )
594 if ( isdefined( level.weapon_damage_callback_array[weapon] ) )
596 self thread [[level.weapon_damage_callback_array[weapon]]]( eAttacker, eInflictor, weapon, meansOfDeath,
damage );
599 else if ( isdefined( level.weapon_damage_callback_array[weapon.rootWeapon] ) )
601 self thread [[level.weapon_damage_callback_array[weapon.rootWeapon]]]( eAttacker, eInflictor, weapon, meansOfDeath,
damage );
611 if ( !isdefined( level.weapon_watcher_callback_array ) )
613 level.weapon_watcher_callback_array = [];
621 if( isdefined( level.weapon_watcher_callback_array ) )
623 for( x = 0; x < level.weapon_watcher_callback_array.size; x++ )
625 self [[level.weapon_watcher_callback_array[x]]]();
640 if(!isdefined(level.gametypestarted) || !level.gametypestarted)
642 [[level.callbackStartGameType]]();
644 level.gametypestarted =
true;
664 self endon(
"disconnect");
666 [[level.callbackPlayerConnect]]();
676 self notify(
"death" );
678 self.player_disconnected =
true;
679 self notify(
"disconnect");
680 level notify(
"disconnect",
self);
682 [[level.callbackPlayerDisconnect]]();
692 /# PrintLn(
"****CodeCallback_Migration_SetupGameType****"); #/
701 /# PrintLn(
"****CodeCallback_HostMigration****"); #/
702 [[level.callbackHostMigration]]();
711 /# PrintLn(
"****CodeCallback_HostMigrationSave****"); #/
712 [[level.callbackHostMigrationSave]]();
717 /# PrintLn(
"****CodeCallback_PreHostMigrationSave****"); #/
718 [[level.callbackPreHostMigrationSave]]();
727 /# PrintLn(
"****CodeCallback_PlayerMigrated****"); #/
728 [[level.callbackPlayerMigrated]]();
736 function CodeCallback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, timeOffset, boneIndex, vSurfaceNormal)
738 self endon(
"disconnect");
739 [[level.callbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, timeOffset, boneIndex, vSurfaceNormal);
748 self endon(
"disconnect");
749 [[level.callbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, timeOffset, deathAnimDuration);
758 self endon(
"disconnect");
759 [[level.callbackPlayerLastStand]](eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, timeOffset, delayOverride );
768 self endon(
"disconnect");
769 [[level.callbackPlayerMelee]]( eAttacker, iDamage, weapon, vOrigin, vDir, boneIndex, shieldHit, fromBehind );
779 [[level.callbackActorSpawned]]( spawner );
787 function CodeCallback_ActorDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, timeOffset, boneIndex, modelIndex, surfaceType, surfaceNormal)
789 [[level.callbackActorDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, timeOffset, boneIndex, modelIndex, surfaceType, surfaceNormal );
798 [[level.callbackActorKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, timeOffset);
807 [[level.callbackActorCloned]](original);
816 if (IsDefined(level.callbackVehicleSpawned))
817 [[level.callbackVehicleSpawned]]( spawner );
827 [[level.callbackVehicleKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime);
835 function CodeCallback_VehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, timeOffset, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
837 [[level.callbackVehicleDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, timeOffset, damageFromUnderneath, modelIndex, partName, vSurfaceNormal);
845 function CodeCallback_VehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, timeOffset)
847 [[level.callbackVehicleRadiusDamage]](eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, timeOffset);
852 self endon(
"death" );
853 self waittillmatch(
"custom_traversal_anim_finished",
"end" );
855 self finishtraversal();
858 self.useGoalAnimWeight =
false;
859 self.blockingPain =
false;
861 self.customTraverseEndNode = undefined;
862 self.customTraverseStartNode = undefined;
864 self notify(
"custom_traversal_cleanup" );
869 self endon(
"custom_traversal_cleanup" );
870 self waittill(
"death" );
872 if ( isdefined(
self ) )
874 self finishtraversal();
875 self StopAnimScripted();
887 entity.blockingPain =
true;
888 entity.useGoalAnimWeight =
true;
890 entity.customTraverseEndNode = entity.traverseEndNode;
891 entity.customTraverseStartNode = entity.traverseStartNode;
894 entity OrientMode(
"face angle", angles[1] );
896 if ( IsDefined( endParent ) )
898 offset = entity.origin - endParent.origin;
899 entity LinkTo( endParent,
"", offset );
902 entity AnimScripted(
"custom_traversal_anim_finished", origin, angles, animHandle, animMode, undefined, playbackSpeed, goalTime, lerpTime );
911 if( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims )
913 if( isdefined( level.face_event_handler ) && isdefined( level.face_event_handler.events[notify_msg] ) )
915 ent SendFaceEvent( level.face_event_handler.events[notify_msg] );
926 if (!isdefined(level.MenuResponseQueue))
928 level.MenuResponseQueue=[];
932 index=level.MenuResponseQueue.size;
933 level.MenuResponseQueue[index]=SpawnStruct();
934 level.MenuResponseQueue[index].action=action;
935 level.MenuResponseQueue[index].arg=arg;
936 level.MenuResponseQueue[index].ent=
self;
937 level notify(
"menuresponse_queue");
944 level waittill(
"menuresponse_queue");
947 level.MenuResponseQueue[0].ent notify(
"menuresponse",level.MenuResponseQueue[0].action,level.MenuResponseQueue[0].arg);
948 ArrayRemoveIndex(level.MenuResponseQueue,0,
false);
951 while (level.MenuResponseQueue.size>0);
963 if ( !IsDefined( level._animnotifyfuncs ) )
966 if ( IsDefined( level._animnotifyfuncs[ label ] ) )
968 pSelf [[ level._animnotifyfuncs[ label ] ]]( param );
974 if ( !IsDefined( level._animnotifyfuncs ) )
977 if ( IsDefined( level._animnotifyfuncs[ label ] ) )
979 level [[ level._animnotifyfuncs[ label ] ]]( param );
988 switchmap_preload( str_mapname, str_gametype, int_lighting );
990 LUINotifyEvent( &
"open_side_mission_countdown", 1, int_list_index );
994 LUINotifyEvent( &
"close_side_mission_countdown" );
1001 for( i = 0; i < level.players.size; i++ )
1003 if( IsDefined( level.players[i] ) )
1012 self notify(
"setcybercomability", new_ability);
1020 /# println(
"ERROR: Aborting level - gametype is not supported"); #/
1036 if( isdefined( level._gametype_default ) )
1038 SetDvar(
"g_gametype", level._gametype_default );
1046 level notify(
"glass_smash", pos, dir);
1054 [[level.callbackBotEnteredUserEdge]]( startNode, endNode );
1060 #precache( "string", "CP_ALL_DECORATIONS" );
1062 #define N_DECORATION_COUNT 12
1065 a_decorations =
self GetDecorations(
true );
1067 if (!isdefined(a_decorations))
1074 self notify(
"give_achievement",
"CP_ALL_DECORATIONS" );
1077 a_all_decorations =
self GetDecorations();
1078 if ( a_decorations.size == a_all_decorations.size - 1 )
1080 self GiveDecoration(
"cp_medal_all_decorations" );
1083 level notify(
"decoration_awarded" );
1085 [[level.callbackDecorationAwarded]]();