142 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Ucode
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Ucode
		
	
	
	
	
	
| class NiceRules extends GameRules;
 | |
| var ScrnGameRules ScrnRules;
 | |
| function PostBeginPlay(){
 | |
|     if(Level.Game.GameRulesModifiers == none)
 | |
|        Level.Game.GameRulesModifiers = Self;
 | |
|     else{
 | |
|        // We need to be the ones giving achievements first
 | |
|        Self.AddGameRules(Level.Game.GameRulesModifiers);
 | |
|        Level.Game.GameRulesModifiers = Self;
 | |
|     }
 | |
|     if(NicePack(Owner) != none)
 | |
|        ScrnRules = NicePack(Owner).ScrnMut.GameRules;
 | |
|     else{
 | |
|        Log("Wrong owner! Owner must be NicePack!");
 | |
|        Destroy();
 | |
|     }
 | |
| }
 | |
| function bool CheckEndGame(PlayerReplicationInfo Winner, string Reason){
 | |
|     local bool bWin;
 | |
|     local string MapName;
 | |
|     if(Level.Game.IsInState('PendingMatch'))
 | |
|        return false;
 | |
|     if(Level.Game.bGameEnded)
 | |
|        return true;
 | |
|     if(NextGameRules != none && !NextGameRules.CheckEndGame(Winner,Reason))
 | |
|        return false;
 | |
|     if(ScrnRules.Mut.bStoryMode)
 | |
|        bWin = Reason ~= "WinAction";
 | |
|     else{
 | |
|        bWin = KFGameReplicationInfo(Level.GRI) != none && KFGameReplicationInfo(Level.GRI).EndGameType == 2;
 | |
|     }
 | |
|     if(bWin){
 | |
|        // Map achievements
 | |
|        MapName = ScrnRules.Mut.KF.GetCurrentMapName(Level);
 | |
|        ScrnRules.CheckMapAlias(MapName);
 | |
|        GiveMapAchievements(MapName);
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| // We would never get ScrN Sui and Hoe achievs with our new zeds, so let's add them ourselves. For different reasons.
 | |
| function GiveMapAchievements(optional String MapName){
 | |
|     local bool bCustomMap, bGiveHardAch, bGiveSuiAch, bGiveHoeAch, bNewAch;
 | |
|     local ScrnPlayerInfo SPI;
 | |
|     local ClientPerkRepLink PerkLink;
 | |
|     local TeamInfo WinnerTeam;
 | |
|     WinnerTeam = TeamInfo(Level.Game.GameReplicationInfo.Winner);
 | |
|     if(ScrnRules.Mut.bStoryMode){
 | |
|        bGiveHardAch = Level.Game.GameDifficulty >= 4;
 | |
|        bGiveSuiAch = Level.Game.GameDifficulty >= 5;
 | |
|        bGiveHoeAch = Level.Game.GameDifficulty >= 7;
 | |
|     }
 | |
|     else{
 | |
|        bGiveHardAch = ScrnRules.HardcoreLevel >= 5;
 | |
|        bGiveSuiAch = ScrnRules.HardcoreLevel >= 10;
 | |
|        bGiveHoeAch = ScrnRules.HardcoreLevel >= 15;
 | |
|     }
 | |
|     for (SPI = ScrnRules.PlayerInfo;SPI != none;SPI = SPI.NextPlayerInfo){
 | |
|        if (SPI.PlayerOwner == none || SPI.PlayerOwner.PlayerReplicationInfo == none)
 | |
|            continue;
 | |
|                PerkLink = SPI.GetRep();
 | |
|        if(PerkLink == none)
 | |
|            continue;
 | |
|        if(WinnerTeam != none && SPI.PlayerOwner.PlayerReplicationInfo.Team != WinnerTeam)
 | |
|            continue; // no candies for loosers
 | |
|            // additional achievements that are granted only when surviving the game
 | |
|        if(ScrnPlayerController(SPI.PlayerOwner) != none && !ScrnPlayerController(SPI.PlayerOwner).bChangedPerkDuringGame)
 | |
|            SPI.ProgressAchievement('PerkFavorite', 1);  
 | |
| 
 | |
|        //unlock "Normal" achievement and see if the map is found
 | |
|        bCustomMap = ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 0) == -2;  
 | |
|        bNewAch = false;
 | |
|        if(bCustomMap){
 | |
|            //map not found - progress custom map achievements
 | |
|            if(bGiveHardAch)
 | |
|                ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsHard', 1);
 | |
|            if(bGiveSuiAch)
 | |
|                ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsSui', 1);
 | |
|            if(bGiveHoeAch)
 | |
|                ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsHoE', 1);
 | |
|            ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsNormal', 1);
 | |
|            ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMaps', 1);
 | |
|        }   
 | |
|        else{
 | |
|            //map found - give related achievements
 | |
|            if(bGiveHardAch)
 | |
|                ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 1);
 | |
|            if(bGiveSuiAch)
 | |
|                ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 2);
 | |
|            if(bGiveHoeAch)
 | |
|                ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 3);
 | |
|        }
 | |
|     }
 | |
| }
 | |
| function int NetDamage(int OriginalDamage, int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class<DamageType> DamageType){
 | |
|     local TeamGame TG;
 | |
|     TG = TeamGame(Level.Game);
 | |
|     if(KFPawn(injured) != none && TG != none && Damage > 0 && class<DamTypeEnemyBase>(DamageType) == none){
 | |
|        if((KFPawn(instigatedBy) != none || FakePlayerPawn(instigatedBy) != none) && (instigatedBy.PlayerReplicationInfo == none || instigatedBy.PlayerReplicationInfo.bOnlySpectator)){
 | |
|            Momentum = vect(0,0,0);
 | |
|            if(NoFF(injured, TG.FriendlyFireScale))
 | |
|                return 0;
 | |
|            else if(OriginalDamage == Damage)
 | |
|                return Damage * TG.FriendlyFireScale;
 | |
|        }
 | |
|        else if(instigatedBy == none && !DamageType.default.bCausedByWorld){
 | |
|            Momentum = vect(0,0,0);
 | |
|            if(NoFF(injured, TG.FriendlyFireScale))
 | |
|                return 0;
 | |
|            else if(OriginalDamage == Damage)
 | |
|                return Damage * TG.FriendlyFireScale;
 | |
|        }
 | |
|     }
 | |
|     return super.NetDamage(OriginalDamage, Damage, injured, instigatedBy, HitLocation, Momentum, DamageType);
 | |
| }
 | |
| function bool NoFF(Pawn injured, float FF){
 | |
|     return (FF == 0.0 || (Vehicle(injured) != none && Vehicle(injured).bNoFriendlyFire));
 | |
| }
 | |
| function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> damageType, vector HitLocation){
 | |
|     local NiceHumanPawn nicePawn;
 | |
|     local NicePlayerController nicePlayer;
 | |
|     nicePlayer = NicePlayerController(Killed.controller);
 | |
|     nicePawn = NiceHumanPawn(Killed);
 | |
|     if(nicePawn != none && (!nicePawn.bReactiveArmorUsed)
 | |
|        && class'NiceVeterancyTypes'.static.HasSkill(nicePlayer, class'NiceSkillDemoReactiveArmor')){
 | |
|        nicePawn.bReactiveArmorUsed = true;
 | |
|        nicePlayer.niceRI.ServerExplode(class'NiceSkillDemoReactiveArmor'.default.baseDamage,
 | |
|            class'NiceSkillDemoReactiveArmor'.default.explRadius,
 | |
|            class'NiceSkillDemoReactiveArmor'.default.explExponent,
 | |
|            class'NiceDamTypeDemoSafeExplosion',
 | |
|            class'NiceSkillDemoReactiveArmor'.default.explMomentum,
 | |
|            killed.location, killed
 | |
|        );
 | |
|        return true;
 | |
|     }
 | |
|     if(NextGameRules != none)
 | |
|        return NextGameRules.PreventDeath(Killed, Killer, damageType, HitLocation);
 | |
|     return false;
 | |
| }
 | |
| defaultproperties
 | |
| {
 | |
| }
 |