mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
1481 lines
27 KiB
Plaintext
1481 lines
27 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: battlechatter_ai.gsc
|
|
* Game: Call of Duty: Advanced Warfare
|
|
* Platform: PC
|
|
* Function Count: 58
|
|
* Decompile Time: 845 ms
|
|
* Timestamp: 4/22/2024 2:00:01 AM
|
|
*******************************************************************/
|
|
|
|
//Function Number: 1
|
|
addtosystem(param_00)
|
|
{
|
|
self endon("death");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(self.chatinitialized)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isdefined(self.squad.chatinitialized) || !self.squad.chatinitialized)
|
|
{
|
|
self.squad animscripts\battlechatter::init_squadbattlechatter();
|
|
}
|
|
|
|
self.enemyclass = "infantry";
|
|
self.calledout = [];
|
|
if(isplayer(self))
|
|
{
|
|
self.battlechatter = 0;
|
|
self.flavorbursts = 0;
|
|
self.type = "human";
|
|
return;
|
|
}
|
|
|
|
if(self.type == "dog")
|
|
{
|
|
self.enemyclass = undefined;
|
|
self.battlechatter = 0;
|
|
self.flavorbursts = 0;
|
|
return;
|
|
}
|
|
|
|
if(self.team == "neutral")
|
|
{
|
|
self.enemyclass = undefined;
|
|
self.battlechatter = 0;
|
|
self.flavorbursts = 0;
|
|
return;
|
|
}
|
|
|
|
if(forceenglish())
|
|
{
|
|
if(self.team == "allies")
|
|
{
|
|
self.script_battlechatter = 0;
|
|
}
|
|
else
|
|
{
|
|
self.voice = "american";
|
|
}
|
|
}
|
|
|
|
self.countryid = level.countryids[self.voice];
|
|
assign_npcid();
|
|
thread ainameandrankwaiter();
|
|
init_aibattlechatter();
|
|
thread aithreadthreader();
|
|
}
|
|
|
|
//Function Number: 2
|
|
assign_npcid()
|
|
{
|
|
if(isdefined(self.script_friendname))
|
|
{
|
|
var_00 = tolower(self.script_friendname);
|
|
if(issubstr(var_00,"burke"))
|
|
{
|
|
self.npcid = "brk";
|
|
return;
|
|
}
|
|
|
|
if(issubstr(var_00,"carter"))
|
|
{
|
|
self.npcid = "ctr";
|
|
return;
|
|
}
|
|
|
|
if(issubstr(var_00,"joker"))
|
|
{
|
|
self.npcid = "jkr";
|
|
return;
|
|
}
|
|
|
|
if(issubstr(var_00,"alpha_leader"))
|
|
{
|
|
self.npcid = "aldr";
|
|
return;
|
|
}
|
|
|
|
if(issubstr(var_00,"cormack"))
|
|
{
|
|
self.npcid = "aldr";
|
|
return;
|
|
}
|
|
|
|
if(issubstr(var_00,"knox"))
|
|
{
|
|
self.npcid = "jkr";
|
|
return;
|
|
}
|
|
|
|
if(issubstr(var_00,"maddox"))
|
|
{
|
|
self.dds_characterid = "jkr";
|
|
return;
|
|
}
|
|
|
|
if(issubstr(var_00,"security_officer_1"))
|
|
{
|
|
self.npcid = "ctr";
|
|
return;
|
|
}
|
|
|
|
setnpcid();
|
|
return;
|
|
}
|
|
|
|
setnpcid();
|
|
}
|
|
|
|
//Function Number: 3
|
|
forceenglish()
|
|
{
|
|
if(!getdvarint("bcs_forceEnglish",0))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
switch(level.script)
|
|
{
|
|
case "pmc_strike":
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 4
|
|
aithreadthreader()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
var_00 = 0.5;
|
|
wait(var_00);
|
|
thread aigrenadedangerwaiter();
|
|
thread aifolloworderwaiter();
|
|
if(self.team == "allies")
|
|
{
|
|
wait(var_00);
|
|
thread aidisplacewaiter();
|
|
if(self.countryid == "CZ")
|
|
{
|
|
thread aihostileburstloop();
|
|
}
|
|
}
|
|
else if((self.team == "axis" || self.team == "team3") && !isalliedcountryid(self.countryid))
|
|
{
|
|
thread aihostileburstloop();
|
|
}
|
|
|
|
if(self.team == level.player.team)
|
|
{
|
|
thread player_friendlyfire_waiter();
|
|
}
|
|
|
|
wait(var_00);
|
|
thread aibattlechatterloop();
|
|
}
|
|
|
|
//Function Number: 5
|
|
isalliedcountryid(param_00)
|
|
{
|
|
if(param_00 == "UK" || param_00 == "US" || param_00 == "NS" || param_00 == "TF" || param_00 == "SS" || param_00 == "XS")
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 6
|
|
setnpcid()
|
|
{
|
|
var_00 = level.usedids[self.voice];
|
|
var_01 = var_00.size;
|
|
var_02 = randomintrange(0,var_01);
|
|
var_03 = var_02;
|
|
for(var_04 = 0;var_04 <= var_01;var_04++)
|
|
{
|
|
if(var_00[var_02 + var_04 % var_01].count < var_00[var_03].count)
|
|
{
|
|
var_03 = var_02 + var_04 % var_01;
|
|
}
|
|
}
|
|
|
|
thread npcidtracker(var_03);
|
|
self.npcid = var_00[var_03].npcid;
|
|
}
|
|
|
|
//Function Number: 7
|
|
npcidtracker(param_00)
|
|
{
|
|
level.usedids[self.voice][param_00].count++;
|
|
common_scripts\utility::waittill_either("death","removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
level.usedids[self.voice][param_00].count--;
|
|
}
|
|
|
|
//Function Number: 8
|
|
aihostileburstloop()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
wait(2);
|
|
for(;;)
|
|
{
|
|
if(distancesquared(self.origin,level.player.origin) < 1048576)
|
|
{
|
|
if(isdefined(self.squad.membercount) && self.squad.membercount > 1)
|
|
{
|
|
addreactionevent("taunt","hostileburst");
|
|
}
|
|
}
|
|
|
|
wait(randomfloatrange(2,5));
|
|
}
|
|
}
|
|
|
|
//Function Number: 9
|
|
aibattlechatterloop()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
for(;;)
|
|
{
|
|
animscripts\battlechatter::playbattlechatter();
|
|
wait(0.3 + randomfloat(0.2));
|
|
}
|
|
}
|
|
|
|
//Function Number: 10
|
|
ainameandrankwaiter()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
for(;;)
|
|
{
|
|
self.bcname = animscripts\battlechatter::getname();
|
|
self.bcrank = animscripts\battlechatter::getrank();
|
|
self waittill("set name and rank");
|
|
}
|
|
}
|
|
|
|
//Function Number: 11
|
|
removefromsystem(param_00)
|
|
{
|
|
if(!isalive(self) && animscripts\battlechatter::bcsenabled())
|
|
{
|
|
if(isdefined(self))
|
|
{
|
|
aideathfriendly();
|
|
aideathenemy();
|
|
}
|
|
}
|
|
|
|
if(isdefined(self))
|
|
{
|
|
self.battlechatter = 0;
|
|
self.chatinitialized = 0;
|
|
}
|
|
|
|
self notify("removed from battleChatter");
|
|
if(isdefined(self))
|
|
{
|
|
self.chatqueue = undefined;
|
|
self.nextsaytime = undefined;
|
|
self.nextsaytimes = undefined;
|
|
self.isspeaking = undefined;
|
|
self.enemyclass = undefined;
|
|
self.calledout = undefined;
|
|
self.countryid = undefined;
|
|
self.npcid = undefined;
|
|
}
|
|
}
|
|
|
|
//Function Number: 12
|
|
init_aibattlechatter()
|
|
{
|
|
self.chatqueue = [];
|
|
self.chatqueue["threat"] = spawnstruct();
|
|
self.chatqueue["threat"].expiretime = 0;
|
|
self.chatqueue["threat"].priority = 0;
|
|
self.chatqueue["response"] = spawnstruct();
|
|
self.chatqueue["response"].expiretime = 0;
|
|
self.chatqueue["response"].priority = 0;
|
|
self.chatqueue["reaction"] = spawnstruct();
|
|
self.chatqueue["reaction"].expiretime = 0;
|
|
self.chatqueue["reaction"].priority = 0;
|
|
self.chatqueue["inform"] = spawnstruct();
|
|
self.chatqueue["inform"].expiretime = 0;
|
|
self.chatqueue["inform"].priority = 0;
|
|
self.chatqueue["order"] = spawnstruct();
|
|
self.chatqueue["order"].expiretime = 0;
|
|
self.chatqueue["order"].priority = 0;
|
|
self.chatqueue["custom"] = spawnstruct();
|
|
self.chatqueue["custom"].expiretime = 0;
|
|
self.chatqueue["custom"].priority = 0;
|
|
self.nextsaytime = gettime() + 50;
|
|
self.nextsaytimes["threat"] = 0;
|
|
self.nextsaytimes["reaction"] = 0;
|
|
self.nextsaytimes["response"] = 0;
|
|
self.nextsaytimes["inform"] = 0;
|
|
self.nextsaytimes["order"] = 0;
|
|
self.nextsaytimes["custom"] = 0;
|
|
self.isspeaking = 0;
|
|
self.bcs_minpriority = 0;
|
|
self.allowedcallouts = [];
|
|
if(self.voice != "xslice")
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout("rpg");
|
|
}
|
|
|
|
animscripts\battlechatter::addallowedthreatcallout("exposed");
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_contact_clock");
|
|
if(self.voice != "xslice")
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_target_clock");
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_cardinal");
|
|
}
|
|
|
|
if(self.voice != "shadowcompany")
|
|
{
|
|
if(self.voice != "british" && self.voice != "pmc" && self.voice != "xslice")
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_obvious");
|
|
}
|
|
}
|
|
|
|
if(self.team == "allies")
|
|
{
|
|
if(common_scripts\utility::array_contains(level.playernameids,self.voice))
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout("player_contact_clock");
|
|
if(self.voice != "xslice")
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout("player_target_clock");
|
|
animscripts\battlechatter::addallowedthreatcallout("player_cardinal");
|
|
animscripts\battlechatter::addallowedthreatcallout("player_obvious");
|
|
animscripts\battlechatter::addallowedthreatcallout("player_object_clock");
|
|
}
|
|
|
|
animscripts\battlechatter::addallowedthreatcallout("player_location");
|
|
}
|
|
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_location");
|
|
if(self.voice != "xslice")
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout("generic_location");
|
|
}
|
|
|
|
if(self.voice == "delta" || self.voice == "taskforce" || self.voice == "seal")
|
|
{
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_obvious");
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_casual_clock");
|
|
animscripts\battlechatter::addallowedthreatcallout("concat_location");
|
|
animscripts\battlechatter::addallowedthreatcallout("player_distance");
|
|
animscripts\battlechatter::addallowedthreatcallout("player_target_clock_high");
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_distance");
|
|
animscripts\battlechatter::addallowedthreatcallout("ai_target_clock_high");
|
|
}
|
|
}
|
|
|
|
if(isdefined(self.script_battlechatter) && !self.script_battlechatter)
|
|
{
|
|
self.battlechatter = 0;
|
|
}
|
|
else
|
|
{
|
|
self.battlechatter = level.battlechatter[self.team];
|
|
}
|
|
|
|
if(animscripts\battlechatter::voicecanburst())
|
|
{
|
|
self.flavorbursts = 1;
|
|
}
|
|
else
|
|
{
|
|
self.flavorbursts = 0;
|
|
}
|
|
|
|
if(level.friendlyfire_warnings)
|
|
{
|
|
maps\_utility::set_friendlyfire_warnings(1);
|
|
}
|
|
else
|
|
{
|
|
maps\_utility::set_friendlyfire_warnings(0);
|
|
}
|
|
|
|
self.chatinitialized = 1;
|
|
}
|
|
|
|
//Function Number: 13
|
|
addthreatevent(param_00,param_01,param_02)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!animscripts\battlechatter::cansay("threat",param_00,param_02))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(animscripts\battlechatter::threatwasalreadycalledout(param_01) && !isplayer(param_01))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_03 = animscripts\battlechatter::createchatevent("threat",param_00,param_02);
|
|
switch(param_00)
|
|
{
|
|
case "infantry":
|
|
var_03.threat = param_01;
|
|
break;
|
|
}
|
|
|
|
if(isdefined(param_01.squad))
|
|
{
|
|
self.squad animscripts\battlechatter::updatecontact(param_01.squad.squadname,self);
|
|
}
|
|
|
|
self.chatqueue["threat"] = undefined;
|
|
self.chatqueue["threat"] = var_03;
|
|
}
|
|
|
|
//Function Number: 14
|
|
addresponseevent(param_00,param_01,param_02,param_03,param_04,param_05)
|
|
{
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
thread addresponseevent_internal(param_00,param_01,param_02,param_03,param_04,param_05);
|
|
}
|
|
|
|
//Function Number: 15
|
|
addresponseevent_internal(param_00,param_01,param_02,param_03,param_04,param_05)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
self endon("responseEvent_failsafe");
|
|
thread responseevent_failsafe(param_02);
|
|
var_06 = param_02 common_scripts\utility::waittill_any_return("death","done speaking","cancel speaking");
|
|
if(var_06 == "cancel speaking")
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isalive(param_02))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!animscripts\battlechatter::cansay("response",param_00,param_03,param_01))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isplayer(param_02))
|
|
{
|
|
if(animscripts\battlechatter::isusingsamevoice(param_02))
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
var_07 = animscripts\battlechatter::createchatevent("response",param_00,param_03);
|
|
if(isdefined(param_04))
|
|
{
|
|
var_07.reportalias = param_04;
|
|
}
|
|
|
|
if(isdefined(param_05))
|
|
{
|
|
var_07.location = param_05;
|
|
}
|
|
|
|
var_07.respondto = param_02;
|
|
var_07.modifier = param_01;
|
|
self.chatqueue["response"] = undefined;
|
|
self.chatqueue["response"] = var_07;
|
|
}
|
|
|
|
//Function Number: 16
|
|
responseevent_failsafe(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
param_00 endon("death");
|
|
param_00 endon("done speaking");
|
|
param_00 endon("cancel speaking");
|
|
wait(25);
|
|
self notify("responseEvent_failsafe");
|
|
}
|
|
|
|
//Function Number: 17
|
|
addinformevent(param_00,param_01,param_02,param_03)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!animscripts\battlechatter::cansay("inform",param_00,param_03,param_01))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_04 = animscripts\battlechatter::createchatevent("inform",param_00,param_03);
|
|
switch(param_00)
|
|
{
|
|
case "reloading":
|
|
var_04.modifier = param_01;
|
|
var_04.informto = param_02;
|
|
break;
|
|
|
|
default:
|
|
var_04.modifier = param_01;
|
|
break;
|
|
}
|
|
|
|
self.chatqueue["inform"] = undefined;
|
|
self.chatqueue["inform"] = var_04;
|
|
}
|
|
|
|
//Function Number: 18
|
|
addreactionevent(param_00,param_01,param_02,param_03)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isdefined(self.chatqueue))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_04 = animscripts\battlechatter::createchatevent("reaction",param_00,param_03);
|
|
var_04.reactto = param_02;
|
|
var_04.modifier = param_01;
|
|
self.chatqueue["reaction"] = undefined;
|
|
self.chatqueue["reaction"] = var_04;
|
|
}
|
|
|
|
//Function Number: 19
|
|
addorderevent(param_00,param_01,param_02,param_03)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!animscripts\battlechatter::cansay("order",param_00,param_03,param_01))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(isdefined(param_02) && param_02.type == "dog")
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_04 = animscripts\battlechatter::createchatevent("order",param_00,param_03);
|
|
var_04.modifier = param_01;
|
|
var_04.orderto = param_02;
|
|
self.chatqueue["order"] = undefined;
|
|
self.chatqueue["order"] = var_04;
|
|
}
|
|
|
|
//Function Number: 20
|
|
squadofficerwaiter()
|
|
{
|
|
anim endon("battlechatter disabled");
|
|
anim endon("squad deleted " + self.squadname);
|
|
for(;;)
|
|
{
|
|
var_00 = undefined;
|
|
if(self.officers.size)
|
|
{
|
|
var_01 = self.officers;
|
|
}
|
|
else
|
|
{
|
|
var_01 = self.members;
|
|
}
|
|
|
|
var_02 = [];
|
|
foreach(var_04 in var_01)
|
|
{
|
|
if(isalive(var_04))
|
|
{
|
|
var_02[var_02.size] = var_04;
|
|
}
|
|
}
|
|
|
|
if(var_02.size)
|
|
{
|
|
var_00 = common_scripts\utility::getclosest(level.player.origin,var_02);
|
|
var_00 aiofficerorders();
|
|
var_00 waittill("death");
|
|
}
|
|
|
|
wait(3);
|
|
}
|
|
}
|
|
|
|
//Function Number: 21
|
|
getthreatsovertime(param_00,param_01)
|
|
{
|
|
var_02 = param_00.size;
|
|
if(var_02 == 0)
|
|
{
|
|
wait(param_01);
|
|
return param_00;
|
|
}
|
|
|
|
var_03 = param_01 * 20;
|
|
var_04 = var_02 / var_03;
|
|
var_05 = [];
|
|
for(var_06 = 0;var_06 < var_02;var_06++)
|
|
{
|
|
var_07 = param_00[var_06];
|
|
if(!isdefined(var_07.enemyclass))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_05[var_05.size] = param_00[var_06];
|
|
}
|
|
|
|
if(var_05.size == 0)
|
|
{
|
|
wait(param_01);
|
|
return var_05;
|
|
}
|
|
|
|
var_05 = sortbydistance(var_05,level.player.origin);
|
|
var_08 = [];
|
|
var_09 = [];
|
|
var_0A = 0;
|
|
foreach(var_0C in var_05)
|
|
{
|
|
if(isdefined(var_0C) && threatisviable(var_0C))
|
|
{
|
|
var_0D = var_0C animscripts\battlechatter::getlocation();
|
|
if(isdefined(var_0D) && !animscripts\battlechatter::location_called_out_recently(var_0D))
|
|
{
|
|
var_08[var_08.size] = var_0C;
|
|
}
|
|
else
|
|
{
|
|
var_09[var_09.size] = var_0C;
|
|
}
|
|
}
|
|
|
|
var_0A++;
|
|
if(var_0A >= var_04)
|
|
{
|
|
wait(0.05);
|
|
var_0A = 0;
|
|
}
|
|
}
|
|
|
|
var_05 = [];
|
|
foreach(var_10 in var_08)
|
|
{
|
|
var_05[var_05.size] = var_10;
|
|
}
|
|
|
|
foreach(var_10 in var_09)
|
|
{
|
|
var_05[var_05.size] = var_10;
|
|
}
|
|
|
|
return var_05;
|
|
}
|
|
|
|
//Function Number: 22
|
|
threatisviable(param_00)
|
|
{
|
|
if(distancesquared(level.player.origin,param_00.origin) > level.bcs_maxthreatdistsqrdfromplayer)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!level.player animscripts\battlechatter::entinfrontarc(param_00))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 23
|
|
squadthreatwaiter()
|
|
{
|
|
anim endon("battlechatter disabled");
|
|
anim endon("squad deleted " + self.squadname);
|
|
for(;;)
|
|
{
|
|
if(self.team == "allies")
|
|
{
|
|
var_00 = getthreatsovertime(getaiarray("axis","team3"),0.5);
|
|
}
|
|
else if(self.team == "team3")
|
|
{
|
|
var_00 = getthreatsovertime(getaiarray("allies","axis"),0.5);
|
|
}
|
|
else
|
|
{
|
|
wait(0.5);
|
|
var_00 = getaiarray("allies","team3");
|
|
var_00[var_00.size] = level.player;
|
|
}
|
|
|
|
if(!var_00.size)
|
|
{
|
|
wait(0.05);
|
|
continue;
|
|
}
|
|
|
|
var_01 = [];
|
|
foreach(var_03 in self.members)
|
|
{
|
|
if(!isalive(var_03))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(!var_00.size)
|
|
{
|
|
var_00 = var_01;
|
|
var_01 = [];
|
|
}
|
|
|
|
foreach(var_0A, var_05 in var_00)
|
|
{
|
|
if(!isdefined(var_05))
|
|
{
|
|
if(var_0A == 0)
|
|
{
|
|
var_00 = [];
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if(!isalive(var_05))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(!isdefined(var_05.enemyclass))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(!var_03 cansee(var_05))
|
|
{
|
|
if(isplayer(var_05))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(var_05.team == level.player.team)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(!maps\_utility::player_can_see_ai(var_05,250))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
var_03 addthreatevent(var_05.enemyclass,var_05);
|
|
var_01[var_01.size] = var_05;
|
|
var_06 = [];
|
|
foreach(var_08 in var_00)
|
|
{
|
|
if(var_08 != var_05)
|
|
{
|
|
var_06[var_06.size] = var_08;
|
|
}
|
|
}
|
|
|
|
var_00 = var_06;
|
|
break;
|
|
}
|
|
|
|
wait(0.05);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 24
|
|
aideathfriendly()
|
|
{
|
|
var_00 = self.attacker;
|
|
common_scripts\utility::array_thread(self.squad.members,::aideatheventthread);
|
|
if(isalive(var_00) && issentient(var_00) && isdefined(var_00.squad) && var_00.battlechatter)
|
|
{
|
|
if(isdefined(var_00.calledout[var_00.squad.squadname]))
|
|
{
|
|
var_00.calledout[var_00.squad.squadname] = undefined;
|
|
}
|
|
|
|
if(!isdefined(var_00.enemyclass))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!var_00 animscripts\battlechatter::is_in_callable_location())
|
|
{
|
|
return;
|
|
}
|
|
|
|
foreach(var_02 in self.squad.members)
|
|
{
|
|
if(gettime() > var_02.lastenemysighttime + 2000)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var_02 addthreatevent(var_00.enemyclass,var_00);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 25
|
|
aideatheventthread()
|
|
{
|
|
if(!isalive(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
self notify("aiDeathEventThread");
|
|
self endon("aiDeathEventThread");
|
|
wait(1.5);
|
|
addreactionevent("casualty","generic",self,0.9);
|
|
}
|
|
|
|
//Function Number: 26
|
|
aideathenemy()
|
|
{
|
|
var_00 = self.attacker;
|
|
if(!isalive(var_00) || !issentient(var_00) || !isdefined(var_00.squad))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isdefined(var_00.countryid) || var_00.countryid != "XS")
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isplayer(var_00))
|
|
{
|
|
if(var_00.countryid == "GS" || var_00.countryid == "GM" || var_00.countryid == "GL")
|
|
{
|
|
var_00 thread aikilleventthread();
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 27
|
|
aikilleventthread()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
wait(1.5);
|
|
addinformevent("killfirm","generic");
|
|
}
|
|
|
|
//Function Number: 28
|
|
aiofficerorders()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!isdefined(self.squad.chatinitialized))
|
|
{
|
|
self.squad waittill("squad chat initialized");
|
|
}
|
|
|
|
for(;;)
|
|
{
|
|
if(getdvarint("bcs_enable") == 0)
|
|
{
|
|
wait(1);
|
|
continue;
|
|
}
|
|
|
|
addsituationalorder();
|
|
wait(randomfloatrange(3,6));
|
|
}
|
|
}
|
|
|
|
//Function Number: 29
|
|
aigrenadedangerwaiter()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
for(;;)
|
|
{
|
|
self waittill("grenade danger",var_00);
|
|
if(getdvarint("bcs_enable") == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(!isdefined(var_00) || var_00.model != "projectile_m67fraggrenade")
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(distancesquared(var_00.origin,level.player.origin) < 262144)
|
|
{
|
|
addinformevent("incoming","grenade");
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 30
|
|
aidisplacewaiter()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
for(;;)
|
|
{
|
|
self waittill("trigger");
|
|
if(getdvarint("bcs_enable") == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(gettime() < self.a.paintime + 4000)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
addresponseevent("ack","yes",level.player,1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 31
|
|
evaluatemoveevent(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isdefined(self.node))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(distancesquared(self.origin,self.node.origin) < 262144)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!animscripts\battlechatter::isnodecoverorconceal())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!nationalityokformoveorder())
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_01 = animscripts\battlechatter::getresponder(24,1024,"response");
|
|
if(self.team != "axis" && self.team != "team3")
|
|
{
|
|
if(!isdefined(var_01))
|
|
{
|
|
var_01 = level.player;
|
|
}
|
|
else if(randomint(100) < level.eventchance["moveEvent"]["ordertoplayer"])
|
|
{
|
|
var_01 = level.player;
|
|
}
|
|
}
|
|
|
|
if(self.combattime > 0)
|
|
{
|
|
if(randomint(100) < level.eventchance["moveEvent"]["coverme"])
|
|
{
|
|
addorderevent("action","coverme",var_01);
|
|
return;
|
|
}
|
|
|
|
addorderevent("move","combat",var_01);
|
|
return;
|
|
}
|
|
|
|
if(nationalityokformoveordernoncombat())
|
|
{
|
|
addorderevent("move","noncombat",var_01);
|
|
}
|
|
}
|
|
|
|
//Function Number: 32
|
|
nationalityokformoveorder()
|
|
{
|
|
if(self.countryid == "SS")
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 33
|
|
nationalityokformoveordernoncombat()
|
|
{
|
|
if(self.countryid == "US" || self.countryid == "XS" || self.countryid == level.player.countryid)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 34
|
|
aifolloworderwaiter()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
for(;;)
|
|
{
|
|
level waittill("follow order",var_00);
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isdefined(var_00))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(!isalive(var_00) || var_00.team != self.team)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(distancesquared(self.origin,var_00.origin) < 360000)
|
|
{
|
|
addresponseevent("ack","yes",var_00,0.9);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 35
|
|
player_friendlyfire_waiter()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
thread player_friendlyfire_waiter_damage();
|
|
for(;;)
|
|
{
|
|
self waittill("bulletwhizby",var_00,var_01);
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(!isplayer(var_00))
|
|
{
|
|
if(level.countryids[self.voice] == "GM" && animscripts\battlechatter::cansay("reaction","takingfire",1,undefined))
|
|
{
|
|
addreactionevent("takingfire",undefined,var_00,1);
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if(friendlyfire_whizby_distances_valid(var_00,var_01))
|
|
{
|
|
player_friendlyfire_addreactionevent();
|
|
wait(3);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 36
|
|
player_friendlyfire_addreactionevent()
|
|
{
|
|
addreactionevent("friendlyfire",undefined,level.player,1);
|
|
}
|
|
|
|
//Function Number: 37
|
|
player_friendlyfire_waiter_damage()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
for(;;)
|
|
{
|
|
self waittill("damage",var_00,var_01,var_02,var_03,var_04);
|
|
if(isdefined(var_01) && isplayer(var_01))
|
|
{
|
|
if(damage_is_valid_for_friendlyfire_warning(var_04,var_01))
|
|
{
|
|
player_friendlyfire_addreactionevent();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 38
|
|
damage_is_valid_for_friendlyfire_warning(param_00,param_01)
|
|
{
|
|
if(!isdefined(param_00))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
switch(param_00)
|
|
{
|
|
case "MOD_IMPACT":
|
|
case "MOD_CRUSH":
|
|
case "MOD_MELEE":
|
|
case "MOD_MELEE_ALT":
|
|
case "MOD_GRENADE_SPLASH":
|
|
case "MOD_GRENADE":
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 39
|
|
friendlyfire_whizby_distances_valid(param_00,param_01)
|
|
{
|
|
var_02 = 65536;
|
|
var_03 = 42;
|
|
if(distancesquared(param_00.origin,self.origin) < var_02)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(param_01 > var_03)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 40
|
|
evaluatereloadevent()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
addinformevent("reloading","generic");
|
|
}
|
|
|
|
//Function Number: 41
|
|
evaluatemeleeevent()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!isdefined(self.enemy))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 42
|
|
evaluatefiringevent()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!isdefined(self.enemy))
|
|
{
|
|
}
|
|
}
|
|
|
|
//Function Number: 43
|
|
evaluatesuppressionevent()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!self.suppressed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
addinformevent("suppressed","generic");
|
|
}
|
|
|
|
//Function Number: 44
|
|
evaluateattackevent(param_00)
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
addinformevent("attack","grenade");
|
|
}
|
|
|
|
//Function Number: 45
|
|
addsituationalorder()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
if(self.squad.squadstates["combat"].isactive)
|
|
{
|
|
addsituationalcombatorder();
|
|
}
|
|
}
|
|
|
|
//Function Number: 46
|
|
addsituationalcombatorder()
|
|
{
|
|
self endon("death");
|
|
self endon("removed from battleChatter");
|
|
var_00 = self.squad;
|
|
var_00 animscripts\squadmanager::updatestates();
|
|
if(var_00.squadstates["suppressed"].isactive)
|
|
{
|
|
if(var_00.squadstates["cover"].isactive)
|
|
{
|
|
var_01 = animscripts\battlechatter::getresponder(96,512,"response");
|
|
addorderevent("action","grenade",var_01);
|
|
}
|
|
else
|
|
{
|
|
addorderevent("displace","generic");
|
|
}
|
|
}
|
|
else if(var_00.squadstates["combat"].isactive)
|
|
{
|
|
if(self.countryid != "SS")
|
|
{
|
|
var_01 = animscripts\battlechatter::getresponder(24,1024,"response");
|
|
addorderevent("action","suppress",var_01);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 47
|
|
custom_battlechatter_init_valid_phrases()
|
|
{
|
|
var_00 = [];
|
|
var_00[var_00.size] = "order_move_combat";
|
|
var_00[var_00.size] = "order_move_noncombat";
|
|
var_00[var_00.size] = "order_action_coverme";
|
|
var_00[var_00.size] = "inform_reloading";
|
|
level.custombcs_validphrases = var_00;
|
|
}
|
|
|
|
//Function Number: 48
|
|
custom_battlechatter_validate_phrase(param_00)
|
|
{
|
|
var_01 = 0;
|
|
foreach(var_03 in level.custombcs_validphrases)
|
|
{
|
|
if(var_03 == param_00)
|
|
{
|
|
var_01 = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return var_01;
|
|
}
|
|
|
|
//Function Number: 49
|
|
get_phraseinvalidstr(param_00)
|
|
{
|
|
return level.bcprintfailprefix + "custom battlechatter phrase \'" + param_00 + "\' isn\'t valid. look at _utility::custom_battlechatter_init_valid_phrases(), or the util script documentation for custom_battlechatter(), for a list of valid phrases.";
|
|
}
|
|
|
|
//Function Number: 50
|
|
get_badcountryidstr(param_00)
|
|
{
|
|
return level.bcprintfailprefix + "AI at origin " + self.origin + "wasn\'t able to play custom battlechatter because his nationality is \'" + self.countryid + "\'.";
|
|
}
|
|
|
|
//Function Number: 51
|
|
custom_battlechatter_internal(param_00)
|
|
{
|
|
if(!isdefined(level.custombcs_validphrases))
|
|
{
|
|
custom_battlechatter_init_valid_phrases();
|
|
}
|
|
|
|
param_00 = tolower(param_00);
|
|
if(!custom_battlechatter_validate_phrase(param_00))
|
|
{
|
|
var_01 = get_phraseinvalidstr(param_00);
|
|
return 0;
|
|
}
|
|
|
|
var_02 = animscripts\battlechatter::getresponder(24,512,"response");
|
|
begincustomevent();
|
|
switch(var_01)
|
|
{
|
|
case "order_move_combat":
|
|
if(!nationalityokformoveorder())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
animscripts\battlechatter::tryorderto(self.customchatphrase,var_02);
|
|
addmovecombataliasex();
|
|
break;
|
|
|
|
case "order_move_noncombat":
|
|
if(!nationalityokformoveordernoncombat())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
addmovenoncombataliasex();
|
|
break;
|
|
|
|
case "order_action_coverme":
|
|
animscripts\battlechatter::tryorderto(self.customchatphrase,var_02);
|
|
addactioncovermealiasex();
|
|
break;
|
|
|
|
case "inform_reloading":
|
|
addinformreloadingaliasex();
|
|
break;
|
|
|
|
default:
|
|
var_01 = get_phraseinvalidstr(var_01);
|
|
return 0;
|
|
}
|
|
|
|
endcustomevent(2000);
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 52
|
|
begincustomevent()
|
|
{
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
self.customchatphrase = animscripts\battlechatter::createchatphrase();
|
|
}
|
|
|
|
//Function Number: 53
|
|
addactioncovermealiasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addorderalias("action","coverme");
|
|
}
|
|
|
|
//Function Number: 54
|
|
addmovecombataliasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addorderalias("move","combat");
|
|
}
|
|
|
|
//Function Number: 55
|
|
addmovenoncombataliasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addorderalias("move","noncombat");
|
|
}
|
|
|
|
//Function Number: 56
|
|
addinformreloadingaliasex()
|
|
{
|
|
self.customchatphrase animscripts\battlechatter::addinformalias("reloading","generic");
|
|
}
|
|
|
|
//Function Number: 57
|
|
addnamealiasex(param_00)
|
|
{
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
self.customchatphrase animscripts\battlechatter::addnamealias(param_00);
|
|
}
|
|
|
|
//Function Number: 58
|
|
endcustomevent(param_00,param_01)
|
|
{
|
|
if(!animscripts\battlechatter::bcsenabled())
|
|
{
|
|
return;
|
|
}
|
|
|
|
var_02 = animscripts\battlechatter::createchatevent("custom","generic",1);
|
|
if(isdefined(param_00))
|
|
{
|
|
var_02.expiretime = gettime() + param_00;
|
|
}
|
|
|
|
if(isdefined(param_01))
|
|
{
|
|
var_02.type = param_01;
|
|
}
|
|
else
|
|
{
|
|
var_02.type = "custom";
|
|
}
|
|
|
|
self.chatqueue["custom"] = undefined;
|
|
self.chatqueue["custom"] = var_02;
|
|
} |