From fb8a55d0f0e70bc381059f52b50adcbae744d4b0 Mon Sep 17 00:00:00 2001 From: FutureRave Date: Tue, 28 Sep 2021 21:22:31 +0100 Subject: [PATCH] Init --- _inf_alive_rewards.gsc | 235 +++++++++++++++++++++++++++++++++++++++++ _inf_anti_camp.gsc | 86 +++++++++++++++ _inf_model.gsc | 99 +++++++++++++++++ _inf_utils.gsc | 150 ++++++++++++++++++++++++++ 4 files changed, 570 insertions(+) create mode 100644 _inf_alive_rewards.gsc create mode 100644 _inf_anti_camp.gsc create mode 100644 _inf_model.gsc create mode 100644 _inf_utils.gsc diff --git a/_inf_alive_rewards.gsc b/_inf_alive_rewards.gsc new file mode 100644 index 0000000..b48bb34 --- /dev/null +++ b/_inf_alive_rewards.gsc @@ -0,0 +1,235 @@ +/* + _inf_alive_rewards + Author: FutureRave + Date: 28/09/2021 +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; + +init() +{ + replaceFunc( maps\mp\killstreaks\_juggernaut::giveJuggernaut, ::giveJuggernautStub ); + + maps\mp\killstreaks\_airdrop::addCrateType( "nuke_drop", "nuke", 1, maps\mp\killstreaks\_airdrop::nukeCrateThink ); + maps\mp\killstreaks\_airdrop::addCrateType( "airdrop", "ammo", 17, ::ammoCrateThink ); + maps\mp\killstreaks\_airdrop::addCrateType( "airdrop_mega", "ammo", 12, ::ammoCrateThink ); + + thread onConnect(); +} + +onConnect() +{ + for ( ;; ) + { + level waittill( "connected", player ); + player thread monitorForRewards(); + } +} + +monitorForRewards() +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + for ( ;; ) + { + self waittill( "killed_enemy" ); + if ( self.sessionteam == "axis" ) return; // It's infected. Once your team is axis you are done for the game + count = self.kills; + switch( count ) + { + case 1: + self scripts\_inf_utils::playLeaderDialog( "kill_confirmed" ); + level thread dropAmmo( self ); + break; + case 5: + self maps\mp\killstreaks\_killstreaks::giveKillstreak( "deployable_vest" ); + break; + case 9: + self maps\mp\killstreaks\_killstreaks::giveKillstreak( "predator_missile" ); + break; + case 18: + level thread maps\mp\killstreaks\_airdrop::doMegaC130FlyBy( self, self.origin, randomFloat( 360 ), "airdrop_grnd", -360 ); + break; + case 25: + self maps\mp\killstreaks\_juggernaut::giveJuggernaut( "juggernaut" ); + break; + case 45: + self maps\mp\killstreaks\_killstreaks::giveKillstreak( "ac130" ); + break; + case 85: + self maps\mp\killstreaks\_killstreaks::giveKillstreak( "helicopter_flares" ); + break; + case 100: + self maps\mp\killstreaks\_killstreaks::giveKillstreak( "osprey_gunner" ); + break; + case 120: + level thread maps\mp\killstreaks\_airdrop::dropNuke( self.origin, self, "nuke_drop" ); + break; + } + } +} + +dropAmmo( owner ) +{ + planeHalfDistance = 24000; + planeFlySpeed = 2000; + yaw = RandomInt( 360 ); + + yaw = RandomInt( 360 ); + direction = ( 0, yaw, 0 ); + + dropSite = owner.origin; + lbheight = level maps\mp\killstreaks\_airdrop::getFlyHeightOffset( dropSite ); + + startPos = dropSite + ( AnglesToForward( direction ) * ( -1 * planeHalfDistance ) ); + startPos = startPos * ( 1, 1, 0 ) + ( 0, 0, lbHeight ); + + endPos = dropSite + ( AnglesToForward( direction ) * planeHalfDistance ); + endPos = endPos * ( 1, 1, 0 ) + ( 0, 0, lbHeight ); + + d = length( startPos - endPos ); + flyTime = ( d / planeFlySpeed ); + + c130 = maps\mp\killstreaks\_airdrop::c130Setup( owner, startPos, endPos ); + c130.veh_speed = planeFlySpeed; + c130.dropType = "airdrop"; + c130 playloopsound( "veh_ac130_dist_loop" ); + + c130.angles = direction; + forward = anglesToForward( direction ); + c130 moveTo( endPos, flyTime, 0, 0 ); + + boomPlayed = false; + minDist = distance2D( c130.origin, dropSite ); + for ( ;; ) + { + dist = distance2D( c130.origin, dropSite ); + + if ( dist < minDist ) + minDist = dist; + else if ( dist > minDist ) + break; + + if ( dist < 256 ) + { + break; + } + else if ( dist < 768 ) + { + earthquake( 0.15, 1.5, dropSite, 1500 ); + if ( !boomPlayed ) + { + c130 playSound( "veh_ac130_sonic_boom" ); + boomPlayed = true; + } + } + + wait( .05 ); + } + + c130 thread maps\mp\killstreaks\_airdrop::dropTheCrate( dropSite, "airdrop", lbHeight, false, "ammo", startPos ); + wait( 0.05 ); + c130 notify ( "drop_crate" ); + + wait( 4 ); + c130 delete(); +} + +ammoCrateThink( dropType ) +{ + self endon ( "death" ); + self.usedBy = []; + + if ( dropType == "airdrop" || !level.teamBased ) + maps\mp\killstreaks\_airdrop::crateSetupForUse( game["strings"]["ammo_hint"], "all", "waypoint_ammo_friendly" ); + else + maps\mp\killstreaks\_airdrop::crateSetupForUse( game["strings"]["ammo_hint"], "all", "waypoint_ammo_friendly" ); + + self thread maps\mp\killstreaks\_airdrop::crateOtherCaptureThink(); + self thread maps\mp\killstreaks\_airdrop::crateOwnerCaptureThink(); + + for ( ;; ) + { + self waittill ( "captured", player ); + + if ( isDefined( self.owner ) && player != self.owner ) + { + if ( !level.teamBased || player.team != self.team ) + { + if ( dropType == "airdrop" ) + player thread maps\mp\killstreaks\_airdrop::hijackNotify( self, "airdrop" ); + else + player thread maps\mp\killstreaks\_airdrop::hijackNotify( self, "emergency_airdrop" ); + } + } + + player maps\mp\killstreaks\_teamammorefill::refillAmmo( true ); + self maps\mp\killstreaks\_airdrop::deleteCrate(); + } +} + +giveJuggernautStub( juggType ) +{ + self endon( "death" ); + self endon( "disconnect" ); + wait( .05 ); + + if ( isDefined( self.hasLightArmor ) && self.hasLightArmor == true ) + maps\mp\perks\_perkfunctions::removeLightArmor( self.previousMaxHealth ); + + switch( juggType ) + { + case "juggernaut": + self.isJuggernaut = true; + self maps\mp\gametypes\_class::giveLoadout( self.pers["team"], juggType, false, false ); + break; + case "juggernaut_recon": + self.isJuggernautRecon = true; + self maps\mp\gametypes\_class::giveLoadout( self.pers["team"], juggType, false, false ); + + portable_radar = spawn( "script_model", self.origin ); + portable_radar.team = self.team; + + portable_radar makePortableRadar( self ); + self.personalRadar = portable_radar; + + self thread maps\mp\killstreaks\_juggernaut::radarMover( portable_radar ); + break; + } + + if ( !getDvarInt( "camera_thirdPerson" ) ) + { + self.juggernautOverlay = newClientHudElem( self ); + self.juggernautOverlay.x = 0; + self.juggernautOverlay.y = 0; + self.juggernautOverlay.alignX = "left"; + self.juggernautOverlay.alignY = "top"; + self.juggernautOverlay.horzAlign = "fullscreen"; + self.juggernautOverlay.vertAlign = "fullscreen"; + self.juggernautOverlay SetShader( level.juggSettings[ juggType ].overlay, 640, 480 ); + self.juggernautOverlay.sort = -10; + self.juggernautOverlay.archived = true; + self.juggernautOverlay.hidein3rdperson = true; + } + + self thread maps\mp\killstreaks\_juggernaut::juggernautSounds(); + self setPerk( "specialty_radarjuggernaut", true, false ); + + self thread teamPlayerCardSplash( level.juggSettings[ juggType ].splashUsedName, self ); + self PlaySoundToTeam( game[ "voice" ][ self.team ] + "use_juggernaut", self.team, self ); + self PlaySoundToTeam( game[ "voice" ][ level.otherTeam[ self.team ] ] + "enemy_juggernaut", level.otherTeam[ self.team ] ); + + self thread maps\mp\killstreaks\_killstreaks::updateKillstreaks( true ); + + self thread maps\mp\killstreaks\_juggernaut::juggRemover(); + + if ( isDefined( self.carryFlag ) ) + { + wait( 0.05 ); + self attach( self.carryFlag, "J_spine4", true ); + } + + level notify( "juggernaut_equipped", self ); + self maps\mp\_matchdata::logKillstreakEvent( "juggernaut", self.origin ); +} diff --git a/_inf_anti_camp.gsc b/_inf_anti_camp.gsc new file mode 100644 index 0000000..f346f6c --- /dev/null +++ b/_inf_anti_camp.gsc @@ -0,0 +1,86 @@ +/* + _inf_anti_camp + Author: FutureRave + Date: 27/09/2021 +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; + +ANTI_CAMP_RADIUS = 350; + +init() +{ + thread onConnect(); +} + +onConnect() +{ + for ( ;; ) + { + level waittill( "connected", player ); + player thread monitorKillStreak(); + player thread connected(); + } +} + +connected() +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + if ( self.sessionteam != "allies" ) + self.anti_camp = false; + } +} + +startAntiCamp() +{ + assert( self.sessionteam == "allies" ); + + level endon( "game_ended" ); + self endon ( "disconnect" ); + + oldPosition = self.origin; + self iPrintLnBold( "^1Run ^:For Your Life^7!" ); + self scripts\_inf_utils::playLeaderDialog( "pushforward" ); + for ( ;; ) + { + wait( 7.5 ); + if ( !self.anti_camp ) return; + + if ( self isUsingRemote() ) continue; + + newPosition = self.origin; + + if ( distance2D( oldPosition, newPosition ) < ANTI_CAMP_RADIUS ) + { + dmg = 80; + if ( self.health > 100 ) dmg = 300; // Jugg ? + + radiusDamage( newPosition, 36, dmg, dmg * 0.75, undefined, "MOD_TRIGGER_HURT" ); + self scripts\_inf_utils::playLeaderDialog( "new_positions" ); + } + + oldPosition = self.origin; + } +} + +monitorKillStreak() +{ + level endon( "game_ended" ); + self endon ( "disconnect" ); + for ( ;; ) + { + self waittill( "killed_enemy" ); + count = self getPlayerData( "killstreaksState", "count" ); + if ( count > 24 && self.sessionteam != "axis" ) + { + self.anti_camp = true; + self thread startAntiCamp(); + return; + } + } +} diff --git a/_inf_model.gsc b/_inf_model.gsc new file mode 100644 index 0000000..ac8e05d --- /dev/null +++ b/_inf_model.gsc @@ -0,0 +1,99 @@ +/* + _inf_model + Author: FutureRave + Date: 27/09/2021 + Notes: Fuck the models for now +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; + +init() +{ + thread onConnect(); + + preCacheShader( "specialty_carepackage_crate" ); + preCacheShader( "iw5_cardicon_medkit" ); + preCacheShader( "iw5_cardicon_juggernaut_a" ); + + preCacheItem( "at4_mp" ); + precacheItem( "uav_strike_marker_mp" ); +} + +onConnect() +{ + for ( ;; ) + { + level waittill( "connected", player ); + player thread connected(); + } +} + +connected() +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + waittillframeend; + if ( self.sessionteam == "allies" ) + { + self giveAllPerks(); + } + else + { +/* + team = self.team; + [[game[ self.team + "_model" ][ "GHILLIE" ]]](); + self.isSniper = true; +*/ + self giveAllPerks(); + self SetOffhandPrimaryClass( "other" ); + self giveWeapon( "bouncingbetty_mp" ); + } + } +} + +giveAllPerks() +{ + perks = []; + perks[ perks.size ] = "specialty_longersprint"; + perks[ perks.size ] = "specialty_fastreload"; + perks[ perks.size ] = "specialty_scavenger"; + perks[ perks.size ] = "specialty_blindeye"; + perks[ perks.size ] = "specialty_paint"; + perks[ perks.size ] = "specialty_hardline"; + perks[ perks.size ] = "specialty_coldblooded"; + perks[ perks.size ] = "specialty_quickdraw"; + + perks[ perks.size ] = "_specialty_blastshield"; + perks[ perks.size ] = "specialty_detectexplosive"; + perks[ perks.size ] = "specialty_autospot"; + perks[ perks.size ] = "specialty_bulletaccuracy"; + + perks[ perks.size ] = "specialty_quieter"; + perks[ perks.size ] = "specialty_stalker"; + + perks[ perks.size ] = "specialty_bulletpenetration"; + perks[ perks.size ] = "specialty_marksman"; + perks[ perks.size ] = "specialty_sharp_focus"; + perks[ perks.size ] = "specialty_holdbreathwhileads"; + perks[ perks.size ] = "specialty_longerrange"; + perks[ perks.size ] = "specialty_fastermelee"; + perks[ perks.size ] = "specialty_reducedsway"; + perks[ perks.size ] = "specialty_lightweight"; + + foreach( perkName in perks ) + { + if( !self _hasPerk( perkName ) ) + { + self givePerk( perkName, false ); + if( maps\mp\gametypes\_class::isPerkUpgraded( perkName ) ) + { + perkUpgrade = tablelookup( "mp/perktable.csv", 1, perkName, 8 ); + self givePerk( perkUpgrade, false ); + } + } + } +} diff --git a/_inf_utils.gsc b/_inf_utils.gsc new file mode 100644 index 0000000..fd82168 --- /dev/null +++ b/_inf_utils.gsc @@ -0,0 +1,150 @@ +/* + _inf_utils + Author: FutureRave + Date: 26/09/2021 +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; + +init() +{ + replaceFunc( maps\mp\perks\_perkfunctions::GlowStickDamageListener, ::GlowStickDamageListenerStub ); + replaceFunc( maps\mp\perks\_perkfunctions::GlowStickEnemyUseListener, ::GlowStickEnemyUseListenerStub ); + + create_dvar( "sv_fallDamage", 0 ); + setDvar( "scr_killcam_time", 7 ); + setDvar( "scr_killcam_posttime", 2 ); + + thread gameEnded(); + thread gameStart(); + + if ( getDvarInt( "sv_fallDamage" ) != 0 ) return; + level.prevCallbackPlayerDamage = level.callbackPlayerDamage; + level.callbackPlayerDamage = ::codeCallbackPlayerDamage; +} + +gameEnded() +{ + gameFlagWait( "prematch_done" ); + for ( ;; ) + { + level waittill( "game_ended", team ); + foreach ( player in level.players ) + { + player setClientDvar ( "cg_thirdperson", true ); + player setClientDvar ( "cg_thirdPersonRange", 170 ); + } + wait( 1.5 ); + foreach ( player in level.players ) + { + player freezecontrols( false ); + } + } +} + +// Might need to set cg_thirdperson to false when a player spawns +gameStart() +{ + gameFlagWait( "prematch_done" ); + foreach ( player in level.players ) + { + player setClientDvar ( "cg_thirdperson", false ); + } +} + +codeCallbackPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ) +{ + self endon( "disconnect" ); + + if ( sMeansOfDeath == "MOD_FALLING" || self isUsingRemote() ) + { + eAttacker maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "" ); + return; + } + + [[level.prevCallbackPlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); +} + +playLeaderDialog( sound ) +{ + assert( self.sessionteam != "spectator" ); + + suffix = "1mc_" + sound; + + if ( self.sessionteam == "allies" ) + { + self playLocalSound( getTeamVoicePrefix( game["allies"] ) + suffix ); + } + else + { + self playLocalSound( getTeamVoicePrefix( game["axis"] ) + suffix ); + } +} + +getTeamVoicePrefix( team ) +{ + return tableLookup( "mp/factionTable.csv", 0, team, 7 ); +} + +GlowStickDamageListenerStub( owner ) +{ + self endon ( "death" ); + + self setCanDamage( false ); + + self.health = 999999; + self.maxHealth = 100; + self.damageTaken = 0; + + for ( ;; ) + { + self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags, weapon ); + + if ( !maps\mp\gametypes\_weapons::friendlyFireCheck( self.owner, attacker ) ) + continue; + + if ( !isdefined( self ) ) + return; +// Can only be damaged by knife + if ( type == "MOD_MELEE" ) + { + self.damageTaken += self.maxHealth; + self.wasDamaged = true; + } + + if( isPlayer( attacker ) ) + { + attacker maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "tactical_insertion" ); + } + + if ( self.damageTaken >= self.maxHealth ) + { + if ( isDefined( owner ) && attacker != owner ) + { + attacker notify ( "destroyed_insertion", owner ); + attacker notify( "destroyed_explosive" ); // count towards SitRep Pro challenge + owner thread leaderDialogOnPlayer( "ti_destroyed" ); + } + + attacker thread maps\mp\perks\_perkfunctions::deleteTI( self ); + } + } +} + +GlowStickEnemyUseListenerStub( owner ) +{ + self endon ( "death" ); + level endon ( "game_ended" ); + owner endon ( "disconnect" ); + + self.enemyTrigger setCursorHint( "HINT_NOICON" ); + self.enemyTrigger setHintString( &"MP_DESTROY_TI" ); + self.enemyTrigger makeEnemyUsable( owner ); + + for ( ;; ) + { + self.enemyTrigger waittill ( "trigger", player ); + player iPrintLnBold( "Nice try" ); + } +}