1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\drown;
6 #using scripts\shared\scoreevents_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\weapons\_weapon_utils;
11 #using scripts\mp\_challenges;
12 #using scripts\mp\gametypes\_loadout;
14 #insert scripts\shared\shared.gsh;
16 #using scripts\mp\_util;
18 #insert scripts\mp\_bonuscard.gsh;
20 #define BLACKJACK_SPECIALIST_INDEX 9
21 #define BLACKJACK_SPECIALIST_KILLS 4 // for blackjack challenge: kills while using a specialist weapon or ability
22 #define BLACKJACK_UNIQUE_SPECIALIST_KILLS 2 // for blackjack challenge: count of unique specialist weapons or abilities used to kill
24 #namespace blackjack_challenges;
35 if ( !isdefined( level.ChallengesCallbacks ) )
37 level.ChallengesCallbacks = [];
58 specialistIndex = player GetSpecialistIndex();
64 if ( !isdefined(
self.pers[
"blackjack_challenge_active" ] ) )
66 remaining_time = player ConsumableGet(
"blackjack",
"awarded" ) - player ConsumableGet(
"blackjack",
"consumed" );
68 if ( remaining_time > 0 )
71 if ( !special_card_earned )
73 player.pers[
"blackjack_challenge_active" ] =
true;
74 player.pers[
"blackjack_unique_specialist_kills" ] = 0;
75 player.pers[
"blackjack_specialist_kills" ] = 0;
76 player.pers[
"blackjack_unique_weapon_mask" ] = 0;
77 player.pers[
"blackjack_unique_ability_mask" ] = 0;
87 return (
self.pers[
"blackjack_challenge_active" ] ===
true );
94 if ( !isdefined( player ) || !isplayer( player ) )
97 if ( !isdefined( player.isRoulette ) || !player.isRoulette )
102 player.pers[
"blackjack_specialist_kills" ]++;
104 currentHeroAbilityMask = player.pers[
"blackjack_unique_ability_mask" ];
106 newHeroAbilityMask = heroAbilityMask | currentHeroAbilityMask;
107 if ( newHeroAbilityMask != currentHeroAbilityMask )
109 player.pers[
"blackjack_unique_specialist_kills" ]++;
110 player.pers[
"blackjack_unique_ability_mask" ] = newHeroAbilityMask;
122 if ( special_card_earned )
131 player AddPlayerStat(
"blackjack_challenge", 1 );
137 attackerisThief = data.attackerIsThief;
138 attackerIsRoulette = data.attackerIsRoulette;
139 attackerIsThiefOrRoulette = attackerisThief || attackerIsRoulette;
141 if ( !attackerIsThiefOrRoulette )
144 victim = data.victim;
145 attacker = data.attacker;
147 weapon = data.weapon;
149 if ( !isdefined( weapon ) || ( weapon == level.weaponNone ) )
152 if ( !isdefined( player ) || !isplayer( player ) )
155 if ( attackerIsThief )
157 if ( weapon.isHeroWeapon ===
true )
161 player.pers[
"blackjack_specialist_kills" ]++;
163 currentHeroWeaponMask = player.pers[
"blackjack_unique_weapon_mask" ];
165 newHeroWeaponMask = heroWeaponMask | currentHeroWeaponMask;
166 if ( newHeroWeaponMask != currentHeroWeaponMask )
168 player.pers[
"blackjack_unique_specialist_kills" ] += 1;
169 player.pers[
"blackjack_unique_weapon_mask" ] = newHeroWeaponMask;
185 return self GetDStat(
"tenthspecialistcontract", stat_name );
190 return self SetDStat(
"tenthspecialistcontract", stat_name, stat_value );
195 if ( !isdefined( weapon ) )
198 if ( isdefined( weapon.isHeroWeapon ) && !weapon.isHeroWeapon )
201 switch( weapon.name )
204 case "hero_minigun_body3":
207 case "hero_flamethrower":
210 case "hero_lightninggun":
211 case "hero_lightninggun_arc":
214 case "hero_chemicalgelgun":
215 case "hero_firefly_swarm":
218 case "hero_pineapplegun":
219 case "hero_pineapple_grenade":
222 case "hero_armblade":
225 case "hero_bowlauncher":
226 case "hero_bowlauncher2":
227 case "hero_bowlauncher3":
228 case "hero_bowlauncher4":
231 case "hero_gravityspikes":
234 case "hero_annihilator":
244 if ( !isdefined( ability ) )
247 switch( ability.name )
252 case "gadget_heat_wave":
255 case "gadget_flashback":
258 case "gadget_resurrect":
267 case "gadget_vision_pulse":
270 case "gadget_speed_burst":
273 case "gadget_combat_efficiency":
283 if ( !isdefined( data ) )
286 player = data.player;
287 if ( !isdefined( player ) )
290 if ( !isPlayer( player ) )
304 if ( !isdefined( data ) )
307 player = data.player;
308 if ( !isdefined( player ) )
311 if ( !isPlayer( player ) )
325 level endon(
"game_ended" );
326 self notify(
"track_blackjack_consumable_singleton" );
327 self endon(
"track_blackjack_consumable_singleton" );
328 self endon(
"disconnect" );
332 if ( !isdefined( player.last_blackjack_consumable_time ) )
333 player.last_blackjack_consumable_time = 0;
335 while ( isdefined( player ) )
337 random_wait_time = GetDvarFloat(
"mp_blackjack_consumable_wait", 20.0 ) + RandomFloatRange( -5.0, 5.0 );
338 wait random_wait_time;
348 if ( !isdefined( player ) )
351 if ( !isdefined( player.timePlayed ) || !isdefined( player.timePlayed[
"total"] ) )
354 current_time_played = player.timePlayed[
"total"];
356 time_to_report = current_time_played - player.last_blackjack_consumable_time;
358 if ( time_to_report > 0 )
360 max_time_to_report = player ConsumableGet(
"blackjack",
"awarded" ) - player ConsumableGet(
"blackjack",
"consumed" );
361 consumable_increment = int( min( time_to_report, max_time_to_report ) );
362 if ( consumable_increment > 0 )
364 player ConsumableIncrement(
"blackjack",
"consumed", consumable_increment );
368 player.last_blackjack_consumable_time = current_time_played;