mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
2159 lines
44 KiB
Plaintext
2159 lines
44 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: maps\mp\_challenges.gsc
|
|
* Game: Call of Duty: Black Ops 2
|
|
* Platform: PC
|
|
* Function Count: 87
|
|
* Decompile Time: 43 ms
|
|
* Timestamp: 10/28/2023 12:10:52 AM
|
|
*******************************************************************/
|
|
|
|
#include common_scripts/utility;
|
|
#include maps/mp/_utility;
|
|
|
|
//Function Number: 1
|
|
init()
|
|
{
|
|
if(!(IsDefined(level.challengescallbacks)))
|
|
{
|
|
level.challengescallbacks = [];
|
|
}
|
|
|
|
waittillframeend;
|
|
if(canprocesschallenges())
|
|
{
|
|
registerchallengescallback("playerKilled",::challengekills);
|
|
registerchallengescallback("gameEnd",::challengegameend);
|
|
registerchallengescallback("roundEnd",::challengeroundend);
|
|
}
|
|
|
|
level thread onplayerconnect();
|
|
foreach(team in level.teams)
|
|
{
|
|
initteamchallenges(team);
|
|
}
|
|
}
|
|
|
|
//Function Number: 2
|
|
addflyswatterstat(weapon,aircraft)
|
|
{
|
|
if(!(IsDefined(self.pers["flyswattercount"])))
|
|
{
|
|
self.pers["flyswattercount"] = 0;
|
|
}
|
|
|
|
self addweaponstat(weapon,"destroyed_aircraft",1);
|
|
self.pers["flyswattercount"]++;
|
|
if(self.pers["flyswattercount"] == 5)
|
|
{
|
|
self addweaponstat(weapon,"destroyed_5_aircraft",1);
|
|
}
|
|
|
|
if(IsDefined(aircraft) && IsDefined(aircraft.birthtime))
|
|
{
|
|
if(GetTime() - aircraft.birthtime < 20000)
|
|
{
|
|
self addweaponstat(weapon,"destroyed_aircraft_under20s",1);
|
|
}
|
|
}
|
|
|
|
if(!(IsDefined(self.destroyedaircrafttime)))
|
|
{
|
|
self.destroyedaircrafttime = [];
|
|
}
|
|
|
|
if(IsDefined(self.destroyedaircrafttime[weapon]) && GetTime() - self.destroyedaircrafttime[weapon] < 10000)
|
|
{
|
|
self addweaponstat(weapon,"destroyed_2aircraft_quickly",1);
|
|
self.destroyedaircrafttime[weapon] = undefined;
|
|
}
|
|
else
|
|
{
|
|
self.destroyedaircrafttime[weapon] = GetTime();
|
|
}
|
|
}
|
|
|
|
//Function Number: 3
|
|
canprocesschallenges()
|
|
{
|
|
/#
|
|
if(getdvarintdefault("scr_debug_challenges",0))
|
|
{
|
|
return 1;
|
|
}
|
|
#/
|
|
if(level.rankedmatch || level.wagermatch)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 4
|
|
initteamchallenges(team)
|
|
{
|
|
if(!(IsDefined(game["challenge"])))
|
|
{
|
|
game["challenge"] = [];
|
|
}
|
|
|
|
if(!(IsDefined(game["challenge"][team])))
|
|
{
|
|
game["challenge"][team] = [];
|
|
game["challenge"][team]["plantedBomb"] = 0;
|
|
game["challenge"][team]["destroyedBombSite"] = 0;
|
|
game["challenge"][team]["capturedFlag"] = 0;
|
|
}
|
|
|
|
game["challenge"][team]["allAlive"] = 1;
|
|
}
|
|
|
|
//Function Number: 5
|
|
registerchallengescallback(callback,func)
|
|
{
|
|
if(!(IsDefined(level.challengescallbacks[callback])))
|
|
{
|
|
level.challengescallbacks[callback] = [];
|
|
}
|
|
|
|
level.challengescallbacks[callback][level.challengescallbacks[callback].size] = func;
|
|
}
|
|
|
|
//Function Number: 6
|
|
dochallengecallback(callback,data)
|
|
{
|
|
if(!(IsDefined(level.challengescallbacks)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!(IsDefined(level.challengescallbacks[callback])))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(IsDefined(data))
|
|
{
|
|
for(i = 0;i < level.challengescallbacks[callback].size;i++)
|
|
{
|
|
thread [[ level.challengescallbacks[callback][i] ]](data);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(i = 0;i < level.challengescallbacks[callback].size;i++)
|
|
{
|
|
thread [[ level.challengescallbacks[callback][i] ]]();
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 7
|
|
onplayerconnect()
|
|
{
|
|
for(;;)
|
|
{
|
|
level waittill("connected",player);
|
|
player thread initchallengedata();
|
|
player thread spawnwatcher();
|
|
player thread monitorreloads();
|
|
}
|
|
}
|
|
|
|
//Function Number: 8
|
|
monitorreloads()
|
|
{
|
|
self endon("disconnect");
|
|
while(1)
|
|
{
|
|
self waittill("reload");
|
|
currentweapon = self getcurrentweapon();
|
|
if(currentweapon == "none")
|
|
{
|
|
continue;
|
|
}
|
|
|
|
time = GetTime();
|
|
self.lastreloadtime = time;
|
|
if(currentweapon == "crossbow_mp")
|
|
{
|
|
self.crossbowclipkillcount = 0;
|
|
}
|
|
|
|
if(weaponhasattachment(currentweapon,"dualclip"))
|
|
{
|
|
self thread reloadthenkill(currentweapon);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 9
|
|
reloadthenkill(reloadweapon)
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
self endon("reloadThenKillTimedOut");
|
|
self notify("reloadThenKillStart");
|
|
self endon("reloadThenKillStart");
|
|
self thread reloadthenkilltimeout(5);
|
|
for(;;)
|
|
{
|
|
self waittill("killed_enemy_player",time,weapon);
|
|
if(reloadweapon == weapon)
|
|
{
|
|
self addplayerstat("reload_then_kill_dualclip",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 10
|
|
reloadthenkilltimeout(time)
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
self endon("reloadThenKillStart");
|
|
wait(time);
|
|
self notify("reloadThenKillTimedOut");
|
|
}
|
|
|
|
//Function Number: 11
|
|
initchallengedata()
|
|
{
|
|
self.pers["bulletStreak"] = 0;
|
|
self.pers["lastBulletKillTime"] = 0;
|
|
self.pers["stickExplosiveKill"] = 0;
|
|
self.pers["carepackagesCalled"] = 0;
|
|
self.explosiveinfo = [];
|
|
}
|
|
|
|
//Function Number: 12
|
|
isdamagefromplayercontrolledaitank(eattacker,einflictor,sweapon)
|
|
{
|
|
if(sweapon == "ai_tank_drone_gun_mp")
|
|
{
|
|
if(IsDefined(eattacker) && IsDefined(eattacker.remoteweapon) && IsDefined(einflictor))
|
|
{
|
|
if(IsDefined(einflictor.controlled) && einflictor.controlled == 1)
|
|
{
|
|
if(eattacker.remoteweapon == einflictor)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(sweapon == "ai_tank_drone_rocket_mp")
|
|
{
|
|
if(IsDefined(einflictor) && !IsDefined(einflictor.from_ai))
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 13
|
|
isdamagefromplayercontrolledsentry(eattacker,einflictor,sweapon)
|
|
{
|
|
if(sweapon == "auto_gun_turret_mp")
|
|
{
|
|
if(IsDefined(eattacker) && IsDefined(eattacker.remoteweapon) && IsDefined(einflictor))
|
|
{
|
|
if(eattacker.remoteweapon == einflictor)
|
|
{
|
|
if(IsDefined(einflictor.controlled) && einflictor.controlled == 1)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 14
|
|
challengekills(data,time)
|
|
{
|
|
victim = data.victim;
|
|
player = data.attacker;
|
|
attacker = data.attacker;
|
|
time = data.time;
|
|
victim = data.victim;
|
|
weapon = data.sweapon;
|
|
time = data.time;
|
|
inflictor = data.einflictor;
|
|
meansofdeath = data.smeansofdeath;
|
|
wasplanting = data.wasplanting;
|
|
wasdefusing = data.wasdefusing;
|
|
lastweaponbeforetoss = data.lastweaponbeforetoss;
|
|
ownerweaponatlaunch = data.ownerweaponatlaunch;
|
|
if(!(IsDefined(data.sweapon)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!IsDefined(player) || !isplayer(player))
|
|
{
|
|
return;
|
|
}
|
|
|
|
weaponclass = getweaponclass(weapon);
|
|
game["challenge"][victim.team]["allAlive"] = 0;
|
|
if(level.teambased)
|
|
{
|
|
if(player.team == victim.team)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
else if(player == victim)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(isdamagefromplayercontrolledaitank(player,inflictor,weapon) == 1)
|
|
{
|
|
player addplayerstat("kill_with_remote_control_ai_tank",1);
|
|
}
|
|
|
|
if(weapon == "auto_gun_turret_mp")
|
|
{
|
|
if(IsDefined(inflictor))
|
|
{
|
|
if(!(IsDefined(inflictor.killcount)))
|
|
{
|
|
inflictor.killcount = 0;
|
|
}
|
|
|
|
inflictor.killcount++;
|
|
if(inflictor.killcount >= 5)
|
|
{
|
|
inflictor.killcount = 0;
|
|
player addplayerstat("killstreak_5_with_sentry_gun",1);
|
|
}
|
|
}
|
|
|
|
if(isdamagefromplayercontrolledsentry(player,inflictor,weapon) == 1)
|
|
{
|
|
player addplayerstat("kill_with_remote_control_sentry_gun",1);
|
|
}
|
|
}
|
|
|
|
if(weapon == "minigun_mp" || weapon == "inventory_minigun_mp")
|
|
{
|
|
player.deathmachinekills++;
|
|
if(player.deathmachinekills >= 5)
|
|
{
|
|
player.deathmachinekills = 0;
|
|
player addplayerstat("killstreak_5_with_death_machine",1);
|
|
}
|
|
}
|
|
|
|
if(data.waslockingon == 1 && weapon == "chopper_minigun_mp")
|
|
{
|
|
player addplayerstat("kill_enemy_locking_on_with_chopper_gunner",1);
|
|
}
|
|
|
|
if(IsDefined(level.iskillstreakweapon))
|
|
{
|
|
if([[ level.iskillstreakweapon ]](data.sweapon))
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
attacker notify("killed_enemy_player",time,weapon);
|
|
if((IsDefined(player.primaryloadoutweapon) && weapon == player.primaryloadoutweapon) || IsDefined(player.primaryloadoutaltweapon) && weapon == player.primaryloadoutaltweapon)
|
|
{
|
|
if(player isbonuscardactive(0,player.class_num))
|
|
{
|
|
player addbonuscardstat(0,"kills",1,player.class_num);
|
|
player addplayerstat("kill_with_loadout_weapon_with_3_attachments",1);
|
|
}
|
|
|
|
if(IsDefined(player.secondaryweaponkill) && player.secondaryweaponkill == 1)
|
|
{
|
|
player.primaryweaponkill = 0;
|
|
player.secondaryweaponkill = 0;
|
|
if(player isbonuscardactive(2,player.class_num))
|
|
{
|
|
player addbonuscardstat(2,"kills",1,player.class_num);
|
|
player addplayerstat("kill_with_both_primary_weapons",1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
player.primaryweaponkill = 1;
|
|
}
|
|
}
|
|
else if((IsDefined(player.secondaryloadoutweapon) && weapon == player.secondaryloadoutweapon) || IsDefined(player.secondaryloadoutaltweapon) && weapon == player.secondaryloadoutaltweapon)
|
|
{
|
|
if(player isbonuscardactive(1,player.class_num))
|
|
{
|
|
player addbonuscardstat(1,"kills",1,player.class_num);
|
|
}
|
|
|
|
if(IsDefined(player.primaryweaponkill) && player.primaryweaponkill == 1)
|
|
{
|
|
player.primaryweaponkill = 0;
|
|
player.secondaryweaponkill = 0;
|
|
if(player isbonuscardactive(2,player.class_num))
|
|
{
|
|
player addbonuscardstat(2,"kills",1,player.class_num);
|
|
player addplayerstat("kill_with_both_primary_weapons",1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
player.secondaryweaponkill = 1;
|
|
}
|
|
}
|
|
|
|
if(player isbonuscardactive(5,player.class_num) || player isbonuscardactive(4,player.class_num) || player isbonuscardactive(3,player.class_num))
|
|
{
|
|
player addplayerstat("kill_with_2_perks_same_category",1);
|
|
}
|
|
|
|
baseweaponname = getreffromitemindex(getbaseweaponitemindex(weapon)) + "_mp";
|
|
if(IsDefined(player.weaponkills[baseweaponname]))
|
|
{
|
|
player.weaponkills[baseweaponname]++;
|
|
if(player.weaponkills[baseweaponname] == 5)
|
|
{
|
|
player addweaponstat(baseweaponname,"killstreak_5",1);
|
|
}
|
|
|
|
if(player.weaponkills[baseweaponname] == 10)
|
|
{
|
|
player addweaponstat(baseweaponname,"killstreak_10",1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
player.weaponkills[baseweaponname] = 1;
|
|
}
|
|
|
|
attachmentname = player getweaponoptic(weapon);
|
|
if(IsDefined(attachmentname) && attachmentname != "")
|
|
{
|
|
if(IsDefined(player.attachmentkills[attachmentname]))
|
|
{
|
|
player.attachmentkills[attachmentname]++;
|
|
if(player.attachmentkills[attachmentname] == 5)
|
|
{
|
|
player addweaponstat(weapon,"killstreak_5_attachment",1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
player.attachmentkills[attachmentname] = 1;
|
|
}
|
|
}
|
|
|
|
/#
|
|
assert(IsDefined(player.activecounteruavs));
|
|
#/
|
|
/#
|
|
assert(IsDefined(player.activeuavs));
|
|
#/
|
|
/#
|
|
assert(IsDefined(player.activesatellites));
|
|
#/
|
|
if(player.activeuavs > 0)
|
|
{
|
|
player addplayerstat("kill_while_uav_active",1);
|
|
}
|
|
|
|
if(player.activecounteruavs > 0)
|
|
{
|
|
player addplayerstat("kill_while_cuav_active",1);
|
|
}
|
|
|
|
if(player.activesatellites > 0)
|
|
{
|
|
player addplayerstat("kill_while_satellite_active",1);
|
|
}
|
|
|
|
if(IsDefined(attacker.tacticalinsertiontime) && attacker.tacticalinsertiontime + 5000 > time)
|
|
{
|
|
player addplayerstat("kill_after_tac_insert",1);
|
|
player addweaponstat("tactical_insertion_mp","CombatRecordStat",1);
|
|
}
|
|
|
|
if(IsDefined(victim.tacticalinsertiontime) && victim.tacticalinsertiontime + 5000 > time)
|
|
{
|
|
player addweaponstat("tactical_insertion_mp","headshots",1);
|
|
}
|
|
|
|
if(IsDefined(level.isplayertrackedfunc))
|
|
{
|
|
if(attacker [[ level.isplayertrackedfunc ]](victim,time))
|
|
{
|
|
attacker addplayerstat("kill_enemy_revealed_by_sensor",1);
|
|
attacker addweaponstat("sensor_grenade_mp","CombatRecordStat",1);
|
|
}
|
|
}
|
|
|
|
if(level.teambased)
|
|
{
|
|
activeempowner = level.empowners[player.team];
|
|
if(IsDefined(activeempowner))
|
|
{
|
|
if(activeempowner == player)
|
|
{
|
|
player addplayerstat("kill_while_emp_active",1);
|
|
}
|
|
}
|
|
}
|
|
else if(IsDefined(level.empplayer))
|
|
{
|
|
if(level.empplayer == player)
|
|
{
|
|
player addplayerstat("kill_while_emp_active",1);
|
|
}
|
|
}
|
|
|
|
if(IsDefined(player.flakjacketclaymore[victim.clientid]) && player.flakjacketclaymore[victim.clientid] == 1)
|
|
{
|
|
player addplayerstat("survive_claymore_kill_planter_flak_jacket_equipped",1);
|
|
}
|
|
|
|
if(IsDefined(player.dogsactive))
|
|
{
|
|
if(weapon != "dog_bite_mp")
|
|
{
|
|
player.dogsactivekillstreak++;
|
|
if(player.dogsactivekillstreak > 5)
|
|
{
|
|
player addplayerstat("killstreak_5_dogs",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
isstunned = 0;
|
|
if(victim maps/mp/_utility::isflashbanged())
|
|
{
|
|
if(IsDefined(victim.lastflashedby) && victim.lastflashedby == player)
|
|
{
|
|
player addplayerstat("kill_flashed_enemy",1);
|
|
player addweaponstat("flash_grenade_mp","CombatRecordStat",1);
|
|
}
|
|
|
|
isstunned = 1;
|
|
}
|
|
|
|
if(IsDefined(victim.concussionendtime) && victim.concussionendtime > GetTime())
|
|
{
|
|
if(IsDefined(victim.lastconcussedby) && victim.lastconcussedby == player)
|
|
{
|
|
player addplayerstat("kill_concussed_enemy",1);
|
|
player addweaponstat("concussion_grenade_mp","CombatRecordStat",1);
|
|
}
|
|
|
|
isstunned = 1;
|
|
}
|
|
|
|
if(IsDefined(player.laststunnedby))
|
|
{
|
|
if(player.laststunnedby == victim && player.laststunnedtime + 5000 > time)
|
|
{
|
|
player addplayerstat("kill_enemy_who_shocked_you",1);
|
|
}
|
|
}
|
|
|
|
if(IsDefined(victim.laststunnedby) && victim.laststunnedtime + 5000 > time)
|
|
{
|
|
isstunned = 1;
|
|
if(victim.laststunnedby == player)
|
|
{
|
|
player addplayerstat("kill_shocked_enemy",1);
|
|
player addweaponstat("proximity_grenade_mp","CombatRecordStat",1);
|
|
if(data.smeansofdeath == "MOD_MELEE")
|
|
{
|
|
player addplayerstat("shock_enemy_then_stab_them",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(player.mantletime + 5000 > time)
|
|
{
|
|
player addplayerstat("mantle_then_kill",1);
|
|
}
|
|
|
|
if(IsDefined(player.tookweaponfrom) && IsDefined(player.tookweaponfrom[weapon]) && IsDefined(player.tookweaponfrom[weapon].previousowner))
|
|
{
|
|
if(level.teambased)
|
|
{
|
|
if(player.tookweaponfrom[weapon].previousowner.team != player.team)
|
|
{
|
|
player.pickedupweaponkills[weapon]++;
|
|
player addplayerstat("kill_enemy_with_picked_up_weapon",1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
player.pickedupweaponkills[weapon]++;
|
|
player addplayerstat("kill_enemy_with_picked_up_weapon",1);
|
|
}
|
|
|
|
if(player.pickedupweaponkills[weapon] >= 5)
|
|
{
|
|
player.pickedupweaponkills[weapon] = 0;
|
|
player addplayerstat("killstreak_5_picked_up_weapon",1);
|
|
}
|
|
}
|
|
|
|
if(IsDefined(victim.explosiveinfo["originalOwnerKill"]) && victim.explosiveinfo["originalOwnerKill"] == 1)
|
|
{
|
|
if(victim.explosiveinfo["damageExplosiveKill"] == 1)
|
|
{
|
|
player addplayerstat("kill_enemy_shoot_their_explosive",1);
|
|
}
|
|
}
|
|
|
|
if(data.attackerstance == "crouch")
|
|
{
|
|
player addplayerstat("kill_enemy_while_crouched",1);
|
|
}
|
|
else if(data.attackerstance == "prone")
|
|
{
|
|
player addplayerstat("kill_enemy_while_prone",1);
|
|
}
|
|
|
|
if(data.victimstance == "prone")
|
|
{
|
|
player addplayerstat("kill_prone_enemy",1);
|
|
}
|
|
|
|
if(data.smeansofdeath == "MOD_HEAD_SHOT" || data.smeansofdeath == "MOD_PISTOL_BULLET" || data.smeansofdeath == "MOD_RIFLE_BULLET")
|
|
{
|
|
player genericbulletkill(data,victim,weapon);
|
|
}
|
|
|
|
if(level.teambased)
|
|
{
|
|
if(!IsDefined(player.pers["kill_every_enemy"]) && level.playercount[victim.pers["team"]] > 3 && player.pers["killed_players"].size >= level.playercount[victim.pers["team"]])
|
|
{
|
|
player addplayerstat("kill_every_enemy",1);
|
|
player.pers["kill_every_enemy"] = 1;
|
|
}
|
|
}
|
|
|
|
switch(weaponclass)
|
|
{
|
|
case "weapon_pistol":
|
|
player.pers["pistolHeadshot"]++;
|
|
player.pers["pistolHeadshot"] = 0;
|
|
player addplayerstat("pistolHeadshot_10_onegame",1);
|
|
break;
|
|
player.pers["pistolHeadshot"] >= 10
|
|
data.smeansofdeath == "MOD_HEAD_SHOT"
|
|
break;
|
|
|
|
case "weapon_assault":
|
|
player.pers["assaultRifleHeadshot"]++;
|
|
player.pers["assaultRifleHeadshot"] = 0;
|
|
player addplayerstat("headshot_assault_5_onegame",1);
|
|
break;
|
|
player.pers["assaultRifleHeadshot"] >= 5
|
|
data.smeansofdeath == "MOD_HEAD_SHOT"
|
|
break;
|
|
|
|
case "weapon_lmg":
|
|
case "weapon_smg":
|
|
break;
|
|
|
|
case "weapon_sniper":
|
|
player addplayerstat("kill_enemy_one_bullet_sniper",1);
|
|
player addweaponstat(weapon,"kill_enemy_one_bullet_sniper",1);
|
|
player.pers["one_shot_sniper_kills"] = 0;
|
|
player.pers["one_shot_sniper_kills"]++;
|
|
player addplayerstat("kill_10_enemy_one_bullet_sniper_onegame",1);
|
|
break;
|
|
player.pers["one_shot_sniper_kills"] == 10
|
|
IsDefined(player.pers["one_shot_sniper_kills"])
|
|
IsDefined(victim.firsttimedamaged) && victim.firsttimedamaged == time
|
|
break;
|
|
|
|
case "weapon_cqb":
|
|
player addplayerstat("kill_enemy_one_bullet_shotgun",1);
|
|
player addweaponstat(weapon,"kill_enemy_one_bullet_shotgun",1);
|
|
player.pers["one_shot_shotgun_kills"] = 0;
|
|
player.pers["one_shot_shotgun_kills"]++;
|
|
player addplayerstat("kill_10_enemy_one_bullet_shotgun_onegame",1);
|
|
break;
|
|
player.pers["one_shot_shotgun_kills"] == 10
|
|
IsDefined(player.pers["one_shot_shotgun_kills"])
|
|
IsDefined(victim.firsttimedamaged) && victim.firsttimedamaged == time
|
|
break;
|
|
}
|
|
|
|
if(data.smeansofdeath == "MOD_MELEE")
|
|
{
|
|
if(weaponhasattachment(weapon,"tacknife"))
|
|
{
|
|
player addplayerstat("kill_enemy_with_tacknife",1);
|
|
player bladekill();
|
|
}
|
|
else if(weapon == "knife_ballistic_mp")
|
|
{
|
|
player bladekill();
|
|
player addweaponstat(weapon,"ballistic_knife_melee",1);
|
|
}
|
|
else if(weapon == "knife_held_mp" || weapon == "knife_mp")
|
|
{
|
|
player bladekill();
|
|
}
|
|
else if(weapon == "riotshield_mp")
|
|
{
|
|
if(victim.lastfiretime + 3000 > time)
|
|
{
|
|
player addweaponstat(weapon,"shield_melee_while_enemy_shooting",1);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(data.smeansofdeath == "MOD_IMPACT" && baseweaponname == "crossbow_mp")
|
|
{
|
|
if(weaponhasattachment(weapon,"stackfire"))
|
|
{
|
|
player addplayerstat("KILL_CROSSBOW_STACKFIRE",1);
|
|
}
|
|
}
|
|
else if(IsDefined(ownerweaponatlaunch))
|
|
{
|
|
if(weaponhasattachment(ownerweaponatlaunch,"stackfire"))
|
|
{
|
|
player addplayerstat("KILL_CROSSBOW_STACKFIRE",1);
|
|
}
|
|
}
|
|
|
|
if(weapon == "knife_ballistic_mp")
|
|
{
|
|
player bladekill();
|
|
if(IsDefined(player.retreivedblades) && player.retreivedblades > 0)
|
|
{
|
|
player.retreivedblades--;
|
|
player addweaponstat(weapon,"kill_retrieved_blade",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
lethalgrenadekill = 0;
|
|
switch(weapon)
|
|
{
|
|
case "bouncingbetty_mp":
|
|
lethalgrenadekill = 1;
|
|
player notify("lethalGrenadeKill");
|
|
break;
|
|
|
|
case "hatchet_mp":
|
|
player bladekill();
|
|
lethalgrenadekill = 1;
|
|
player notify("lethalGrenadeKill");
|
|
player addweaponstat(level.riotshield_name,"hatchet_kill_with_shield_equiped",1);
|
|
player addplayerstat("hatchet_kill_with_shield_equiped",1);
|
|
break;
|
|
lastweaponbeforetoss == level.riotshield_name
|
|
IsDefined(lastweaponbeforetoss)
|
|
break;
|
|
|
|
case "claymore_mp":
|
|
lethalgrenadekill = 1;
|
|
player notify("lethalGrenadeKill");
|
|
player addplayerstat("kill_with_claymore",1);
|
|
player addplayerstat("kill_with_hacked_claymore",1);
|
|
break;
|
|
data.washacked
|
|
break;
|
|
|
|
case "satchel_charge_mp":
|
|
lethalgrenadekill = 1;
|
|
player notify("lethalGrenadeKill");
|
|
player addplayerstat("kill_with_c4",1);
|
|
break;
|
|
|
|
case "destructible_car_mp":
|
|
player addplayerstat("kill_enemy_withcar",1);
|
|
player addweaponstat(inflictor.destroyingweapon,"kills_from_cars",1);
|
|
break;
|
|
IsDefined(inflictor.destroyingweapon)
|
|
break;
|
|
|
|
case "sticky_grenade_mp":
|
|
lethalgrenadekill = 1;
|
|
player notify("lethalGrenadeKill");
|
|
attacker.pers["stickExplosiveKill"]++;
|
|
attacker.pers["stickExplosiveKill"] = 0;
|
|
player addplayerstat("stick_explosive_kill_5_onegame",1);
|
|
break;
|
|
attacker.pers["stickExplosiveKill"] >= 5
|
|
IsDefined(victim.explosiveinfo["stuckToPlayer"]) && victim.explosiveinfo["stuckToPlayer"] == victim
|
|
break;
|
|
|
|
case "frag_grenade_mp":
|
|
lethalgrenadekill = 1;
|
|
player notify("lethalGrenadeKill");
|
|
player addplayerstat("kill_with_cooked_grenade",1);
|
|
player addplayerstat("kill_with_tossed_back_lethal",1);
|
|
break;
|
|
IsDefined(data.victim.explosiveinfo["throwbackKill"]) && data.victim.explosiveinfo["throwbackKill"] == 1
|
|
IsDefined(data.victim.explosiveinfo["cookedKill"]) && data.victim.explosiveinfo["cookedKill"] == 1
|
|
break;
|
|
|
|
case "crossbow_mp":
|
|
case "explosive_bolt_mp":
|
|
player.crossbowclipkillcount = 0;
|
|
player.crossbowclipkillcount++;
|
|
player.crossbowclipkillcount = 0;
|
|
player addweaponstat("crossbow_mp","crossbow_kill_clip",1);
|
|
break;
|
|
player.crossbowclipkillcount >= weaponclipsize("crossbow_mp")
|
|
IsDefined(player.crossbowclipkillcount)
|
|
break;
|
|
}
|
|
|
|
if(lethalgrenadekill)
|
|
{
|
|
if(player isbonuscardactive(6,player.class_num))
|
|
{
|
|
player addbonuscardstat(6,"kills",1,player.class_num);
|
|
if(!(IsDefined(player.pers["dangerCloseKills"])))
|
|
{
|
|
player.pers["dangerCloseKills"] = 0;
|
|
}
|
|
|
|
player.pers["dangerCloseKills"]++;
|
|
if(player.pers["dangerCloseKills"] == 5)
|
|
{
|
|
player addplayerstat("kill_with_dual_lethal_grenades",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
player perkkills(victim,isstunned,time);
|
|
}
|
|
|
|
//Function Number: 15
|
|
perkkills(victim,isstunned,time)
|
|
{
|
|
player = self;
|
|
if(player hasperk("specialty_movefaster"))
|
|
{
|
|
player addplayerstat("perk_movefaster_kills",1);
|
|
}
|
|
|
|
if(player hasperk("specialty_noname"))
|
|
{
|
|
player addplayerstat("perk_noname_kills",1);
|
|
}
|
|
|
|
if(player hasperk("specialty_quieter"))
|
|
{
|
|
player addplayerstat("perk_quieter_kills",1);
|
|
}
|
|
|
|
if(player hasperk("specialty_longersprint"))
|
|
{
|
|
if(IsDefined(player.lastsprinttime) && GetTime() - player.lastsprinttime < 2500)
|
|
{
|
|
player addplayerstat("perk_longersprint",1);
|
|
}
|
|
}
|
|
|
|
if(player hasperk("specialty_fastmantle"))
|
|
{
|
|
if(IsDefined(player.lastsprinttime) && GetTime() - player.lastsprinttime < 2500 && player playerads() >= 1)
|
|
{
|
|
player addplayerstat("perk_fastmantle_kills",1);
|
|
}
|
|
}
|
|
|
|
if(player hasperk("specialty_loudenemies"))
|
|
{
|
|
player addplayerstat("perk_loudenemies_kills",1);
|
|
}
|
|
|
|
if(isstunned == 1 && player hasperk("specialty_stunprotection"))
|
|
{
|
|
player addplayerstat("perk_protection_stun_kills",1);
|
|
}
|
|
|
|
/#
|
|
assert(IsDefined(victim.activecounteruavs));
|
|
#/
|
|
activeemp = 0;
|
|
if(level.teambased)
|
|
{
|
|
foreach(team in level.teams)
|
|
{
|
|
if(team == player.team)
|
|
{
|
|
}
|
|
else if(IsDefined(level.empowners[team]))
|
|
{
|
|
activeemp = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if(IsDefined(level.empplayer))
|
|
{
|
|
if(level.empplayer != player)
|
|
{
|
|
activeemp = 1;
|
|
}
|
|
}
|
|
|
|
activecuav = 0;
|
|
if(level.teambased)
|
|
{
|
|
foreach(team in level.teams)
|
|
{
|
|
if(team == player.team)
|
|
{
|
|
}
|
|
else if(level.activecounteruavs[team] > 0)
|
|
{
|
|
activecuav = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
players = level.players;
|
|
for(i = 0;i < players.size;i++)
|
|
{
|
|
if(players[i] != player)
|
|
{
|
|
if(IsDefined(level.activecounteruavs[players[i].entnum]) && level.activecounteruavs[players[i].entnum] > 0)
|
|
{
|
|
activecuav = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(activecuav == 1 || activeemp == 1)
|
|
{
|
|
if(player hasperk("specialty_immunecounteruav"))
|
|
{
|
|
player addplayerstat("perk_immune_cuav_kills",1);
|
|
}
|
|
}
|
|
|
|
activeuavvictim = 0;
|
|
if(level.teambased)
|
|
{
|
|
if(level.activeuavs[victim.team] > 0)
|
|
{
|
|
activeuavvictim = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
activeuavvictim = IsDefined(level.activeuavs[victim.entnum]) && level.activeuavs[victim.entnum] > 0;
|
|
}
|
|
|
|
if(activeuavvictim == 1)
|
|
{
|
|
if(player hasperk("specialty_gpsjammer"))
|
|
{
|
|
player addplayerstat("perk_gpsjammer_immune_kills",1);
|
|
}
|
|
}
|
|
|
|
if(player.lastweaponchange + 5000 > time)
|
|
{
|
|
if(player hasperk("specialty_fastweaponswitch"))
|
|
{
|
|
player addplayerstat("perk_fastweaponswitch_kill_after_swap",1);
|
|
}
|
|
}
|
|
|
|
if(player.scavenged == 1)
|
|
{
|
|
if(player hasperk("specialty_scavenger"))
|
|
{
|
|
player addplayerstat("perk_scavenger_kills_after_resupply",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 16
|
|
flakjacketprotected(weapon,attacker)
|
|
{
|
|
if(weapon == "claymore_mp")
|
|
{
|
|
self.flakjacketclaymore[attacker.clientid] = 1;
|
|
}
|
|
|
|
self addplayerstat("perk_flak_survive",1);
|
|
}
|
|
|
|
//Function Number: 17
|
|
earnedkillstreak()
|
|
{
|
|
if(self hasperk("specialty_earnmoremomentum"))
|
|
{
|
|
self addplayerstat("perk_earnmoremomentum_earn_streak",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 18
|
|
genericbulletkill(data,victim,weapon)
|
|
{
|
|
player = self;
|
|
time = data.time;
|
|
if(player.pers["lastBulletKillTime"] == time)
|
|
{
|
|
player.pers["bulletStreak"]++;
|
|
}
|
|
else
|
|
{
|
|
player.pers["bulletStreak"] = 1;
|
|
}
|
|
|
|
player.pers["lastBulletKillTime"] = time;
|
|
if(data.victim.idflagstime == time)
|
|
{
|
|
if(data.victim.idflags & level.idflags_penetration)
|
|
{
|
|
player addplayerstat("kill_enemy_through_wall",1);
|
|
if(IsDefined(weapon) && weaponhasattachment(weapon,"fmj"))
|
|
{
|
|
player addplayerstat("kill_enemy_through_wall_with_fmj",1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 19
|
|
ishighestscoringplayer(player)
|
|
{
|
|
if(!IsDefined(player.score) || player.score < 1)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
players = level.players;
|
|
if(level.teambased)
|
|
{
|
|
team = player.pers["team"];
|
|
}
|
|
else
|
|
{
|
|
team = "all";
|
|
}
|
|
|
|
highscore = player.score;
|
|
for(i = 0;i < players.size;i++)
|
|
{
|
|
if(!(IsDefined(players[i].score)))
|
|
{
|
|
}
|
|
else if(players[i] == player)
|
|
{
|
|
}
|
|
else if(players[i].score < 1)
|
|
{
|
|
}
|
|
else if(team != "all" && players[i].pers["team"] != team)
|
|
{
|
|
}
|
|
else if(players[i].score >= highscore)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 20
|
|
spawnwatcher()
|
|
{
|
|
self endon("disconnect");
|
|
self.pers["stickExplosiveKill"] = 0;
|
|
self.pers["pistolHeadshot"] = 0;
|
|
self.pers["assaultRifleHeadshot"] = 0;
|
|
self.pers["killNemesis"] = 0;
|
|
while(1)
|
|
{
|
|
self waittill("spawned_player");
|
|
self.pers["longshotsPerLife"] = 0;
|
|
self.flakjacketclaymore = [];
|
|
self.weaponkills = [];
|
|
self.attachmentkills = [];
|
|
self.retreivedblades = 0;
|
|
self.lastreloadtime = 0;
|
|
self.crossbowclipkillcount = 0;
|
|
self thread watchfordtp();
|
|
self thread watchformantle();
|
|
self thread monitor_player_sprint();
|
|
}
|
|
}
|
|
|
|
//Function Number: 21
|
|
pickedupballisticknife()
|
|
{
|
|
self.retreivedblades++;
|
|
}
|
|
|
|
//Function Number: 22
|
|
watchfordtp()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
self.dtptime = 0;
|
|
while(1)
|
|
{
|
|
self waittill("dtp_end");
|
|
self.dtptime = GetTime() + 4000;
|
|
}
|
|
}
|
|
|
|
//Function Number: 23
|
|
watchformantle()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
self.mantletime = 0;
|
|
while(1)
|
|
{
|
|
self waittill("mantle_start",mantleendtime);
|
|
self.mantletime = mantleendtime;
|
|
}
|
|
}
|
|
|
|
//Function Number: 24
|
|
disarmedhackedcarepackage()
|
|
{
|
|
self addplayerstat("disarm_hacked_carepackage",1);
|
|
}
|
|
|
|
//Function Number: 25
|
|
destroyed_car()
|
|
{
|
|
if(!IsDefined(self) || !isplayer(self))
|
|
{
|
|
return;
|
|
}
|
|
|
|
self addplayerstat("destroy_car",1);
|
|
}
|
|
|
|
//Function Number: 26
|
|
killednemesis()
|
|
{
|
|
self.pers["killNemesis"]++;
|
|
if(self.pers["killNemesis"] >= 5)
|
|
{
|
|
self.pers["killNemesis"] = 0;
|
|
self addplayerstat("kill_nemesis",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 27
|
|
killwhiledamagingwithhpm()
|
|
{
|
|
self addplayerstat("kill_while_damaging_with_microwave_turret",1);
|
|
}
|
|
|
|
//Function Number: 28
|
|
longdistancehatchetkill()
|
|
{
|
|
self addplayerstat("long_distance_hatchet_kill",1);
|
|
}
|
|
|
|
//Function Number: 29
|
|
blockedsatellite()
|
|
{
|
|
self addplayerstat("activate_cuav_while_enemy_satelite_active",1);
|
|
}
|
|
|
|
//Function Number: 30
|
|
longdistancekill()
|
|
{
|
|
self.pers["longshotsPerLife"]++;
|
|
if(self.pers["longshotsPerLife"] >= 3)
|
|
{
|
|
self.pers["longshotsPerLife"] = 0;
|
|
self addplayerstat("longshot_3_onelife",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 31
|
|
challengeroundend(data)
|
|
{
|
|
player = data.player;
|
|
winner = data.winner;
|
|
if(endedearly(winner))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(level.teambased)
|
|
{
|
|
winnerscore = game["teamScores"][winner];
|
|
loserscore = getlosersteamscores(winner);
|
|
}
|
|
|
|
switch(level.gametype)
|
|
{
|
|
case "sd":
|
|
player addgametypestat("round_win_no_deaths",1);
|
|
player addgametypestat("last_man_defeat_3_enemies",1);
|
|
break;
|
|
IsDefined(player.lastmansddefeat3enemies)
|
|
game["challenge"][winner]["allAlive"]
|
|
player.team == winner
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Function Number: 32
|
|
roundend(winner)
|
|
{
|
|
wait(0.05);
|
|
data = spawnstruct();
|
|
data.time = GetTime();
|
|
if(level.teambased)
|
|
{
|
|
if(IsDefined(winner) && IsDefined(level.teams[winner]))
|
|
{
|
|
data.winner = winner;
|
|
}
|
|
}
|
|
else if(IsDefined(winner))
|
|
{
|
|
data.winner = winner;
|
|
}
|
|
|
|
for(index = 0;index < level.placement["all"].size;index++)
|
|
{
|
|
data.player = level.placement["all"][index];
|
|
data.place = index;
|
|
dochallengecallback("roundEnd",data);
|
|
}
|
|
}
|
|
|
|
//Function Number: 33
|
|
gameend(winner)
|
|
{
|
|
wait(0.05);
|
|
data = spawnstruct();
|
|
data.time = GetTime();
|
|
if(level.teambased)
|
|
{
|
|
if(IsDefined(winner) && IsDefined(level.teams[winner]))
|
|
{
|
|
data.winner = winner;
|
|
}
|
|
}
|
|
else if(IsDefined(winner) && isplayer(winner))
|
|
{
|
|
data.winner = winner;
|
|
}
|
|
|
|
for(index = 0;index < level.placement["all"].size;index++)
|
|
{
|
|
data.player = level.placement["all"][index];
|
|
data.place = index;
|
|
dochallengecallback("gameEnd",data);
|
|
}
|
|
}
|
|
|
|
//Function Number: 34
|
|
getfinalkill(player)
|
|
{
|
|
if(isplayer(player))
|
|
{
|
|
player addplayerstat("get_final_kill",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 35
|
|
destroyrcbomb(weaponname)
|
|
{
|
|
self destroyscorestreak(weaponname);
|
|
if(weaponname == "hatchet_mp")
|
|
{
|
|
self addplayerstat("destroy_rcbomb_with_hatchet",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 36
|
|
capturedcrate()
|
|
{
|
|
if(IsDefined(self.lastrescuedby) && IsDefined(self.lastrescuedtime))
|
|
{
|
|
if(self.lastrescuedtime + 5000 > GetTime())
|
|
{
|
|
self.lastrescuedby addplayerstat("defend_teammate_who_captured_package",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 37
|
|
destroyscorestreak(weaponname)
|
|
{
|
|
if(IsDefined(weaponname) && weaponname == "qrdrone_turret_mp")
|
|
{
|
|
self addplayerstat("destroy_score_streak_with_qrdrone",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 38
|
|
capturedobjective(capturetime)
|
|
{
|
|
if(IsDefined(self.smokegrenadetime) && IsDefined(self.smokegrenadeposition))
|
|
{
|
|
if(self.smokegrenadetime + 14000 > capturetime)
|
|
{
|
|
distsq = distancesquared(self.smokegrenadeposition,self.origin);
|
|
if(distsq < 57600)
|
|
{
|
|
self addplayerstat("capture_objective_in_smoke",1);
|
|
self addweaponstat("willy_pete_mp","CombatRecordStat",1);
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 39
|
|
hackedordestroyedequipment()
|
|
{
|
|
if(self hasperk("specialty_showenemyequipment"))
|
|
{
|
|
self addplayerstat("perk_hacker_destroy",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 40
|
|
destroyedequipment(weaponname)
|
|
{
|
|
if(IsDefined(weaponname) && weaponname == "emp_grenade_mp")
|
|
{
|
|
self addplayerstat("destroy_equipment_with_emp_grenade",1);
|
|
self addweaponstat("emp_grenade_mp","combatRecordStat",1);
|
|
}
|
|
|
|
self addplayerstat("destroy_equipment",1);
|
|
self hackedordestroyedequipment();
|
|
}
|
|
|
|
//Function Number: 41
|
|
destroyedtacticalinsert()
|
|
{
|
|
if(!(IsDefined(self.pers["tacticalInsertsDestroyed"])))
|
|
{
|
|
self.pers["tacticalInsertsDestroyed"] = 0;
|
|
}
|
|
|
|
self.pers["tacticalInsertsDestroyed"]++;
|
|
if(self.pers["tacticalInsertsDestroyed"] >= 5)
|
|
{
|
|
self.pers["tacticalInsertsDestroyed"] = 0;
|
|
self addplayerstat("destroy_5_tactical_inserts",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 42
|
|
bladekill()
|
|
{
|
|
if(!(IsDefined(self.pers["bladeKills"])))
|
|
{
|
|
self.pers["bladeKills"] = 0;
|
|
}
|
|
|
|
self.pers["bladeKills"]++;
|
|
if(self.pers["bladeKills"] >= 15)
|
|
{
|
|
self.pers["bladeKills"] = 0;
|
|
self addplayerstat("kill_15_with_blade",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 43
|
|
destroyedexplosive(weaponname)
|
|
{
|
|
self destroyedequipment(weaponname);
|
|
self addplayerstat("destroy_explosive",1);
|
|
}
|
|
|
|
//Function Number: 44
|
|
assisted()
|
|
{
|
|
self addplayerstat("assist",1);
|
|
}
|
|
|
|
//Function Number: 45
|
|
earnedmicrowaveassistscore(score)
|
|
{
|
|
self addplayerstat("assist_score_microwave_turret",score);
|
|
self addplayerstat("assist_score_killstreak",score);
|
|
}
|
|
|
|
//Function Number: 46
|
|
earnedcuavassistscore(score)
|
|
{
|
|
self addplayerstat("assist_score_cuav",score);
|
|
self addplayerstat("assist_score_killstreak",score);
|
|
self addweaponstat("counteruav_mp","assists",1);
|
|
}
|
|
|
|
//Function Number: 47
|
|
earneduavassistscore(score)
|
|
{
|
|
self addplayerstat("assist_score_uav",score);
|
|
self addplayerstat("assist_score_killstreak",score);
|
|
self addweaponstat("radar_mp","assists",1);
|
|
}
|
|
|
|
//Function Number: 48
|
|
earnedsatelliteassistscore(score)
|
|
{
|
|
self addplayerstat("assist_score_satellite",score);
|
|
self addplayerstat("assist_score_killstreak",score);
|
|
self addweaponstat("radardirection_mp","assists",1);
|
|
}
|
|
|
|
//Function Number: 49
|
|
earnedempassistscore(score)
|
|
{
|
|
self addplayerstat("assist_score_emp",score);
|
|
self addplayerstat("assist_score_killstreak",score);
|
|
self addweaponstat("emp_mp","assists",1);
|
|
}
|
|
|
|
//Function Number: 50
|
|
teamcompletedchallenge(team,challenge)
|
|
{
|
|
players = get_players();
|
|
for(i = 0;i < players.size;i++)
|
|
{
|
|
if(IsDefined(players[i].team) && players[i].team == team)
|
|
{
|
|
players[i] addgametypestat(challenge,1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 51
|
|
endedearly(winner)
|
|
{
|
|
if(level.hostforcedend)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(winner)))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(level.teambased)
|
|
{
|
|
if(winner == "tie")
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 52
|
|
getlosersteamscores(winner)
|
|
{
|
|
teamscores = 0;
|
|
foreach(team in level.teams)
|
|
{
|
|
if(team == winner)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
teamscores = teamscores + game["teamScores"][team];
|
|
}
|
|
}
|
|
|
|
return teamscores;
|
|
}
|
|
|
|
//Function Number: 53
|
|
didloserfailchallenge(winner,challenge)
|
|
{
|
|
foreach(team in level.teams)
|
|
{
|
|
if(team == winner)
|
|
{
|
|
}
|
|
else if(game["challenge"][team][challenge])
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 54
|
|
challengegameend(data)
|
|
{
|
|
player = data.player;
|
|
winner = data.winner;
|
|
if(IsDefined(level.scoreeventgameendcallback))
|
|
{
|
|
[[ level.scoreeventgameendcallback ]](data);
|
|
}
|
|
|
|
if(endedearly(winner))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(level.teambased)
|
|
{
|
|
winnerscore = game["teamScores"][winner];
|
|
loserscore = getlosersteamscores(winner);
|
|
}
|
|
|
|
switch(level.gametype)
|
|
{
|
|
case "tdm":
|
|
player addgametypestat("CRUSH",1);
|
|
mostkillsleastdeaths = 1;
|
|
index = 0;
|
|
for(;;)
|
|
{
|
|
mostkillsleastdeaths = 0;
|
|
mostkillsleastdeaths = 0;
|
|
index++;
|
|
}
|
|
|
|
player addgametypestat("most_kills_least_deaths",1);
|
|
break;
|
|
mostkillsleastdeaths && player.kills > 0 && level.placement["all"].size > 3
|
|
level.placement["all"][index].kills > player.kills
|
|
level.placement["all"][index].deaths < player.deaths
|
|
index < level.placement["all"].size
|
|
winnerscore >= loserscore + 20
|
|
player.team == winner
|
|
break;
|
|
|
|
case "dm":
|
|
secondplace = level.placement["all"][1];
|
|
player addgametypestat("CRUSH",1);
|
|
break;
|
|
player.kills >= secondplace.kills + 7
|
|
level.placement["all"].size >= 2
|
|
player == winner
|
|
break;
|
|
|
|
case "ctf":
|
|
player addgametypestat("SHUT_OUT",1);
|
|
break;
|
|
loserscore == 0
|
|
player.team == winner
|
|
break;
|
|
|
|
case "dom":
|
|
player addgametypestat("CRUSH",1);
|
|
break;
|
|
winnerscore >= loserscore + 70
|
|
player.team == winner
|
|
break;
|
|
|
|
case "hq":
|
|
player addgametypestat("CRUSH",1);
|
|
break;
|
|
winnerscore >= loserscore + 70
|
|
player.team == winner && winnerscore > 0
|
|
break;
|
|
|
|
case "koth":
|
|
player addgametypestat("CRUSH",1);
|
|
player addgametypestat("ANNIHILATION",1);
|
|
break;
|
|
winnerscore >= loserscore + 110
|
|
player.team == winner && winnerscore > 0
|
|
winnerscore >= loserscore + 70
|
|
player.team == winner && winnerscore > 0
|
|
break;
|
|
|
|
case "dem":
|
|
player addgametypestat("SHUT_OUT",1);
|
|
break;
|
|
loserscore == 0
|
|
player.team == game["defenders"] && player.team == winner
|
|
break;
|
|
|
|
case "sd":
|
|
player addgametypestat("CRUSH",1);
|
|
loserscore <= 1
|
|
player.team == winner
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Function Number: 55
|
|
multikill(killcount,weapon)
|
|
{
|
|
if(killcount >= 3 && IsDefined(self.lastkillwheninjured))
|
|
{
|
|
if(self.lastkillwheninjured + 5000 > GetTime())
|
|
{
|
|
self addplayerstat("multikill_3_near_death",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 56
|
|
domattackermultikill(killcount)
|
|
{
|
|
self addgametypestat("kill_2_enemies_capturing_your_objective",1);
|
|
}
|
|
|
|
//Function Number: 57
|
|
totaldomination(team)
|
|
{
|
|
teamcompletedchallenge(team,"control_3_points_3_minutes");
|
|
}
|
|
|
|
//Function Number: 58
|
|
holdflagentirematch(team,label)
|
|
{
|
|
switch(label)
|
|
{
|
|
case "_a":
|
|
event = "hold_a_entire_match";
|
|
break;
|
|
|
|
case "_b":
|
|
event = "hold_b_entire_match";
|
|
break;
|
|
|
|
case "_c":
|
|
event = "hold_c_entire_match";
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
teamcompletedchallenge(team,event);
|
|
}
|
|
|
|
//Function Number: 59
|
|
capturedbfirstminute()
|
|
{
|
|
self addgametypestat("capture_b_first_minute",1);
|
|
}
|
|
|
|
//Function Number: 60
|
|
controlzoneentirely(team)
|
|
{
|
|
teamcompletedchallenge(team,"control_zone_entirely");
|
|
}
|
|
|
|
//Function Number: 61
|
|
multi_lmg_smg_kill()
|
|
{
|
|
self addplayerstat("multikill_3_lmg_or_smg_hip_fire",1);
|
|
}
|
|
|
|
//Function Number: 62
|
|
killedzoneattacker(weapon)
|
|
{
|
|
if(weapon == "planemortar_mp" || weapon == "remote_missile_missile_mp" || weapon == "remote_missile_bomblet_mp")
|
|
{
|
|
self thread updatezonemultikills();
|
|
}
|
|
}
|
|
|
|
//Function Number: 63
|
|
killeddog()
|
|
{
|
|
origin = self.origin;
|
|
if(level.teambased)
|
|
{
|
|
teammates = get_team_alive_players_s(self.team);
|
|
foreach(player in teammates.a)
|
|
{
|
|
if(player == self)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
distsq = distancesquared(origin,player.origin);
|
|
if(distsq < 57600)
|
|
{
|
|
self addplayerstat("killed_dog_close_to_teammate",1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 64
|
|
updatezonemultikills()
|
|
{
|
|
self endon("disconnect");
|
|
level endon("game_ended");
|
|
self notify("updateRecentZoneKills");
|
|
self endon("updateRecentZoneKills");
|
|
if(!(IsDefined(self.recentzonekillcount)))
|
|
{
|
|
self.recentzonekillcount = 0;
|
|
}
|
|
|
|
self.recentzonekillcount++;
|
|
wait(4);
|
|
if(self.recentzonekillcount > 1)
|
|
{
|
|
self addplayerstat("multikill_2_zone_attackers",1);
|
|
}
|
|
|
|
self.recentzonekillcount = 0;
|
|
}
|
|
|
|
//Function Number: 65
|
|
multi_rcbomb_kill()
|
|
{
|
|
self addplayerstat("muiltikill_2_with_rcbomb",1);
|
|
}
|
|
|
|
//Function Number: 66
|
|
multi_remotemissile_kill()
|
|
{
|
|
self addplayerstat("multikill_3_remote_missile",1);
|
|
}
|
|
|
|
//Function Number: 67
|
|
multi_mgl_kill()
|
|
{
|
|
self addplayerstat("multikill_3_with_mgl",1);
|
|
}
|
|
|
|
//Function Number: 68
|
|
immediatecapture()
|
|
{
|
|
self addgametypestat("immediate_capture",1);
|
|
}
|
|
|
|
//Function Number: 69
|
|
killedlastcontester()
|
|
{
|
|
self addgametypestat("contest_then_capture",1);
|
|
}
|
|
|
|
//Function Number: 70
|
|
bothbombsdetonatewithintime()
|
|
{
|
|
self addgametypestat("both_bombs_detonate_10_seconds",1);
|
|
}
|
|
|
|
//Function Number: 71
|
|
fullclipnomisses(weaponclass,weapon)
|
|
{
|
|
}
|
|
|
|
//Function Number: 72
|
|
destroyedturret(weaponname)
|
|
{
|
|
self destroyscorestreak(weaponname);
|
|
self addplayerstat("destroy_turret",1);
|
|
}
|
|
|
|
//Function Number: 73
|
|
calledincarepackage()
|
|
{
|
|
self.pers["carepackagesCalled"]++;
|
|
if(self.pers["carepackagesCalled"] >= 3)
|
|
{
|
|
self addplayerstat("call_in_3_care_packages",1);
|
|
self.pers["carepackagesCalled"] = 0;
|
|
}
|
|
}
|
|
|
|
//Function Number: 74
|
|
destroyedhelicopter(attacker,weapon,damagetype,playercontrolled)
|
|
{
|
|
attacker destroyscorestreak(weapon);
|
|
if(damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET")
|
|
{
|
|
attacker addplayerstat("destroyed_helicopter_with_bullet",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 75
|
|
destroyedqrdrone(damagetype,weapon)
|
|
{
|
|
self destroyscorestreak(weapon);
|
|
self addplayerstat("destroy_qrdrone",1);
|
|
if(damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET")
|
|
{
|
|
self addplayerstat("destroyed_qrdrone_with_bullet",1);
|
|
}
|
|
|
|
self destroyedplayercontrolledaircraft();
|
|
}
|
|
|
|
//Function Number: 76
|
|
destroyedplayercontrolledaircraft()
|
|
{
|
|
if(self hasperk("specialty_noname"))
|
|
{
|
|
self addplayerstat("destroy_helicopter",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 77
|
|
destroyedaircraft(attacker,weapon)
|
|
{
|
|
attacker destroyscorestreak(weapon);
|
|
if(IsDefined(weapon))
|
|
{
|
|
if(weapon == "emp_mp" || weapon == "killstreak_emp_mp")
|
|
{
|
|
attacker addplayerstat("destroy_aircraft_with_emp",1);
|
|
}
|
|
else if(weapon == "missile_drone_projectile_mp" || weapon == "missile_drone_mp")
|
|
{
|
|
attacker addplayerstat("destroy_aircraft_with_missile_drone",1);
|
|
}
|
|
}
|
|
|
|
if(attacker hasperk("specialty_nottargetedbyairsupport"))
|
|
{
|
|
attacker addplayerstat("perk_nottargetedbyairsupport_destroy_aircraft",1);
|
|
}
|
|
|
|
attacker addplayerstat("destroy_aircraft",1);
|
|
}
|
|
|
|
//Function Number: 78
|
|
killstreakten()
|
|
{
|
|
primary = self getloadoutitem(self.class_num,"primary");
|
|
if(primary != 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
secondary = self getloadoutitem(self.class_num,"secondary");
|
|
if(secondary != 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
primarygrenade = self getloadoutitem(self.class_num,"primarygrenade");
|
|
if(primarygrenade != 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
specialgrenade = self getloadoutitem(self.class_num,"specialgrenade");
|
|
if(specialgrenade != 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for(numspecialties = 0;numspecialties < level.maxspecialties;numspecialties++)
|
|
{
|
|
perk = self getloadoutitem(self.class_num,"specialty" + numspecialties + 1);
|
|
if(perk != 0)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
self addplayerstat("killstreak_10_no_weapons_perks",1);
|
|
}
|
|
|
|
//Function Number: 79
|
|
scavengedgrenade()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
self notify("scavengedGrenade");
|
|
self endon("scavengedGrenade");
|
|
for(;;)
|
|
{
|
|
self waittill("lethalGrenadeKill");
|
|
self addplayerstat("kill_with_resupplied_lethal_grenade",1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 80
|
|
stunnedtankwithempgrenade(attacker)
|
|
{
|
|
attacker addplayerstat("stun_aitank_wIth_emp_grenade",1);
|
|
}
|
|
|
|
//Function Number: 81
|
|
playerkilled(einflictor,attacker,idamage,smeansofdeath,sweapon,shitloc,attackerstance)
|
|
{
|
|
/#
|
|
print(level.gametype);
|
|
#/
|
|
self.anglesondeath = self getplayerangles();
|
|
if(IsDefined(attacker))
|
|
{
|
|
attacker.anglesonkill = attacker getplayerangles();
|
|
}
|
|
|
|
if(!(IsDefined(sweapon)))
|
|
{
|
|
sweapon = "none";
|
|
}
|
|
|
|
self endon("disconnect");
|
|
data = spawnstruct();
|
|
data.victim = self;
|
|
data.victimstance = self getstance();
|
|
data.einflictor = einflictor;
|
|
data.attacker = attacker;
|
|
data.attackerstance = attackerstance;
|
|
data.idamage = idamage;
|
|
data.smeansofdeath = smeansofdeath;
|
|
data.sweapon = sweapon;
|
|
data.shitloc = shitloc;
|
|
data.time = GetTime();
|
|
if(IsDefined(einflictor) && IsDefined(einflictor.lastweaponbeforetoss))
|
|
{
|
|
data.lastweaponbeforetoss = einflictor.lastweaponbeforetoss;
|
|
}
|
|
|
|
if(IsDefined(einflictor) && IsDefined(einflictor.ownerweaponatlaunch))
|
|
{
|
|
data.ownerweaponatlaunch = einflictor.ownerweaponatlaunch;
|
|
}
|
|
|
|
waslockingon = 0;
|
|
if(IsDefined(einflictor.locking_on))
|
|
{
|
|
waslockingon = waslockingon | einflictor.locking_on;
|
|
}
|
|
|
|
if(IsDefined(einflictor.locked_on))
|
|
{
|
|
waslockingon = waslockingon | einflictor.locked_on;
|
|
}
|
|
|
|
waslockingon = waslockingon & 1 << data.victim.entnum;
|
|
if(waslockingon != 0)
|
|
{
|
|
data.waslockingon = 1;
|
|
}
|
|
else
|
|
{
|
|
data.waslockingon = 0;
|
|
}
|
|
|
|
data.washacked = einflictor maps/mp/_utility::ishacked();
|
|
data.wasplanting = data.victim.isplanting;
|
|
if(!(IsDefined(data.wasplanting)))
|
|
{
|
|
data.wasplanting = 0;
|
|
}
|
|
|
|
data.wasdefusing = data.victim.isdefusing;
|
|
if(!(IsDefined(data.wasdefusing)))
|
|
{
|
|
data.wasdefusing = 0;
|
|
}
|
|
|
|
data.victimweapon = data.victim.currentweapon;
|
|
data.victimonground = data.victim isonground();
|
|
if(isplayer(attacker))
|
|
{
|
|
data.attackeronground = data.attacker isonground();
|
|
if(!(IsDefined(data.attackerstance)))
|
|
{
|
|
data.attackerstance = data.attacker getstance();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
data.attackeronground = 0;
|
|
data.attackerstance = "stand";
|
|
}
|
|
|
|
waitandprocessplayerkilledcallback(data);
|
|
data.attacker notify("playerKilledChallengesProcessed");
|
|
}
|
|
|
|
//Function Number: 82
|
|
waittillslowprocessallowed()
|
|
{
|
|
while(level.lastslowprocessframe == GetTime())
|
|
{
|
|
wait(0.05);
|
|
}
|
|
|
|
level.lastslowprocessframe = GetTime();
|
|
}
|
|
|
|
//Function Number: 83
|
|
doscoreeventcallback(callback,data)
|
|
{
|
|
if(!(IsDefined(level.scoreeventcallbacks)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!(IsDefined(level.scoreeventcallbacks[callback])))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(IsDefined(data))
|
|
{
|
|
for(i = 0;i < level.scoreeventcallbacks[callback].size;i++)
|
|
{
|
|
thread [[ level.scoreeventcallbacks[callback][i] ]](data);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(i = 0;i < level.scoreeventcallbacks[callback].size;i++)
|
|
{
|
|
thread [[ level.scoreeventcallbacks[callback][i] ]]();
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 84
|
|
waitandprocessplayerkilledcallback(data)
|
|
{
|
|
if(IsDefined(data.attacker))
|
|
{
|
|
data.attacker endon("disconnect");
|
|
}
|
|
|
|
wait(0.05);
|
|
waittillslowprocessallowed();
|
|
level thread dochallengecallback("playerKilled",data);
|
|
level thread doscoreeventcallback("playerKilled",data);
|
|
}
|
|
|
|
//Function Number: 85
|
|
weaponisknife(weapon)
|
|
{
|
|
if(weapon == "knife_held_mp" || weapon == "knife_mp" || weapon == "knife_ballistic_mp")
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
//Function Number: 86
|
|
eventreceived(eventname)
|
|
{
|
|
self endon("disconnect");
|
|
waittillslowprocessallowed();
|
|
switch(level.gametype)
|
|
{
|
|
case "tdm":
|
|
self addgametypestat("killstreak_10",1);
|
|
continue;
|
|
self addgametypestat("killstreak_15",1);
|
|
continue;
|
|
self addgametypestat("killstreak_20",1);
|
|
continue;
|
|
self addgametypestat("multikill_3",1);
|
|
continue;
|
|
self addgametypestat("kill_enemy_who_killed_teammate",1);
|
|
continue;
|
|
self addgametypestat("kill_enemy_injuring_teammate",1);
|
|
break;
|
|
eventname == "kill_enemy_injuring_teammate"
|
|
eventname == "kill_enemy_who_killed_teammate"
|
|
eventname == "multikill_3"
|
|
eventname == "killstreak_20"
|
|
eventname == "killstreak_15"
|
|
eventname == "killstreak_10"
|
|
break;
|
|
|
|
case "dm":
|
|
self addgametypestat("killstreak_10",1);
|
|
continue;
|
|
self addgametypestat("killstreak_15",1);
|
|
continue;
|
|
self addgametypestat("killstreak_20",1);
|
|
continue;
|
|
self addgametypestat("killstreak_30",1);
|
|
break;
|
|
eventname == "killstreak_30"
|
|
eventname == "killstreak_20"
|
|
eventname == "killstreak_15"
|
|
eventname == "killstreak_10"
|
|
break;
|
|
|
|
case "sd":
|
|
self addgametypestat("defused_bomb_last_man_alive",1);
|
|
continue;
|
|
self addgametypestat("elimination_and_last_player_alive",1);
|
|
continue;
|
|
self addgametypestat("killed_bomb_planter",1);
|
|
continue;
|
|
self addgametypestat("killed_bomb_defuser",1);
|
|
break;
|
|
eventname == "killed_bomb_defuser"
|
|
eventname == "killed_bomb_planter"
|
|
eventname == "elimination_and_last_player_alive"
|
|
eventname == "defused_bomb_last_man_alive"
|
|
break;
|
|
|
|
case "ctf":
|
|
self addgametypestat("kill_flag_carrier",1);
|
|
continue;
|
|
self addgametypestat("defend_flag_carrier",1);
|
|
break;
|
|
eventname == "defend_flag_carrier"
|
|
eventname == "kill_flag_carrier"
|
|
break;
|
|
|
|
case "dem":
|
|
self addgametypestat("killed_bomb_planter",1);
|
|
continue;
|
|
self addgametypestat("killed_bomb_defuser",1);
|
|
break;
|
|
eventname == "killed_bomb_defuser"
|
|
eventname == "killed_bomb_planter"
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Function Number: 87
|
|
monitor_player_sprint()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
self.lastsprinttime = undefined;
|
|
while(1)
|
|
{
|
|
self waittill("sprint_begin");
|
|
self waittill("sprint_end");
|
|
self.lastsprinttime = GetTime();
|
|
}
|
|
} |