Apply dirty patch (messed up line endings)

This commit is contained in:
Anton Tarasenko 2020-04-18 18:22:54 +07:00
parent 12d95e387e
commit 51bb9add5b
30 changed files with 1354 additions and 714 deletions

View File

@ -1,76 +1,152 @@
class NiceGUIPerkButton extends GUIButton; class NiceGUIPerkButton extends GUIButton;
var bool isAltSkill; var bool isAltSkill;
var int skillPerkIndex, skillIndex; var int skillPerkIndex, skillIndex;
var class<NiceSkill> associatedSkill; var class<NiceSkill> associatedSkill;
function InitComponent(GUIController MyController, GUIComponent MyOwner) function InitComponent(GUIController MyController, GUIComponent MyOwner)
{ {
OnDraw = DrawSkillButton; OnDraw = DrawSkillButton;
OnClick = SkillChange; OnClick = SkillChange;
Super.InitComponent(MyController, MyOwner); Super.InitComponent(MyController, MyOwner);
} }
function bool SkillChange(GUIComponent Sender){ function bool SkillChange(GUIComponent Sender){
local byte newSkillChoice; local byte newSkillChoice;
local NicePlayerController skillOwner; local NicePlayerController skillOwner;
if(isAltSkill) newSkillChoice = 1; if(isAltSkill)
else newSkillChoice = 0; newSkillChoice = 1;
skillOwner = NicePlayerController(PlayerOwner()); else
if(skillOwner != none){ skillOwner.ServerSetSkill(skillPerkIndex, skillIndex, newSkillChoice); skillOwner.SaveConfig(); newSkillChoice = 0;
} skillOwner = NicePlayerController(PlayerOwner());
return true; if(skillOwner != none){
} skillOwner.ServerSetSkill(skillPerkIndex, skillIndex, newSkillChoice);
function bool DrawSkillButton(Canvas cnvs){ skillOwner.SaveConfig();
// Variables that contain information about this button's skill }
local NicePlayerController skillOwner; return true;
local bool bAvailable, bSelected, bPending; }
// Variables needed for text drawing function bool DrawSkillButton(Canvas cnvs){
local int descLineOffset; // How much vertical space description took so far // Variables that contain information about this button's skill
local string skillEffects, line; // 'line' is next line from description to be drawn, 'skillEffects' is a not-yet drawn part of skill's effect description local NicePlayerController skillOwner;
local float textWidth, textHeight, nameHeight; // Variables for storing amount of space text uses local bool bAvailable, bSelected, bPending;
local int horizontalOffset, verticalOffset, smVerticalOffset; // Spaces between text and borders ('smVerticalOffset' is space between skill's name and description) // Variables needed for text drawing
// Old values for font and it's scale local int descLineOffset; // How much vertical space description took so far
local Font oldFont; local string skillEffects, line; // 'line' is next line from description to be drawn, 'skillEffects' is a not-yet drawn part of skill's effect description
local float oldFontScaleX, oldFontScaleY; local float textWidth, textHeight, nameHeight; // Variables for storing amount of space text uses
// Get skill parameters local int horizontalOffset, verticalOffset, smVerticalOffset; // Spaces between text and borders ('smVerticalOffset' is space between skill's name and description)
skillOwner = NicePlayerController(PlayerOwner()); // Old values for font and it's scale
bAvailable = class'NiceVeterancyTypes'.static.CanUseSkill(skillOwner, associatedSkill); local Font oldFont;
if(bAvailable) bSelected = class'NiceVeterancyTypes'.static.HasSkill(skillOwner, associatedSkill); local float oldFontScaleX, oldFontScaleY;
bPending = class'NiceVeterancyTypes'.static.IsSkillPending(skillOwner, associatedSkill); // Get skill parameters
if(skillOwner == none || associatedSkill == none) return true; skillOwner = NicePlayerController(PlayerOwner());
// Text offset parameters that seem to give a good result bAvailable = class'NiceVeterancyTypes'.static.CanUseSkill(skillOwner, associatedSkill);
horizontalOffset = 10; if(bAvailable)
verticalOffset = 5; bSelected = class'NiceVeterancyTypes'.static.HasSkill(skillOwner, associatedSkill);
smVerticalOffset = 2; bPending = class'NiceVeterancyTypes'.static.IsSkillPending(skillOwner, associatedSkill);
// Backup old font values and set the new ones if(skillOwner == none || associatedSkill == none)
oldFont = cnvs.Font; return true;
oldFontScaleX = cnvs.FontScaleX; // Text offset parameters that seem to give a good result
oldFontScaleY = cnvs.FontScaleY; verticalOffset = 5;
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(3); smVerticalOffset = 2;
cnvs.FontScaleX = 1.0; if (ActualWidth() > 400)
cnvs.FontScaleY = 1.0; {
// Draw text horizontalOffset = 10;
// - Name }
cnvs.SetPos(ActualLeft() + horizontalOffset, ActualTop() + verticalOffset); else if (ActualWidth() > 320)
if(!bAvailable) cnvs.SetDrawColor(0, 0, 0); {
else if(bSelected) cnvs.SetDrawColor(255, 255, 255); horizontalOffset = 5;
else cnvs.SetDrawColor(128, 128, 128); }
cnvs.DrawText(associatedSkill.default.skillName); // Backup old font values and set the new ones
cnvs.TextSize(associatedSkill.default.skillName, textWidth, nameHeight); oldFont = cnvs.Font;
// - Description oldFontScaleX = cnvs.FontScaleX;
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(5); oldFontScaleY = cnvs.FontScaleY;
if(!bAvailable) cnvs.SetDrawColor(0, 0, 0); cnvs.FontScaleX = 1.0;
else if(bSelected) cnvs.SetDrawColor(220, 220, 220);//180 cnvs.FontScaleY = 1.0;
else cnvs.SetDrawColor(140, 140, 140);//100 if (ActualWidth() > 700)
skillEffects = associatedSkill.default.skillEffects; {
while(Len(skillEffects) > 0){ cnvs.WrapText(skillEffects, line, ActualWidth() - horizontalOffset * 2, cnvs.Font, cnvs.FontScaleX); cnvs.SetPos(ActualLeft() + horizontalOffset, ActualTop() + verticalOffset + nameHeight + smVerticalOffset + descLineOffset); cnvs.DrawText(line); cnvs.TextSize(line, textWidth, textHeight); descLineOffset += textHeight; cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(3);
} }
// Draw border else if (ActualWidth() > 500)
if(bAvailable && bSelected || bPending){ if(bAvailable && bSelected) cnvs.SetDrawColor(255, 255, 255); else cnvs.SetDrawColor(64, 64, 64); cnvs.SetPos(ActualLeft(), ActualTop()); cnvs.DrawLine(3, ActualWidth()); cnvs.DrawLine(1, ActualHeight()); cnvs.SetPos(ActualLeft() + ActualWidth() + 2, ActualTop() + ActualHeight()); cnvs.DrawLine(2, ActualWidth() + 2); cnvs.SetPos(ActualLeft() + ActualWidth(), ActualTop() + ActualHeight() + 2); cnvs.DrawLine(0, ActualHeight() + 2); {
} cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(5);
cnvs.Font = oldFont; }
cnvs.FontScaleX = oldFontScaleX; else if (ActualWidth() > 400)
cnvs.FontScaleY = oldFontScaleY; {
return true; cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(6);
} }
defaultproperties else if (ActualWidth() > 320)
{ {
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(7);
}
else if (ActualWidth() > 250)
{
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(8);
}
else
{
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(8);
cnvs.FontScaleX = 0.9;
cnvs.FontScaleY = 0.9;
}
// Draw text
// - Name
cnvs.SetPos(ActualLeft() + horizontalOffset, ActualTop() + verticalOffset);
if(!bAvailable)
cnvs.SetDrawColor(0, 0, 0);
else if(bSelected)
cnvs.SetDrawColor(255, 255, 255);
else
cnvs.SetDrawColor(128, 128, 128);
//cnvs.DrawText(string(ActualWidth()));
cnvs.DrawText(associatedSkill.default.skillName);
cnvs.TextSize(associatedSkill.default.skillName, textWidth, nameHeight);
// - Description
if (ActualWidth() > 700)
{
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(5);
}
else if (ActualWidth() > 500)
{
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(6);
}
else if (ActualWidth() > 400)
{
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(7);
}
else
{
cnvs.Font = class'ROHUD'.Static.LoadSmallFontStatic(8);
}
if(!bAvailable)
cnvs.SetDrawColor(0, 0, 0);
else if(bSelected)
cnvs.SetDrawColor(220, 220, 220);//180
else
cnvs.SetDrawColor(140, 140, 140);//100
skillEffects = associatedSkill.default.skillEffects;
while(Len(skillEffects) > 0){
cnvs.WrapText(skillEffects, line, ActualWidth() - horizontalOffset * 2, cnvs.Font, cnvs.FontScaleX);
cnvs.SetPos(ActualLeft() + horizontalOffset, ActualTop() + verticalOffset + nameHeight + smVerticalOffset + descLineOffset);
cnvs.DrawText(line);
cnvs.TextSize(line, textWidth, textHeight);
descLineOffset += textHeight;
}
// Draw border
if(bAvailable && bSelected || bPending){
if(bAvailable && bSelected)
cnvs.SetDrawColor(255, 255, 255);
else
cnvs.SetDrawColor(64, 64, 64);
cnvs.SetPos(ActualLeft(), ActualTop());
cnvs.DrawLine(3, ActualWidth());
cnvs.DrawLine(1, ActualHeight());
cnvs.SetPos(ActualLeft() + ActualWidth() + 2, ActualTop() + ActualHeight());
cnvs.DrawLine(2, ActualWidth() + 2);
cnvs.SetPos(ActualLeft() + ActualWidth(), ActualTop() + ActualHeight() + 2);
cnvs.DrawLine(0, ActualHeight() + 2);
}
cnvs.Font = oldFont;
cnvs.FontScaleX = oldFontScaleX;
cnvs.FontScaleY = oldFontScaleY;
return true;
}
defaultproperties
{
} }

View File

@ -71,12 +71,14 @@ function ReplaceRequiredEquipment(){
simulated function int CalculateCalibrationScore(){ simulated function int CalculateCalibrationScore(){
local float accuracy; local float accuracy;
accuracy = (float(calibrationHits)) / (float(calibrationTotalShots)); accuracy = (float(calibrationHits)) / (float(calibrationTotalShots));
if(calibrationTotalShots <= 0)
return 3;
// Very low accuracy (<60%) or not enough shots (<2) - 1 star // Very low accuracy (<60%) or not enough shots (<2) - 1 star
if(calibrationTotalShots < 2 || accuracy < 0.6) if(accuracy < 0.6)
return 1; return 1;
// Here we definitely have at least 60% accuracy and 2 shots. // Here we definitely have at least 60% accuracy and 2 shots.
// Low accuracy (<80%) or not enough shots (<5) - 2 stars. // Low accuracy (<80%) or not enough shots (<5) - 2 stars.
if(calibrationTotalShots < 5 || accuracy < 0.8) if(accuracy < 0.8)
return 2; return 2;
// Here we definitely have at least 80% accuracy and 5 shots. // Here we definitely have at least 80% accuracy and 5 shots.
// If amount of shots is below 7 - it's 3 stars at most. // If amount of shots is below 7 - it's 3 stars at most.

View File

@ -175,7 +175,7 @@ simulated function PostBeginPlay(){
super.PostBeginPlay(); super.PostBeginPlay();
class'NicePack'.default.Mut = self; class'NicePack'.default.Mut = self;
// Gun skins // Gun skins
/*class'NicePack.NiceMaulerPickup'.default.VariantClasses[class'NicePack.NiceMaulerPickup'.default.VariantClasses.length] = class'ScrnBalanceSrv.ScrnSPSniperPickup'; class'NicePack.NiceMaulerPickup'.default.VariantClasses[class'NicePack.NiceMaulerPickup'.default.VariantClasses.length] = class'ScrnBalanceSrv.ScrnSPSniperPickup';
class'NicePack.NiceDeaglePickup'.default.VariantClasses[class'NicePack.NiceDeaglePickup'.default.VariantClasses.length] = class'NicePack.SkinExecutionerPickup'; class'NicePack.NiceDeaglePickup'.default.VariantClasses[class'NicePack.NiceDeaglePickup'.default.VariantClasses.length] = class'NicePack.SkinExecutionerPickup';
class'NicePack.NiceDualDeaglePickup'.default.VariantClasses[class'NicePack.NiceDualDeaglePickup'.default.VariantClasses.length] = class'NicePack.SkinDualExecutionerPickup'; class'NicePack.NiceDualDeaglePickup'.default.VariantClasses[class'NicePack.NiceDualDeaglePickup'.default.VariantClasses.length] = class'NicePack.SkinDualExecutionerPickup';
class'NicePack.NiceMagnumPickup'.default.VariantClasses[class'NicePack.NiceMagnumPickup'.default.VariantClasses.length] = class'NicePack.SkinCowboyMagnumPickup'; class'NicePack.NiceMagnumPickup'.default.VariantClasses[class'NicePack.NiceMagnumPickup'.default.VariantClasses.length] = class'NicePack.SkinCowboyMagnumPickup';
@ -183,7 +183,7 @@ simulated function PostBeginPlay(){
class'NicePack.NiceWinchesterPickup'.default.VariantClasses[class'NicePack.NiceWinchesterPickup'.default.VariantClasses.length] = class'NicePack.SkinRetroLARPickup'; class'NicePack.NiceWinchesterPickup'.default.VariantClasses[class'NicePack.NiceWinchesterPickup'.default.VariantClasses.length] = class'NicePack.SkinRetroLARPickup';
class'NicePack.NiceM14EBRPickup'.default.VariantClasses[class'NicePack.NiceM14EBRPickup'.default.VariantClasses.length] = class'NicePack.SkinM14EBR2ProPickup'; class'NicePack.NiceM14EBRPickup'.default.VariantClasses[class'NicePack.NiceM14EBRPickup'.default.VariantClasses.length] = class'NicePack.SkinM14EBR2ProPickup';
class'ScrnBalanceSrv.ScrnKrissMPickup'.default.VariantClasses[class'ScrnBalanceSrv.ScrnKrissMPickup'.default.VariantClasses.length] = class'NicePack.SkinGoldenKrissPickup'; class'ScrnBalanceSrv.ScrnKrissMPickup'.default.VariantClasses[class'ScrnBalanceSrv.ScrnKrissMPickup'.default.VariantClasses.length] = class'NicePack.SkinGoldenKrissPickup';
class'NicePack.NiceSCARMK17Pickup'.default.VariantClasses[class'NicePack.NiceSCARMK17Pickup'.default.VariantClasses.length] = class'NicePack.SkinCamoSCARMK17Pickup';*/ class'NicePack.NiceSCARMK17Pickup'.default.VariantClasses[class'NicePack.NiceSCARMK17Pickup'.default.VariantClasses.length] = class'NicePack.SkinCamoSCARMK17Pickup';
// Abilities // Abilities
class'NiceAbilityManager'.default.events.static.AddAdapter(class'NiceSharpshooterAbilitiesAdapter', level); class'NiceAbilityManager'.default.events.static.AddAdapter(class'NiceSharpshooterAbilitiesAdapter', level);
SetTimer(0.25, true); SetTimer(0.25, true);

View File

@ -1,88 +1,131 @@
class NiceVetBerserker extends NiceVeterancyTypes class NiceVetBerserker extends NiceVeterancyTypes
abstract; abstract;
static function AddCustomStats(ClientPerkRepLink Other){ static function AddCustomStats(ClientPerkRepLink Other){
other.AddCustomValue(Class'NiceVetBerserkerExp'); other.AddCustomValue(Class'NiceVetBerserkerExp');
} }
static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){ static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){
return StatOther.GetCustomValueInt(Class'NiceVetBerserkerExp'); return StatOther.GetCustomValueInt(Class'NiceVetBerserkerExp');
} }
static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){ static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){
return default.progressArray0; return default.progressArray0;
} }
static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<DamageType> DmgType){ static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<DamageType> DmgType){
local float perkDamage; local float perkDamage;
local class<NiceWeaponPickup> pickupClass; local class<NiceWeaponPickup> pickupClass;
pickupClass = GetPickupFromDamageType(DmgType); pickupClass = GetPickupFromDamageType(DmgType);
perkDamage = float(InDamage); perkDamage = float(InDamage);
if(IsPerkedPickup(pickupClass)) perkDamage *= 2; if(IsPerkedPickup(pickupClass))
return perkDamage; perkDamage *= 2;
} return perkDamage;
static function float GetFireSpeedModStatic(KFPlayerReplicationInfo KFPRI, class<Weapon> other){ }
local float bonus; static function float GetFireSpeedModStatic(KFPlayerReplicationInfo KFPRI, class<Weapon> other){
local class<NiceWeaponPickup> pickupClass; local float bonus;
local NiceHumanPawn nicePawn; local class<NiceWeaponPickup> pickupClass;
local NicePlayerController nicePlayer; local NiceHumanPawn nicePawn;
pickupClass = GetPickupFromWeapon(other); local NicePlayerController nicePlayer;
bonus = 1.0; pickupClass = GetPickupFromWeapon(other);
nicePlayer = NicePlayerController(KFPRI.Owner); bonus = 1.0;
if(IsPerkedPickup(pickupClass)) bonus *= 1.25; nicePlayer = NicePlayerController(KFPRI.Owner);
nicePawn = NiceHumanPawn(nicePlayer.Pawn); if(IsPerkedPickup(pickupClass))
if(nicePlayer != none && nicePawn != none && HasSkill(nicePlayer, class'NiceSkillZerkFury') && IsPerkedPickup(pickupClass)){ if(nicePawn != none && nicePawn.invincibilityTimer > 0.0) bonus *= class'NiceSkillZerkFury'.default.attackSpeedBonus; bonus *= 1.25;
} nicePawn = NiceHumanPawn(nicePlayer.Pawn);
if(nicePlayer != none && nicePawn != none && nicePlayer.IsZedTimeActive() && IsPerkedPickup(pickupClass) && HasSkill(nicePlayer, class'NiceSkillZerkZEDAccelerate')) bonus /= (nicePawn.Level.TimeDilation / 1.1); if(nicePlayer != none && nicePawn != none && HasSkill(nicePlayer, class'NiceSkillZerkFury') && IsPerkedPickup(pickupClass)){
return bonus; if(nicePawn != none && nicePawn.invincibilityTimer > 0.0)
} bonus *= class'NiceSkillZerkFury'.default.attackSpeedBonus;
static function float GetMeleeMovementSpeedModifier(KFPlayerReplicationInfo KFPRI){ }
return 0.2; if(nicePlayer != none && nicePawn != none && nicePlayer.IsZedTimeActive() && IsPerkedPickup(pickupClass)
} && HasSkill(nicePlayer, class'NiceSkillZerkZEDAccelerate'))
static function float GetMovementSpeedModifier(KFPlayerReplicationInfo KFPRI, KFGameReplicationInfo KFGRI) bonus /= (nicePawn.Level.TimeDilation / 1.1);
{ return bonus;
local NicePlayerController nicePlayer; }
nicePlayer = NicePlayerController(KFPRI.Owner); static function float GetMeleeMovementSpeedModifier(KFPlayerReplicationInfo KFPRI){
if(nicePlayer != none && nicePlayer.IsZedTimeActive() && HasSkill(nicePlayer, class'NiceSkillZerkZEDAccelerate')) return 1.0 / fmin(1.0, (KFGRI.Level.TimeDilation / 1.1)); return 0.2;
return 1.0; }
} static function float GetMovementSpeedModifier(KFPlayerReplicationInfo KFPRI, KFGameReplicationInfo KFGRI)
static function float GetWeaponMovementSpeedBonus(KFPlayerReplicationInfo KFPRI, Weapon Weap){ {
local float bonus; local NicePlayerController nicePlayer;
local NicePlayerController nicePlayer; nicePlayer = NicePlayerController(KFPRI.Owner);
local NiceHumanPawn nicePawn; if(nicePlayer != none && nicePlayer.IsZedTimeActive()
bonus = 0.0; && HasSkill(nicePlayer, class'NiceSkillZerkZEDAccelerate'))
nicePlayer = NicePlayerController(KFPRI.Owner); return 1.0 / fmin(1.0, (KFGRI.Level.TimeDilation / 1.1));
if(nicePlayer != none) nicePawn = NiceHumanPawn(nicePlayer.Pawn); return 1.0;
if(nicePlayer != none && nicePawn != none && HasSkill(nicePlayer, class'NiceSkillZerkWhirlwind')){ if(nicePawn != none && nicePawn.invincibilityTimer > 0.0) bonus = 1.0; }
} static function float GetWeaponMovementSpeedBonus(KFPlayerReplicationInfo KFPRI, Weapon Weap){
return bonus; local float bonus;
} local NicePlayerController nicePlayer;
static function bool CanBeGrabbed(KFPlayerReplicationInfo KFPRI, KFMonster Other){ local NiceHumanPawn nicePawn;
return false; bonus = 0.0;
} nicePlayer = NicePlayerController(KFPRI.Owner);
// Set number times Zed Time can be extended if(nicePlayer != none)
static function int ZedTimeExtensions(KFPlayerReplicationInfo KFPRI){ nicePawn = NiceHumanPawn(nicePlayer.Pawn);
return 4; if(nicePlayer != none && nicePawn != none && HasSkill(nicePlayer, class'NiceSkillZerkWhirlwind')){
} if(nicePawn != none && nicePawn.invincibilityTimer > 0.0)
static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){ bonus = 1.0;
return 1.2; }
} return bonus;
static function int GetInvincibilityExtentions(KFPlayerReplicationInfo KFPRI){ }
return 3; static function bool CanBeGrabbed(KFPlayerReplicationInfo KFPRI, KFMonster Other){
} return false;
static function int GetInvincibilityDuration(KFPlayerReplicationInfo KFPRI){ }
local NicePlayerController nicePlayer; // Set number times Zed Time can be extended
nicePlayer = NicePlayerController(KFPRI.Owner); static function int ZedTimeExtensions(KFPlayerReplicationInfo KFPRI){
if( nicePlayer != none && HasSkill(nicePlayer, class'NiceSkillZerkColossus')){ return 3.0 + class'NiceSkillZerkColossus'.default.timeBonus; return 4;
} }
return 3.0; static function int GetInvincibilityExtentions(KFPlayerReplicationInfo KFPRI){
} return 3;
static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){ }
local NicePlayerController nicePlayer; static function int GetInvincibilityDuration(KFPlayerReplicationInfo KFPRI){
nicePlayer = NicePlayerController(KFPRI.Owner); local NicePlayerController nicePlayer;
if( nicePlayer != none && HasSkill(nicePlayer, class'NiceSkillZerkUndead')){ return 1 + class'NiceSkillZerkUndead'.default.addedSafeMisses; nicePlayer = NicePlayerController(KFPRI.Owner);
} if( nicePlayer != none
return 1; && HasSkill(nicePlayer, class'NiceSkillZerkColossus')){
} return 3.0 + class'NiceSkillZerkColossus'.default.timeBonus;
static function string GetCustomLevelInfo(byte Level){ }
return default.CustomLevelInfo; return 3.0;
} }
defaultproperties static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){
{ bNewTypePerk=True SkillGroupA(0)=Class'NicePack.NiceSkillZerkWindCutter' SkillGroupA(1)=Class'NicePack.NiceSkillZerkWhirlwind' SkillGroupA(2)=Class'NicePack.NiceSkillZerkColossus' SkillGroupA(3)=Class'NicePack.NiceSkillZerkUndead' SkillGroupA(4)=Class'NicePack.NiceSkillZerkZEDAccelerate' SkillGroupB(0)=Class'NicePack.NiceSkillZerkCleave' SkillGroupB(1)=Class'NicePack.NiceSkillZerkFury' SkillGroupB(2)=Class'NicePack.NiceSkillZerkGunzerker' SkillGroupB(3)=Class'NicePack.NiceSkillZerkVorpalBlade' SkillGroupB(4)=Class'NicePack.NiceSkillZerkZEDUnbreakable' progressArray0(0)=100 progressArray0(1)=1000 progressArray0(2)=3000 progressArray0(3)=10000 progressArray0(4)=30000 progressArray0(5)=100000 progressArray0(6)=200000 DefaultDamageType=Class'NicePack.NiceDamageTypeVetBerserker' OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Berserker',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Berserker_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255)) CustomLevelInfo="Level up by doing damage with perked weapons|100% extra melee damage|25% faster melee attacks|20% faster melee movement|Melee invincibility lasts 3 seconds|Melee invincibility doesn't reset on your first miss|Up to 4 Zed-Time Extensions|Can't be grabbed by clots|Can activate melee-invincibility with non-decapitating head-shots up to 3 times" PerkIndex=4 OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Berserker' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Berserker_Gold' VeterancyName="Berserker" Requirements(0)="Required experience for the next level: %x" local NicePlayerController nicePlayer;
} nicePlayer = NicePlayerController(KFPRI.Owner);
if( nicePlayer != none
&& HasSkill(nicePlayer, class'NiceSkillZerkUndead')){
return 1 + class'NiceSkillZerkUndead'.default.addedSafeMisses;
}
return 1;
}
static function string GetCustomLevelInfo(byte Level){
return default.CustomLevelInfo;
}
defaultproperties
{
bNewTypePerk=True
SkillGroupA(0)=Class'NicePack.NiceSkillZerkWindCutter'
SkillGroupA(1)=Class'NicePack.NiceSkillZerkWhirlwind'
SkillGroupA(2)=Class'NicePack.NiceSkillZerkColossus'
SkillGroupA(3)=Class'NicePack.NiceSkillZerkUndead'
SkillGroupA(4)=Class'NicePack.NiceSkillZerkZEDAccelerate'
SkillGroupB(0)=Class'NicePack.NiceSkillZerkCleave'
SkillGroupB(1)=Class'NicePack.NiceSkillZerkFury'
SkillGroupB(2)=Class'NicePack.NiceSkillZerkGunzerker'
SkillGroupB(3)=Class'NicePack.NiceSkillZerkVorpalBlade'
SkillGroupB(4)=Class'NicePack.NiceSkillZerkZEDUnbreakable'
progressArray0(0)=100
progressArray0(1)=1000
progressArray0(2)=3000
progressArray0(3)=10000
progressArray0(4)=30000
progressArray0(5)=100000
progressArray0(6)=200000
DefaultDamageType=Class'NicePack.NiceDamageTypeVetBerserker'
OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Berserker',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Berserker_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Berserker_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255))
CustomLevelInfo="Level up by doing damage with perked weapons|100% extra melee damage|25% faster melee attacks|20% faster melee movement|Melee invincibility lasts 3 seconds|Melee invincibility doesn't reset on your first miss|Up to 4 Zed-Time Extensions|Can't be grabbed by clots|Can activate melee-invincibility with non-decapitating head-shots up to 3 times"
PerkIndex=4
OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Berserker'
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Berserker_Gold'
VeterancyName="Berserker"
Requirements(0)="Required experience for the next level: %x"
}

View File

@ -1,38 +1,73 @@
class NiceVetCommando extends NiceVeterancyTypes class NiceVetCommando extends NiceVeterancyTypes
abstract; abstract;
static function AddCustomStats(ClientPerkRepLink Other){ static function AddCustomStats(ClientPerkRepLink Other){
other.AddCustomValue(Class'NiceVetCommandoExp'); other.AddCustomValue(Class'NiceVetCommandoExp');
} }
static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){ static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){
return StatOther.GetCustomValueInt(Class'NiceVetCommandoExp'); return StatOther.GetCustomValueInt(Class'NiceVetCommandoExp');
} }
static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){ static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){
return default.progressArray0; return default.progressArray0;
} }
static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){ static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){
if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) return class'NiceSkillCommandoStrategist'.default.visionRadius; if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist'))
return 0.0; return class'NiceSkillCommandoStrategist'.default.visionRadius;
} return 0.0;
static function float GetStalkerViewDistanceMulti(KFPlayerReplicationInfo KFPRI){ }
if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) return class'NiceSkillCommandoStrategist'.default.visionRadius; static function float GetStalkerViewDistanceMulti(KFPlayerReplicationInfo KFPRI){
return 0.0; if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist'))
} return class'NiceSkillCommandoStrategist'.default.visionRadius;
static function float GetMagCapacityMod(KFPlayerReplicationInfo KFPRI, KFWeapon Other){ return 0.0;
local class<NiceWeaponPickup> pickupClass; }
pickupClass = GetPickupFromWeapon(other.class); static function float GetMagCapacityMod(KFPlayerReplicationInfo KFPRI, KFWeapon Other){
if(IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoLargerMags')) return class'NiceSkillCommandoLargerMags'.default.sizeBonus; local class<NiceWeaponPickup> pickupClass;
return 1.0; pickupClass = GetPickupFromWeapon(other.class);
} if(IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoLargerMags'))
static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> Other){ return class'NiceSkillCommandoLargerMags'.default.sizeBonus;
return 1.3; return 1.0;
} }
static function int ZedTimeExtensions(KFPlayerReplicationInfo KFPRI){ static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> Other){
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoTactitian')) return class'NiceSkillCommandoTactitian'.default.bonusExt + 3; return 1.3;
return 3; }
} static function int ZedTimeExtensions(KFPlayerReplicationInfo KFPRI){
static function string GetCustomLevelInfo(byte Level){ if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoTactitian'))
return default.CustomLevelInfo; return class'NiceSkillCommandoTactitian'.default.bonusExt + 3;
} return 3;
defaultproperties }
{ bNewTypePerk=True SkillGroupA(0)=Class'NicePack.NiceSkillCommandoTactitian' SkillGroupA(1)=Class'NicePack.NiceSkillCommandoCriticalFocus' SkillGroupA(2)=Class'NicePack.NiceSkillCommandoLargerMags' SkillGroupA(3)=Class'NicePack.NiceSkillCommandoPerfectExecution' SkillGroupA(4)=Class'NicePack.NiceSkillCommandoZEDProfessional' SkillGroupB(0)=Class'NicePack.NiceSkillCommandoStrategist' SkillGroupB(1)=Class'NicePack.NiceSkillCommandoTrashCleaner' SkillGroupB(2)=Class'NicePack.NiceSkillCommandoExplosivePower' SkillGroupB(3)=Class'NicePack.NiceSkillCommandoThinOut' SkillGroupB(4)=Class'NicePack.NiceSkillCommandoZEDEvisceration' progressArray0(0)=100 progressArray0(1)=1000 progressArray0(2)=3000 progressArray0(3)=10000 progressArray0(4)=30000 progressArray0(5)=100000 progressArray0(6)=200000 DefaultDamageType=Class'NicePack.NiceDamageTypeVetCommando' OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Commando',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255)) CustomLevelInfo="Level up by doing damage with perked weapons|30% faster reload with all weapons|You get three additional Zed-Time Extensions" PerkIndex=3 OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Commando' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold' VeterancyName="Commando" Requirements(0)="Required experience for the next level: %x" static function string GetCustomLevelInfo(byte Level){
} return default.CustomLevelInfo;
}
defaultproperties
{
bNewTypePerk=True
SkillGroupA(0)=Class'NicePack.NiceSkillCommandoTactitian'
SkillGroupA(1)=Class'NicePack.NiceSkillCommandoCriticalFocus'
SkillGroupA(2)=Class'NicePack.NiceSkillCommandoLargerMags'
SkillGroupA(3)=Class'NicePack.NiceSkillCommandoPerfectExecution'
SkillGroupA(4)=Class'NicePack.NiceSkillCommandoZEDProfessional'
SkillGroupB(0)=Class'NicePack.NiceSkillCommandoStrategist'
SkillGroupB(1)=Class'NicePack.NiceSkillCommandoTrashCleaner'
SkillGroupB(2)=Class'NicePack.NiceSkillCommandoExplosivePower'
SkillGroupB(3)=Class'NicePack.NiceSkillCommandoGiantSlayer'
SkillGroupB(4)=Class'NicePack.NiceSkillCommandoZEDEvisceration'
progressArray0(0)=100
progressArray0(1)=1000
progressArray0(2)=3000
progressArray0(3)=10000
progressArray0(4)=30000
progressArray0(5)=100000
progressArray0(6)=200000
DefaultDamageType=Class'NicePack.NiceDamageTypeVetCommando'
OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Commando',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255))
CustomLevelInfo="Level up by doing damage with perked weapons|30% faster reload with all weapons|You get three additional Zed-Time Extensions"
PerkIndex=3
OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Commando'
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold'
VeterancyName="Commando"
Requirements(0)="Required experience for the next level: %x"
}

View File

@ -1,28 +1,36 @@
class NiceSkillCommandoCriticalFocus extends NiceSkill class NiceSkillCommandoCriticalFocus extends NiceSkill
abstract; abstract;
var float cooldown; var float cooldown;
var float healthBoundary; var float healthBoundary;
function static SkillSelected(NicePlayerController nicePlayer){ function static SkillSelected(NicePlayerController nicePlayer){
local NicePack niceMutator; local NicePack niceMutator;
super.SkillSelected(nicePlayer); super.SkillSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
niceMutator.AddCounter("npCommandoCriticalFocus", Texture'NicePackT.HudCounter.commandoCounter', false, default.class); return;
} niceMutator.AddCounter("npCommandoCriticalFocus", Texture'NicePackT.HudCounter.commandoCounter', false, default.class);
function static SkillDeSelected(NicePlayerController nicePlayer){ }
local NicePack niceMutator; function static SkillDeSelected(NicePlayerController nicePlayer){
super.SkillDeSelected(nicePlayer); local NicePack niceMutator;
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); super.SkillDeSelected(nicePlayer);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
niceMutator.RemoveCounter("npCommandoCriticalFocus"); if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
} return;
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ niceMutator.RemoveCounter("npCommandoCriticalFocus");
local NiceHumanPawn nicePawn; }
if(nicePlayer == none || counterName != "npCommandoCriticalFocus") return 0; function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
nicePawn = NiceHumanPawn(nicePlayer.pawn); local NiceHumanPawn nicePawn;
if(nicePawn == none) return 0; if(nicePlayer == none || counterName != "npCommandoCriticalFocus")
return Ceil(nicePawn.forcedZedTimeCountDown); return 0;
} nicePawn = NiceHumanPawn(nicePlayer.pawn);
defaultproperties if(nicePawn == none)
{ cooldown=30.000000 healthBoundary=50.000000 SkillName="Critical focus" return 0;
} return Ceil(nicePawn.forcedZedTimeCountDown);
}
defaultproperties
{
cooldown=30.000000
healthBoundary=50.000000
SkillName="Critical focus"
SkillEffects="Activates zed time once you fall below 50% health. Has a cooldown of 30 seconds."
}

View File

@ -0,0 +1,11 @@
class NiceSkillCommandoGiantSlayer extends NiceSkill
abstract;
var float bonusDamageMult;
var float healthStep;
defaultproperties
{
healthStep=1000.000000
bonusDamageMult=0.05000
SkillName="Giant slayer"
SkillEffects="For every 1000 of health zed currently has, you deal additional 5% damage."
}

View File

@ -1,7 +0,0 @@
class NiceSkillCommandoThinOut extends NiceSkill
abstract;
var float damageMult;
var float maxDistance;
defaultproperties
{ damageMult=2.000000 MaxDistance=800.000000 SkillName="Thin out" SkillEffects="Deal double damage against non-trash zeds, when there's either a huge zed or another zed of the same type within 16 meters of you."
}

View File

@ -1,6 +1,9 @@
class NiceSkillCommandoTrashCleaner extends NiceSkill class NiceSkillCommandoTrashCleaner extends NiceSkill
abstract; abstract;
var float decapitationMultiLimit; var float decapitationMultiLimit;
defaultproperties defaultproperties
{ decapitationMultiLimit=0.600000 SkillName="Trash cleaner" SkillEffects="Get finisher property on your shots against low-health zeds, but your weapons leave more decapitated zeds behind." {
} decapitationMultiLimit=0.45
SkillName="Trash cleaner"
SkillEffects="Get finisher property on your shots against low-health zeds, but your weapons leave more decapitated zeds behind."
}

View File

@ -1,5 +1,7 @@
class NiceSkillCommandoZEDEvisceration extends NiceSkill class NiceSkillCommandoZEDEvisceration extends NiceSkill
abstract; abstract;
defaultproperties defaultproperties
{ SkillName="Evisceration" SkillEffects="During zed-time both 'Trash cleaner' and 'Thin out' skills are active." {
} SkillName="Evisceration"
SkillEffects="Does nothing."
}

View File

@ -1,66 +1,114 @@
class NiceVetDemolitions extends NiceVeterancyTypes class NiceVetDemolitions extends NiceVeterancyTypes
abstract; abstract;
static function AddCustomStats(ClientPerkRepLink Other){ static function AddCustomStats(ClientPerkRepLink Other){
other.AddCustomValue(Class'NiceVetDemolitionsExp'); other.AddCustomValue(Class'NiceVetDemolitionsExp');
} }
static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){ static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){
return StatOther.GetCustomValueInt(Class'NiceVetDemolitionsExp'); return StatOther.GetCustomValueInt(Class'NiceVetDemolitionsExp');
} }
static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){ static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){
return default.progressArray0; return default.progressArray0;
} }
static function int ReduceDamage(KFPlayerReplicationInfo KFPRI, KFPawn Injured, Pawn Instigator, int InDamage, class<DamageType> DmgType){ static function int ReduceDamage(KFPlayerReplicationInfo KFPRI, KFPawn Injured, Pawn Instigator, int InDamage, class<DamageType> DmgType){
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
if(class<NiceDamTypeDemoSafeExplosion>(DmgType) != none) return 0; if(class<NiceDamTypeDemoSafeExplosion>(DmgType) != none)
nicePlayer = NicePlayerController(KFPRI.Owner); return 0;
if(nicePlayer != none && Instigator == nicePlayer.pawn && nicePlayer.IsZedTimeActive() && HasSkill(nicePlayer, class'NiceSkillDemoZEDDuckAndCover')) return 0.0; nicePlayer = NicePlayerController(KFPRI.Owner);
if((class<KFWeaponDamageType>(DmgType) != none && class<KFWeaponDamageType>(DmgType).default.bIsExplosive)) return float(InDamage) * 0.5; if(nicePlayer != none && Instigator == nicePlayer.pawn && nicePlayer.IsZedTimeActive()
return InDamage; && HasSkill(nicePlayer, class'NiceSkillDemoZEDDuckAndCover'))
} return 0.0;
static function float AddExtraAmmoFor(KFPlayerReplicationInfo KFPRI, Class<Ammunition> AmmoType){ if((class<KFWeaponDamageType>(DmgType) != none && class<KFWeaponDamageType>(DmgType).default.bIsExplosive))
local float bonusNades, bonusPipes; return float(InDamage) * 0.5;
// Default bonus return InDamage;
bonusNades = 5; }
bonusPipes = 6; static function float AddExtraAmmoFor(KFPlayerReplicationInfo KFPRI, Class<Ammunition> AmmoType){
if(AmmoType == class'FragAmmo') return 1.0 + 0.2 * bonusNades; local float bonusNades, bonusPipes;
if(ClassIsChildOf(AmmoType, class'PipeBombAmmo')) return 1.0 + 0.5 * bonusPipes; // Default bonus
return 1.0; bonusNades = 5;
} bonusPipes = 6;
static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<DamageType> DmgType){ if(AmmoType == class'FragAmmo')
local float perkDamage; return 1.0 + 0.2 * bonusNades;
local class<NiceWeaponPickup> pickupClass; if(ClassIsChildOf(AmmoType, class'PipeBombAmmo'))
pickupClass = GetPickupFromDamageType(DmgType); return 1.0 + 0.5 * bonusPipes;
perkDamage = float(InDamage); return 1.0;
if(DmgType == class'NicePack.NiceDamTypeDemoExplosion') return 1.6 * perkDamage; }
if(IsPerkedPickup(pickupClass)) perkDamage *= 1.25; static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<DamageType> DmgType){
else if( pickupClass != none && pickupClass.default.weight <= class'NiceSkillDemoOffperk'.default.weightBound && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoOffperk') ) perkDamage *= class'NiceSkillDemoOffperk'.default.damageBonus; local float perkDamage;
if( KFPRI != none && class<NiceDamTypeDemoBlunt>(DmgType) != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoOnperk') ) perkDamage *= class'NiceSkillDemoOnperk'.default.damageBonus; local class<NiceWeaponPickup> pickupClass;
return perkDamage; pickupClass = GetPickupFromDamageType(DmgType);
} perkDamage = float(InDamage);
static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> other){ if(DmgType == class'NicePack.NiceDamTypeDemoExplosion')
local NiceHumanPawn nicePawn; return 1.6 * perkDamage;
local class<NiceWeaponPickup> pickupClass; if(IsPerkedPickup(pickupClass))
// Pistols reload perkDamage *= 1.25;
if( other != none && other.default.weight <= class'NiceSkillDemoOffperk'.default.weightBound && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoOffperk') ) return class'NiceSkillDemoOffperk'.default.reloadBonus; else if( pickupClass != none && pickupClass.default.weight <= class'NiceSkillDemoOffperk'.default.weightBound
// Maniac reload && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoOffperk') )
pickupClass = GetPickupFromWeapon(other); perkDamage *= class'NiceSkillDemoOffperk'.default.damageBonus;
if(KFPRI != none && PlayerController(KFPRI.Owner) != none) nicePawn = NiceHumanPawn(PlayerController(KFPRI.Owner).Pawn); if( KFPRI != none && class<NiceDamTypeDemoBlunt>(DmgType) != none
if(nicePawn != none && nicePawn.maniacTimeout >= 0.0 && IsPerkedPickup(pickupClass)) return class'NiceSkillDemoManiac'.default.reloadSpeedup; && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoOnperk') )
return 1.0; perkDamage *= class'NiceSkillDemoOnperk'.default.damageBonus;
} return perkDamage;
static function float stunDurationMult(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, class<NiceWeaponDamageType> DmgType){ }
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoConcussion')) return class'NiceSkillDemoConcussion'.default.durationMult; static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> other){
return 1.0; local NiceHumanPawn nicePawn;
} local class<NiceWeaponPickup> pickupClass;
static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class<NiceWeaponDamageType> DmgType){ // Pistols reload
return int(float(InStunScore) * 1.5); if( other != none && other.default.weight <= class'NiceSkillDemoOffperk'.default.weightBound
} && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoOffperk') )
static function int AddFlinchScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InFlinchScore, class<NiceWeaponDamageType> DmgType){ return class'NiceSkillDemoOffperk'.default.reloadBonus;
return int(float(InFlinchScore) * 1.5); // Maniac reload
} pickupClass = GetPickupFromWeapon(other);
static function string GetCustomLevelInfo(byte Level){ if(KFPRI != none && PlayerController(KFPRI.Owner) != none)
return default.CustomLevelInfo; nicePawn = NiceHumanPawn(PlayerController(KFPRI.Owner).Pawn);
} if(nicePawn != none && nicePawn.maniacTimeout >= 0.0 && IsPerkedPickup(pickupClass))
defaultproperties return class'NiceSkillDemoManiac'.default.reloadSpeedup;
{ bNewTypePerk=True SkillGroupA(0)=Class'NicePack.NiceSkillDemoOnperk' SkillGroupA(1)=Class'NicePack.NiceSkillDemoDirectApproach' SkillGroupA(2)=Class'NicePack.NiceSkillDemoConcussion' SkillGroupA(3)=Class'NicePack.NiceSkillDemoAPShot' SkillGroupA(4)=Class'NicePack.NiceSkillDemoZEDDuckAndCover' SkillGroupB(0)=Class'NicePack.NiceSkillDemoOffperk' SkillGroupB(1)=Class'NicePack.NiceSkillDemoVolatile' SkillGroupB(2)=Class'NicePack.NiceSkillDemoReactiveArmor' SkillGroupB(3)=Class'NicePack.NiceSkillDemoManiac' SkillGroupB(4)=Class'NicePack.NiceSkillDemoZEDFullBlast' progressArray0(0)=100 progressArray0(1)=1000 progressArray0(2)=3000 progressArray0(3)=10000 progressArray0(4)=30000 progressArray0(5)=100000 progressArray0(6)=200000 DefaultDamageType=Class'NicePack.NiceDamageTypeVetDemolitions' OnHUDIcons(0)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255)) CustomLevelInfo="Level up by doing damage with perked weapons|25% extra explosives damage|50% better stun and flinch ability for all weapons|50% resistance to explosives|+5 grenades|+6 pipe bombs" PerkIndex=6 OnHUDIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition_Gold' VeterancyName="Demolitions" Requirements(0)="Required experience for the next level: %x" return 1.0;
} }
static function float stunDurationMult(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, class<NiceWeaponDamageType> DmgType){
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillDemoConcussion'))
return class'NiceSkillDemoConcussion'.default.durationMult;
return 1.0;
}
static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class<NiceWeaponDamageType> DmgType){
return int(float(InStunScore) * 1.5);
}
static function int AddFlinchScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InFlinchScore, class<NiceWeaponDamageType> DmgType){
return int(float(InFlinchScore) * 1.5);
}
static function string GetCustomLevelInfo(byte Level){
return default.CustomLevelInfo;
}
defaultproperties
{
bNewTypePerk=True
SkillGroupA(0)=Class'NicePack.NiceSkillDemoOnperk'
SkillGroupA(1)=Class'NicePack.NiceSkillDemoDirectApproach'
SkillGroupA(2)=Class'NicePack.NiceSkillDemoConcussion'
SkillGroupA(3)=Class'NicePack.NiceSkillDemoAPShot'
SkillGroupA(4)=Class'NicePack.NiceSkillDemoZEDDuckAndCover'
SkillGroupB(0)=Class'NicePack.NiceSkillDemoOffperk'
SkillGroupB(1)=Class'NicePack.NiceSkillDemoVolatile'
SkillGroupB(2)=Class'NicePack.NiceSkillDemoReactiveArmor'
SkillGroupB(3)=Class'NicePack.NiceSkillDemoManiac'
SkillGroupB(4)=Class'NicePack.NiceSkillDemoZEDFullBlast'
progressArray0(0)=100
progressArray0(1)=1000
progressArray0(2)=3000
progressArray0(3)=10000
progressArray0(4)=30000
progressArray0(5)=100000
progressArray0(6)=200000
DefaultDamageType=Class'NicePack.NiceDamageTypeVetDemolitions'
OnHUDIcons(0)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Demolition_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255))
CustomLevelInfo="Level up by doing damage with perked weapons|25% extra explosives damage|50% better stun and flinch ability for all weapons|50% resistance to explosives|+5 grenades|+6 pipe bombs"
PerkIndex=6
OnHUDIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition'
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Demolition_Gold'
VeterancyName="Demolitions"
Requirements(0)="Required experience for the next level: %x"
}

View File

@ -1,118 +1,157 @@
class NiceVetEnforcer extends NiceVeterancyTypes class NiceVetEnforcer extends NiceVeterancyTypes
abstract; abstract;
static function AddCustomStats(ClientPerkRepLink Other){ static function AddCustomStats(ClientPerkRepLink Other){
Other.AddCustomValue(Class'NiceVetSupportExp'); Other.AddCustomValue(Class'NiceVetSupportExp');
} }
static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){ static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){
return StatOther.GetCustomValueInt(Class'NiceVetSupportExp'); return StatOther.GetCustomValueInt(Class'NiceVetSupportExp');
} }
static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){ static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){
return default.progressArray0; return default.progressArray0;
} }
// Other bonuses // Other bonuses
static function float GetPenetrationDamageMulti(KFPlayerReplicationInfo KFPRI, float DefaultPenDamageReduction, class<NiceWeaponDamageType> fireIntance){ static function float GetPenetrationDamageMulti(KFPlayerReplicationInfo KFPRI, float DefaultPenDamageReduction, class<NiceWeaponDamageType> fireIntance){
local float bonusReduction; local float bonusReduction;
local float PenDamageInverse; local float PenDamageInverse;
bonusReduction = 0.0; bonusReduction = 0.0;
if(class<NiceDamageTypeVetEnforcerBullets>(fireIntance) != none) if(class<NiceDamageTypeVetEnforcerBullets>(fireIntance) != none)
return DefaultPenDamageReduction; return DefaultPenDamageReduction;
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillSupportStubbornness')) bonusReduction = class'NiceSkillSupportStubbornness'.default.penLossRed; if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillSupportStubbornness'))
PenDamageInverse = (1.0 - FMax(0, DefaultPenDamageReduction)); bonusReduction = class'NiceSkillSupportStubbornness'.default.penLossRed;
return DefaultPenDamageReduction + PenDamageInverse * (0.6 + 0.4 * bonusReduction); // 60% better penetrations + bonus PenDamageInverse = (1.0 - FMax(0, DefaultPenDamageReduction));
} return DefaultPenDamageReduction + PenDamageInverse * (0.6 + 0.4 * bonusReduction); // 60% better penetrations + bonus
}
static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class<NiceWeaponDamageType> DmgType){
local class<NiceWeaponPickup> pickupClass; static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class<NiceWeaponDamageType> DmgType){
pickupClass = GetPickupFromDamageType(DmgType); local class<NiceWeaponPickup> pickupClass;
if(KFPRI != none && IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerBombard')) return InStunScore * class'NiceSkillEnforcerBombard'.default.stunMult; pickupClass = GetPickupFromDamageType(DmgType);
return InStunScore; if(KFPRI != none && IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerBombard'))
} return InStunScore * class'NiceSkillEnforcerBombard'.default.stunMult;
return InStunScore;
static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI){ }
/*if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillSupportCautious')) return class'NicePack.NiceDelayedNade';
return class'NicePack.NiceNailNade';*/ static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI){
return class'NicePack.NiceCryoNade'; /*if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillSupportCautious'))
} return class'NicePack.NiceDelayedNade';
return class'NicePack.NiceNailNade';*/
static function int ReduceDamage(KFPlayerReplicationInfo KFPRI, KFPawn Injured, Pawn Instigator, int InDamage, class<DamageType> DmgType){ return class'NicePack.NiceCryoNade';
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerDetermination') && Injured.Health < class'NiceSkillEnforcerDetermination'.default.healthBound) }
InDamage *= (1 - class'NiceSkillEnforcerDetermination'.default.addedResist);
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnshakable')) static function float AddExtraAmmoFor(KFPlayerReplicationInfo KFPRI, Class<Ammunition> AmmoType){
InDamage *= (1 - class'NiceSkillEnforcerUnshakable'.default.skillResist); local float bonusNades;
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillHeavyCoating') && Injured.ShieldStrength > 0){ // Default bonus
if( class<KFWeaponDamageType>(DmgType) != none bonusNades = 2;
&& ((class<KFWeaponDamageType>(DmgType).default.bDealBurningDamage && KFMonster(Instigator) != none) if(AmmoType == class'NicePack.NiceCryoNade' || AmmoType == class'NicePack.NiceNailNade')
|| DmgType == class'NiceZombieTeslaHusk'.default.MyDamageType) ) return 1.0 + 0.2 * bonusNades;
InDamage *= (1 - class'NiceSkillHeavyCoating'.default.huskResist); return 1.0;
} }
return InDamage;
} static function int ReduceDamage(KFPlayerReplicationInfo KFPRI, KFPawn Injured, Pawn Instigator, int InDamage, class<DamageType> DmgType){
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerDetermination') && Injured.Health < class'NiceSkillEnforcerDetermination'.default.healthBound)
static function float GetFireSpeedModStatic(KFPlayerReplicationInfo KFPRI, class<Weapon> other){ InDamage *= (1 - class'NiceSkillEnforcerDetermination'.default.addedResist);
local float fireSpeed; if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnshakable'))
local NicePlayerController nicePlayer; InDamage *= (1 - class'NiceSkillEnforcerUnshakable'.default.skillResist);
local class<NiceWeaponPickup> pickupClass; if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillHeavyCoating') && Injured.ShieldStrength > 0){
pickupClass = GetPickupFromWeapon(other); if( class<KFWeaponDamageType>(DmgType) != none
if(KFPRI.Owner == none) && ((class<KFWeaponDamageType>(DmgType).default.bDealBurningDamage && KFMonster(Instigator) != none)
return 1.0; || DmgType == class'NiceZombieTeslaHusk'.default.MyDamageType) )
if(IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillHeavyOverclocking')) InDamage *= (1 - class'NiceSkillHeavyCoating'.default.huskResist);
fireSpeed = class'NiceSkillHeavyOverclocking'.default.fireSpeedMult; }
else return InDamage;
fireSpeed = 1.0; }
nicePlayer = NicePlayerController(KFPRI.Owner);
/*if(nicePlayer != none && HasSkill(nicePlayer, class'NiceSkillEnforcerZEDBarrage')) static function float GetFireSpeedModStatic(KFPlayerReplicationInfo KFPRI, class<Weapon> other){
fireSpeed /= (KFPRI.Owner.Level.TimeDilation / 1.1);*/ local float fireSpeed;
return fireSpeed; local NicePlayerController nicePlayer;
} local class<NiceWeaponPickup> pickupClass;
pickupClass = GetPickupFromWeapon(other);
static function float ModifyRecoilSpread(KFPlayerReplicationInfo KFPRI, WeaponFire other, out float Recoil){ if(KFPRI.Owner == none)
local class<NiceWeaponPickup> pickupClass; return 1.0;
pickupClass = GetPickupFromWeaponFire(other); if(IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillHeavyOverclocking'))
if(IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillHeavyOverclocking')) fireSpeed = class'NiceSkillHeavyOverclocking'.default.fireSpeedMult;
Recoil = class'NiceSkillHeavyOverclocking'.default.fireSpeedMult; else
else fireSpeed = 1.0;
Recoil = 1.0; nicePlayer = NicePlayerController(KFPRI.Owner);
return Recoil; /*if(nicePlayer != none && HasSkill(nicePlayer, class'NiceSkillEnforcerZEDBarrage'))
} fireSpeed /= (KFPRI.Owner.Level.TimeDilation / 1.1);*/
return fireSpeed;
/*static function float GetMagCapacityModStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> other){ }
local class<NiceWeapon> niceWeap;
niceWeap = class<NiceWeapon>(other); static function float ModifyRecoilSpread(KFPlayerReplicationInfo KFPRI, WeaponFire other, out float Recoil){
if(niceWeap != none && niceWeap.default.reloadType == RTYPE_MAG) local class<NiceWeaponPickup> pickupClass;
return 1.5; pickupClass = GetPickupFromWeaponFire(other);
if(other == class'NicePack.NiceM41AAssaultRifle' || other == class'NicePack.NiceChainGun' || other == class'NicePack.NiceStinger' ) if(IsPerkedPickup(pickupClass) && HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillHeavyOverclocking'))
return 1.5; Recoil = class'NiceSkillHeavyOverclocking'.default.fireSpeedMult;
return 1.0; else
}*/ Recoil = 1.0;
return Recoil;
static function float GetMovementSpeedModifier(KFPlayerReplicationInfo KFPRI, KFGameReplicationInfo KFGRI){ }
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnstoppable'))
return class'NiceSkillEnforcerUnstoppable'.default.speedMult; /*static function float GetMagCapacityModStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> other){
return 1.0; local class<NiceWeapon> niceWeap;
} niceWeap = class<NiceWeapon>(other);
if(niceWeap != none && niceWeap.default.reloadType == RTYPE_MAG)
static function bool CanBePulled(KFPlayerReplicationInfo KFPRI){ return 1.5;
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnstoppable')) if(other == class'NicePack.NiceM41AAssaultRifle' || other == class'NicePack.NiceChainGun' || other == class'NicePack.NiceStinger' )
return false; return 1.5;
return super.CanBePulled(KFPRI); return 1.0;
} }*/
static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){ static function float GetMovementSpeedModifier(KFPlayerReplicationInfo KFPRI, KFGameReplicationInfo KFGRI){
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnstoppable')) if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnstoppable'))
return 0.0; return class'NiceSkillEnforcerUnstoppable'.default.speedMult;
return 1.0; return 1.0;
} }
static function string GetCustomLevelInfo(byte Level){ static function bool CanBePulled(KFPlayerReplicationInfo KFPRI){
return default.CustomLevelInfo; if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnstoppable'))
} return false;
defaultproperties return super.CanBePulled(KFPRI);
{ bNewTypePerk=True }
SkillGroupA(0)=Class'NicePack.NiceSkillEnforcerUnstoppable' SkillGroupA(1)=Class'NicePack.NiceSkillEnforcerBombard' SkillGroupA(2)=Class'NicePack.NiceSkillEnforcerFullCounter' SkillGroupA(4)=Class'NicePack.NiceSkillEnforcerZEDBarrage'
SkillGroupB(0)=Class'NicePack.NiceSkillEnforcerUnshakable' SkillGroupB(1)=Class'NicePack.NiceSkillEnforcerMultitasker' SkillGroupB(2)=Class'NicePack.NiceSkillEnforcerDetermination' SkillGroupB(4)=Class'NicePack.NiceSkillEnforcerZEDJuggernaut' progressArray0(0)=100 progressArray0(1)=1000 progressArray0(2)=3000 progressArray0(3)=10000 progressArray0(4)=30000 progressArray0(5)=100000 progressArray0(6)=200000 DefaultDamageType=Class'NicePack.NiceDamageTypeVetEnforcer' OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Support',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Support_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255)) CustomLevelInfo="Level up by doing damage with perked weapons|60% better penetration with all weapons" PerkIndex=1 OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Support' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Support_Gold' VeterancyName="Enforcer" Requirements(0)="Required experience for the next level: %x" static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){
if(HasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillEnforcerUnstoppable'))
return 0.0;
return 1.0;
}
static function string GetCustomLevelInfo(byte Level){
return default.CustomLevelInfo;
}
defaultproperties
{
bNewTypePerk=True
SkillGroupA(0)=Class'NicePack.NiceSkillEnforcerUnstoppable'
SkillGroupA(1)=Class'NicePack.NiceSkillEnforcerBombard'
SkillGroupA(2)=Class'NicePack.NiceSkillEnforcerFullCounter'
SkillGroupA(4)=Class'NicePack.NiceSkillEnforcerZEDBarrage'
SkillGroupB(0)=Class'NicePack.NiceSkillEnforcerUnshakable'
SkillGroupB(1)=Class'NicePack.NiceSkillEnforcerMultitasker'
SkillGroupB(2)=Class'NicePack.NiceSkillEnforcerDetermination'
SkillGroupB(4)=Class'NicePack.NiceSkillEnforcerZEDJuggernaut'
progressArray0(0)=100
progressArray0(1)=1000
progressArray0(2)=3000
progressArray0(3)=10000
progressArray0(4)=30000
progressArray0(5)=100000
progressArray0(6)=200000
DefaultDamageType=Class'NicePack.NiceDamageTypeVetEnforcer'
OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Support',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Support_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Support_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255))
CustomLevelInfo="Level up by doing damage with perked weapons|60% better penetration with all weapons|+2 grenades"
PerkIndex=1
OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Support'
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Support_Gold'
VeterancyName="Enforcer"
Requirements(0)="Required experience for the next level: %x"
} }

View File

@ -1,62 +1,95 @@
class NiceVetFieldMedic extends NiceVeterancyTypes class NiceVetFieldMedic extends NiceVeterancyTypes
abstract; abstract;
static function AddCustomStats(ClientPerkRepLink Other){ static function AddCustomStats(ClientPerkRepLink Other){
Other.AddCustomValue(Class'NiceVetFieldMedicExp'); Other.AddCustomValue(Class'NiceVetFieldMedicExp');
} }
static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){ static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum){
return StatOther.GetCustomValueInt(Class'NiceVetFieldMedicExp'); return StatOther.GetCustomValueInt(Class'NiceVetFieldMedicExp');
} }
static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){ static function array<int> GetProgressArray(byte ReqNum, optional out int DoubleScalingBase){
return default.progressArray0; return default.progressArray0;
} }
// Allows to increase head-shot check scale for some weapons. // Allows to increase head-shot check scale for some weapons.
static function float GetHeadshotCheckMultiplier(KFPlayerReplicationInfo KFPRI, class<DamageType> DmgType){ static function float GetHeadshotCheckMultiplier(KFPlayerReplicationInfo KFPRI, class<DamageType> DmgType){
if(KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicAimAssistance')) return class'NiceSkillMedicAimAssistance'.default.headIncrease; if(KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicAimAssistance'))
return 1.0; return class'NiceSkillMedicAimAssistance'.default.headIncrease;
} return 1.0;
// Give Medic normal hand nades again - he should buy medic nade lauchers for healing nades }
static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI){ // Give Medic normal hand nades again - he should buy medic nade lauchers for healing nades
if(KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicArmament')) return class'NicePack.NiceMedicNade'; static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI){
return class'NiceMedicNadePoison'; if(KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicArmament'))
} return class'NicePack.NiceMedicNade';
static function float GetAmmoPickupMod(KFPlayerReplicationInfo KFPRI, KFAmmunition Other){ return class'NiceMedicNadePoison';
if(other != none && other.class == class'FragAmmo' && KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicArmament')) return 0.0; }
return 1.0; static function float GetAmmoPickupMod(KFPlayerReplicationInfo KFPRI, KFAmmunition Other){
} if(other != none && other.class == class'FragAmmo'
//can't cook medic nades && KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicArmament'))
static function bool CanCookNade(KFPlayerReplicationInfo KFPRI, Weapon Weap){ return 0.0;
return GetNadeType(KFPRI) != class'NicePack.NiceMedicNade'; return 1.0;
} }
static function float GetSyringeChargeRate(KFPlayerReplicationInfo KFPRI){ //can't cook medic nades
return 3.0; static function bool CanCookNade(KFPlayerReplicationInfo KFPRI, Weapon Weap){
} return GetNadeType(KFPRI) != class'NicePack.NiceMedicNade';
static function float GetHealPotency(KFPlayerReplicationInfo KFPRI){ }
local float potency, debuff; static function float GetSyringeChargeRate(KFPlayerReplicationInfo KFPRI){
potency = 2.0; return 3.0;
debuff = 0.0; }
if(KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicTranquilizer')) debuff += class'NiceSkillMedicTranquilizer'.default.healingDebuff; static function float GetHealPotency(KFPlayerReplicationInfo KFPRI){
potency *= (1.0 - debuff); local float potency, debuff;
return potency; potency = 2.0;
} debuff = 0.0;
static function float GetFireSpeedModStatic(KFPlayerReplicationInfo KFPRI, class<Weapon> Other){ if(KFPRI != none && class'NiceVetFieldMedic'.static.hasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillMedicTranquilizer'))
if(ClassIsChildOf(Other, class'Syringe')) return 1.6; debuff += class'NiceSkillMedicTranquilizer'.default.healingDebuff;
return 1.0; potency *= (1.0 - debuff);
} return potency;
static function float GetMovementSpeedModifier(KFPlayerReplicationInfo KFPRI, KFGameReplicationInfo KFGRI){ }
return 1.2; static function float GetFireSpeedModStatic(KFPlayerReplicationInfo KFPRI, class<Weapon> Other){
} if(ClassIsChildOf(Other, class'Syringe'))
static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){ return 1.6;
return 1.5; return 1.0;
} }
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<Pickup> Item){ static function float GetMovementSpeedModifier(KFPlayerReplicationInfo KFPRI, KFGameReplicationInfo KFGRI){
local class<NiceWeaponPickup> pickupClass; return 1.2;
pickupClass = class<NiceWeaponPickup>(Item); }
if(IsPerkedPickup(class<NiceWeaponPickup>(Item))) return 0.5; static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<Pickup> Item){
return 1.0; local class<NiceWeaponPickup> pickupClass;
} pickupClass = class<NiceWeaponPickup>(Item);
static function string GetCustomLevelInfo(byte Level){ if(IsPerkedPickup(class<NiceWeaponPickup>(Item)))
return default.CustomLevelInfo; return 0.5;
} return 1.0;
defaultproperties }
{ SkillGroupA(0)=Class'NicePack.NiceSkillMedicSymbioticHealth' SkillGroupA(1)=Class'NicePack.NiceSkillMedicArmament' SkillGroupA(2)=Class'NicePack.NiceSkillMedicAdrenalineShot' SkillGroupA(3)=Class'NicePack.NiceSkillMedicInjection' SkillGroupA(4)=Class'NicePack.NiceSkillMedicZEDHeavenCanceller' SkillGroupB(0)=Class'NicePack.NiceSkillMedicAimAssistance' SkillGroupB(1)=Class'NicePack.NiceSkillMedicPesticide' SkillGroupB(2)=Class'NicePack.NiceSkillMedicRegeneration' SkillGroupB(3)=Class'NicePack.NiceSkillMedicTranquilizer' SkillGroupB(4)=Class'NicePack.NiceSkillMedicZEDFrenzy' progressArray0(0)=100 progressArray0(1)=1000 progressArray0(2)=3000 progressArray0(3)=10000 progressArray0(4)=30000 progressArray0(5)=100000 progressArray0(6)=200000 OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Medic',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Medic_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255)) CustomLevelInfo="Level up by doing damage with perked weapons|50% discount on everything|100% more potent medical injections|20% faster movement speed|Better Syringe handling" PerkIndex=0 OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Medic' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Medic_Gold' VeterancyName="Field Medic" Requirements(0)="Required experience for the next level: %x" static function string GetCustomLevelInfo(byte Level){
} return default.CustomLevelInfo;
}
defaultproperties
{
SkillGroupA(0)=Class'NicePack.NiceSkillMedicSymbioticHealth'
SkillGroupA(1)=Class'NicePack.NiceSkillMedicArmament'
SkillGroupA(2)=Class'NicePack.NiceSkillMedicAdrenalineShot'
SkillGroupA(3)=Class'NicePack.NiceSkillMedicInjection'
SkillGroupA(4)=Class'NicePack.NiceSkillMedicZEDHeavenCanceller'
SkillGroupB(0)=Class'NicePack.NiceSkillMedicAimAssistance'
SkillGroupB(1)=Class'NicePack.NiceSkillMedicPesticide'
SkillGroupB(2)=Class'NicePack.NiceSkillMedicRegeneration'
SkillGroupB(3)=Class'NicePack.NiceSkillMedicTranquilizer'
SkillGroupB(4)=Class'NicePack.NiceSkillMedicZEDFrenzy'
progressArray0(0)=100
progressArray0(1)=1000
progressArray0(2)=3000
progressArray0(3)=10000
progressArray0(4)=30000
progressArray0(5)=100000
progressArray0(6)=200000
OnHUDIcons(0)=(PerkIcon=Texture'KillingFloorHUD.Perks.Perk_Medic',StarIcon=Texture'KillingFloorHUD.HUD.Hud_Perk_Star',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(1)=(PerkIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Medic_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Medic_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255))
CustomLevelInfo="Level up by doing damage with perked weapons|50% discount on everything|100% more potent medical injections|20% faster movement speed|Better Syringe handling"
PerkIndex=0
OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Medic'
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Medic_Gold'
VeterancyName="Field Medic"
Requirements(0)="Required experience for the next level: %x"
}

View File

@ -1,52 +1,87 @@
//============================================================================== //==============================================================================
// NicePack / NiceSharpshooterAbilitiesAdapter // NicePack / NiceSharpshooterAbilitiesAdapter
//============================================================================== //==============================================================================
// Temporary stand-in for future functionality. // Temporary stand-in for future functionality.
// Use this class to catch events from sharpshooter players' abilities. // Use this class to catch events from sharpshooter players' abilities.
//============================================================================== //==============================================================================
// 'Nice pack' source // 'Nice pack' source
// Do whatever the fuck you want with it // Do whatever the fuck you want with it
// Author: dkanus // Author: dkanus
// E-mail: dkanus@gmail.com // E-mail: dkanus@gmail.com
//============================================================================== //==============================================================================
class NiceSharpshooterAbilitiesAdapter extends NiceAbilitiesAdapter; class NiceSharpshooterAbilitiesAdapter extends NiceAbilitiesAdapter;
static function AbilityActivated( string abilityID, NicePlayerController relatedPlayer){ static function AbilityActivated( string abilityID,
local NiceHumanPawn nicePawn; NicePlayerController relatedPlayer){
if(relatedPlayer == none) return; local NiceHumanPawn nicePawn;
nicePawn = NiceHumanPawn(relatedPlayer.pawn); if(relatedPlayer == none) return;
if(nicePawn == none) return; nicePawn = NiceHumanPawn(relatedPlayer.pawn);
if(abilityID == "Calibration"){ nicePawn.currentCalibrationState = CALSTATE_ACTIVE; nicePawn.calibrateUsedZeds.length = 0; nicePawn.calibrationScore = 1; nicePawn.calibrationRemainingTime = 7.0; nicePawn.calibrationHits = 0; nicePawn.calibrationTotalShots = 0; if(nicePawn == none)
} return;
if(abilityID == class'NiceSkillSharpshooterGunslingerA'.default.abilityID){ nicePawn.gunslingerTimer = class'NiceSkillSharpshooterGunslingerA'.default.duration; if(abilityID == "Calibration"){
} nicePawn.currentCalibrationState = CALSTATE_ACTIVE;
} nicePawn.calibrateUsedZeds.length = 0;
static function AbilityAdded( string abilityID, NicePlayerController relatedPlayer){ nicePawn.calibrationScore = 1;
local NiceHumanPawn nicePawn; nicePawn.calibrationRemainingTime = 7.0;
if(relatedPlayer == none) return; nicePawn.calibrationHits = 0;
nicePawn = NiceHumanPawn(relatedPlayer.pawn); nicePawn.calibrationTotalShots = 0;
if(nicePawn == none) return; }
if(abilityID == "Calibration"){ nicePawn.currentCalibrationState = CALSTATE_FINISHED; nicePawn.calibrationScore = 1; if(abilityID == class'NiceSkillSharpshooterGunslingerA'.default.abilityID){
} nicePawn.gunslingerTimer =
} class'NiceSkillSharpshooterGunslingerA'.default.duration;
static function AbilityRemoved( string abilityID, NicePlayerController relatedPlayer){ }
local NiceHumanPawn nicePawn; }
if(relatedPlayer == none) return; static function AbilityAdded( string abilityID,
nicePawn = NiceHumanPawn(relatedPlayer.pawn); NicePlayerController relatedPlayer){
if(nicePawn == none) return; local NiceHumanPawn nicePawn;
if(abilityID == "Calibration") nicePawn.currentCalibrationState = CALSTATE_NOABILITY; if(relatedPlayer == none) return;
if(abilityID == class'NiceSkillSharpshooterGunslingerA'.default.abilityID){ nicePawn.gunslingerTimer = 0.0; nicePawn = NiceHumanPawn(relatedPlayer.pawn);
} if(nicePawn == none)
} return;
static function ModAbilityCooldown( string abilityID, NicePlayerController relatedPlayer, out float cooldown){ if(abilityID == "Calibration"){
local NiceHumanPawn nicePawn; nicePawn.currentCalibrationState = CALSTATE_FINISHED;
if(relatedPlayer == none) return; nicePawn.calibrationScore = 3;
nicePawn = NiceHumanPawn(relatedPlayer.pawn); }
if( abilityID != class'NiceSkillSharpshooterGunslingerA'.default.abilityID && abilityID != class'NiceSkillSharpshooterReaperA'.default.abilityID) return; }
switch(nicePawn.calibrationScore){ case 2: cooldown *= 0.85; break; case 3: cooldown *= 0.7; break; case 4: cooldown *= 0.5; break; case 5: cooldown *= 0.25; break; static function AbilityRemoved( string abilityID,
} NicePlayerController relatedPlayer){
// Reduce calibration score local NiceHumanPawn nicePawn;
if(nicePawn.calibrationScore > 1) nicePawn.calibrationScore -= 1; if(relatedPlayer == none) return;
} nicePawn = NiceHumanPawn(relatedPlayer.pawn);
defaultproperties if(nicePawn == none)
{ return;
} if(abilityID == "Calibration")
nicePawn.currentCalibrationState = CALSTATE_NOABILITY;
if(abilityID == class'NiceSkillSharpshooterGunslingerA'.default.abilityID){
nicePawn.gunslingerTimer = 0.0;
}
}
static function ModAbilityCooldown( string abilityID,
NicePlayerController relatedPlayer,
out float cooldown){
local NiceHumanPawn nicePawn;
if(relatedPlayer == none) return;
nicePawn = NiceHumanPawn(relatedPlayer.pawn);
if( abilityID != class'NiceSkillSharpshooterGunslingerA'.default.abilityID
&& abilityID != class'NiceSkillSharpshooterReaperA'.default.abilityID)
return;
switch(nicePawn.calibrationScore){
case 2:
cooldown *= 0.85;
break;
case 3:
cooldown *= 0.7;
break;
case 4:
cooldown *= 0.5;
break;
case 5:
cooldown *= 0.25;
break;
}
// Reduce calibration score
if(nicePawn.calibrationScore > 3)
nicePawn.calibrationScore -= 1;
}
defaultproperties
{
}

View File

@ -1,5 +1,16 @@
class NiceDamTypeFNFALAssaultRifle extends NiceDamageTypeVetCommando class NiceDamTypeFNFALAssaultRifle extends NiceDamageTypeVetCommando
abstract; abstract;
defaultproperties defaultproperties
{ MaxPenetrations=3 HeadShotDamageMult=2.250000 WeaponClass=Class'NicePack.NiceFNFAL_ACOG_AssaultRifle' DeathString="%k killed %o (FNFAL ACOG)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=6500.000000 KDeathVel=175.000000 KDeathUpKick=20.000000 {
} MaxPenetrations=3
flinchMultiplier=0.800000
HeadShotDamageMult=2.250000
WeaponClass=Class'NicePack.NiceFNFAL_ACOG_AssaultRifle'
DeathString="%k killed %o (FNFAL ACOG)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
KDamageImpulse=6500.000000
KDeathVel=175.000000
KDeathUpKick=20.000000
}

View File

@ -1,5 +1,17 @@
class NiceDamTypeSCARMK17AssaultRifle extends NiceDamageTypeVetCommando class NiceDamTypeSCARMK17AssaultRifle extends NiceDamageTypeVetCommando
abstract; abstract;
defaultproperties defaultproperties
{ bPenetrationHSOnly=True MaxPenetrations=1 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceSCARMK17AssaultRifle' DeathString="%k killed %o (SCAR MK17)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=6500.000000 KDeathVel=175.000000 KDeathUpKick=20.000000 {
} bPenetrationHSOnly=True
MaxPenetrations=1
flinchMultiplier=0.800000
HeadShotDamageMult=2.000000
WeaponClass=Class'NicePack.NiceSCARMK17AssaultRifle'
DeathString="%k killed %o (SCAR MK17)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
KDamageImpulse=6500.000000
KDeathVel=175.000000
KDeathUpKick=20.000000
}

View File

@ -1,6 +1,19 @@
class NiceDamTypeDeagle extends NiceDamageTypeVetSharpshooter class NiceDamTypeDeagle extends NiceDamageTypeVetSharpshooter
abstract; abstract;
defaultproperties defaultproperties
{ {
goodDecapMod=0.750000 MaxPenetrations=4 WeaponClass=Class'NicePack.NiceDeagle' DeathString="%k killed %o (Deagle)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=6500.000000 KDeathVel=400.000000 KDeathUpKick=80.000000 VehicleDamageScaling=0.800000 goodDecapMod=0.750000
} MaxPenetrations=4
HeadShotDamageMult=1.35
WeaponClass=Class'NicePack.NiceDeagle'
DeathString="%k killed %o (Deagle)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
bBulletHit=True
FlashFog=(X=600.000000)
KDamageImpulse=6500.000000
KDeathVel=400.000000
KDeathUpKick=80.000000
VehicleDamageScaling=0.800000
}

View File

@ -1,4 +1,29 @@
class NiceDeagleFire extends NiceSingleFire; class NiceDeagleFire extends NiceSingleFire;
defaultproperties defaultproperties
{ ProjectileSpeed=23500.000000 FireAimedAnim="Iron_Fire" maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 ShellEjectClass=Class'ROEffects.KFShellEjectHandCannon' FireSoundRef="KF_HandcannonSnd.50AE_Fire" StereoFireSoundRef="KF_HandcannonSnd.50AE_FireST" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeDeagle' DamageMin=105 DamageMax=105 Momentum=20000.000000 FireLoopAnim= FireEndAnim= FireAnimRate=1.000000 FireRate=0.500000 AmmoClass=Class'NicePack.NiceDeagleAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 {
} ProjectileSpeed=23500.000000
FireAimedAnim="Iron_Fire"
maxVerticalRecoilAngle=600
maxHorizontalRecoilAngle=300
ShellEjectClass=Class'ROEffects.KFShellEjectHandCannon'
FireSoundRef="KF_HandcannonSnd.50AE_Fire"
StereoFireSoundRef="KF_HandcannonSnd.50AE_FireST"
NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire"
DamageType=Class'NicePack.NiceDamTypeDeagle'
DamageMin=120
DamageMax=120
Momentum=20000.000000
FireLoopAnim=
FireEndAnim=
FireAnimRate=1.000000
FireRate=0.500000
AmmoClass=Class'NicePack.NiceDeagleAmmo'
ShakeRotMag=(Z=400.000000)
ShakeRotRate=(X=12500.000000,Y=12500.000000)
ShakeRotTime=3.500000
ShakeOffsetMag=(Y=1.000000,Z=8.000000)
ShakeOffsetTime=2.500000
BotRefireRate=0.650000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=40.000000
}

View File

@ -1,4 +1,24 @@
class NiceDualDeagleFire extends NiceDualiesFire; class NiceDualDeagleFire extends NiceDualiesFire;
defaultproperties defaultproperties
{ ProjectileSpeed=23500.000000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 ShellEjectClass=Class'ROEffects.KFShellEjectHandCannon' FireSoundRef="KF_HandcannonSnd.50AE_Fire" StereoFireSoundRef="KF_HandcannonSnd.50AE_FireST" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeDeagle' DamageMin=120 DamageMax=120 Momentum=20000.000000 FireRate=0.250000 AmmoClass=Class'NicePack.NiceDualDeagleAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 {
} ProjectileSpeed=23500.000000
maxVerticalRecoilAngle=600
maxHorizontalRecoilAngle=300
ShellEjectClass=Class'ROEffects.KFShellEjectHandCannon'
FireSoundRef="KF_HandcannonSnd.50AE_Fire"
StereoFireSoundRef="KF_HandcannonSnd.50AE_FireST"
NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire"
DamageType=Class'NicePack.NiceDamTypeDeagle'
DamageMin=120
DamageMax=120
Momentum=20000.000000
FireRate=0.250000
AmmoClass=Class'NicePack.NiceDualDeagleAmmo'
ShakeRotMag=(Z=400.000000)
ShakeRotRate=(X=12500.000000,Y=12500.000000)
ShakeRotTime=3.500000
ShakeOffsetMag=(Y=1.000000,Z=8.000000)
ShakeOffsetTime=2.500000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=40.000000
}

View File

@ -1,6 +1,20 @@
class NiceDamTypeMK23Pistol extends NiceDamageTypeVetSharpshooter class NiceDamTypeMK23Pistol extends NiceDamageTypeVetSharpshooter
abstract; abstract;
defaultproperties defaultproperties
{ decapType=DB_DROP badDecapMod=0.900000 {
flinchMultiplier=2 HeadShotDamageMult=1.5//2.250000 WeaponClass=Class'NicePack.NiceMK23Pistol' DeathString="%k killed %o with MK23." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=1850.000000 KDeathVel=150.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.800000 decapType=DB_DROP
} badDecapMod=0.900000
flinchMultiplier=2
HeadShotDamageMult=2.0//2.250000
WeaponClass=Class'NicePack.NiceMK23Pistol'
DeathString="%k killed %o with MK23."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
bBulletHit=True
FlashFog=(X=600.000000)
KDamageImpulse=1850.000000
KDeathVel=150.000000
KDeathUpKick=5.000000
VehicleDamageScaling=0.800000
}

View File

@ -1,4 +1,25 @@
class NiceDualMK23Fire extends NiceDualiesFire; class NiceDualMK23Fire extends NiceDualiesFire;
defaultproperties defaultproperties
{ ProjectileSpeed=13000.000000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 ShellEjectClass=Class'KFMod.MK23Shell' FireSoundRef="KF_MK23Snd.MK23_Fire_M" StereoFireSoundRef="KF_MK23Snd.MK23_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMK23Pistol' DamageMin=55 DamageMax=55 Momentum=18000.000000 NoAmmoSound=None FireRate=0.175000 AmmoClass=Class'NicePack.NiceDualMK23Ammo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' aimerror=40.000000 {
} ProjectileSpeed=13000.000000
maxVerticalRecoilAngle=400
maxHorizontalRecoilAngle=200
ShellEjectClass=Class'KFMod.MK23Shell'
FireSoundRef="KF_MK23Snd.MK23_Fire_M"
StereoFireSoundRef="KF_MK23Snd.MK23_Fire_S"
NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire"
DamageType=Class'NicePack.NiceDamTypeMK23Pistol'
DamageMin=55
DamageMax=55
Momentum=18000.000000
NoAmmoSound=None
FireRate=0.175000
AmmoClass=Class'NicePack.NiceDualMK23Ammo'
ShakeRotMag=(Z=290.000000)
ShakeRotRate=(X=10080.000000,Y=10080.000000)
ShakeRotTime=3.500000
ShakeOffsetMag=(Y=1.000000,Z=8.000000)
ShakeOffsetTime=2.500000
FlashEmitterClass=Class'KFMod.MuzzleFlashMK'
aimerror=40.000000
}

View File

@ -1,4 +1,25 @@
class NiceMK23Fire extends NiceSingleFire; class NiceMK23Fire extends NiceSingleFire;
defaultproperties defaultproperties
{ ProjectileSpeed=13000.000000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 FireSoundRef="KF_MK23Snd.MK23_Fire_M" StereoFireSoundRef="KF_MK23Snd.MK23_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMK23Pistol' DamageMin=55 DamageMax=55 Momentum=18000.000000 FireLoopAnim= FireEndAnim= FireRate=0.350000 AmmoClass=Class'NicePack.NiceMK23Ammo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' {
} ProjectileSpeed=13000.000000
maxVerticalRecoilAngle=400
maxHorizontalRecoilAngle=200
FireSoundRef="KF_MK23Snd.MK23_Fire_M"
StereoFireSoundRef="KF_MK23Snd.MK23_Fire_S"
NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire"
DamageType=Class'NicePack.NiceDamTypeMK23Pistol'
DamageMin=55
DamageMax=55
Momentum=18000.000000
FireLoopAnim=
FireEndAnim=
FireRate=0.350000
AmmoClass=Class'NicePack.NiceMK23Ammo'
ShakeRotMag=(Z=290.000000)
ShakeRotRate=(X=10080.000000,Y=10080.000000)
ShakeRotTime=3.500000
ShakeOffsetMag=(Y=1.000000,Z=8.000000)
ShakeOffsetTime=2.500000
BotRefireRate=0.650000
FlashEmitterClass=Class'KFMod.MuzzleFlashMK'
}

View File

@ -1,4 +1,13 @@
class NiceDamTypeMagnumPistol extends NiceDamageTypeVetSharpshooter; class NiceDamTypeMagnumPistol extends NiceDamageTypeVetSharpshooter;
defaultproperties defaultproperties
{ flinchMultiplier=2.5 stunMultiplier=6.0 MaxPenetrations=2 PenDmgReduction=0.990000 HeadShotDamageMult=1.1 WeaponClass=Class'NicePack.NiceMagnumPistol' KDamageImpulse=3250.000000 KDeathVel=200.000000 KDeathUpKick=40.000000 {
} flinchMultiplier=2.5
stunMultiplier=6.0
MaxPenetrations=2
PenDmgReduction=0.990000
HeadShotDamageMult=1.35
WeaponClass=Class'NicePack.NiceMagnumPistol'
KDamageImpulse=3250.000000
KDeathVel=200.000000
KDeathUpKick=40.000000
}

View File

@ -1,5 +1,37 @@
class NiceDualMagnum extends NiceDualies; class NiceDualMagnum extends NiceDualies;
defaultproperties defaultproperties
{ SingleClass=Class'NicePack.NiceMagnumPistol' leftEject=0.660000 rightEject=0.115000 leftInsert=0.800000 rightInsert=0.375000 MagCapacity=12 {
Weight=2.000000 ReloadRate=2.23125//3.570000 ReloadAnimRate=2//1.250000 WeaponReloadAnim="Reload_DualRevolver" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_DualRevolver' bIsTier2Weapon=True MeshRef="KF_Wep_DualRevolver.DualRevolver_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SelectSoundRef="KF_RevolverSnd.WEP_Revolver_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.DualRevolver_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.DualRevolver" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualMagnumFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual 44 Magnum Pistols. Make my day!" DisplayFOV=60.000000 Priority=120 GroupOffset=8 PickupClass=Class'NicePack.NiceDualMagnumPickup' PlayerViewOffset=(X=25.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceDualMagnumAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual 44 Magnums" DrawScale=1.000000 SingleClass=Class'NicePack.NiceMagnumPistol'
} leftEject=0.660000
rightEject=0.115000
leftInsert=0.800000
rightInsert=0.375000
MagCapacity=12
Weight=2.000000
ReloadRate=2.23125//3.570000
ReloadAnimRate=2//1.250000
WeaponReloadAnim="Reload_DualRevolver"
StandardDisplayFOV=60.000000
TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_DualRevolver'
bIsTier2Weapon=True
MeshRef="KF_Wep_DualRevolver.DualRevolver_Trip"
SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb"
SelectSoundRef="KF_RevolverSnd.WEP_Revolver_Foley_Select"
HudImageRef="KillingFloor2HUD.WeaponSelect.DualRevolver_unselected"
SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.DualRevolver"
ZoomedDisplayFOV=50.000000
FireModeClass(0)=Class'NicePack.NiceDualMagnumFire'
AIRating=0.450000
CurrentRating=0.450000
Description="Dual 44 Magnum Pistols. Make my day!"
DisplayFOV=60.000000
Priority=120
GroupOffset=8
PickupClass=Class'NicePack.NiceDualMagnumPickup'
PlayerViewOffset=(X=25.000000)
BobDamping=6.000000
AttachmentClass=Class'NicePack.NiceDualMagnumAttachment'
IconCoords=(X1=250,Y1=110,X2=330,Y2=145)
ItemName="Dual 44 Magnums"
DrawScale=1.000000
}

View File

@ -1,4 +1,29 @@
class NiceMagnumFire extends NiceSingleFire; class NiceMagnumFire extends NiceSingleFire;
defaultproperties defaultproperties
{ ProjectileSpeed=22500.000000 FireAimedAnim="Iron_Fire" maxHorizontalRecoilAngle=150 ShellEjectClass=None FireSoundRef="KF_RevolverSnd.Revolver_Fire_M" StereoFireSoundRef="KF_RevolverSnd.Revolver_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMagnumPistol' DamageMin=61 DamageMax=61 Momentum=15000.000000 bPawnRapidFireAnim=False FireLoopAnim= FireEndAnim= FireAnimRate=1.000000 FireRate=0.250000//0.3 AmmoClass=Class'NicePack.NiceMagnumAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 {
} ProjectileSpeed=22500.000000
FireAimedAnim="Iron_Fire"
maxHorizontalRecoilAngle=150
ShellEjectClass=None
FireSoundRef="KF_RevolverSnd.Revolver_Fire_M"
StereoFireSoundRef="KF_RevolverSnd.Revolver_Fire_S"
NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire"
DamageType=Class'NicePack.NiceDamTypeMagnumPistol'
DamageMin=61
DamageMax=61
Momentum=15000.000000
bPawnRapidFireAnim=False
FireLoopAnim=
FireEndAnim=
FireAnimRate=1.000000
FireRate=0.250000//0.3
AmmoClass=Class'NicePack.NiceMagnumAmmo'
ShakeRotMag=(Z=400.000000)
ShakeRotRate=(X=12500.000000,Y=12500.000000)
ShakeRotTime=3.500000
ShakeOffsetMag=(Y=1.000000,Z=8.000000)
ShakeOffsetTime=2.500000
BotRefireRate=0.650000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=40.000000
}

View File

@ -1,52 +1,103 @@
class NiceBoomStick extends NiceWeapon; class NiceBoomStick extends NiceWeapon;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx #EXEC OBJ LOAD FILE=KillingFloorHUD.utx
var float glueTiming; var float glueTiming;
var float firstShellTiming, secondShellTiming, jumpTiming; var float firstShellTiming, secondShellTiming, jumpTiming;
var const string firstShellStr, secondShellStr, jumpStr; var const string firstShellStr, secondShellStr, jumpStr;
simulated function PostBeginPlay(){ simulated function PostBeginPlay(){
local EventRecord record; local EventRecord record;
local AutoReloadAnimDesc reloadDesc; local AutoReloadAnimDesc reloadDesc;
// Setup animation timings // Setup animation timings
autoReloadsDescriptions.Length = 0; autoReloadsDescriptions.Length = 0;
reloadDesc.canInterruptFrame = 0.056; reloadDesc.canInterruptFrame = 0.056;
reloadDesc.trashStartFrame = secondShellTiming; reloadDesc.trashStartFrame = secondShellTiming;
reloadDesc.resumeFrame = 0.056; reloadDesc.resumeFrame = 0.056;
reloadDesc.speedFrame = 0.056; reloadDesc.speedFrame = 0.056;
// Setup all possible fire animations // Setup all possible fire animations
reloadDesc.animName = 'Fire_Both'; reloadDesc.animName = 'Fire_Both';
autoReloadsDescriptions[0] = reloadDesc; autoReloadsDescriptions[0] = reloadDesc;
reloadDesc.animName = 'Fire_Both_Iron'; reloadDesc.animName = 'Fire_Both_Iron';
autoReloadsDescriptions[1] = reloadDesc; autoReloadsDescriptions[1] = reloadDesc;
reloadDesc.animName = 'Fire_Last'; reloadDesc.animName = 'Fire_Last';
autoReloadsDescriptions[2] = reloadDesc; autoReloadsDescriptions[2] = reloadDesc;
reloadDesc.animName = 'Fire_Last_Iron'; reloadDesc.animName = 'Fire_Last_Iron';
autoReloadsDescriptions[3] = reloadDesc; autoReloadsDescriptions[3] = reloadDesc;
// Setup reload events // Setup reload events
record.eventName = jumpStr; record.eventName = jumpStr;
record.eventFrame = jumpTiming; record.eventFrame = jumpTiming;
relEvents[relEvents.Length] = record; relEvents[relEvents.Length] = record;
record.eventName = firstShellStr; record.eventName = firstShellStr;
record.eventFrame = firstShellTiming; record.eventFrame = firstShellTiming;
relEvents[relEvents.Length] = record; relEvents[relEvents.Length] = record;
record.eventName = secondShellStr; record.eventName = secondShellStr;
record.eventFrame = secondShellTiming; record.eventFrame = secondShellTiming;
relEvents[relEvents.Length] = record; relEvents[relEvents.Length] = record;
super.PostBeginPlay(); super.PostBeginPlay();
} }
simulated function ReloadEvent(string eventName){ simulated function ReloadEvent(string eventName){
if(eventName ~= jumpStr && GetMagazineAmmo() > 0) SetAnimFrame(glueTiming); if(eventName ~= jumpStr && GetMagazineAmmo() > 0)
if(eventName ~= firstShellStr) MagAmmoRemainingClient = Min(1, AmmoAmount(0)); SetAnimFrame(glueTiming);
else if(eventName ~= secondShellStr) MagAmmoRemainingClient = Min(2, AmmoAmount(0)); if(eventName ~= firstShellStr)
ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); MagAmmoRemainingClient = Min(1, AmmoAmount(0));
} else if(eventName ~= secondShellStr)
simulated function AddAutoReloadedAmmo(){ MagAmmoRemainingClient = Min(2, AmmoAmount(0));
MagAmmoRemainingClient = Min(2, AmmoAmount(0)); ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds);
ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds); }
} simulated function AddAutoReloadedAmmo(){
simulated function bool AltFireCanForceInterruptReload(){ MagAmmoRemainingClient = Min(2, AmmoAmount(0));
return (GetMagazineAmmo() > 0); ServerSetMagSize(MagAmmoRemainingClient, bRoundInChamber, Level.TimeSeconds);
} }
defaultproperties simulated function bool AltFireCanForceInterruptReload(){
{ glueTiming=0.633330 firstShellTiming=0.555550 secondShellTiming=0.733330 jumpTiming=0.388880 firstShellStr="firstShell" secondShellStr="secondShellStr" jumpStr="jumpStr" bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_AUTO ForceZoomOutOnFireTime=0.010000 ForceZoomOutOnAltFireTime=0.010000 MagCapacity=2 return (GetMagazineAmmo() > 0);
Weight=6.000000 ReloadRate=2.250000 ReloadAnim="Reload" ReloadAnimRate=1.100000 bHoldToReload=True WeaponReloadAnim="Reload_HuntingShotgun" bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Hunting_Shotgun' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.BoomStick_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Shotguns.boomstick_cmb" SelectSoundRef="KF_DoubleSGSnd.2Barrel_Select" HudImageRef="KillingFloorHUD.WeaponSelect.BoomStic_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.BoomStick" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceBoomStickAltFire' FireModeClass(1)=Class'NicePack.NiceBoomStickFire' PutDownAnim="PutDown" AIRating=0.900000 CurrentRating=0.900000 bSniping=False Description="A double barreled shotgun used by big game hunters. It fires two slugs simultaneously and can bring down even the largest targets, quickly." DisplayFOV=55.000000 Priority=160 InventoryGroup=4 GroupOffset=2 PickupClass=Class'NicePack.NiceBoomStickPickup' PlayerViewOffset=(X=8.000000,Y=14.000000,Z=-8.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceBoomStickAttachment' ItemName="Hunting Shotgun" bUseDynamicLights=True TransientSoundVolume=1.000000 }
defaultproperties
{
glueTiming=0.633330
firstShellTiming=0.555550
secondShellTiming=0.733330
jumpTiming=0.388880
firstShellStr="firstShell"
secondShellStr="secondShellStr"
jumpStr="jumpStr"
bChangeClipIcon=True
hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet'
reloadType=RTYPE_AUTO
ForceZoomOutOnFireTime=0.010000
ForceZoomOutOnAltFireTime=0.010000
MagCapacity=2
Weight=5.000000
ReloadRate=2.250000
ReloadAnim="Reload"
ReloadAnimRate=1.100000
bHoldToReload=True
WeaponReloadAnim="Reload_HuntingShotgun"
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=55.000000
TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Hunting_Shotgun'
bIsTier2Weapon=True
MeshRef="KF_Weapons_Trip.BoomStick_Trip"
SkinRefs(0)="KF_Weapons_Trip_T.Shotguns.boomstick_cmb"
SelectSoundRef="KF_DoubleSGSnd.2Barrel_Select"
HudImageRef="KillingFloorHUD.WeaponSelect.BoomStic_unselected"
SelectedHudImageRef="KillingFloorHUD.WeaponSelect.BoomStick"
PlayerIronSightFOV=70.000000
ZoomedDisplayFOV=40.000000
FireModeClass(0)=Class'NicePack.NiceBoomStickAltFire'
FireModeClass(1)=Class'NicePack.NiceBoomStickFire'
PutDownAnim="PutDown"
AIRating=0.900000
CurrentRating=0.900000
bSniping=False
Description="A double barreled shotgun used by big game hunters. It fires two slugs simultaneously and can bring down even the largest targets, quickly."
DisplayFOV=55.000000
Priority=160
InventoryGroup=4
GroupOffset=2
PickupClass=Class'NicePack.NiceBoomStickPickup'
PlayerViewOffset=(X=8.000000,Y=14.000000,Z=-8.000000)
BobDamping=6.000000
AttachmentClass=Class'NicePack.NiceBoomStickAttachment'
ItemName="Hunting Shotgun"
bUseDynamicLights=True
TransientSoundVolume=1.000000
} }

View File

@ -1,5 +1,23 @@
class NiceBoomStickPickup extends NiceWeaponPickup; class NiceBoomStickPickup extends NiceWeaponPickup;
var int SingleShotCount; var int SingleShotCount;
defaultproperties defaultproperties
{ cost=500 BuyClipSize=2 PowerValue=90 SpeedValue=30 RangeValue=12 Description="A double barreled shotgun used by big game hunters." ItemName="Hunting Shotgun" ItemShortName="Hunting Shotgun" AmmoItemName="12-gauge Hunting shells" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceBoomStick' PickupMessage="You got the Hunting Shotgun" PickupSound=Sound'KF_DoubleSGSnd.2Barrel_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Shotgun.boomstick_pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 {
cost=500
BuyClipSize=2
PowerValue=90
SpeedValue=30
RangeValue=12
Description="A double barreled shotgun used by big game hunters."
ItemName="Hunting Shotgun"
ItemShortName="Hunting Shotgun"
AmmoItemName="12-gauge Hunting shells"
CorrespondingPerkIndex=1
EquipmentCategoryID=3
InventoryType=Class'NicePack.NiceBoomStick'
PickupMessage="You got the Hunting Shotgun"
PickupSound=Sound'KF_DoubleSGSnd.2Barrel_Pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'KF_pickups_Trip.Shotgun.boomstick_pickup'
CollisionRadius=35.000000
CollisionHeight=5.000000
} }

View File

@ -1,10 +1,48 @@
class NiceSpas extends NiceWeapon; class NiceSpas extends NiceWeapon;
simulated function fillSubReloadStages(){ simulated function fillSubReloadStages(){
// Loading 8 shells during 173 frames tops, with first shell loaded at frame 17, with 18 frames between load moments // Loading 8 shells during 173 frames tops, with first shell loaded at frame 17, with 18 frames between load moments
generateReloadStages(8, 173, 17, 18); generateReloadStages(8, 173, 17, 18);
} }
defaultproperties defaultproperties
{ bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_SINGLE ForceZoomOutOnFireTime=0.010000 MagCapacity=5 ReloadRate=0.666667 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'ScrnWeaponPack_T.Spas.Spas_Unselected' MeshRef="ScrnWeaponPack_A.spas12_1st" SkinRefs(0)="ScrnWeaponPack_T.SPAS.shotgun_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.SPAS.Spas_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.SPAS.Spas_Selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceSpasFire' FireModeClass(1)=Class'NicePack.NiceSpasAltFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 Description="The SPAS12 is a dual-mode shotgun, that can also be used for firing slugs." DisplayFOV=65.000000 Priority=135 InventoryGroup=3 GroupOffset=2 PickupClass=Class'NicePack.NiceSpasPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceSpasAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="SPAS-12" TransientSoundVolume=1.000000 {
bChangeClipIcon=True
hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet'
reloadType=RTYPE_SINGLE
ForceZoomOutOnFireTime=0.010000
MagCapacity=5
ReloadRate=0.666667
ReloadAnim="Reload"
ReloadAnimRate=1.000000
bHoldToReload=True
Weight=6.000000
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=65.000000
TraderInfoTexture=Texture'ScrnWeaponPack_T.Spas.Spas_Unselected'
MeshRef="ScrnWeaponPack_A.spas12_1st"
SkinRefs(0)="ScrnWeaponPack_T.SPAS.shotgun_cmb"
SelectSoundRef="KF_PumpSGSnd.SG_Select"
HudImageRef="ScrnWeaponPack_T.SPAS.Spas_Unselected"
SelectedHudImageRef="ScrnWeaponPack_T.SPAS.Spas_Selected"
PlayerIronSightFOV=70.000000
ZoomedDisplayFOV=40.000000
FireModeClass(0)=Class'NicePack.NiceSpasFire'
FireModeClass(1)=Class'NicePack.NiceSpasAltFire'
PutDownAnim="PutDown"
AIRating=0.600000
CurrentRating=0.600000
Description="The SPAS12 is a dual-mode shotgun, that can also be used for firing slugs."
DisplayFOV=65.000000
Priority=135
InventoryGroup=3
GroupOffset=2
PickupClass=Class'NicePack.NiceSpasPickup'
PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000)
BobDamping=7.000000
AttachmentClass=Class'NicePack.NiceSpasAttachment'
IconCoords=(X1=169,Y1=172,X2=245,Y2=208)
ItemName="SPAS-12"
TransientSoundVolume=1.000000
} }

View File

@ -1,18 +1,24 @@
class MeanPoisonInventory extends Inventory; class MeanPoisonInventory extends Inventory;
var float poisonStartTime, maxSpeedPenaltyTime, poisonSpeedDown; var float poisonStartTime, maxSpeedPenaltyTime, poisonSpeedDown;
simulated function Tick(float DeltaTime) { simulated function Tick(float DeltaTime) {
if(Level.TimeSeconds - poisonStartTime > maxSpeedPenaltyTime) Destroy(); if(Level.TimeSeconds - poisonStartTime > maxSpeedPenaltyTime)
} Destroy();
simulated function float GetMovementModifierFor(Pawn InPawn){ }
local float actualSpeedDown; simulated function float GetMovementModifierFor(Pawn InPawn){
local class<NiceVeterancyTypes> niceVet; local float actualSpeedDown;
local class<NiceVeterancyTypes> niceVet;
niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(InPawn.PlayerReplicationInfo);
if(niceVet != none){ actualSpeedDown = 1.0 - (1.0 - poisonSpeedDown) * niceVet.static.SlowingModifier(KFPlayerReplicationInfo(InPawn.PlayerReplicationInfo)); actualSpeedDown = FMax(0.0, FMin(1.0, actualSpeedDown)); return actualSpeedDown; niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(InPawn.PlayerReplicationInfo);
} if(niceVet != none){
// If something went wrong - ignore slowdown altogether actualSpeedDown = 1.0 - (1.0 - poisonSpeedDown) * niceVet.static.SlowingModifier(KFPlayerReplicationInfo(InPawn.PlayerReplicationInfo));
return 1.0; actualSpeedDown = FMax(0.0, FMin(1.0, actualSpeedDown));
} return actualSpeedDown;
defaultproperties }
{ maxSpeedPenaltyTime=5.000000 poisonSpeedDown=0.600000 // If something went wrong - ignore slowdown altogether
} return 1.0;
}
defaultproperties
{
maxSpeedPenaltyTime=5.000000
poisonSpeedDown=0.800000
}

View File

@ -668,36 +668,28 @@ function ModDamage( out int damage,
float headshotLevel, float headshotLevel,
KFPlayerReplicationInfo KFPRI, KFPlayerReplicationInfo KFPRI,
optional float lockonTime){ optional float lockonTime){
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
local NiceMonster niceZed; local bool hasGiantSlayer;
local bool hasThinOut; local int bonusDamageStacks;
local bool isRelated; if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return;
local float maxDistance; // Add perked damage
if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return; damage = KFPRI.ClientVeteranSkill.Static.AddDamage( KFPRI, self,
// Add perked damage KFPawn(instigatedBy),
damage = KFPRI.ClientVeteranSkill.Static.AddDamage( KFPRI, self, damage, damageType);
KFPawn(instigatedBy), // Skill bonuses
damage, damageType); if(instigatedBy == none)
// Skill bonuses return;
if(nicePlayer == none || instigatedBy == none) nicePlayer = NicePlayerController(instigatedBy.controller);
return; if(nicePlayer == none)
hasThinOut = class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, return;
class'NiceSkillCommandoThinOut'); hasGiantSlayer = class'NiceVeterancyTypes'.static.hasSkill(nicePlayer,
if(!hasThinOut) class'NiceSkillCommandoGiantSlayer');
return; if(!hasGiantSlayer)
maxDistance = class'NiceSkillCommandoThinOut'.default.maxDistance; return;
foreach instigatedBy.RadiusActors(class'NiceMonster', niceZed, maxDistance){ bonusDamageStacks =
if(!nicePlayer.CanSee(niceZed)) continue; int(health / class'NiceSkillCommandoGiantSlayer'.default.healthStep);
if(niceZed == none || niceZed == self) continue; damage *= 1.0f + bonusDamageStacks *
if(niceZed.health <= 0) continue; class'NiceSkillCommandoGiantSlayer'.default.bonusDamageMult;
if(default.health < 500) continue;
isRelated = ClassIsChildOf(niceZed.class, class)
|| ClassIsChildOf(class, niceZed.class);
if(niceZed.default.health >= 1000 || isRelated){
damage *= class'NiceSkillCommandoThinOut'.default.damageMult;
break;
}
}
} }
function ModRegularDamage( out int damage, function ModRegularDamage( out int damage,
Pawn instigatedBy, Pawn instigatedBy,
@ -945,8 +937,10 @@ function DealDecapDamage( int damage,
damageType, headshotLevel, KFPRI, lockonTime); damageType, headshotLevel, KFPRI, lockonTime);
} }
else else
decapDmg = HealthMax * GetDecapDamageModifier( damageType, nicePlayer, {
KFPRI); decapDmg = Ceil(HealthMax * GetDecapDamageModifier( damageType,
nicePlayer, KFPRI));
}
DealBodyDamage( decapDmg, instigatedBy, hitLocation, momentum, damageType, DealBodyDamage( decapDmg, instigatedBy, hitLocation, momentum, damageType,
headshotLevel, KFPRI, lockonTime); headshotLevel, KFPRI, lockonTime);
if(class'NiceVeterancyTypes'.static. if(class'NiceVeterancyTypes'.static.
@ -1057,7 +1051,9 @@ function DealBodyDamage(int damage,
// Reduce health // Reduce health
Health -= actualDamage; Health -= actualDamage;
if(IsFinisher(damage, damageType, nicePlayer)) if(IsFinisher(damage, damageType, nicePlayer))
{
Health -= actualDamage; Health -= actualDamage;
}
// Update location // Update location
if(hitLocation == vect(0,0,0)) if(hitLocation == vect(0,0,0))
hitLocation = Location; hitLocation = Location;
@ -1771,7 +1767,7 @@ simulated function RemoveHead(){
// No more raspy breathin'...cuz he has no throat or mouth :S // No more raspy breathin'...cuz he has no throat or mouth :S
AmbientSound = MiscSound; AmbientSound = MiscSound;
if(Health > 0) if(Health > 0)
BleedOutTime = Level.TimeSeconds + BleedOutDuration; BleedOutTime = Level.TimeSeconds + BleedOutDuration;
if(MeleeAnims[1] == 'Claw3') if(MeleeAnims[1] == 'Claw3')
MeleeAnims[1] = 'Claw1'; MeleeAnims[1] = 'Claw1';
if(MeleeAnims[2] == 'Claw3') if(MeleeAnims[2] == 'Claw3')