iw6-scripts/animscripts/squadmanager.gsc
2024-02-13 13:20:49 +01:00

692 lines
16 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_squadmanager()
{
if ( isdefined( anim.squadinitialized ) && anim.squadinitialized )
return;
anim.squadcreatefuncs = [];
anim.squadcreatestrings = [];
anim.squads = [];
anim.squadindex = [];
anim.squadrand = 0;
anim.squadinitialized = 1;
}
createsquad( var_0, var_1 )
{
anim.squads[var_0] = spawnstruct();
var_2 = anim.squads[var_0];
var_2.squadname = var_0;
var_2.team = getsquadteam( var_1 );
var_2.sighttime = 0;
var_2.origin = undefined;
var_2.forward = undefined;
var_2.enemy = undefined;
var_2.isincombat = 0;
var_2.membercount = 0;
var_2.members = [];
var_2.officers = [];
var_2.officercount = 0;
var_2.squadlist = [];
var_2.memberaddfuncs = [];
var_2.memberaddstrings = [];
var_2.memberremovefuncs = [];
var_2.memberremovestrings = [];
var_2.squadupdatefuncs = [];
var_2.squadupdatestrings = [];
var_2.squadid = anim.squadindex.size;
var_2 initstate( "combat", 0.75 );
var_2 initstate( "cover", 0.75 );
var_2 initstate( "move", 0.75 );
var_2 initstate( "stop", 0.75 );
var_2 initstate( "death", 0.75 );
var_2 initstate( "suppressed", 0.75 );
var_2 initstate( "attacking", 0.5 );
anim.squadindex[anim.squadindex.size] = var_2;
var_2 updatesquadlist();
level notify( "squad created " + var_0 );
anim notify( "squad created " + var_0 );
for ( var_3 = 0; var_3 < anim.squadcreatefuncs.size; var_3++ )
{
var_4 = anim.squadcreatefuncs[var_3];
var_2 thread [[ var_4 ]]();
}
for ( var_3 = 0; var_3 < anim.squadindex.size; var_3++ )
anim.squadindex[var_3] updatesquadlist();
var_2 thread updatewaiter();
var_2 thread squadtracker();
var_2 thread officerwaiter();
var_2 thread updatememberstates();
return var_2;
}
deletesquad( var_0 )
{
if ( var_0 == "axis" || var_0 == "team3" || var_0 == "allies" )
return;
var_1 = anim.squads[var_0].squadid;
var_2 = anim.squads[var_0];
var_2 notify( "squad_deleting" );
while ( var_2.members.size )
var_2.members[0] addtosquad( var_2.members[0].team );
anim.squadindex[var_1] = anim.squadindex[anim.squadindex.size - 1];
anim.squadindex[var_1].squadid = var_1;
anim.squadindex[anim.squadindex.size - 1] = undefined;
anim.squads[var_0] = undefined;
level notify( "squad deleted " + var_0 );
anim notify( "squad deleted " + var_0 );
for ( var_3 = 0; var_3 < anim.squadindex.size; var_3++ )
anim.squadindex[var_3] updatesquadlist();
}
generatesquadname()
{
var_0 = "auto" + anim.squadrand;
anim.squadrand++;
return var_0;
}
addplayertosquad( var_0 )
{
if ( !isdefined( var_0 ) )
{
if ( isdefined( self.script_squadname ) )
var_0 = self.script_squadname;
else
var_0 = self.team;
}
if ( !isdefined( anim.squads[var_0] ) )
anim createsquad( var_0, self );
var_1 = anim.squads[var_0];
self.squad = var_1;
}
squadchange()
{
self endon( "death" );
wait 10.0;
if ( !isdefined( self.script_squadname ) )
var_0 = self.team + self.script_flanker;
else
var_0 = self.script_squadname + self.script_flanker;
addtosquad( var_0 );
}
getsquadteam( var_0 )
{
var_1 = "allies";
if ( var_0.team == "axis" || var_0.team == "neutral" || var_0.team == "team3" )
var_1 = var_0.team;
return var_1;
}
addtosquad( var_0 )
{
if ( !isdefined( var_0 ) )
{
if ( isdefined( self.script_flanker ) )
thread squadchange();
if ( isdefined( self.script_squadname ) )
var_0 = self.script_squadname;
else
var_0 = self.team;
}
if ( !isdefined( anim.squads[var_0] ) )
anim createsquad( var_0, self );
var_1 = anim.squads[var_0];
if ( isdefined( self.squad ) )
{
if ( self.squad == var_1 )
return;
else
removefromsquad();
}
self.lastenemysighttime = 0;
self.combattime = 0;
self.squad = var_1;
self.memberid = var_1.members.size;
var_1.members[self.memberid] = self;
var_1.membercount = var_1.members.size;
if ( isdefined( level.loadoutcomplete ) )
{
if ( self.team == "allies" && animscripts\battlechatter::isofficer() )
addofficertosquad();
}
for ( var_2 = 0; var_2 < self.squad.memberaddfuncs.size; var_2++ )
{
var_3 = self.squad.memberaddfuncs[var_2];
self thread [[ var_3 ]]( self.squad.squadname );
}
thread membercombatwaiter();
thread memberdeathwaiter();
}
removefromsquad()
{
var_0 = self.squad;
var_1 = -1;
if ( isdefined( self ) )
var_1 = self.memberid;
else
{
for ( var_2 = 0; var_2 < var_0.members.size; var_2++ )
{
if ( var_0.members[var_2] == self )
var_1 = var_2;
}
}
if ( var_1 != var_0.members.size - 1 )
{
var_3 = var_0.members[var_0.members.size - 1];
var_0.members[var_1] = var_3;
if ( isdefined( var_3 ) )
var_3.memberid = var_1;
}
var_0.members[var_0.members.size - 1] = undefined;
var_0.membercount = var_0.members.size;
if ( isdefined( self.officerid ) )
removeofficerfromsquad();
for ( var_2 = 0; var_2 < self.squad.memberremovefuncs.size; var_2++ )
{
var_4 = self.squad.memberremovefuncs[var_2];
self thread [[ var_4 ]]( var_0.squadname );
}
if ( var_0.membercount == 0 )
deletesquad( var_0.squadname );
if ( isdefined( self ) )
{
self.squad = undefined;
self.memberid = undefined;
}
self notify( "removed from squad" );
}
addofficertosquad()
{
var_0 = self.squad;
if ( isdefined( self.officerid ) )
return;
self.officerid = var_0.officers.size;
var_0.officers[self.officerid] = self;
var_0.officercount = var_0.officers.size;
}
removeofficerfromsquad()
{
var_0 = self.squad;
var_1 = -1;
if ( isdefined( self ) )
var_1 = self.officerid;
else
{
for ( var_2 = 0; var_2 < var_0.officers.size; var_2++ )
{
if ( var_0.officers[var_2] == self )
var_1 = var_2;
}
}
if ( var_1 != var_0.officers.size - 1 )
{
var_3 = var_0.officers[var_0.officers.size - 1];
var_0.officers[var_1] = var_3;
if ( isdefined( var_3 ) )
var_3.officerid = var_1;
}
var_0.officers[var_0.officers.size - 1] = undefined;
var_0.officercount = var_0.officers.size;
if ( isdefined( self ) )
self.officerid = undefined;
}
officerwaiter()
{
if ( !isdefined( level.loadoutcomplete ) )
anim waittill( "loadout complete" );
for ( var_0 = 0; var_0 < self.members.size; var_0++ )
{
if ( self.members[var_0] animscripts\battlechatter::isofficer() )
self.members[var_0] addofficertosquad();
}
}
updatewaiter()
{
for (;;)
{
anim waittill( "squadupdate", var_0 );
switch ( var_0 )
{
case "squadlist":
updatesquadlist();
break;
case "combat":
updatecombat();
break;
case "origin":
updateorigin();
break;
case "forward":
updateheading();
break;
}
}
}
squadtracker()
{
anim endon( "squad deleted " + self.squadname );
for (;;)
{
updateall();
wait 0.1;
}
}
memberdeathwaiter()
{
self endon( "removed from squad" );
self waittill( "death", var_0 );
if ( isdefined( self ) )
self.attacker = var_0;
removefromsquad();
}
membercombatwaiter()
{
self endon( "removed from squad" );
for (;;)
{
self waittill( "enemy" );
if ( !isdefined( self.enemy ) )
self.squad notify( "squadupdate", "combat" );
else
self.squad.isincombat = 1;
wait 0.05;
}
}
updateheading()
{
if ( isdefined( self.enemy ) )
self.forward = vectornormalize( self.enemy.origin - self.origin );
else
{
var_0 = ( 0, 0, 0 );
var_1 = 0;
for ( var_2 = 0; var_2 < self.members.size; var_2++ )
{
if ( !isalive( self.members[var_2] ) )
continue;
var_0 = var_0 + anglestoforward( self.members[var_2].angles );
var_1++;
}
if ( var_1 )
{
self.forward = ( var_0[0] / var_1, var_0[1] / var_1, var_0[2] / var_1 );
return;
}
self.forward = var_0;
}
}
updateorigin()
{
var_0 = ( 0, 0, 0 );
var_1 = 0;
for ( var_2 = 0; var_2 < self.members.size; var_2++ )
{
if ( !isalive( self.members[var_2] ) )
continue;
var_0 = var_0 + self.members[var_2].origin;
var_1++;
}
if ( var_1 )
self.origin = ( var_0[0] / var_1, var_0[1] / var_1, var_0[2] / var_1 );
else
self.origin = var_0;
}
updatecombat()
{
self.isincombat = 0;
for ( var_0 = 0; var_0 < anim.squadindex.size; var_0++ )
self.squadlist[anim.squadindex[var_0].squadname].isincontact = 0;
for ( var_0 = 0; var_0 < self.members.size; var_0++ )
{
if ( isdefined( self.members[var_0].enemy ) && isdefined( self.members[var_0].enemy.squad ) && self.members[var_0].combattime > 0 )
self.squadlist[self.members[var_0].enemy.squad.squadname].isincontact = 1;
}
}
updateenemy()
{
var_0 = undefined;
for ( var_1 = 0; var_1 < self.members.size; var_1++ )
{
if ( isdefined( self.members[var_1].enemy ) && isdefined( self.members[var_1].enemy.squad ) )
{
if ( !isdefined( var_0 ) )
{
var_0 = self.members[var_1].enemy.squad;
continue;
}
if ( self.members[var_1].enemy.squad.membercount > var_0.membercount )
var_0 = self.members[var_1].enemy.squad;
}
}
self.enemy = var_0;
}
updateall()
{
var_0 = ( 0, 0, 0 );
var_1 = 0;
var_2 = undefined;
var_3 = 0;
updatecombat();
for ( var_4 = 0; var_4 < self.members.size; var_4++ )
{
if ( !isalive( self.members[var_4] ) )
continue;
var_0 = var_0 + self.members[var_4].origin;
var_1++;
if ( isdefined( self.members[var_4].enemy ) && isdefined( self.members[var_4].enemy.squad ) )
{
if ( !isdefined( var_2 ) )
{
var_2 = self.members[var_4].enemy.squad;
continue;
}
if ( self.members[var_4].enemy.squad.membercount > var_2.membercount )
var_2 = self.members[var_4].enemy.squad;
}
}
if ( var_1 )
self.origin = ( var_0[0] / var_1, var_0[1] / var_1, var_0[2] / var_1 );
else
self.origin = var_0;
self.isincombat = var_3;
self.enemy = var_2;
updateheading();
}
updatesquadlist()
{
for ( var_0 = 0; var_0 < anim.squadindex.size; var_0++ )
{
if ( !isdefined( self.squadlist[anim.squadindex[var_0].squadname] ) )
{
self.squadlist[anim.squadindex[var_0].squadname] = spawnstruct();
self.squadlist[anim.squadindex[var_0].squadname].isincontact = 0;
}
for ( var_1 = 0; var_1 < self.squadupdatefuncs.size; var_1++ )
{
var_2 = self.squadupdatefuncs[var_1];
self thread [[ var_2 ]]( anim.squadindex[var_0].squadname );
}
}
}
printabovehead( var_0, var_1, var_2, var_3 )
{
self endon( "death" );
if ( !isdefined( var_2 ) )
var_2 = ( 0, 0, 0 );
if ( !isdefined( var_3 ) )
var_3 = ( 1, 0, 0 );
for ( var_4 = 0; var_4 < var_1 * 2; var_4++ )
{
if ( !isalive( self ) )
return;
var_5 = self getshootatpos() + ( 0, 0, 10 ) + var_2;
wait 0.05;
}
}
aiupdateanimstate( var_0 )
{
switch ( var_0 )
{
case "move":
case "combat":
case "death":
case "stop":
self.a.state = var_0;
break;
case "grenadecower":
case "pain":
break;
case "stalingrad_cover_crouch":
case "concealment_stand":
case "concealment_prone":
case "concealment_crouch":
case "cover_wide_right":
case "cover_wide_left":
case "cover_swim_up":
case "cover_swim_right":
case "cover_swim_left":
case "cover_prone":
case "cover_left":
case "cover_stand":
case "cover_crouch":
case "cover_multi":
case "cover_right":
self.a.state = "cover";
break;
case "l33t truckride combat":
case "aim":
self.a.state = "combat";
break;
}
}
updatestates()
{
resetstate( "combat" );
resetstate( "cover" );
resetstate( "move" );
resetstate( "stop" );
resetstate( "death" );
resetstate( "suppressed" );
resetstate( "attacking" );
for ( var_0 = 0; var_0 < self.members.size; var_0++ )
{
if ( !isalive( self.members[var_0] ) )
continue;
querymemberanimstate( self.members[var_0] );
querymemberstate( self.members[var_0], "suppressed" );
querymemberstate( self.members[var_0], "combat" );
querymemberstate( self.members[var_0], "attacking" );
querymemberstate( self.members[var_0], "cover" );
}
}
updatememberstates()
{
anim endon( "squad deleted " + self.squadname );
var_0 = 0.05;
for (;;)
{
for ( var_1 = 0; var_1 < self.members.size; var_1++ )
{
if ( !isalive( self.members[var_1] ) )
continue;
self.members[var_1] aiupdatecombat( var_0 );
self.members[var_1] aiupdatesuppressed( var_0 );
}
wait( var_0 );
}
}
aiupdatecombat( var_0 )
{
if ( isdefined( self.lastenemysightpos ) )
{
if ( self.combattime < 0 )
self.combattime = var_0;
else
self.combattime = self.combattime + var_0;
self.lastenemysighttime = gettime();
return;
}
else if ( self issuppressed() )
{
self.combattime = self.combattime + var_0;
return;
}
if ( self.combattime > 0 )
self.combattime = 0 - var_0;
else
self.combattime = self.combattime - var_0;
}
aiupdatesuppressed( var_0 )
{
if ( self.suppressed )
{
if ( self.suppressedtime < 0 )
self.suppressedtime = var_0;
else
self.suppressedtime = self.suppressedtime + var_0;
}
else
{
if ( self.suppressedtime > 0 )
{
self.suppressedtime = 0 - var_0;
return;
}
self.suppressedtime = self.suppressedtime - var_0;
}
}
initstate( var_0, var_1 )
{
self.squadstates[var_0] = spawnstruct();
self.squadstates[var_0].activateratio = var_1;
self.squadstates[var_0].isactive = 0;
self.squadstates[var_0].numactive = 0;
}
resetstate( var_0 )
{
self.squadstates[var_0].isactive = 0;
self.squadstates[var_0].numactive = 0;
}
querymemberanimstate( var_0 )
{
self.squadstates[var_0.a.state].numactive++;
if ( self.squadstates[var_0.a.state].numactive > self.squadstates[var_0.a.state].activateratio * self.members.size )
self.squadstates[var_0.a.state].isactive = 1;
}
querymemberstate( var_0, var_1 )
{
switch ( var_1 )
{
case "suppressed":
if ( var_0.suppressedtime > 1.0 )
self.squadstates[var_1].numactive++;
break;
case "combat":
if ( var_0.combattime > 0.0 )
self.squadstates[var_1].numactive++;
break;
case "attacking":
if ( gettime() < var_0.a.lastshoottime + 2000 )
self.squadstates[var_1].numactive++;
break;
case "cover":
if ( !var_0 animscripts\battlechatter::isexposed() )
self.squadstates[var_1].numactive++;
break;
}
if ( self.squadstates[var_1].numactive > self.squadstates[var_1].activateratio * self.members.size )
self.squadstates[var_1].isactive = 1;
}