modded gsc

This commit is contained in:
INeedBots 2020-09-22 18:45:44 -06:00
parent 1480e11f0a
commit a42a4dc37b
8 changed files with 2439 additions and 843 deletions

View File

@ -1,3 +1,12 @@
/*
_gamelogic modded
Author: INeedGames
Date: 09/22/2020
Adds force final killcam, extra hitmarkers, etc.
Thanks: banz
*/
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
@ -202,6 +211,7 @@ handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath )
else
value = undefined;
if( !level.extraDamageFeedback )
attacker playLocalSound( "bullet_impact_headshot_2" );
}
else
@ -237,19 +247,19 @@ handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath )
if ( isAlive( attacker ) )
{
// killstreaks only advance from kills earned this life
if ( isDefined( level.killStreakSpecialCaseWeapons[sWeapon] ) ) // this is an optimization
if ( isDefined( level.killStreakSpecialCaseWeapons[sWeapon] ) || sWeapon == "nuke_mp" ) // this is an optimization
{
switch ( sWeapon )
{
case "ac130_105mm_mp":
case "ac130_40mm_mp":
case "ac130_25mm_mp":
if ( attacker.ac130LifeId == attacker.pers["deaths"] )
if ( attacker.ac130LifeId == attacker.pers["deaths"] && !level.scriptIncKillstreak )
attacker.pers["cur_kill_streak"]++;
break;
case "cobra_player_minigun_mp":
case "weapon_cobra_mk19_mp":
if ( attacker.heliRideLifeId == attacker.pers["deaths"] )
if ( attacker.heliRideLifeId == attacker.pers["deaths"] && !level.scriptIncKillstreak )
attacker.pers["cur_kill_streak"]++;
break;
case "cobra_20mm_mp":
@ -259,21 +269,24 @@ handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath )
case "sentry_minigun_mp":
case "harrier_20mm_mp":
case "pavelow_minigun_mp":
case "nuke_mp":
if ( isDefined( eInflictor ) && isDefined( eInflictor.lifeId ) )
killstreakLifeId = eInflictor.lifeId;
else
killstreakLifeId = attacker.lifeId;
if ( killstreakLifeId == attacker.pers["deaths"] )
if ( killstreakLifeId == attacker.pers["deaths"] && !level.scriptIncKillstreak && (level.nukeIncreasesStreak || sWeapon != "nuke_mp") )
attacker.pers["cur_kill_streak"]++;
break;
default:
if( !level.scriptIncKillstreak )
attacker.pers["cur_kill_streak"]++;
break;
}
}
else
{
if( !level.scriptIncKillstreak )
attacker.pers["cur_kill_streak"]++;
}
@ -322,6 +335,9 @@ handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath )
if ( isDefined( level.onNormalDeath ) && attacker.pers[ "team" ] != "spectator" )
[[ level.onNormalDeath ]]( self, attacker, lifeId );
if ( isDefined( level.onNormalDeath2 ) && attacker.pers[ "team" ] != "spectator" )
[[ level.onNormalDeath2 ]]( self, attacker, sMeansOfDeath );
level thread maps\mp\gametypes\_battlechatter_mp::sayLocalSoundDelayed( attacker, "kill", 0.75 );
if ( isDefined( self.lastAttackedShieldPlayer ) && isDefined( self.lastAttackedShieldTime ) && self.lastAttackedShieldPlayer != attacker )
@ -425,7 +441,7 @@ PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWe
victim.idFlags = 0;
else if ( sMeansOfDeath == "MOD_GRENADE" && isSubstr( sWeapon, "frag_grenade" ) && iDamage == 100000 )
victim.idFlags = 0;
else if ( sWeapon == "nuke_mp" )
else if ( sWeapon == "nuke_mp" && !level.forceFinalKillcam )
victim.idFlags = 0;
else if ( level.friendlyfire >= 2)
victim.idFlags = 0;
@ -543,7 +559,11 @@ PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWe
// override MOD
if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, attacker ) )
{
sMeansOfDeath = "MOD_HEAD_SHOT";
if( level.headShotDetachHead )
victim detach(victim.headmodel);
}
else if ( sMeansOfDeath != "MOD_MELEE" && !isDefined( victim.nuked ) )
victim playDeathSound();
@ -634,10 +654,14 @@ PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWe
else if ( !isPlayer( attacker ) || (isPlayer( attacker ) && sMeansOfDeath == "MOD_FALLING") )
{
handleWorldDeath( attacker, lifeId, sMeansOfDeath, sHitLoc );
if ( level.failCam )
doKillcam = true;
}
else if ( attacker == victim )
{
handleSuicideDeath( sMeansOfDeath, sHitLoc );
if ( level.failCam )
doKillcam = true;
}
else if ( friendlyFire )
{
@ -645,6 +669,8 @@ PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWe
{
handleFriendlyFireDeath( attacker );
}
if ( level.failCam )
doKillcam = true;
}
else
{
@ -697,9 +723,11 @@ PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWe
if ( isPlayer( attacker ) )
attackerNum = attacker getEntityNumber();
else if ( (sMeansOfDeath == "MOD_FALLING" || eInflictor.classname == "trigger_hurt") && level.failCam )//banz
attackerNum = victim getEntityNumber();
else
attackerNum = -1;
killcamentity = victim getKillcamEntity( attacker, eInflictor, sWeapon );
killcamentity = victim getKillcamEntity( attacker, eInflictor, sWeapon, sMeansOfDeath );
killcamentityindex = -1;
killcamentitystarttime = 0;
@ -716,6 +744,12 @@ PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWe
doKillcam = true;
#/
// record the kill cam values for the final kill cam
if ( level.forceFinalKillcam && doKillcam )
maps\mp\gametypes\_gamelogic::recordFinalKillCam( 5.0, victim, attacker, attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, deathTimeOffset, psOffsetTime );
if ( !level.forceFinalKillcam && level.allowFinalKillcam )
{
if ( isDefined( attacker.finalKill ) )
maps\mp\_awards::addAwardWinner( "finalkill", attacker.clientid );
@ -729,6 +763,7 @@ PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWe
if ( !isFauxDeath )
wait ( 1.0 );
}
}
if ( !isFauxDeath )
{
@ -925,11 +960,14 @@ resetPlayerVariables()
}
getKillcamEntity( attacker, eInflictor, sWeapon )
getKillcamEntity( attacker, eInflictor, sWeapon, sMeansOfDeath )
{
if ( !isDefined( eInflictor ) )
return undefined;
if( (sMeansOfDeath == "MOD_FALLING" || eInflictor.classname == "trigger_hurt") && level.failCam )
return attacker;
if ( eInflictor == attacker )
return undefined;
@ -1052,6 +1090,12 @@ giveRecentShieldXP()
Callback_PlayerDamage_internal( eInflictor, eAttacker, victim, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
if( level.disableKnife && sMeansOfDeath == "MOD_MELEE" && sWeapon != "riotshield_mp" )
return;
if( level.disableTurret && sWeapon == "turret_minigun_mp" )
return;
if ( !isReallyAlive( victim ) )
return;
@ -1402,6 +1446,8 @@ Callback_PlayerDamage_internal( eInflictor, eAttacker, victim, iDamage, iDFlags,
if ( attackerIsNPC && isDefined( eAttacker.gunner ) )
damager = eAttacker.gunner;
else if( level.extraDamageFeedback && isDefined( eAttacker.owner ) )
damager = eAttacker.owner;
else
damager = eAttacker;
@ -1409,7 +1455,7 @@ Callback_PlayerDamage_internal( eInflictor, eAttacker, victim, iDamage, iDFlags,
{
if ( iDFlags & level.iDFLAGS_STUN )
typeHit = "stun";
else if ( victim hasPerk( "specialty_armorvest", true ) || (isExplosiveDamage( sMeansOfDeath ) && victim _hasPerk( "_specialty_blastshield" )) )
else if ( victim _hasPerk( "specialty_armorvest" ) || (isExplosiveDamage( sMeansOfDeath ) && victim _hasPerk( "_specialty_blastshield" )) )
typeHit = "hitBodyArmor";
else if ( victim _hasPerk( "specialty_combathigh") )
typeHit = "hitEndGame";
@ -1534,6 +1580,37 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction )
{
if( level.allowPrintDamage )
{
if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && eAttacker.printDamage )
eAttacker iPrintLnBold( iDamage );
else if( isDefined( eAttacker.owner ) && isPlayer( eAttacker.owner ) && eAttacker.owner.printDamage )
eAttacker.owner iPrintLnBold( iDamage );
}
if( level.extraDamageFeedback )
{
if( sWeapon == "nuke_mp" )
{
if ( self _hasPerk( "specialty_armorvest" ) || self _hasPerk( "_specialty_blastshield") )
typeHit = "hitBodyArmor";
else if ( self _hasPerk( "specialty_combathigh") )
typeHit = "hitEndGame";
else
typeHit = "standard";
eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( typeHit );
}
if( sHitLoc == "head" || sHitLoc == "helmet" )
{
if ( isDefined( eAttacker ) && isPlayer( eAttacker ) )
eAttacker playLocalSound( "bullet_impact_headshot_2" );
else if( isDefined( eAttacker.owner ) && isPlayer( eAttacker.owner ) )
eAttacker.owner playLocalSound( "bullet_impact_headshot_2" );
}
}
if ( (self isUsingRemote() ) && (iDamage >= self.health) && !(iDFlags & level.iDFLAGS_STUN) )
{
if ( !isDefined( vDir ) )

View File

@ -1,3 +1,64 @@
/*
_gamelogic modded
Author: INeedGames
Date: 09/22/2020
Adds DVARs for customization.
DVARS:
- scr_extraDamageFeedback <bool>
false - (default) players receive hitmarkers for helicopters, hitting equipment, etc.
- scr_printDamage <bool>
false - (default) allows players to receive numbered feedback how much damage they delt
- scr_disableKnife <bool>
false - (default) disables knife damage
- scr_intermissionTime <float>
30.0 - (default) how long to wait in intermission after a match completes
- scr_forceKillcam <bool>
false - (default) show final killcams even if a kill didn't end the game
- scr_forceKillcam_winnersKill <bool>
true - (default) only show the winner's killcam as a final killcam
- scr_game_allowFinalKillcam <bool>
true - (default) allows if a final killcam is shown
- scr_disableTurret <bool>
false - (default) disables mountable turret damage
- scr_failCam <bool>
false - (default) show suicides as killcams
- scr_voting <bool>
false - (default) allow players to vote for a map at the end of a match
- scr_voting_maps <comma seperate string list>
"mp_rust,mp_terminal" - (default) list of maps to be allowed for voting
- scr_voting_time <bool>
26.0 - (default) how long should polls be open for
- scr_voting_winTime <bool>
4.0 - (default) how long to show the winning map for
- scr_allow_intermission <bool>
false - (default) allow an intermission time after a match ends
- scr_voting_bots <bool>
false - (default) bots are allowed to pick a map to vote
- scr_nuke_increases_streak <bool>
true - (default) nukes (if they don't end the game) increase a player's killstreak
- headshot_detach_head <bool>
false - (default) headshots dismember the victim's head
Thanks: banz
*/
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
@ -365,6 +426,23 @@ updateGameEvents()
waittillFinalKillcamDone()
{
if ( level.forceFinalKillcam )
{
waittillframeend; // give "round_end_finished" notifies time to process
if( level.showingFinalKillcam )
{
foreach ( player in level.players )
player notify( "reset_outcome" );
level notify( "game_cleanup" );
while ( level.showingFinalKillcam )
wait ( 0.05 );
}
}
else
{
if ( !level.showingFinalKillcam )
return false;
@ -372,23 +450,41 @@ waittillFinalKillcamDone()
wait ( 0.05 );
return true;
}
}
timeLimitClock_Intermission( waitTime )
timeLimitClock_Intermission( waitTime, clockColor )
{
setGameEndTime( getTime() + int(waitTime*1000) );
if( !isDefined( clockColor ) )
clockColor = (0, 0, 0);
NewWaitTime = waitTime*1000;
setGameEndTime( getTime() + int(NewWaitTime) );
clockObject = spawn( "script_origin", (0,0,0) );
clockObject hide();
if ( waitTime >= 10.0 )
wait ( waitTime - 10.0 );
matchStartTimer = createServerTimer("objective", 1.4);
matchStartTimer setPoint( "TOPRIGHT", "TOPRIGHT", -5, 0 ); //("CENTER", "CENTER", 0, -45);
matchStartTimer setTimer( waitTime - 1 );
matchStartTimer.sort = 1001;
matchStartTimer.foreground = false;
matchStartTimer.hideWhenInMenu = false;
matchStartTimer.color = clockColor;
for ( ;; )
currentTime = getTime();
timeRunning = ( getTime() - currentTime );
while ( timeRunning <= NewWaitTime )
{
wait 0.05;
if ( (timeRunning - NewWaitTime) >= -10000 && timeRunning%1000 == 0 )
clockObject playSound( "ui_mp_timer_countdown" );
wait ( 1.0 );
timeRunning = ( getTime() - currentTime );
}
clockObject delete();
matchStartTimer destroyElem();
}
@ -530,6 +626,9 @@ updateTieStats( loser )
updateWinLossStats( winner )
{
//if ( privateMatch() )
// return;
if ( !wasLastRound() )
return;
@ -607,6 +706,9 @@ updateMatchBonusScores( winner )
if ( !game["timePassed"] )
return;
//if ( !matchMakingGame() )
// return;
if ( !getTimeLimit() || level.forcedEnd )
{
gameLength = getTimePassed() / 1000;
@ -1226,6 +1328,36 @@ roundEndDOF( time )
self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
}
randomizeMaps()
{
tok = strTok( level.votingMaps, "," );
randomArray = [];
for( i = 0; i < 9; i++ )
{
selectedRand = randomint( tok.size );
randomArray[ i ] = tok[ selectedRand ];
tok = restructMapArray( tok, selectedRand );
}
return randomArray;
}
restructMapArray(oldArray, index)
{
restructArray = [];
for( i=0; i < oldArray.size; i++ )
{
if( i < index )
restructArray[ i ] = oldArray[ i ];
else if( i > index )
restructArray[ i - 1 ] = oldArray[ i ];
}
return restructArray;
}
Callback_StartGameType()
{
@ -1241,6 +1373,60 @@ Callback_StartGameType()
level.intermission = false;
setDvarIfUninitialized( "scr_extraDamageFeedback", false );
setDvarIfUninitialized( "scr_printDamage", false );
setDvarIfUninitialized( "scr_disableKnife", false );
setDvarIfUninitialized( "scr_intermissionTime", 30.0 );
setDvarIfUninitialized( "scr_forceKillcam", false );
setDvarIfUninitialized( "scr_forceKillcam_winnersKill", true );
setDvarIfUninitialized( "scr_game_allowFinalKillcam", true );
setDvarIfUninitialized( "scr_disableTurret", false );
setDvarIfUninitialized( "scr_failCam", false );
setDvarIfUninitialized( "scr_voting", false );
setDvarIfUninitialized( "scr_voting_maps", "mp_rust,mp_terminal" );
setDvarIfUninitialized( "scr_voting_time", 26.0 );
setDvarIfUninitialized( "scr_voting_winTime", 4.0 );
setDvarIfUninitialized( "scr_allow_intermission", false );//vanilla as possible
setDvarIfUninitialized( "scr_voting_bots", false );
setDvarIfUninitialized( "scr_nuke_increases_streak", true );
setDvarIfUninitialized( "headshot_detach_head", false );
level.extraDamageFeedback = getDvarInt("scr_extraDamageFeedback");
level.allowPrintDamage = getDvarInt("scr_printDamage");
level.disableKnife = getDvarInt("scr_disableKnife");
level.intermissionTime = getDvarFloat("scr_intermissionTime");
level.forceFinalKillcam = getDvarInt("scr_forceKillcam");
level.forceFinalKillcamWinnersKill = getDvarInt("scr_forceKillcam_winnersKill");
level.allowFinalKillcam = getDvarInt("scr_game_allowFinalKillcam");
level.disableTurret = getDvarInt( "scr_disableTurret" );
level.failCam = getDvarInt( "scr_failCam" );
level.voting = getDvarInt( "scr_voting" );
level.votingMaps = getDvar( "scr_voting_maps" );
level.voteWinTime = getDvarInt( "scr_voting_winTime" );
level.voteTime = getDvarInt( "scr_voting_time" );
level.allowIntermission = getDvarInt( "scr_allow_intermission" );
level.botsVote = getDvarInt( "scr_voting_bots" );
level.headShotDetachHead = getDvarInt("headshot_detach_head");
level.nukeIncreasesStreak = getDvarInt( "scr_nuke_increases_streak" );
if ( level.voting )
level.votingMapsTok = randomizeMaps();
else
level.votingMapsTok = strTok( level.votingMaps, "," );
level.scriptIncKillstreak = false;
level.mapVotes = [];
for( i=0; i < level.votingMapsTok.size; i++ )
level.mapVotes[ i ] = 0;
level.inVoting = false;
level.inShowingWinner = false;
level.inIntermission = false;
level.highestVotedMap = -1;
makeDvarServerInfo( "cg_thirdPersonAngle", 356 );
makeDvarServerInfo( "scr_gameended", 0 );
@ -1290,7 +1476,16 @@ Callback_StartGameType()
precacheShader( "white" );
precacheShader( "black" );
//precacheMenu("popup_summary");
game["menu_vote"] = "vote";
if ( level.voting && level.voteTime > 0.0 && level.votingMapsTok.size )
precacheMenu( game["menu_vote"] );
game["menu_popup_summary"] = "popup_summary";
if ( level.allowIntermission && level.intermissionTime > 0.0 )
precacheMenu( game["menu_popup_summary"] );
game["strings"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN";
if ( level.teamBased )
@ -1473,6 +1668,8 @@ Callback_StartGameType()
thread maps\mp\_events::init();
thread maps\mp\_defcon::init();
level thread onPlayerConnect();
if ( level.teamBased )
thread maps\mp\gametypes\_friendicons::init();
@ -1557,6 +1754,99 @@ Callback_StartGameType()
level thread updateWatchedDvars();
level thread timeLimitThread();
level thread doFinalKillcam();
}
onPlayerConnect()
{
for(;;)
{
level waittill( "connected", player );
player thread onPlayerSpawned();
player thread watchIntermissionAfterConnect();
}
}
watchIntermissionAfterConnect()
{
self endon("disconnect");
wait 0.05;
self notify("kill_menus_on_connect");
if(level.inVoting || level.inShowingWinner)
{
self.sessionstate = "spectator";//allow player to leave while in intermission and make voting options
self thread watchVoting();
if(level.inVoting)
{
self setClientDvars( "hud_ShowWinner", "0",
"hud_voteText", "^3Vote for new map:",
"vote_map", "" );
}
else if(level.inShowingWinner)
{
self setClientDvars( "hud_WinningName", "preview_" + level.votingMapsTok[ level.highestVotedMap ],
"hud_WinningMap", consoleMapNameToMapName( level.votingMapsTok[ level.highestVotedMap ] ),
"hud_voteText", "^3Next Map:",
"hud_ShowWinner", "1" );
}
self openPopupMenu( game["menu_vote"] );
}
else if(level.inIntermission)
{
self.sessionstate = "spectator";//allow player to leave while in intermission
self thread openSummaryOnMenuClose();
self openPopupMenu( game["menu_popup_summary"] );
}
}
onPlayerSpawned()
{
self endon("disconnect");
self.printDamage = false;
firstTime = false;
for(;;)
{
self waittill("spawned_player");
if( !firstTime && level.allowPrintDamage )
{
firstTime = true;
self iPrintlnBold( "^7Press ^3[{+actionslot 2}] ^7to toggle ^3Print Damage" );
}
self thread printDamage();
}
}
printDamage()
{
if( !level.allowPrintDamage )
return;
self endon("disconnect");
self endon("death");
self notifyOnPlayerCommand("printDamage", "+actionslot 2");
for(;;)
{
self waittill("printDamage");
self playSound( "semtex_warning" );
if(self.printDamage)
{
self iPrintlnBold("^7Print Damage ^1Disabled");
self.printDamage = false;
}
else
{
self iPrintlnBold("^7Print Damage ^1Enabled");
self.printDamage = true;
}
}
}
@ -1842,9 +2132,19 @@ getBetterTeam()
rankedMatchUpdates( winner )
{
//if ( matchMakingGame() )
//{
setXenonRanks();
//if ( hostIdledOut() )
//{
// level.hostForcedEnd = true;
// logString( "host idled out" );
// endLobby();
//}
updateMatchBonusScores( winner );
//}
updateWinLossStats( winner );
}
@ -1934,6 +2234,8 @@ displayRoundSwitch()
endGameOvertime( winner, endReasonText )
{
visionSetNaked( "mpOutro", 0.5 );
setDvar( "scr_gameended", 2 );
// freeze players
foreach ( player in level.players )
{
@ -1966,6 +2268,9 @@ endGameOvertime( winner, endReasonText )
roundEndWait( level.roundEndDelay, false );
if ( level.forceFinalKillcam )
waittillFinalKillcamDone();
game["status"] = "overtime";
level notify ( "restarting" );
game["state"] = "playing";
@ -2012,6 +2317,9 @@ endGameHalfTime()
roundEndWait( level.roundEndDelay, false );
if ( level.forceFinalKillcam )
waittillFinalKillcamDone();
game["status"] = "halftime";
level notify ( "restarting" );
game["state"] = "playing";
@ -2021,6 +2329,11 @@ endGameHalfTime()
endGame( winner, endReasonText, nukeDetonated )
{
if( !level.forceFinalKillcamWinnersKill || !isDefined( winner ) || !isString( winner ) || ( winner != "axis" && winner != "allies" ) )
level.finalKillCam_winner = "none";
else
level.finalKillCam_winner = winner;
if ( !isDefined(nukeDetonated) )
nukeDetonated = false;
@ -2109,6 +2422,12 @@ endGame( winner, endReasonText, nukeDetonated )
displayRoundEnd( winner, endReasonText );
if ( level.forceFinalKillcam )
{
waittillFinalKillcamDone();
}
else
{
if ( level.showingFinalKillcam )
{
foreach ( player in level.players )
@ -2118,6 +2437,7 @@ endGame( winner, endReasonText, nukeDetonated )
waittillFinalKillcamDone();
}
}
if ( !wasLastRound() )
{
@ -2148,9 +2468,20 @@ endGame( winner, endReasonText, nukeDetonated )
maps\mp\gametypes\_missions::roundEnd( winner );
if( isRoundBased() )
winner = getWinningTeam();
displayGameEnd( winner, endReasonText );
if ( level.showingFinalKillcam && wasOnlyRound() )
if( wasOnlyRound() )
{
if ( level.forceFinalKillcam )
{
waittillFinalKillcamDone();
}
else
{
if ( level.showingFinalKillcam )
{
foreach ( player in level.players )
player notify ( "reset_outcome" );
@ -2159,6 +2490,8 @@ endGame( winner, endReasonText, nukeDetonated )
waittillFinalKillcamDone();
}
}
}
levelFlagClear( "block_notifies" );
@ -2196,28 +2529,407 @@ endGame( winner, endReasonText, nukeDetonated )
{
wait ( min( 10.0, 4.0 + level.postGameNotifies ) );
}
if (!matchmakingGame())
if ( level.voting && level.voteTime > 0.0 && level.votingMapsTok.size )
{
level.inVoting = true;
foreach (player in level.players)
{
//player openPopupMenu("popup_summary");
player.sessionstate = "spectator";//allow player to leave while in intermission and make voting options
player thread watchVoting();
player setClientDvars( "hud_ShowWinner", "0",
"hud_voteText", "^3Vote for new map:",
"vote_map", "" );
player openPopupMenu( game["menu_vote"] );
}
intermissionTime = 30.0;
level thread doBotVoting();
thread timeLimitClock_Intermission( level.voteTime, (84.7, 100, 0) );
wait level.voteTime;
level.inVoting = false;
if(getDvarInt( "party_host" ))
level.highestVotedMap = getHighestVotedMap();
if ( level.voteWinTime > 0.0 )
{
intermissionTime = 10.0;
level.inShowingWinner = true;
foreach (player in level.players)
{
player setClientDvars( "hud_WinningName", "preview_" + level.votingMapsTok[ level.highestVotedMap ],
"hud_WinningMap", consoleMapNameToMapName( level.votingMapsTok[ level.highestVotedMap ] ),
"hud_voteText", "^3Next Map:",
"hud_ShowWinner", "1" );
}
thread timeLimitClock_Intermission( intermissionTime );
wait intermissionTime;
thread timeLimitClock_Intermission( level.voteWinTime, (84.7, 100, 0) );
wait level.voteWinTime;
level.inShowingWinner = false;
}
foreach (player in level.players)
player closeMenu( game["menu_vote"] );
level notify( "voting_finished" );
level setVoteVars( level.highestVotedMap );
}
if ( level.allowIntermission && level.intermissionTime > 0.0 )
{
level.inIntermission = true;
foreach (player in level.players)
{
player.sessionstate = "spectator";//allow player to leave while in intermission
player thread openSummaryOnMenuClose();
player openPopupMenu( game["menu_popup_summary"] );
}
thread timeLimitClock_Intermission( level.intermissionTime );
wait level.intermissionTime;
level.inIntermission = false;
level notify( "intermission_finished" );
}
level notify( "exitLevel_called" );
exitLevel( false );
}
setVoteVars( highestVotedMap )
{
setDvar( "sv_maprotation", "map " + level.votingMapsTok[ highestVotedMap ] );
setDvar( "sv_maprotationCurrent", "map " + level.votingMapsTok[ highestVotedMap ] );
}
getHighestVotedMap()
{
highest = 0;
for( i = 0; i < level.mapVotes.size; i++ )
if( level.mapVotes[ i ] > highest && i < 9 )
highest = level.mapVotes[ i ];
votes = [];
for( i = 0; i < level.mapVotes.size; i++ )
if( level.mapVotes[ i ] == highest && i < 9 )
votes[votes.size] = i;
if ( votes.size )
return votes[ randomInt( votes.size ) ];
else if ( level.mapVotes.size > 9 )
return randomIntRange( 0, 8 );
else
return randomInt( level.mapVotes.size );
}
doBotVoting()
{
if(!level.botsVote)
return;
level endon("voting_finished");
bots = [];
foreach(player in level.players)
{
if(!isDefined(player.pers["isBot"]) || !player.pers["isBot"])
continue;
player.botWillVoteFor = bots.size;
bots[bots.size] = player;
}
while(bots.size)
{
wait 0.05;
bot = bots[randomInt(bots.size)];
if(!bot.hasVoted)
{
bot castMap(bot.botWillVoteFor);
wait randomInt(3);
}
}
}
ridVoteOnDisconnect()
{
level endon("voting_finished");
self waittill_either( "disconnect", "kill_menus_on_connect" );
if ( self.votedNum > -1 )
level.mapVotes[ self.votedNum ]--;
}
updateVoteMenu()
{
self endon("disconnect");
self endon("kill_menus_on_connect");
level endon("voting_finished");
for(i = 0; i < 9; i++)
{
if( i >= level.votingMapsTok.size )
{
self setClientDvar( "hud_picName" + i, "white" );
}
else
{
self setClientDvars( "hud_mapName" + i, consoleMapNameToMapName( level.votingMapsTok[ i ] ),
"hud_mapVotes" + i, level.mapVotes[ i ],
"hud_picName" + i, "preview_" + level.votingMapsTok[ i ] );
}
}
for(;;)
{
wait 0.5;
for( i = 0; i < level.votingMapsTok.size; i++ )
self setClientDvar( "hud_mapVotes" + i, level.mapVotes[ i ] );
highestVotedMap = getHighestVotedMap();
self setClientDvars( "hud_gamesize", level.players.size,
"hud_mapVotes" + highestVotedMap, "^3" + level.mapVotes[ highestVotedMap ] );
}
}
watchVoting()
{
self endon("disconnect");
self endon("kill_menus_on_connect");
level endon("voting_finished");
self thread ridVoteOnDisconnect();
self thread updateVoteMenu();
self.hasVoted = false;
self.votedNum = -1;
for(;;)
{
self waittill("menuresponse", menu, response);
if( menu == game["menu_vote"] )
{
switch(response)
{
case "map1":
self castMap(0);
break;
case "map2":
self castMap(1);
break;
case "map3":
self castMap(2);
break;
case "map4":
self castMap(3);
break;
case "map5":
self castMap(4);
break;
case "map6":
self castMap(5);
break;
case "map7":
self castMap(6);
break;
case "map8":
self castMap(7);
break;
case "map9":
self castMap(8);
break;
default:
break;
}
}
else if ( response == "back" )
{
self closepopupMenu();
self closeInGameMenu();
wait 0.25;
self openPopupMenu( game["menu_vote"] );
continue;
}
}
}
castMap( number )
{
if ( !isDefined( level.votingMapsTok[ number ] ) || level.votingMapsTok[ number ] == "" )
{
if ( self.hasVoted )
{
self.hasVoted = false;
level.mapVotes[ self.votedNum ]--;
self.votedNum = -1;
}
self iprintln( "Invalid map selection" );
return;
}
if( !self.hasVoted )
{
self.hasVoted = true;
level.mapVotes[ number ]++;
self.votedNum = number;
self iprintln( "You voted for ^3" + consoleMapNameToMapName( level.votingMapsTok[ number ] ) );
}
else if( self.votedNum != number )
{
level.mapVotes[ self.votedNum ]--;
level.mapVotes[ number ]++;
self.votedNum = number;
self iprintln( "You ^3re-voted ^7for ^3" + consoleMapNameToMapName( level.votingMapsTok[ number ] ) );
}
}
consoleMapNameToMapName(mapname)
{
switch(mapname)
{
case "mp_abandon":
return "Carnival";
case "mp_rundown":
return "Rundown";
case "mp_afghan":
return "Afghan";
case "mp_boneyard":
return "Scrapyard";
case "mp_brecourt":
return "Wasteland";
case "mp_cargoship":
return "Wetwork";
case "mp_checkpoint":
return "Karachi";
case "mp_compact":
return "Salvage";
case "mp_complex":
return "Bailout";
case "mp_crash":
return "Crash";
case "mp_cross_fire":
return "Crossfire";
case "mp_derail":
return "Derail";
case "mp_estate":
return "Estate";
case "mp_favela":
return "Favela";
case "mp_fuel2":
return "Fuel";
case "mp_highrise":
return "Highrise";
case "mp_invasion":
return "Invasion";
case "mp_killhouse":
return "Killhouse";
case "mp_nightshift":
return "Skidrow";
case "mp_nuked":
return "Nuketown";
case "oilrig":
return "Oilrig";
case "mp_quarry":
return "Quarry";
case "mp_rust":
return "Rust";
case "mp_storm":
return "Storm";
case "mp_strike":
return "Strike";
case "mp_subbase":
return "Subbase";
case "mp_terminal":
return "Terminal";
case "mp_trailerpark":
return "Trailer Park";
case "mp_overgrown":
return "Overgrown";
case "mp_underpass":
return "Underpass";
case "mp_vacant":
return "Vacant";
case "iw4_credits":
return "IW4 Test Map";
case "airport":
return "Airport";
case "co_hunted":
return "Hunted";
case "invasion":
return "Burgertown";
case "mp_bloc":
return "Bloc";
case "mp_bog_sh":
return "Bog";
case "contingency":
return "Contingency";
case "gulag":
return "Gulag";
case "so_ghillies":
return "Pripyat";
case "ending":
return "Museum";
case "af_chase":
return "Afghan Chase";
case "af_caves":
return "Afghan Caves";
case "arcadia":
return "Arcadia";
case "boneyard":
return "Boneyard";
case "cliffhanger":
return "Cliffhanger";
case "dcburning":
return "DCBurning";
case "dcemp":
return "DCEMP";
case "downtown":
return "Downtown";
case "estate":
return "EstateSP";
case "favela":
return "FavelaSP";
case "favela_escape":
return "Favela Escape";
case "roadkill":
return "Roadkill";
case "trainer":
return "TH3 PIT";
case "so_bridge":
return "Bridge";
case "dc_whitehouse":
return "Whitehouse";
default:
return mapname;
}
}
openSummaryOnMenuClose()
{
self endon("disconnect");
self endon("kill_menus_on_connect");
level endon("intermission_finished");
for(;;)
{
self waittill("menuresponse", menu, response);
if ( response == "back" && menu != game["menu_popup_summary"] )
{
self closepopupMenu();
self closeInGameMenu();
wait 0.25;
self openPopupMenu( game["menu_popup_summary"] );
continue;
}
}
}
updateEndReasonText( winner )
{
if ( !level.teamBased )
@ -2327,3 +3039,105 @@ processLobbyData()
sendClientMatchData();
}
getWinningTeam()
{
if ( game["roundsWon"]["allies"] == game["roundsWon"]["axis"] )
winner = "tie";
else if ( game["roundsWon"]["axis"] > game["roundsWon"]["allies"] )
winner = "axis";
else
winner = "allies";
return winner;
}
doFinalKillCam()
{
level waittill ( "round_end_finished" );
winner = level.finalKillCam_winner; // we want to show the winner's final kill cam
delay = level.finalKillCam_delay[ winner ];
victim = level.finalKillCam_victim[ winner ];
attacker = level.finalKillCam_attacker[ winner ];
attackerNum = level.finalKillCam_attackerNum[ winner ];
killCamEntityIndex = level.finalKillCam_killCamEntityIndex[ winner ];
killCamEntityStartTime = level.finalKillCam_killCamEntityStartTime[ winner ];
sWeapon = level.finalKillCam_sWeapon[ winner ];
deathTimeOffset = level.finalKillCam_deathTimeOffset[ winner ];
psOffsetTime = level.finalKillCam_psOffsetTime[ winner ];
timeRecorded = level.finalKillCam_timeRecorded[ winner ]/1000;
timeGameEnded = level.gameEndTime/1000;
if( !isDefined( victim ) || !isDefined( attacker ) )
return;
if( !level.forceFinalKillcam || !level.allowFinalKillcam )
return;
// if the killcam happened longer than 15 seconds ago, don't show it
killCamBufferTime = 15;
killCamOffsetTime = timeGameEnded - timeRecorded;
if( killCamOffsetTime > killCamBufferTime )
return;
level.showingFinalKillcam = true;
if ( isDefined( attacker ) )
{
maps\mp\_awards::addAwardWinner( "finalkill", attacker.clientid );
attacker.finalKill = true;
}
postDeathDelay = (( getTime() - victim.deathTime ) / 1000);
foreach ( player in level.players )
{
player closePopupMenu();
player closeInGameMenu();
if( isDefined( level.nukeDetonated ) )
player VisionSetNakedForPlayer( "mpnuke_aftermath", 0 );
else
player VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
player.killcamentitylookat = victim getEntityNumber();
if ( (player != victim || (!isRoundBased() || isLastRound())) && player _hasPerk( "specialty_copycat" ) )
player _unsetPerk( "specialty_copycat" );
player thread maps\mp\gametypes\_killcam::killcam( attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, postDeathDelay + deathTimeOffset, psOffsetTime, 0, 10000, attacker, victim );
}
wait( 0.1 );
while ( maps\mp\gametypes\_damage::anyPlayersInKillcam() )
wait( 0.05 );
level.showingFinalKillcam = false;
}
recordFinalKillCam( delay, victim, attacker, attackerNum, killCamEntityIndex, killCamEntityStartTime, sWeapon, deathTimeOffset, psOffsetTime )
{
teams[0] = "none"; // none gets filled just in case we need something without a team or this is ffa
if( level.teambased && IsDefined( attacker.team ) )
teams[1] = attacker.team; // we want to save each team seperately so we can show the winning team's kill when applicable
for( i = 0; i < teams.size; i++ )
{
team = teams[i];
level.finalKillCam_delay[ team ] = delay;
level.finalKillCam_victim[ team ] = victim;
level.finalKillCam_attacker[ team ] = attacker;
level.finalKillCam_attackerNum[ team ] = attackerNum;
level.finalKillCam_killCamEntityIndex[ team ] = killCamEntityIndex;
level.finalKillCam_killCamEntityStartTime[ team ] = killCamEntityStartTime;
level.finalKillCam_sWeapon[ team ] = sWeapon;
level.finalKillCam_deathTimeOffset[ team ] = deathTimeOffset;
level.finalKillCam_psOffsetTime[ team ] = psOffsetTime;
level.finalKillCam_timeRecorded[ team ] = getTime();
}
}

View File

@ -1,3 +1,10 @@
/*
_rank modded
Author: INeedGames
Date: 09/22/2020
Removes the level.xpScale check, good old 2010 infinity ward under a law suite logic here
*/
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
@ -8,11 +15,11 @@ init()
level.scoreInfo = [];
level.xpScale = getDvarInt( "scr_xpscale" );
if ( level.xpScale > 4 || level.xpScale < 0)
exitLevel( false );
// if ( level.xpScale > 4 || level.xpScale < 0)
// exitLevel( false );
level.xpScale = min( level.xpScale, 4 );
level.xpScale = max( level.xpScale, 0 );
// level.xpScale = min( level.xpScale, 4 );
// level.xpScale = max( level.xpScale, 0 );
level.rankTable = [];
@ -677,8 +684,8 @@ isLastRestXPAward( baseXP )
syncXPStat()
{
if ( level.xpScale > 4 || level.xpScale <= 0)
exitLevel( false );
// if ( level.xpScale > 4 || level.xpScale <= 0)
// exitLevel( false );
xp = self getRankXP();

View File

@ -1,3 +1,33 @@
/*
_weapons modded
Author: INeedGames
Date: 09/22/2020
Adds dropping weapon, picking up equipment and friendly fire grenade team switching exploit fix.
Fixes the semtex 'STUCK' challenge when the thrower dies.
Fixes claymores from tripping when the victim is elevated from the claymore.
Fixes stuns and flashes friendly fire on claymores and c4s.
Fixes direct impact stun stunning the victim.
DVARS:
- scr_allowDropWeaponOnCommand <bool>
false - (default) allows the player to drop their weapon
- scr_allowPickUpEquipment <bool>
false - (default) allows the player to pick up their equipment once placed
- scr_allowDropWeaponOnDeath <bool>
true - (default) allows player dropping their weapon on death
- scr_allowClaymoreBounces <bool>
true - (default) allows players to use claymores from an elevated area, and the claymore will be placed far below the player.
- scr_extraTeamIcons <bool>
false - (default) adds team icons to more objects such as grenades
- scr_deleteNadeOnTeamChange <bool>
false - (default) deletes a grenade when it's owner changes team
*/
#include common_scripts\utility;
#include maps\mp\_utility;
@ -50,6 +80,20 @@ init()
break;
}
setDvarIfUninitialized("scr_allowDropWeaponOnCommand", false);
setDvarIfUninitialized("scr_allowPickUpEquipment", false);
setDvarIfUninitialized("scr_allowDropWeaponOnDeath", true);
setDvarIfUninitialized("scr_allowClaymoreBounces", true);
setDvarIfUninitialized("scr_extraTeamIcons", false);
setDvarIfUninitialized("scr_deleteNadeOnTeamChange", false);
level.allowDropWeaponOnCommand = getDvarInt("scr_allowDropWeaponOnCommand");
level.allowDropWeaponOnDeath = getDvarInt("scr_allowDropWeaponOnDeath");
level.allowPickUpEquipment = getDvarInt("scr_allowPickUpEquipment");
level.allowExtendedClaymoreTrace = getDvarInt("scr_allowClaymoreBounces");
level.extraTeamIcons = getDvarInt("scr_extraTeamIcons");
level.deleteNadeOnTeamChange = getDvarInt("scr_deleteNadeOnTeamChange");
attachmentList = getAttachmentList();
// assigns weapons with stat numbers from 0-149
@ -216,6 +260,8 @@ init()
level thread onPlayerConnect();
level thread watchSentryLimit();
level.c4explodethisframe = false;
array_thread( getEntArray( "misc_turret", "classname" ), ::turret_monitorUse );
@ -224,6 +270,19 @@ init()
}
watchSentryLimit()
{
for(;;)
{
sentries = getentarray( "misc_turret", "classname" );
if(sentries.size > 30)
sentries[0] delete();
wait 0.05;
}
}
dumpIt()
{
@ -397,6 +456,7 @@ onPlayerConnect()
player thread onPlayerSpawned();
player thread bombSquadWaiter();
player thread monitorSemtex();
}
}
@ -423,6 +483,7 @@ onPlayerSpawned()
self thread watchSentryUsage();
self thread watchWeaponReload();
self thread maps\mp\gametypes\_class::trackRiotShield();
self thread watchDropWeaponOnCommand();
self.lastHitTime = [];
@ -433,13 +494,88 @@ onPlayerSpawned()
self thread updateSavedLastWeapon();
if ( self hasWeapon( "semtex_mp" ) )
self thread monitorSemtex();
self.currentWeaponAtSpawn = undefined;
}
}
watchDropWeaponOnCommand()
{
if( !level.allowDropWeaponOnCommand )
return;
self endon( "disconnect" );
self endon( "death" );
self notifyOnPlayerCommand( "drop_weapon_on_cmd", "+actionslot 2" );
for(;;)
{
self waittill( "drop_weapon_on_cmd" );
weapon = self GetCurrentWeapon();
if ( !gameFlag( "prematch_done" ) || !isDefined( weapon ) )
continue;
if( level.gameEnded )
continue;
if( !mayDropWeapon( weapon ) )
continue;
if ( !self hasWeapon( weapon ) )
continue;
if ( weapon != "riotshield_mp" )
{
if ( !(self AnyAmmoForWeaponModes( weapon )) )
{
continue;
}
clipAmmoR = self GetWeaponAmmoClip( weapon, "right" );
clipAmmoL = self GetWeaponAmmoClip( weapon, "left" );
if ( !clipAmmoR && !clipAmmoL )
{
continue;
}
stockAmmo = self GetWeaponAmmoStock( weapon );
stockMax = WeaponMaxAmmo( weapon );
if ( stockAmmo > stockMax )
stockAmmo = stockMax;
item = self dropItem( weapon );
item ItemWeaponSetAmmo( clipAmmoR, stockAmmo, clipAmmoL );
}
else
{
item = self dropItem( weapon );
if ( !isDefined( item ) )
continue;
item ItemWeaponSetAmmo( 1, 1, 0 );
}
item.owner = self;
item thread maps\mp\gametypes\_weapons::watchPickup();
//deletes dropped weapon after 30 sec.
item thread maps\mp\gametypes\_weapons::deletePickupAfterAWhile();
detach_model = getWeaponModel( weapon );
if ( !isDefined( detach_model ) )
continue;
if( isDefined( self.tag_stowed_back ) && detach_model == self.tag_stowed_back )
self maps\mp\gametypes\_weapons::detach_back_weapon();
if ( !isDefined( self.tag_stowed_hip ) )
continue;
if( detach_model == self.tag_stowed_hip )
self maps\mp\gametypes\_weapons::detach_hip_weapon();
}
}
WatchStingerUsage()
{
self maps\mp\_stinger::StingerUsageLoop();
@ -598,6 +734,9 @@ mayDropWeapon( weapon )
dropWeaponForDeath( attacker )
{
if( !level.allowDropWeaponOnDeath )
return;
weapon = self.lastDroppableWeapon;
if ( isdefined( self.droppedDeathWeapon ) )
@ -1106,6 +1245,17 @@ watchGrenadeUsage()
}
}
deleteOnOwnerTeamChange( owner )
{
self endon( "delete_on_team_overlap" );
self endon( "death" );
owner waittill_any( "disconnect", "joined_team", "joined_spectators" );
self delete();
}
beginGrenadeTracking()
{
self endon( "death" );
@ -1122,16 +1272,42 @@ beginGrenadeTracking()
self.changingWeapon = undefined;
if ( weaponName == "frag_grenade_mp" || weaponName == "semtex_mp" )
grenade.owner = self;
switch( weaponName )
{
case "frag_grenade_mp":
case "semtex_mp":
grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
grenade.originalOwner = self;
}
if ( weaponName == "flash_grenade_mp" || weaponName == "concussion_grenade_mp" )
{
grenade.owner = self;
if ( level.deleteNadeOnTeamChange )
grenade thread deleteOnOwnerTeamChange( self );
if( level.extraTeamIcons )
grenade thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
break;
case "flash_grenade_mp":
case "concussion_grenade_mp":
grenade thread empExplodeWaiter();
if ( level.deleteNadeOnTeamChange )
grenade thread deleteOnOwnerTeamChange( self );
if( level.extraTeamIcons )
grenade thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
break;
case "smoke_grenade_mp":
if( level.extraTeamIcons )
grenade thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
break;
case "throwingknife_mp":
if ( level.deleteNadeOnTeamChange )
grenade thread deleteOnOwnerTeamChange( self );
if( level.extraTeamIcons )
grenade thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
break;
}
}
@ -1193,6 +1369,10 @@ watchMissileUsage()
default:
break;
}
if( level.extraTeamIcons && weaponName != "remotemissile_projectile_mp" )
missile thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
if ( level.deleteNadeOnTeamChange )
missile thread deleteOnOwnerTeamChange( self );
}
}
@ -1262,6 +1442,14 @@ watchForThrowbacks()
grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
grenade.originalOwner = self;
if( level.extraTeamIcons )
grenade thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
if ( level.deleteNadeOnTeamChange )
{
grenade notify( "delete_on_team_overlap" );
grenade thread deleteOnOwnerTeamChange( self );
}
}
}
@ -1302,7 +1490,12 @@ watchC4()
c4 thread c4Damage();
c4 thread c4EMPDamage();
c4 thread c4EMPKillstreakWait();
if( level.extraTeamIcons )
c4 thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
//c4 thread c4DetectionTrigger( self.pers[ "team" ] );
c4 thread c4WatchPickup();
if ( level.deleteNadeOnTeamChange )
c4 thread deleteOnOwnerTeamChange( self );
}
}
}
@ -1316,6 +1509,9 @@ c4EMPDamage()
{
self waittill( "emp_damage", attacker, duration );
if ( isPlayer(attacker) && !friendlyFireCheck( self.owner, attacker ) )
continue;
playfxOnTag( getfx( "sentry_explode_mp" ), self, "tag_origin" );
self.disabled = true;
@ -1350,15 +1546,44 @@ c4EMPKillstreakWait()
}
}
deleteTeamHeadIconOnUndefined(ent, hud)
{
ent endon( "death" );
while ( isDefined(ent) )
wait 0.05;
hud destroy();
hud = undefined;
ent notify( "kill_entity_headicon_thread" );
}
setClaymoreTeamHeadIcon( team )
{
self endon( "death" );
wait .05;
if ( self.weaponname == "claymore_mp" && !level.allowExtendedClaymoreTrace )
{
self waittill( "missile_stuck" );
self waittill( "claymore_trace_fixed" );
}
else
wait 0.05;
if ( isDefined( self.entityHeadIcon ) )
{
self.entityHeadIconTeam = "none";
self.entityHeadIcon destroy();
self.entityHeadIcon = undefined;
self notify( "kill_entity_headicon_thread" );
}
if ( level.teamBased )
self maps\mp\_entityheadicons::setTeamHeadIcon( team, ( 0, 0, 20 ) );
else if ( isDefined( self.owner ) )
self maps\mp\_entityheadicons::setPlayerHeadIcon( self.owner, (0,0,20) );
thread deleteTeamHeadIconOnUndefined(self, self.entityHeadIcon);
}
@ -1367,7 +1592,6 @@ watchClaymores()
self endon( "spawned_player" );
self endon( "disconnect" );
self.claymorearray = [];
while ( 1 )
{
self waittill( "grenade_fire", claymore, weapname );
@ -1389,7 +1613,10 @@ watchClaymores()
claymore thread claymoreDetonation();
//claymore thread claymoreDetectionTrigger_wait( self.pers[ "team" ] );
claymore thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
claymore thread c4WatchPickup();
claymore thread claymoreWatchTrace();
if ( level.deleteNadeOnTeamChange )
claymore thread deleteOnOwnerTeamChange( self );
/#
if ( getdvarint( "scr_claymoredebug" ) )
{
@ -1400,6 +1627,96 @@ watchClaymores()
}
}
claymoreWatchTrace()
{
if( level.allowExtendedClaymoreTrace )
return;
self endon( "death" );
// need to see if this is being placed far away from the player and not let it do that
// this will fix a legacy bug where you can stand on a ledge and plant a claymore down on the ground far below you
self Hide();
self waittill( "missile_stuck" );
wait 0.05;//wait for threads
distanceZ = 40;
if( distanceZ * distanceZ < DistanceSquared( self.origin, self.owner.origin ) )
{
secTrace = bulletTrace( self.owner.origin, self.owner.origin - (0, 0, distanceZ), false, self );
if( secTrace["fraction"] == 1 )
{
self.owner SetWeaponAmmoStock( self.weaponname, self.owner GetWeaponAmmoStock( self.weaponname ) + 1 );
self delete();
return;
}
self.origin = secTrace["position"];
}
self Show();
self notify( "claymore_trace_fixed" );
}
_notUsableForJoiningPlayers( owner )
{
self endon ( "death" );
level endon ( "game_ended" );
owner endon ( "disconnect" );
// as players join they need to be set to not be able to use this
while( true )
{
level waittill( "player_spawned", player );
if( IsDefined( player ) && player != owner )
{
self disablePlayerUse( player );
}
}
}
c4WatchPickup()
{
if( !level.allowPickUpEquipment )
return;
self endon( "death" );
self waittill( "missile_stuck" );
if( !level.allowExtendedClaymoreTrace && self.weaponname == "claymore_mp" )
self waittill( "claymore_trace_fixed" );
trigger = spawn( "script_origin", self.origin );
self thread deleteOnDeath( trigger );
trigger setCursorHint( "HINT_NOICON" );
if ( self.weaponname == "c4_mp" )
trigger setHintString( &"MP_PICKUP_C4" );
else if (self.weaponname == "claymore_mp" )
trigger setHintString( &"MP_PICKUP_CLAYMORE" );
trigger setSelfUsable( self.owner );
trigger thread _notUsableForJoiningPlayers( self );
for ( ;; )
{
trigger waittillmatch( "trigger", self.owner );
usePressTime = getTime();
while( self.owner UseButtonPressed() && (getTime() - usePressTime) < 500 )
wait .05;
if( self.owner UseButtonPressed() )
{
self.owner playLocalSound( "scavenger_pack_pickup" );
self.owner SetWeaponAmmoStock( self.weaponname, self.owner GetWeaponAmmoStock( self.weaponname ) + 1 );
self delete();
}
}
}
/#
claymoreDebug()
{
@ -1450,6 +1767,9 @@ claymoreDetonation()
self waittill( "missile_stuck" );
if( !level.allowExtendedClaymoreTrace )
self waittill( "claymore_trace_fixed" );
damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - level.claymoreDetonateRadius ), 0, level.claymoreDetonateRadius, level.claymoreDetonateRadius * 2 );
self thread deleteOnDeath( damagearea );
@ -1467,6 +1787,9 @@ claymoreDetonation()
if ( lengthsquared( player getVelocity() ) < 10 )
continue;
if ( abs( player.origin[2] - self.origin[2] ) > 128 )
continue;
if ( !player shouldAffectClaymore( self ) )
continue;
@ -1658,7 +1981,7 @@ c4Damage()
while ( 1 )
{
self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags );
self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags, weapon );
if ( !isPlayer( attacker ) )
continue;
@ -1666,8 +1989,22 @@ c4Damage()
if ( !friendlyFireCheck( self.owner, attacker ) )
continue;
if ( damage < 5 )// ignore concussion grenades
if( isDefined( weapon ) )
{
switch( weapon )
{
case "concussion_grenade_mp":
case "flash_grenade_mp":
case "smoke_grenade_mp":
continue;
}
}
else
{
if( damage < 5 )
continue;
}
break;
}
@ -1692,6 +2029,14 @@ c4Damage()
self.wasDamaged = true;
if( isPlayer( attacker ) )
{
if( isDefined( level.extraDamageFeedback ) && level.extraDamageFeedback )
attacker maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "c4" );
if( isDefined( level.allowPrintDamage ) && level.allowPrintDamage && attacker.printDamage )
attacker iPrintLnBold( damage );
}
if ( level.teamBased )
{
// "destroyed_explosive" notify, for challenges
@ -2071,10 +2416,10 @@ damageEnt( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, damagepos, da
else
{
// destructable walls and such can only be damaged in certain ways.
if ( self.isADestructable && ( sWeapon == "artillery_mp" || sWeapon == "claymore_mp" ) || sWeapon == "stealth_bomb_mp" )
if ( self.isADestructable && ( sWeapon == "artillery_mp" || sWeapon == "claymore_mp" || sWeapon == "stealth_bomb_mp" ) )
return;
self.entity notify( "damage", iDamage, eAttacker, ( 0, 0, 0 ), ( 0, 0, 0 ), "mod_explosive", "", "" );
self.entity notify( "damage", iDamage, eAttacker, ( 0, 0, 0 ), ( 0, 0, 0 ), "MOD_EXPLOSIVE", "", "", "", undefined, sWeapon );
}
}
@ -2107,6 +2452,12 @@ onWeaponDamage( eInflictor, sWeapon, meansOfDeath, damage, eAttacker )
{
case "concussion_grenade_mp":
// should match weapon settings in gdt
if ( !isDefined( eInflictor ) )//check to ensure inflictor wasnt destroyed.
return;
if( meansOfDeath == "MOD_IMPACT" ) // do not cause stun effect if it was direct hit
return;
radius = 512;
scale = 1 - ( distance( self.origin, eInflictor.origin ) / radius );
@ -2115,10 +2466,18 @@ onWeaponDamage( eInflictor, sWeapon, meansOfDeath, damage, eAttacker )
time = 2 + ( 4 * scale );
if ( isDefined( self.stunScaler ) )
time = time * self.stunScaler;
wait( 0.05 );
eAttacker notify( "stun_hit" );
self notify( "concussed", eAttacker );
if( eAttacker != self )
eAttacker maps\mp\gametypes\_missions::processChallenge( "ch_alittleconcussed" );
self shellShock( "concussion_grenade_mp", time );
self.concussionEndTime = getTime() + ( time * 1000 );
if( IsDefined( eInflictor.owner ) && eInflictor.owner == eAttacker && isDefined( level.extraDamageFeedback ) && level.extraDamageFeedback )
eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "stun" );
break;
case "weapon_cobra_mk19_mp":
@ -2649,7 +3008,6 @@ buildWeaponData( filterPerks )
monitorSemtex()
{
self endon( "disconnect" );
self endon( "death" );
for( ;; )
{

View File

@ -1,3 +1,21 @@
/*
_emp modded
Author: INeedGames
Date: 09/22/2020
Adds a friendly fire check when destroying killstreaks and a duration dvar.
> gets emp'd
> hears on an electric radio: WE'VE BEEN EMP'D ELECTRONICS ARE DOWN!
DVARS:
- scr_emp_duration <int>
60 - (default) amount of seconds for an emp to last
- scr_emp_doesFriendlyFire <bool>
true - (default) whether or not if an emp destroies all killstreaks reguardless of friendly fire
Thanks: H3X1C, Emosewaj
*/
#include maps\mp\_utility;
#include common_scripts\utility;
@ -17,8 +35,13 @@ init()
level.killstreakFuncs["emp"] = ::EMP_Use;
level thread onPlayerConnect();
setDvarIfUninitialized( "scr_emp_duration", 60 );
setDvarIfUninitialized( "scr_emp_doesFriendlyFire", true );
level.empduration = getDvarInt( "scr_emp_duration" );
level.empDoesFriendlyFire = getDvarInt( "scr_emp_doesFriendlyFire" );
level thread onPlayerConnect();
}
@ -58,9 +81,9 @@ EMP_Use( lifeId, delay )
otherTeam = level.otherTeam[myTeam];
if ( level.teamBased )
self thread EMP_JamTeam( otherTeam, 60.0, delay );
self thread EMP_JamTeam( otherTeam, level.empduration, delay );
else
self thread EMP_JamPlayers( self, 60.0, delay );
self thread EMP_JamPlayers( self, level.empduration, delay );
self maps\mp\_matchdata::logKillstreakEvent( "emp", self.origin );
self notify( "used_emp" );
@ -69,7 +92,7 @@ EMP_Use( lifeId, delay )
}
EMP_JamTeam( teamName, duration, delay )
EMP_JamTeam( teamName, duration, delay, silent )
{
level endon ( "game_ended" );
@ -77,6 +100,7 @@ EMP_JamTeam( teamName, duration, delay )
//wait ( delay );
if (!isDefined(silent))
thread teamPlayerCardSplash( "used_emp", self );
level notify ( "EMP_JamTeam" + teamName );
@ -93,6 +117,8 @@ EMP_JamTeam( teamName, duration, delay )
player RadarJamOff();
}
if (!isDefined(silent))
{
visionSetNaked( "coup_sunblind", 0.1 );
thread empEffects();
@ -103,11 +129,12 @@ EMP_JamTeam( teamName, duration, delay )
// this will force them to lerp from the bright one to the normal one.
visionSetNaked( "coup_sunblind", 0 );
visionSetNaked( getDvar( "mapname" ), 3.0 );
}
level.teamEMPed[teamName] = true;
level notify ( "emp_update" );
level destroyActiveVehicles( self );
level destroyActiveVehicles( self, !level.empEffectsAll );
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( duration );
@ -125,7 +152,7 @@ EMP_JamTeam( teamName, duration, delay )
level notify ( "emp_update" );
}
EMP_JamPlayers( owner, duration, delay )
EMP_JamPlayers( owner, duration, delay, silent )
{
level notify ( "EMP_JamPlayers" );
level endon ( "EMP_JamPlayers" );
@ -145,6 +172,8 @@ EMP_JamPlayers( owner, duration, delay )
player RadarJamOff();
}
if (!isDefined(silent))
{
visionSetNaked( "coup_sunblind", 0.1 );
thread empEffects();
@ -155,12 +184,13 @@ EMP_JamPlayers( owner, duration, delay )
// this will force them to lerp from the bright one to the normal one.
visionSetNaked( "coup_sunblind", 0 );
visionSetNaked( getDvar( "mapname" ), 3.0 );
}
level notify ( "emp_update" );
level.empPlayer = owner;
level.empPlayer thread empPlayerFFADisconnect();
level destroyActiveVehicles( owner );
level destroyActiveVehicles( owner, !level.empDoesFriendlyFire );
level notify ( "emp_update" );
@ -254,37 +284,48 @@ EMP_PlayerTracker()
}
}
destroyActiveVehicles( attacker )
destroyActiveVehicles( attacker, friendlyFireCheck )
{
if (!isDefined(friendlyFireCheck))
friendlyFireCheck = false;
if ( isDefined( attacker ) )
{
foreach ( heli in level.helis )
if (!friendlyFireCheck || (level.teamBased && heli.team != attacker.team) || (!level.teamBased && (!isDefined(heli.owner) || heli.owner != attacker)))
radiusDamage( heli.origin, 384, 5000, 5000, attacker );
foreach ( littleBird in level.littleBird )
if (!friendlyFireCheck || (level.teamBased && littleBird.team != attacker.team) || (!level.teamBased && (!isDefined(littleBird.owner) || littleBird.owner != attacker)))
radiusDamage( littleBird.origin, 384, 5000, 5000, attacker );
foreach ( turret in level.turrets )
if (!friendlyFireCheck || (level.teamBased && turret.team != attacker.team) || (!level.teamBased && (!isDefined(turret.owner) || turret.owner != attacker)))
radiusDamage( turret.origin, 16, 5000, 5000, attacker );
foreach ( rocket in level.rockets )
if (!friendlyFireCheck || (level.teamBased && rocket.team != attacker.team) || (!level.teamBased && (!isDefined(rocket.owner) || rocket.owner != attacker)))
rocket notify ( "death" );
if ( level.teamBased )
{
foreach ( uav in level.uavModels["allies"] )
if (!friendlyFireCheck || uav.team != attacker.team)
radiusDamage( uav.origin, 384, 5000, 5000, attacker );
foreach ( uav in level.uavModels["axis"] )
if (!friendlyFireCheck || uav.team != attacker.team)
radiusDamage( uav.origin, 384, 5000, 5000, attacker );
}
else
{
foreach ( uav in level.uavModels )
if (!friendlyFireCheck || !isDefined(uav.owner) || uav.owner != attacker)
radiusDamage( uav.origin, 384, 5000, 5000, attacker );
}
if ( isDefined( level.ac130player ) )
if (!friendlyFireCheck || (level.teamBased && level.ac130player.team != attacker.team) || (!level.teamBased && level.ac130player != attacker))
radiusDamage( level.ac130.planeModel.origin+(0,0,10), 1000, 5000, 5000, attacker );
}
else

View File

@ -1,3 +1,29 @@
/*
_killstreaks modded
Author: INeedGames
Date: 09/22/2020
Adds killstreak rollover and killstreak HUD.origin
DVARS:
- scr_killstreak_rollover <int>
0 - (default) killstreaks do not rollover, only get one set of killstreaks
1 - killstreaks rollover, earn killstreaks over again without dying
2 - killstreaks rollover only with hardline pro
- scr_maxKillstreakRollover <int>
10 - (default) allow to rollover killstreaks <int> times. (remember you are limited to 10 rollovers as defined in _class.gsc)
- scr_killstreak_mod <int>
0 - (default) offsets all killstreaks reward costs by <int> amount
- scr_killstreakHud <int>
0 - (default) no HUD
1 - use Puffiamo's killstreak HUD
2 - use NoFate's MW3 killstreak HUD
Thanks: H3X1C, Emosewaj, NoFate, Puffiamo
*/
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
@ -21,8 +47,6 @@ init()
level.killstreakSetupFuncs = [];
level.killstreakWeapons = [];
level.killStreakMod = 0;
thread maps\mp\killstreaks\_ac130::init();
thread maps\mp\killstreaks\_remotemissile::init();
thread maps\mp\killstreaks\_uav::init();
@ -36,6 +60,16 @@ init()
level.killstreakRoundDelay = getIntProperty( "scr_game_killstreakdelay", 8 );
setDvarIfUninitialized( "scr_killstreak_rollover", false );
setDvarIfUninitialized( "scr_maxKillstreakRollover", 10 );
setDvarIfUninitialized( "scr_killstreakHud", false );
setDvarIfUninitialized( "scr_killstreak_mod", 0 );
level.killstreaksRollOver = getDvarInt("scr_killstreak_rollover");
level.maxKillstreakRollover = getDvarInt("scr_maxKillstreakRollover");
level.killstreakHud = getDvarInt("scr_killstreakHud");
level.killStreakMod = getDvarInt( "scr_killstreak_mod" );
level thread onPlayerConnect();
}
@ -124,6 +158,11 @@ onPlayerSpawned()
self thread killstreakUseWaiter();
self thread waitForChangeTeam();
if (level.killstreakHud == 1)
self thread initKillstreakHud( 145 );
else if (level.killstreakHud == 2)
self thread initMW3KillstreakHud();
self giveOwnedKillstreakItem( true );
}
}
@ -460,16 +499,22 @@ checkKillstreakReward( streakCount )
if ( isSubStr( streakName, "-rollover" ) )
{
if (!level.killstreaksRollover || (level.killstreaksRollover == 2 && !self _hasPerk("specialty_rollover")))
continue;
/*
if ( game["defcon"] > 2 )
else
{
curRollover = int(strtok(strtok(streakName, "-")[1], "rollover")[0]);
if (curRollover > level.maxKillstreakRollover)
continue;
if ( isDefined( game["defcon"] ) && game["defcon"] > 2 )
{
self.pers["lastEarnedStreak"] = streakName;
continue;
}
useStreakName = strTok( streakName, "-" )[0];
*/
}
}
else
{
@ -711,4 +756,204 @@ clearRideIntro( delay )
self VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
}
destroyOnEvents(elem)
{
self waittill_either("disconnect", "spawned_player");
elem destroy();
}
initKillstreakHud(inity)
{
self endon( "death" );
self endon( "disconnect" );
streakVals = GetArrayKeys(self.killStreaks);
hasHardline = self _hasPerk("specialty_hardline");
self.killStreakHudElems = [];
// the killstreak counter
index = self.killStreakHudElems.size;
self.killStreakHudElems[index] = self createFontString( "objective", 2 );
self.killStreakHudElems[index].foreground = false;
self.killStreakHudElems[index].hideWhenInMenu = true;
self.killStreakHudElems[index].fontScale = 0.60;
self.killStreakHudElems[index].font = "hudbig";
self.killStreakHudElems[index].alpha = 1;
self.killStreakHudElems[index].glow = 1;
self.killStreakHudElems[index].glowColor = ( 0, 0, 1 );
self.killStreakHudElems[index].glowAlpha = 1;
self.killStreakHudElems[index].color = ( 1.0, 1.0, 1.0 );
self thread destroyOnEvents(self.killStreakHudElems[index]);
highestStreak = -1;
for (i = 0; i < streakVals.size; i++)
{
streakVal = streakVals[i];
streakName = self.killStreaks[streakVal];
if (isSubStr(streakName, "-rollover"))
continue;
streakShader = maps\mp\killstreaks\_killstreaks::getKillstreakIcon( streakName );
streakCost = maps\mp\killstreaks\_killstreaks::getStreakCost( streakName );
if (hasHardline)
streakCost--;
// each killstreak icon
index = self.killStreakHudElems.size;
self.killStreakHudElems[index] = self createFontString( "objective", 2 );
self.killStreakHudElems[index].foreground = false;
self.killStreakHudElems[index].hideWhenInMenu = true;
self.killStreakHudElems[index].fontScale = 0.60;
self.killStreakHudElems[index].font = "hudbig";
self.killStreakHudElems[index].alpha = 1;
self.killStreakHudElems[index].glow = 1;
self.killStreakHudElems[index].glowColor = ( 0, 0, 1 );
self.killStreakHudElems[index].glowAlpha = 1;
self.killStreakHudElems[index].color = ( 1.0, 1.0, 1.0 );
self.killStreakHudElems[index] setPoint( "RIGHT", "RIGHT", 0, inity - 25 * i );
self.killStreakHudElems[index] setShader( streakShader, 20, 20 );
self.killStreakHudElems[index].ks_cost = streakCost;
self thread destroyOnEvents(self.killStreakHudElems[index]);
if (streakCost > highestStreak)
highestStreak = streakCost;
}
for(first=true;;)
{
if (first)
first = false;
else
self waittill( "killed_enemy" );
curStreak = self.pers["cur_kill_streak"];
timesRolledOver = int(curStreak / highestStreak);
if (level.killstreaksRollover == 1 || (level.killstreaksRollover == 2 && self _hasPerk("specialty_rollover")))
curStreak %= highestStreak;
if (timesRolledOver > level.maxKillstreakRollover)
curStreak = highestStreak;
isUnderAStreak = false;
for (i = self.killStreakHudElems.size - 1; i >= 1; i--)
{
streakElem = self.killStreakHudElems[i];
if (curStreak < streakElem.ks_cost)
{
isUnderAStreak = true;
self.killStreakHudElems[0] setPoint( "RIGHT", "RIGHT", -25, inity - 25 * (i - 1) );
self.killStreakHudElems[0] setText( streakElem.ks_cost - curStreak );
}
}
if (!isUnderAStreak && self.killStreakHudElems.size)
{
self.killStreakHudElems[0] setPoint( "RIGHT", "RIGHT", -25, inity - 25 * (self.killStreakHudElems.size - 1 - 1) );
self.killStreakHudElems[0] setText( "Done" );
}
}
}
initMW3KillstreakHud()
{
self endon( "death" );
self endon( "disconnect" );
streakVals = GetArrayKeys(self.killStreaks);
hasHardline = self _hasPerk("specialty_hardline");
self.killStreakHudElems = [];
self.killStreakShellsElems = [];
highestStreak = -1;
for (i = 0; i < streakVals.size; i++)
{
streakVal = streakVals[i];
streakName = self.killStreaks[streakVal];
if (isSubStr(streakName, "-rollover"))
continue;
streakShader = maps\mp\killstreaks\_killstreaks::getKillstreakIcon( streakName );
streakCost = maps\mp\killstreaks\_killstreaks::getStreakCost( streakName );
if (hasHardline)
streakCost--;
if (streakCost > highestStreak)
highestStreak = streakCost;
// the shader
ksIcon = createIcon( streakShader, 20, 20 );
ksIcon setPoint( "BOTTOM RIGHT", "BOTTOM RIGHT", -32, -90 + -25 * i );
ksIcon.alpha = 0.4;
ksIcon.hideWhenInMenu = true;
ksIcon.foreground = true;
ksIcon.ks_cost = streakCost;
self thread destroyOnEvents(ksIcon);
self.killStreakHudElems[self.killStreakHudElems.size] = ksIcon;
}
// the shells
if (highestStreak > 0)
{
h = -53;
for(i = 0; i < highestStreak; i++)
{
ksShell = NewClientHudElem( self );
ksShell.x = 40;
ksShell.y = h;
ksShell.alignX = "right";
ksShell.alignY = "bottom";
ksShell.horzAlign = "right";
ksShell.vertAlign = "bottom";
ksShell setshader("white", 10, 2);
ksShell.alpha = 0.3;
ksShell.hideWhenInMenu = true;
ksShell.foreground = false;
self thread destroyOnEvents(ksShell);
self.killStreakShellsElems[i] = ksShell;
h -= 4;
}
}
for(first=true;;)
{
if (first)
first = false;
else
self waittill( "killed_enemy" );
curStreak = self.pers["cur_kill_streak"];
timesRolledOver = int(curStreak / highestStreak);
if (level.killstreaksRollover == 1 || (level.killstreaksRollover == 2 && self _hasPerk("specialty_rollover")))
curStreak %= highestStreak;
if (timesRolledOver > level.maxKillstreakRollover)
curStreak = highestStreak;
// update the shells
for (i = 0; i < self.killStreakShellsElems.size; i++)
{
elem = self.killStreakShellsElems[i];
if (curStreak > i)
elem.alpha = 0.85;
else
elem.alpha = 0.3;
}
// update the ks icons
for (i = 0; i < self.killStreakHudElems.size; i++)
{
elem = self.killStreakHudElems[i];
if (curStreak >= elem.ks_cost)
elem.alpha = 0.9;
else
elem.alpha = 0.4;
}
}
}

View File

@ -1,3 +1,10 @@
/*
_perkfunctions modded
Author: INeedGames
Date: 09/22/2020
Readds optional painkiller and one man army refills noobtubes.
*/
/*******************************************************************
// _perkfunctions.gsc
//
@ -121,8 +128,11 @@ setCombatHigh()
level endon( "end_game" );
self.damageBlockedTotal = 0;
if (level.combathighIsJuiced)
{
self.moveSpeedScaler = 1.25;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
}
//self visionSetNakedForPlayer( "end_game", 1 );
if ( level.splitscreen )
@ -149,7 +159,11 @@ setCombatHigh()
self.combatHighTimer = createTimer( "hudsmall", 1.0 );
self.combatHighTimer setPoint( "CENTER", "CENTER", 0, yOffset );
if (level.combathighIsJuiced)
self.combatHighTimer setTimer( 7.0 );
else
self.combatHighTimer setTimer( 10.0 );
self.combatHighTimer.color = (.8,.8,0);
self.combatHighTimer.archived = false;
self.combatHighTimer.foreground = true;
@ -170,7 +184,10 @@ setCombatHigh()
self thread unsetCombatHighOnDeath();
if (level.combathighIsJuiced)
wait( 5 );
else
wait( 8 );
self.combatHighIcon fadeOverTime( 2.0 );
self.combatHighIcon.alpha = 0.0;
@ -184,6 +201,8 @@ setCombatHigh()
wait( 2 );
self.damageBlockedTotal = undefined;
if (level.combathighIsJuiced)
{
self.moveSpeedScaler = 1;
if (self _hasperk( "specialty_lightweight" ))
@ -192,6 +211,7 @@ setCombatHigh()
}
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
}
self _unsetPerk( "specialty_combathigh" );
}
@ -203,12 +223,15 @@ unsetCombatHighOnDeath()
self waittill ( "death" );
if (level.combathighIsJuiced)
{
self.moveSpeedScaler = 1;
if (self _hasperk( "specialty_lightweight" ))
{
self.moveSpeedScaler = 1.07;
}
}
self thread _unsetPerk( "specialty_combathigh" );
}
@ -220,12 +243,15 @@ unsetCombatHigh()
self.combatHighIcon destroy();
self.combatHighTimer destroy();
if (level.combathighIsJuiced)
{
self.moveSpeedScaler = 1;
if (self _hasperk( "specialty_lightweight" ))
{
self.moveSpeedScaler = 1.07;
}
}
}
setSiege()
@ -366,10 +392,13 @@ setLightWeight()
{
self.moveSpeedScaler = 1.07;
if (level.combathighIsJuiced)
{
if (self _hasperk( "specialty_combathigh" ))
{
self.moveSpeedScaler = 1.4;
}
}
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
}
@ -693,6 +722,9 @@ giveOneManArmyClass( className )
self notify ( "changed_kit" );
level notify ( "changed_kit" );
if (level.onemanarmyRefillsTubes)
return;
weaponNameSize = self getCurrentWeapon().size;
if( getSubStr( self getCurrentWeapon(), weaponNameSize - 6, weaponNameSize ) == "_gl_mp" )

View File

@ -1,3 +1,19 @@
/*
_perks modded
Author: INeedGames
Date: 09/22/2020
Readds optional painkiller and one man army refills noobtubes.
DVARS:
- combathighIsJuiced <bool>
false - painkiller is in the game
true - (default) replaces painkiller with juiced from mw3
- onemanarmyRefillsTubes <bool>
false - (default) One Man Army does not refill the gl attachment
true - it does
*/
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
@ -178,6 +194,12 @@ init()
level.perkSetFuncs["specialty_tacticalinsertion"] = ::setTacticalInsertion;
level.perkUnsetFuncs["specialty_tacticalinsertion"] = ::unsetTacticalInsertion;
setDvarIfUninitialized( "combathighIsJuiced", true );
level.combathighIsJuiced = getDvarInt( "combathighIsJuiced" );
setDvarIfUninitialized( "onemanarmyRefillsTubes", false );
level.onemanarmyRefillsTubes = getDvarInt( "onemanarmyRefillsTubes" );
initPerkDvars();
level thread onPlayerConnect();
@ -320,10 +342,10 @@ cac_modified_damage( victim, attacker, damage, meansofdeath, weapon, impactPoint
}
}
if ( ( victim.xpScaler == 2 && isDefined( attacker ) ) && ( isPlayer( attacker ) || attacker.classname == "scrip_vehicle" ) )
damageAdd += 200;
//if ( ( victim.xpScaler == 2 && isDefined( attacker ) ) && ( isPlayer( attacker ) || attacker.classname == "scrip_vehicle" ) )
// damageAdd += 200;
/*if ( victim _hasperk( "specialty_combathigh" ) )
if ( victim _hasperk( "specialty_combathigh" ) && !level.combathighIsJuiced )
{
if ( IsDefined( self.damageBlockedTotal ) && (!level.teamBased || (isDefined( attacker ) && isDefined( attacker.team ) && victim.team != attacker.team)) )
{
@ -351,7 +373,7 @@ cac_modified_damage( victim, attacker, damage, meansofdeath, weapon, impactPoint
break;
}
}
}*/
}
return int( damage + damageAdd );
}