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
|
|
{
|
|
}
|