Fix new line symbol issues

This commit is contained in:
Anton Tarasenko 2020-04-19 00:44:48 +07:00
commit d66d86b2b1
846 changed files with 33896 additions and 12983 deletions

View file

@ -1,20 +1,25 @@
//==============================================================================
// NicePack / NiceAbilitiesAdapter
//==============================================================================
// Temporary stand-in for future functionality.
// Use this class to catch events from players' abilities.
//==============================================================================
// 'Nice pack' source
// Do whatever the fuck you want with it
// Author: dkanus
// E-mail: dkanus@gmail.com
//==============================================================================
class NiceAbilitiesAdapter extends Object;
var LevelInfo level;
static function AbilityActivated( string abilityID, NicePlayerController relatedPlayer);
static function AbilityAdded( string abilityID, NicePlayerController relatedPlayer);
static function AbilityRemoved( string abilityID, NicePlayerController relatedPlayer);
static function ModAbilityCooldown( string abilityID, NicePlayerController relatedPlayer, out float cooldown);
defaultproperties
{
}
//==============================================================================
// NicePack / NiceAbilitiesAdapter
//==============================================================================
// Temporary stand-in for future functionality.
// Use this class to catch events from players' abilities.
//==============================================================================
// 'Nice pack' source
// Do whatever the fuck you want with it
// Author: dkanus
// E-mail: dkanus@gmail.com
//==============================================================================
class NiceAbilitiesAdapter extends Object;
var LevelInfo level;
static function AbilityActivated( string abilityID,
NicePlayerController relatedPlayer);
static function AbilityAdded( string abilityID,
NicePlayerController relatedPlayer);
static function AbilityRemoved( string abilityID,
NicePlayerController relatedPlayer);
static function ModAbilityCooldown( string abilityID,
NicePlayerController relatedPlayer,
out float cooldown);
defaultproperties
{
}

View file

@ -1,57 +1,79 @@
//==============================================================================
// NicePack / NiceAbilitiesEvents
//==============================================================================
// Temporary stand-in for future functionality.
//==============================================================================
// 'Nice pack' source
// Do whatever the fuck you want with it
// Author: dkanus
// E-mail: dkanus@gmail.com
//==============================================================================
class NiceAbilitiesEvents extends Object;
var array< class<NiceAbilitiesAdapter> > adapters;
// If adapter was already added also returns 'false'.
static function bool AddAdapter(class<NiceAbilitiesAdapter> newAdapter, optional LevelInfo level){
local int i;
if(newAdapter == none) return false;
for(i = 0;i < default.adapters.length;i ++) if(default.adapters[i] == newAdapter) return false;
newAdapter.default.level = level;
default.adapters[default.adapters.length] = newAdapter;
return true;
}
// If adapter wasn't even present also returns 'false'.
static function bool RemoveAdapter(class<NiceAbilitiesAdapter> adapter){
local int i;
if(adapter == none) return false;
for(i = 0;i < default.adapters.length;i ++){ if(default.adapters[i] == adapter){ default.adapters.Remove(i, 1); return true; }
}
return false;
}
static function CallAbilityActivated
( string abilityID, NicePlayerController relatedPlayer
){
local int i;
for(i = 0;i < default.adapters.length;i ++) default.adapters[i].static.AbilityActivated(abilityID, relatedPlayer);
}
static function CallAbilityAdded
( string abilityID, NicePlayerController relatedPlayer
){
local int i;
for(i = 0;i < default.adapters.length;i ++) default.adapters[i].static.AbilityAdded(abilityID, relatedPlayer);
}
static function CallAbilityRemoved
( string abilityID, NicePlayerController relatedPlayer
){
local int i;
for(i = 0;i < default.adapters.length;i ++) default.adapters[i].static.AbilityRemoved(abilityID, relatedPlayer);
}
static function CallModAbilityCooldown
( string abilityID, NicePlayerController relatedPlayer, out float cooldown
){
local int i;
for(i = 0;i < default.adapters.length;i ++){ default.adapters[i].static.ModAbilityCooldown( abilityID, relatedPlayer, cooldown);
}
}
defaultproperties
{
}
//==============================================================================
// NicePack / NiceAbilitiesEvents
//==============================================================================
// Temporary stand-in for future functionality.
//==============================================================================
// 'Nice pack' source
// Do whatever the fuck you want with it
// Author: dkanus
// E-mail: dkanus@gmail.com
//==============================================================================
class NiceAbilitiesEvents extends Object;
var array< class<NiceAbilitiesAdapter> > adapters;
// If adapter was already added also returns 'false'.
static function bool AddAdapter(class<NiceAbilitiesAdapter> newAdapter,
optional LevelInfo level){
local int i;
if(newAdapter == none) return false;
for(i = 0;i < default.adapters.length;i ++)
if(default.adapters[i] == newAdapter)
return false;
newAdapter.default.level = level;
default.adapters[default.adapters.length] = newAdapter;
return true;
}
// If adapter wasn't even present also returns 'false'.
static function bool RemoveAdapter(class<NiceAbilitiesAdapter> adapter){
local int i;
if(adapter == none) return false;
for(i = 0;i < default.adapters.length;i ++){
if(default.adapters[i] == adapter){
default.adapters.Remove(i, 1);
return true;
}
}
return false;
}
static function CallAbilityActivated
(
string abilityID,
NicePlayerController relatedPlayer
){
local int i;
for(i = 0;i < default.adapters.length;i ++)
default.adapters[i].static.AbilityActivated(abilityID, relatedPlayer);
}
static function CallAbilityAdded
(
string abilityID,
NicePlayerController relatedPlayer
){
local int i;
for(i = 0;i < default.adapters.length;i ++)
default.adapters[i].static.AbilityAdded(abilityID, relatedPlayer);
}
static function CallAbilityRemoved
(
string abilityID,
NicePlayerController relatedPlayer
){
local int i;
for(i = 0;i < default.adapters.length;i ++)
default.adapters[i].static.AbilityRemoved(abilityID, relatedPlayer);
}
static function CallModAbilityCooldown
(
string abilityID,
NicePlayerController relatedPlayer,
out float cooldown
){
local int i;
for(i = 0;i < default.adapters.length;i ++){
default.adapters[i].static.ModAbilityCooldown( abilityID,
relatedPlayer,
cooldown);
}
}
defaultproperties
{
}

View file

@ -1,137 +1,169 @@
//==============================================================================
// NicePack / NiceAbilityManager
//==============================================================================
// Class that manager active abilities, introduced along with a NicePack.
// Can support at most 5 ('maxAbilitiesAmount') different abilities at once.
// NICETODO: refactor later
//==============================================================================
// 'Nice pack' source
// Do whatever the fuck you want with it
// Author: dkanus
// E-mail: dkanus@gmail.com
//==============================================================================
class NiceAbilityManager extends Actor;
var const int maxAbilitiesAmount;
// Defines a list of all possible ability's states
enum EAbilityState{
// Ability is ready to use
ASTATE_READY,
// Ability is being used
ASTATE_ACTIVE,
// Ability is on cooldown
ASTATE_COOLDOWN
};
// Describes all the necessary information about an ability
struct NiceAbilityDescription{
// Ability's ID, supposed to be unique per ability,
// but no checks are enforced yet
var string ID;
// Image to be used as an ability's icon
var Texture icon;
// Default cooldown duration
var float cooldownLength;
// Can ability be canceled once activated?
var bool canBeCancelled;
};
// Complete description of current status of an ability,
// including it's complete description.
struct NiceAbilityStatus{
// Complete description of ability in question
var NiceAbilityDescription description;
// Current cooldown value
var float cooldown;
// Current state of an ability
var EAbilityState myState;
};
var NiceAbilityStatus currentAbilities[5];
var int currentAbilitiesAmount;
// Refers to the player whose abilities we manage
var NicePlayerController relatedPlayer;
var const class<NiceAbilitiesEvents> events;
// Unfortunately this hackk is required to force replication of structure array
var int hackCounter;
replication{
reliable if(Role == ROLE_Authority) currentAbilities, currentAbilitiesAmount, hackCounter;
}
simulated function PostBeginPlay(){
relatedPlayer = NicePlayerController(owner);
}
function AddAbility(NiceAbilityDescription description){
local int i;
local NiceAbilityStatus newRecord;
if(currentAbilitiesAmount >= maxAbilitiesAmount) return;
for(i = 0;i < currentAbilitiesAmount;i ++) if(currentAbilities[i].description.ID ~= description.ID) return;
newRecord.description = description;
newRecord.cooldown = 0.0;
newRecord.myState = ASTATE_READY;
currentAbilities[currentAbilitiesAmount] = newRecord;
currentAbilitiesAmount += 1;
events.static.CallAbilityAdded(description.ID, relatedPlayer);
netUpdateTime = level.timeSeconds - 1;
}
function RemoveAbility(string abilityID){
local int i, j;
local bool wasRemoved;
j = 0;
for(i = 0;i < currentAbilitiesAmount;i ++){ if(currentAbilities[i].description.ID ~= abilityID){ wasRemoved = true; continue; } currentAbilities[j] = currentAbilities[i]; j += 1;
}
currentAbilitiesAmount = j;
if(wasRemoved) events.static.CallAbilityRemoved(abilityID, relatedPlayer);
netUpdateTime = level.timeSeconds - 1;
}
function ClearAbilities(){
currentAbilitiesAmount = 0;
netUpdateTime = level.timeSeconds - 1;
}
// Returns index of the ability with a given name.
// Returns '-1' if such ability doesn't exist.
simulated function int GetAbilityIndex(string abilityID){
local int i;
for(i = 0;i < currentAbilitiesAmount;i ++) if(currentAbilities[i].description.ID ~= abilityID) return i;
return -1;
}
simulated function bool IsAbilityActive(string abilityID){
local int index;
index = GetAbilityIndex(abilityID);
if(index < 0) return false;
return (currentAbilities[index].myState == ASTATE_ACTIVE);
}
// Sets ability to a proper state.
// Does nothing if ability is already in a specified state.
// Setting active ability to a ready state is only allowed
// if ability can be canceled.
// Updates cooldown to full length if new state is 'ASTATE_COOLDOWN'.
function SetAbilityState(int abilityIndex, EAbilityState newState){
local float cooldown;
local EAbilityState currentState;
if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return;
currentState = currentAbilities[abilityIndex].myState;
if(currentState == newState) return;
if( currentState == ASTATE_ACTIVE && newState == ASTATE_READY && !currentAbilities[abilityIndex].description.canBeCancelled) return;
currentAbilities[abilityIndex].myState = newState;
if(newState == ASTATE_COOLDOWN){ cooldown = currentAbilities[abilityIndex].description.cooldownLength; events.static.CallModAbilityCooldown( currentAbilities[abilityIndex].description.ID, relatedPlayer, cooldown ); currentAbilities[abilityIndex].cooldown = cooldown;
}
hackCounter ++;
netUpdateTime = level.timeSeconds - 1;
// Fire off events
if(newState == ASTATE_ACTIVE){ events.static.CallAbilityActivated( currentAbilities[abilityIndex].description.ID, relatedPlayer );
}
}
// Changes ability's cooldown by a given amount.
// If this brings cooldown to zero or below -
// resets current ability to a 'ready' (ASTATE_READY) state.
function AddToCooldown(int abilityIndex, float delta){
if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return;
if(currentAbilities[abilityIndex].myState != ASTATE_COOLDOWN) return;
currentAbilities[abilityIndex].cooldown += delta;
if(currentAbilities[abilityIndex].cooldown <= 0) SetAbilityState(abilityIndex, ASTATE_READY);
hackCounter ++;
}
function Tick(float deltaTime){
local int i;
if(Role != Role_AUTHORITY) return;
for(i = 0;i < currentAbilitiesAmount;i ++) AddToCooldown(i, -deltaTime);
}
defaultproperties
{ maxAbilitiesAmount=5 Events=Class'NicePack.NiceAbilitiesEvents' DrawType=DT_None
}
//==============================================================================
// NicePack / NiceAbilityManager
//==============================================================================
// Class that manager active abilities, introduced along with a NicePack.
// Can support at most 5 ('maxAbilitiesAmount') different abilities at once.
// NICETODO: refactor later
//==============================================================================
// 'Nice pack' source
// Do whatever the fuck you want with it
// Author: dkanus
// E-mail: dkanus@gmail.com
//==============================================================================
class NiceAbilityManager extends Actor;
var const int maxAbilitiesAmount;
// Defines a list of all possible ability's states
enum EAbilityState{
// Ability is ready to use
ASTATE_READY,
// Ability is being used
ASTATE_ACTIVE,
// Ability is on cooldown
ASTATE_COOLDOWN
};
// Describes all the necessary information about an ability
struct NiceAbilityDescription{
// Ability's ID, supposed to be unique per ability,
// but no checks are enforced yet
var string ID;
// Image to be used as an ability's icon
var Texture icon;
// Default cooldown duration
var float cooldownLength;
// Can ability be canceled once activated?
var bool canBeCancelled;
};
// Complete description of current status of an ability,
// including it's complete description.
struct NiceAbilityStatus{
// Complete description of ability in question
var NiceAbilityDescription description;
// Current cooldown value
var float cooldown;
// Current state of an ability
var EAbilityState myState;
};
var NiceAbilityStatus currentAbilities[5];
var int currentAbilitiesAmount;
// Refers to the player whose abilities we manage
var NicePlayerController relatedPlayer;
var const class<NiceAbilitiesEvents> events;
// Unfortunately this hackk is required to force replication of structure array
var int hackCounter;
replication{
reliable if(Role == ROLE_Authority)
currentAbilities, currentAbilitiesAmount, hackCounter;
}
simulated function PostBeginPlay(){
relatedPlayer = NicePlayerController(owner);
}
function AddAbility(NiceAbilityDescription description){
local int i;
local NiceAbilityStatus newRecord;
if(currentAbilitiesAmount >= maxAbilitiesAmount) return;
for(i = 0;i < currentAbilitiesAmount;i ++)
if(currentAbilities[i].description.ID ~= description.ID)
return;
newRecord.description = description;
newRecord.cooldown = 0.0;
newRecord.myState = ASTATE_READY;
currentAbilities[currentAbilitiesAmount] = newRecord;
currentAbilitiesAmount += 1;
events.static.CallAbilityAdded(description.ID, relatedPlayer);
netUpdateTime = level.timeSeconds - 1;
}
function RemoveAbility(string abilityID){
local int i, j;
local bool wasRemoved;
j = 0;
for(i = 0;i < currentAbilitiesAmount;i ++){
if(currentAbilities[i].description.ID ~= abilityID){
wasRemoved = true;
continue;
}
currentAbilities[j] = currentAbilities[i];
j += 1;
}
currentAbilitiesAmount = j;
if(wasRemoved)
events.static.CallAbilityRemoved(abilityID, relatedPlayer);
netUpdateTime = level.timeSeconds - 1;
}
function ClearAbilities(){
currentAbilitiesAmount = 0;
netUpdateTime = level.timeSeconds - 1;
}
// Returns index of the ability with a given name.
// Returns '-1' if such ability doesn't exist.
simulated function int GetAbilityIndex(string abilityID){
local int i;
for(i = 0;i < currentAbilitiesAmount;i ++)
if(currentAbilities[i].description.ID ~= abilityID)
return i;
return -1;
}
simulated function bool IsAbilityActive(string abilityID){
local int index;
index = GetAbilityIndex(abilityID);
if(index < 0)
return false;
return (currentAbilities[index].myState == ASTATE_ACTIVE);
}
// Sets ability to a proper state.
// Does nothing if ability is already in a specified state.
// Setting active ability to a ready state is only allowed
// if ability can be canceled.
// Updates cooldown to full length if new state is 'ASTATE_COOLDOWN'.
function SetAbilityState(int abilityIndex, EAbilityState newState){
local float cooldown;
local EAbilityState currentState;
if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return;
currentState = currentAbilities[abilityIndex].myState;
if(currentState == newState)
return;
if( currentState == ASTATE_ACTIVE && newState == ASTATE_READY
&& !currentAbilities[abilityIndex].description.canBeCancelled)
return;
currentAbilities[abilityIndex].myState = newState;
if(newState == ASTATE_COOLDOWN){
cooldown = currentAbilities[abilityIndex].description.cooldownLength;
events.static.CallModAbilityCooldown(
currentAbilities[abilityIndex].description.ID,
relatedPlayer,
cooldown
);
currentAbilities[abilityIndex].cooldown = cooldown;
}
hackCounter ++;
netUpdateTime = level.timeSeconds - 1;
// Fire off events
if(newState == ASTATE_ACTIVE){
events.static.CallAbilityActivated(
currentAbilities[abilityIndex].description.ID,
relatedPlayer
);
}
}
// Changes ability's cooldown by a given amount.
// If this brings cooldown to zero or below -
// resets current ability to a 'ready' (ASTATE_READY) state.
function AddToCooldown(int abilityIndex, float delta){
if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return;
if(currentAbilities[abilityIndex].myState != ASTATE_COOLDOWN) return;
currentAbilities[abilityIndex].cooldown += delta;
if(currentAbilities[abilityIndex].cooldown <= 0)
SetAbilityState(abilityIndex, ASTATE_READY);
hackCounter ++;
}
function Tick(float deltaTime){
local int i;
if(Role != Role_AUTHORITY) return;
for(i = 0;i < currentAbilitiesAmount;i ++)
AddToCooldown(i, -deltaTime);
}
defaultproperties
{
maxAbilitiesAmount=5
Events=Class'NicePack.NiceAbilitiesEvents'
DrawType=DT_None
}

View file

@ -1,8 +1,24 @@
class NiceDamageTypeVetBerserker extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetBerserkerExp', Int(Float(Amount) * class'NicePack'.default.vetZerkDamageExpCost * getScale(HL)));
}
defaultproperties
{ HeadShotDamageMult=1.250000 bIsMeleeDamage=True DeathString="%o was beat down by %k." FemaleSuicide="%o beat herself down." MaleSuicide="%o beat himself down." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=2000.000000 KDeathVel=100.000000 KDeathUpKick=25.000000 VehicleDamageScaling=0.600000
}
class NiceDamageTypeVetBerserker extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none)
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetBerserkerExp', Int(Float(Amount) * class'NicePack'.default.vetZerkDamageExpCost * getScale(HL)));
}
defaultproperties
{
HeadShotDamageMult=1.250000
bIsMeleeDamage=True
DeathString="%o was beat down by %k."
FemaleSuicide="%o beat herself down."
MaleSuicide="%o beat himself down."
bRagdollBullet=True
bBulletHit=True
PawnDamageEmitter=Class'ROEffects.ROBloodPuff'
LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore'
LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall'
FlashFog=(X=600.000000)
KDamageImpulse=2000.000000
KDeathVel=100.000000
KDeathUpKick=25.000000
VehicleDamageScaling=0.600000
}

View file

@ -1,4 +1,5 @@
class NiceVetBerserkerExp extends SRCustomProgressInt;
defaultproperties
{ ProgressName="Berserker exp."
}
class NiceVetBerserkerExp extends SRCustomProgressInt;
defaultproperties
{
ProgressName="Berserker exp."
}

View file

@ -1,5 +1,7 @@
class NiceSkillZerkBrawler extends NiceSkill
abstract;
defaultproperties
{ SkillName="Brawler" SkillEffects="Clots can't grab you."
}
class NiceSkillZerkBrawler extends NiceSkill
abstract;
defaultproperties
{
SkillName="Brawler"
SkillEffects="Clots can't grab you."
}

View file

@ -1,6 +1,9 @@
class NiceSkillZerkCleave extends NiceSkill
abstract;
var float bonusDegrees;
defaultproperties
{ bonusDegrees=0.523599 SkillName="Cleave" SkillEffects="Add 30 degrees to wide attacks with melee weapons."
}
class NiceSkillZerkCleave extends NiceSkill
abstract;
var float bonusDegrees;
defaultproperties
{
bonusDegrees=0.523599
SkillName="Cleave"
SkillEffects="Add 30 degrees to wide attacks with melee weapons."
}

View file

@ -1,6 +1,9 @@
class NiceSkillZerkColossus extends NiceSkill
abstract;
var float timeBonus;
defaultproperties
{ timeBonus=1.000000 SkillName="Colossus" SkillEffects="Invincibility period lasts 1 second longer."
}
class NiceSkillZerkColossus extends NiceSkill
abstract;
var float timeBonus;
defaultproperties
{
timeBonus=1.000000
SkillName="Colossus"
SkillEffects="Invincibility period lasts 1 second longer."
}

View file

@ -1,6 +1,9 @@
class NiceSkillZerkFury extends NiceSkill
abstract;
var float attackSpeedBonus;
defaultproperties
{ attackSpeedBonus=1.500000 SkillName="Fury" SkillEffects="Attack 50% faster during invincibility."
}
class NiceSkillZerkFury extends NiceSkill
abstract;
var float attackSpeedBonus;
defaultproperties
{
attackSpeedBonus=1.500000
SkillName="Fury"
SkillEffects="Attack 50% faster during invincibility."
}

View file

@ -1,6 +1,9 @@
class NiceSkillZerkGunzerker extends NiceSkill
abstract;
var float cooldown;
defaultproperties
{ cooldown=-2.000000 SkillName="Gunzerker" SkillEffects="You're able to activate melee-invincibility with non-melee headshots, but your misses are punished by a 2 second cooldown, during which you cannot activate invincibility."
}
class NiceSkillZerkGunzerker extends NiceSkill
abstract;
var float cooldown;
defaultproperties
{
cooldown=-2.000000
SkillName="Gunzerker"
SkillEffects="You're able to activate melee-invincibility with non-melee headshots, but your misses are punished by a 2 second cooldown, during which you cannot activate invincibility."
}

View file

@ -1,6 +1,9 @@
class NiceSkillZerkUndead extends NiceSkill
abstract;
var int addedSafeMisses;
defaultproperties
{ addedSafeMisses=1 SkillName="Undead" SkillEffects="Get additional safe melee-miss during invincibility period."
}
class NiceSkillZerkUndead extends NiceSkill
abstract;
var int addedSafeMisses;
defaultproperties
{
addedSafeMisses=1
SkillName="Undead"
SkillEffects="Get additional safe melee-miss during invincibility period."
}

View file

@ -1,6 +1,9 @@
class NiceSkillZerkVorpalBlade extends NiceSkill
abstract;
var float damageBonus;
defaultproperties
{ damageBonus=2.000000 SkillName="Vorpal blade" SkillEffects="Your head-shot deals double damage on your first invincibility extension against the zed."
}
class NiceSkillZerkVorpalBlade extends NiceSkill
abstract;
var float damageBonus;
defaultproperties
{
damageBonus=2.000000
SkillName="Vorpal blade"
SkillEffects="Your head-shot deals double damage on your first invincibility extension against the zed."
}

View file

@ -1,5 +1,7 @@
class NiceSkillZerkWhirlwind extends NiceSkill
abstract;
defaultproperties
{ SkillName="Whirlwind" SkillEffects="Move twice as fast during invincibility."
}
class NiceSkillZerkWhirlwind extends NiceSkill
abstract;
defaultproperties
{
SkillName="Whirlwind"
SkillEffects="Move twice as fast during invincibility."
}

View file

@ -1,6 +1,9 @@
class NiceSkillZerkWindCutter extends NiceSkill
abstract;
var float rangeBonus;
defaultproperties
{ rangeBonus=1.500000 SkillName="Wind cutter" SkillEffects="Increase your reach with melee-weapons by 50%."
}
class NiceSkillZerkWindCutter extends NiceSkill
abstract;
var float rangeBonus;
defaultproperties
{
rangeBonus=1.500000
SkillName="Wind cutter"
SkillEffects="Increase your reach with melee-weapons by 50%."
}

View file

@ -1,5 +1,7 @@
class NiceSkillZerkZEDAccelerate extends NiceSkill
abstract;
defaultproperties
{ SkillName="Accelerate" SkillEffects="Move and attack at the same speed during zed-time."
}
class NiceSkillZerkZEDAccelerate extends NiceSkill
abstract;
defaultproperties
{
SkillName="Accelerate"
SkillEffects="Move and attack at the same speed during zed-time."
}

View file

@ -1,5 +1,7 @@
class NiceSkillZerkZEDUnbreakable extends NiceSkill
abstract;
defaultproperties
{ SkillName="Unbreakable" SkillEffects="You resist all damage during zed time."
}
class NiceSkillZerkZEDUnbreakable extends NiceSkill
abstract;
defaultproperties
{
SkillName="Unbreakable"
SkillEffects="You resist all damage during zed time."
}

View file

@ -1,14 +1,16 @@
class NiceDamageTypeVetCommando extends NiceWeaponDamageType
abstract;
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ){
if(Killed.IsA('ZombieStalker')) KFStatsAndAchievements.AddStalkerKill();
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount){
KFStatsAndAchievements.AddBullpupDamage(Amount);
}
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetCommandoExp', Int(Float(Amount) * class'NicePack'.default.vetCommandoDamageExpCost * getScale(HL)));
}
defaultproperties
{
}
class NiceDamageTypeVetCommando extends NiceWeaponDamageType
abstract;
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ){
if(Killed.IsA('ZombieStalker'))
KFStatsAndAchievements.AddStalkerKill();
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount){
KFStatsAndAchievements.AddBullpupDamage(Amount);
}
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none)
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetCommandoExp', Int(Float(Amount) * class'NicePack'.default.vetCommandoDamageExpCost * getScale(HL)));
}
defaultproperties
{
}

View file

@ -1,4 +1,5 @@
class NiceVetCommandoExp extends SRCustomProgressInt;
defaultproperties
{ ProgressName="Commando exp."
}
class NiceVetCommandoExp extends SRCustomProgressInt;
defaultproperties
{
ProgressName="Commando exp."
}

View file

@ -1,6 +1,9 @@
class NiceSkillCommandoExplosivePower extends NiceSkill
abstract;
var float dmgMod;
defaultproperties
{ dmgMod=1.200000 SkillName="Explosive power" SkillEffects="Burst fire deals 20% more damage and has reduced delay between shots."
}
class NiceSkillCommandoExplosivePower extends NiceSkill
abstract;
var float dmgMod;
defaultproperties
{
dmgMod=1.200000
SkillName="Explosive power"
SkillEffects="Burst fire deals 20% more damage and has reduced delay between shots."
}

View file

@ -1,6 +1,9 @@
class NiceSkillCommandoLargerMags extends NiceSkill
abstract;
var float sizeBonus;
defaultproperties
{ sizeBonus=1.500000 SkillName="Larger mags" SkillEffects="50% larger assault rifles' magazines."
}
class NiceSkillCommandoLargerMags extends NiceSkill
abstract;
var float sizeBonus;
defaultproperties
{
sizeBonus=1.500000
SkillName="Larger mags"
SkillEffects="50% larger assault rifles' magazines."
}

View file

@ -1,5 +1,7 @@
class NiceSkillCommandoPerfectExecution extends NiceSkill
abstract;
defaultproperties
{ SkillName="Perfect execution" SkillEffects="Raging scrake or fleshpound activates zed-time."
}
class NiceSkillCommandoPerfectExecution extends NiceSkill
abstract;
defaultproperties
{
SkillName="Perfect execution"
SkillEffects="Raging scrake or fleshpound activates zed-time."
}

View file

@ -1,6 +1,10 @@
class NiceSkillCommandoStrategist extends NiceSkill
abstract;
var float visionRadius; // 1.0 ~ 16m
defaultproperties
{ visionRadius=1.000000 bBroadcast=True SkillName="Strategist" SkillEffects="You and your teammates can see enemies' health and invisible zeds from 16 meters."
}
class NiceSkillCommandoStrategist extends NiceSkill
abstract;
var float visionRadius; // 1.0 ~ 16m
defaultproperties
{
visionRadius=1.000000
bBroadcast=True
SkillName="Strategist"
SkillEffects="You and your teammates can see enemies' health and invisible zeds from 16 meters."
}

View file

@ -1,6 +1,9 @@
class NiceSkillCommandoTactitian extends NiceSkill
abstract;
var int bonusExt;
defaultproperties
{ bonusExt=2 SkillName="Tactician" SkillEffects="Gain two additional zed-time extensions."
}
class NiceSkillCommandoTactitian extends NiceSkill
abstract;
var int bonusExt;
defaultproperties
{
bonusExt=2
SkillName="Tactician"
SkillEffects="Gain two additional zed-time extensions."
}

View file

@ -1,5 +1,7 @@
class NiceSkillCommandoZEDProfessional extends NiceSkill
abstract;
defaultproperties
{ SkillName="Professionalism" SkillEffects="Your reloads aren't slowed down during zed-time."
}
class NiceSkillCommandoZEDProfessional extends NiceSkill
abstract;
defaultproperties
{
SkillName="Professionalism"
SkillEffects="Your reloads aren't slowed down during zed-time."
}

View file

@ -1,5 +1,17 @@
class NiceDamTypeDemoBlunt extends NiceDamageTypeVetDemolitions
abstract;
defaultproperties
{ HeadShotDamageMult=2.000000 bSniperWeapon=True DeathString="%k killed %o (LAW Impact)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=5000.000000 KDeathVel=200.000000 KDeathUpKick=50.000000 VehicleDamageScaling=0.700000
}
class NiceDamTypeDemoBlunt extends NiceDamageTypeVetDemolitions
abstract;
defaultproperties
{
HeadShotDamageMult=2.000000
bSniperWeapon=True
DeathString="%k killed %o (LAW Impact)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
bBulletHit=True
FlashFog=(X=600.000000)
KDamageImpulse=5000.000000
KDeathVel=200.000000
KDeathUpKick=50.000000
VehicleDamageScaling=0.700000
}

View file

@ -1,9 +1,26 @@
class NiceDamTypeDemoExplosion extends NiceDamageTypeVetDemolitions;
static function GetHitEffects(out class<xEmitter> HitEffects[4], int VictimHealth){
HitEffects[0] = class'HitSmoke';
if(VictimHealth <= 0) HitEffects[1] = class'KFHitFlame';
else if(FRand() < 0.8) HitEffects[1] = class'KFHitFlame';
}
defaultproperties
{ stunMultiplier=0.600000 bIsExplosive=True DeathString="%o filled %k's body with shrapnel." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." bLocationalHit=False bThrowRagdoll=True bExtraMomentumZ=True DamageThreshold=1 DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=3000.000000 KDeathVel=300.000000 KDeathUpKick=250.000000 HumanObliterationThreshhold=150
}
class NiceDamTypeDemoExplosion extends NiceDamageTypeVetDemolitions;
static function GetHitEffects(out class<xEmitter> HitEffects[4], int VictimHealth){
HitEffects[0] = class'HitSmoke';
if(VictimHealth <= 0)
HitEffects[1] = class'KFHitFlame';
else if(FRand() < 0.8)
HitEffects[1] = class'KFHitFlame';
}
defaultproperties
{
stunMultiplier=0.600000
bIsExplosive=True
DeathString="%o filled %k's body with shrapnel."
FemaleSuicide="%o blew up."
MaleSuicide="%o blew up."
bLocationalHit=False
bThrowRagdoll=True
bExtraMomentumZ=True
DamageThreshold=1
DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay'
DeathOverlayTime=999.000000
KDamageImpulse=3000.000000
KDeathVel=300.000000
KDeathUpKick=250.000000
HumanObliterationThreshhold=150
}

View file

@ -1,8 +1,9 @@
class NiceDamageTypeVetDemolitions extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetDemolitionsExp', Int(Float(Amount) * class'NicePack'.default.vetDemoDamageExpCost * getScale(HL)));
}
defaultproperties
{
}
class NiceDamageTypeVetDemolitions extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none)
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetDemolitionsExp', Int(Float(Amount) * class'NicePack'.default.vetDemoDamageExpCost * getScale(HL)));
}
defaultproperties
{
}

View file

@ -1,4 +1,5 @@
class NiceVetDemolitionsExp extends SRCustomProgressInt;
defaultproperties
{ ProgressName="Demolitions exp."
}
class NiceVetDemolitionsExp extends SRCustomProgressInt;
defaultproperties
{
ProgressName="Demolitions exp."
}

View file

@ -1,7 +1,11 @@
class NiceSkillDemoAPShot extends NiceSkill
abstract;
var float minCos;
var float damageRatio;
defaultproperties
{ minCos=0.707000 damageRatio=1.000000 SkillName="AP shot" SkillEffects="Deal full blast damage behind the target you've hit."
}
class NiceSkillDemoAPShot extends NiceSkill
abstract;
var float minCos;
var float damageRatio;
defaultproperties
{
minCos=0.707000
damageRatio=1.000000
SkillName="AP shot"
SkillEffects="Deal full blast damage behind the target you've hit."
}

View file

@ -1,6 +1,9 @@
class NiceSkillDemoConcussion extends NiceSkill
abstract;
var float durationMult;
defaultproperties
{ durationMult=2.000000 SkillName="Concussion" SkillEffects="You stun zeds for twice longer time than usual."
}
class NiceSkillDemoConcussion extends NiceSkill
abstract;
var float durationMult;
defaultproperties
{
durationMult=2.000000
SkillName="Concussion"
SkillEffects="You stun zeds for twice longer time than usual."
}

View file

@ -1,5 +1,7 @@
class NiceSkillDemoDirectApproach extends NiceSkill
abstract;
defaultproperties
{ SkillName="Direct approach" SkillEffects="Your explosives will first hit target zed as a blunt before exploding."
}
class NiceSkillDemoDirectApproach extends NiceSkill
abstract;
defaultproperties
{
SkillName="Direct approach"
SkillEffects="Your explosives will first hit target zed as a blunt before exploding."
}

View file

@ -1,28 +1,36 @@
class NiceSkillDemoManiac extends NiceSkill
abstract;
var float reloadBoostTime;
var float reloadSpeedup;
function static SkillSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return;
niceMutator.AddCounter("npDemoManiac", Texture'NicePackT.HudCounter.demo', false, default.class);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillDeSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return;
niceMutator.RemoveCounter("npDemoManiac");
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePlayer == none || counterName != "npDemoManiac") return 0;
nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn == none || nicePawn.maniacTimeout <= 0.0) return 0;
return Ceil(nicePawn.maniacTimeout);
}
defaultproperties
{ reloadBoostTime=5.000000 reloadSpeedup=1.500000 SkillName="Maniac" SkillEffects="Reload 50% faster for 5 seconds after killing something."
}
class NiceSkillDemoManiac extends NiceSkill
abstract;
var float reloadBoostTime;
var float reloadSpeedup;
function static SkillSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
return;
niceMutator.AddCounter("npDemoManiac", Texture'NicePackT.HudCounter.demo', false, default.class);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillDeSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
return;
niceMutator.RemoveCounter("npDemoManiac");
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePlayer == none || counterName != "npDemoManiac")
return 0;
nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn == none || nicePawn.maniacTimeout <= 0.0)
return 0;
return Ceil(nicePawn.maniacTimeout);
}
defaultproperties
{
reloadBoostTime=5.000000
reloadSpeedup=1.500000
SkillName="Maniac"
SkillEffects="Reload 50% faster for 5 seconds after killing something."
}

View file

@ -1,8 +1,13 @@
class NiceSkillDemoOffperk extends NiceSkill
abstract;
var float damageBonus;
var float reloadBonus;
var int weightBound;
defaultproperties
{ damageBonus=1.250000 ReloadBonus=1.250000 weightBound=4 SkillName="Offperk" SkillEffects="Reload light weapons (less than 5 pounds) 25% faster and do 25% more damage with them."
}
class NiceSkillDemoOffperk extends NiceSkill
abstract;
var float damageBonus;
var float reloadBonus;
var int weightBound;
defaultproperties
{
damageBonus=1.250000
ReloadBonus=1.250000
weightBound=4
SkillName="Offperk"
SkillEffects="Reload light weapons (less than 5 pounds) 25% faster and do 25% more damage with them."
}

View file

@ -1,7 +1,12 @@
class NiceSkillDemoOnperk extends NiceSkill
abstract;
var float damageBonus;
var float speedBonus;
defaultproperties
{ damageBonus=1.200000 speedBonus=1.500000 bBroadcast=True SkillName="Onperk" SkillEffects="Deal 20% more damage with your blunts and make your perk weapon's projectiles fly 50% faster."
}
class NiceSkillDemoOnperk extends NiceSkill
abstract;
var float damageBonus;
var float speedBonus;
defaultproperties
{
damageBonus=1.200000
speedBonus=1.500000
bBroadcast=True
SkillName="Onperk"
SkillEffects="Deal 20% more damage with your blunts and make your perk weapon's projectiles fly 50% faster."
}

View file

@ -1,10 +1,16 @@
class NiceSkillDemoReactiveArmor extends NiceSkill
abstract;
var float baseDamage;
var float perNadeDamage;
var float explRadius;
var float explExponent;
var float explMomentum;
defaultproperties
{ BaseDamage=3000.000000 explRadius=1000.000000 explExponent=1.000000 explMomentum=150000.000000 SkillName="Reactive armor" SkillEffects="Once per wave your death will be prevented, while zeds all around you will be blown to bits."
}
class NiceSkillDemoReactiveArmor extends NiceSkill
abstract;
var float baseDamage;
var float perNadeDamage;
var float explRadius;
var float explExponent;
var float explMomentum;
defaultproperties
{
BaseDamage=3000.000000
explRadius=1000.000000
explExponent=1.000000
explMomentum=150000.000000
SkillName="Reactive armor"
SkillEffects="Once per wave your death will be prevented, while zeds all around you will be blown to bits."
}

View file

@ -1,8 +1,13 @@
class NiceSkillDemoVolatile extends NiceSkill
abstract;
var float safeDistanceMult;
var float explRangeMult;
var float falloffMult;
defaultproperties
{ safeDistanceMult=0.500000 explRangeMult=1.000000 falloffMult=0.500000 SkillName="Volatile" SkillEffects="Safe range for your explosives is halved and explosion damage experiences smaller fall off."
}
class NiceSkillDemoVolatile extends NiceSkill
abstract;
var float safeDistanceMult;
var float explRangeMult;
var float falloffMult;
defaultproperties
{
safeDistanceMult=0.500000
explRangeMult=1.000000
falloffMult=0.500000
SkillName="Volatile"
SkillEffects="Safe range for your explosives is halved and explosion damage experiences smaller fall off."
}

View file

@ -1,5 +1,7 @@
class NiceSkillDemoZEDDuckAndCover extends NiceSkill
abstract;
defaultproperties
{ SkillName="Duck and cover" SkillEffects="During zed time you can't deal yourself any damage."
}
class NiceSkillDemoZEDDuckAndCover extends NiceSkill
abstract;
defaultproperties
{
SkillName="Duck and cover"
SkillEffects="During zed time you can't deal yourself any damage."
}

View file

@ -1,6 +1,9 @@
class NiceSkillDemoZEDFullBlast extends NiceSkill
abstract;
var float explRadiusMult;
defaultproperties
{ explRadiusMult=1.350000 SkillName="Full blast" SkillEffects="During zed time your explosions have 35% larger radius and their damage doesn't suffer from a fall off."
}
class NiceSkillDemoZEDFullBlast extends NiceSkill
abstract;
var float explRadiusMult;
defaultproperties
{
explRadiusMult=1.350000
SkillName="Full blast"
SkillEffects="During zed time your explosions have 35% larger radius and their damage doesn't suffer from a fall off."
}

View file

@ -1,10 +1,14 @@
class NiceDamageTypeVetEnforcer extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSupportExp', Int(Float(Amount) * class'NicePack'.default.vetSupportDamageExpCost * getScale(HL)));
}
defaultproperties
{ badDecapMod=1.000000 bIsProjectile=True HeadShotDamageMult=1.500000
class NiceDamageTypeVetEnforcer extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none)
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSupportExp', Int(Float(Amount) * class'NicePack'.default.vetSupportDamageExpCost * getScale(HL)));
}
defaultproperties
{
badDecapMod=1.000000
bIsProjectile=True
HeadShotDamageMult=1.500000
}

View file

@ -1,7 +1,10 @@
class NiceDamageTypeVetEnforcerBullets extends NiceDamageTypeVetEnforcer
abstract;
defaultproperties
{
badDecapMod=0.2500000 goodDecapMod=0.500000 bodyDestructionMult=1.000000 HeadShotDamageMult=1.000000
class NiceDamageTypeVetEnforcerBullets extends NiceDamageTypeVetEnforcer
abstract;
defaultproperties
{
badDecapMod=0.2500000
goodDecapMod=0.500000
bodyDestructionMult=1.000000
HeadShotDamageMult=1.000000
}

View file

@ -1,4 +1,5 @@
class NiceVetSupportExp extends SRCustomProgressInt;
defaultproperties
{ ProgressName="Enforcer exp."
}
class NiceVetSupportExp extends SRCustomProgressInt;
defaultproperties
{
ProgressName="Enforcer exp."
}

View file

@ -1,7 +1,11 @@
class NiceSkillEnforcerBombard extends NiceSkill
abstract;
var float stunMult;
var float spreadMult;
defaultproperties
{ stunMult=3.000000 spreadMult=0.500000 SkillName="Bombard" SkillEffects="Your perked weapons are 3 times as good at stunning."
}
class NiceSkillEnforcerBombard extends NiceSkill
abstract;
var float stunMult;
var float spreadMult;
defaultproperties
{
stunMult=3.000000
spreadMult=0.500000
SkillName="Bombard"
SkillEffects="Your perked weapons are 3 times as good at stunning."
}

View file

@ -1,6 +1,9 @@
class NiceSkillEnforcerMultitasker extends NiceSkill
abstract;
var float reloadSlowDown;
defaultproperties
{ reloadSlowDown=5.000000 SkillName="Multitasker" SkillEffects="Reload holstered weapons at five times as much time."
}
class NiceSkillEnforcerMultitasker extends NiceSkill
abstract;
var float reloadSlowDown;
defaultproperties
{
reloadSlowDown=5.000000
SkillName="Multitasker"
SkillEffects="Reload holstered weapons at five times as much time."
}

View file

@ -1,5 +1,7 @@
class NiceSkillSupportAntiZed extends NiceSkill
abstract;
defaultproperties
{ SkillName="Anti-zed rounds" SkillEffects="When shotgun pellets pass screaming siren, they gain x4 damage boost."
}
class NiceSkillSupportAntiZed extends NiceSkill
abstract;
defaultproperties
{
SkillName="Anti-zed rounds"
SkillEffects="When shotgun pellets pass screaming siren, they gain x4 damage boost."
}

View file

@ -1,5 +1,8 @@
class NiceSkillSupportArmory extends NiceSkill
abstract;
defaultproperties
{ bBroadcast=True SkillName="Armory" SkillEffects="Once per wave your team-mates will receive armored jacket when they run out of armor."
}
class NiceSkillSupportArmory extends NiceSkill
abstract;
defaultproperties
{
bBroadcast=True
SkillName="Armory"
SkillEffects="Once per wave your team-mates will receive armored jacket when they run out of armor."
}

View file

@ -1,6 +1,9 @@
class NiceSkillSupportBigGameHunter extends NiceSkillGenAmmo
abstract;
var float damageBonus;
defaultproperties
{ damageBonus=1.600000 SkillName="Big-game hunter" SkillEffects="Gain 60% damage bonus with grenades, but carry 5 grenades less."
}
class NiceSkillSupportBigGameHunter extends NiceSkillGenAmmo
abstract;
var float damageBonus;
defaultproperties
{
damageBonus=1.600000
SkillName="Big-game hunter"
SkillEffects="Gain 60% damage bonus with grenades, but carry 5 grenades less."
}

View file

@ -1,5 +1,7 @@
class NiceSkillSupportCautious extends NiceSkill
abstract;
defaultproperties
{ SkillName="Cautious" SkillEffects="Your grenades won't explode if you're too close to them."
}
class NiceSkillSupportCautious extends NiceSkill
abstract;
defaultproperties
{
SkillName="Cautious"
SkillEffects="Your grenades won't explode if you're too close to them."
}

View file

@ -1,18 +1,22 @@
class NiceSkillSupportDiversity extends NiceSkill
abstract;
var int bonusWeight;
static function UpdateWeight(NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePawn == none || nicePawn.KFPRI == none) return;
nicePawn.maxCarryWeight = nicePawn.default.maxCarryWeight;
if(nicePawn.KFPRI.clientVeteranSkill != none) nicePawn.maxCarryWeight += nicePawn.KFPRI.clientVeteranSkill.static.AddCarryMaxWeight(nicePawn.KFPRI);
}
function static SkillSelected(NicePlayerController nicePlayer){
UpdateWeight(nicePlayer);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
UpdateWeight(nicePlayer);
}
defaultproperties
{ bonusWeight=5 SkillName="Diversity" SkillEffects="Gain +5 weight slots."
}
class NiceSkillSupportDiversity extends NiceSkill
abstract;
var int bonusWeight;
static function UpdateWeight(NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePawn == none || nicePawn.KFPRI == none) return;
nicePawn.maxCarryWeight = nicePawn.default.maxCarryWeight;
if(nicePawn.KFPRI.clientVeteranSkill != none)
nicePawn.maxCarryWeight += nicePawn.KFPRI.clientVeteranSkill.static.AddCarryMaxWeight(nicePawn.KFPRI);
}
function static SkillSelected(NicePlayerController nicePlayer){
UpdateWeight(nicePlayer);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
UpdateWeight(nicePlayer);
}
defaultproperties
{
bonusWeight=5
SkillName="Diversity"
SkillEffects="Gain +5 weight slots."
}

View file

@ -1,7 +1,11 @@
class NiceSkillSupportGraze extends NiceSkill
abstract;
var float hsBonusZoneMult;
var float grazeDamageMult;
defaultproperties
{ hsBonusZoneMult=1.500000 grazeDamageMult=0.750000 SkillName="Graze" SkillEffects="Your perked projectile can hit zeds' extended head zone for 75% of damage even if they miss the normal one."
}
class NiceSkillSupportGraze extends NiceSkill
abstract;
var float hsBonusZoneMult;
var float grazeDamageMult;
defaultproperties
{
hsBonusZoneMult=1.500000
grazeDamageMult=0.750000
SkillName="Graze"
SkillEffects="Your perked projectile can hit zeds' extended head zone for 75% of damage even if they miss the normal one."
}

View file

@ -1,7 +1,11 @@
class NiceSkillSupportObsessive extends NiceSkill
abstract;
var float reloadLevel;
var float reloadBonus;
defaultproperties
{ reloadLevel=0.650000 ReloadBonus=1.500000 SkillName="Obsessive" SkillEffects="Reload 50% faster when you lack at most 35% of bullets in the magazine."
}
class NiceSkillSupportObsessive extends NiceSkill
abstract;
var float reloadLevel;
var float reloadBonus;
defaultproperties
{
reloadLevel=0.650000
ReloadBonus=1.500000
SkillName="Obsessive"
SkillEffects="Reload 50% faster when you lack at most 35% of bullets in the magazine."
}

View file

@ -1,5 +1,7 @@
class NiceSkillSupportSlugs extends NiceSkill
abstract;
defaultproperties
{ SkillName="Slugs" SkillEffects="Pellets shots replaced by slugs on shotguns."
}
class NiceSkillSupportSlugs extends NiceSkill
abstract;
defaultproperties
{
SkillName="Slugs"
SkillEffects="Pellets shots replaced by slugs on shotguns."
}

View file

@ -1,6 +1,9 @@
class NiceSkillSupportStubbornness extends NiceSkillGenAmmo
abstract;
var float penLossRed;
defaultproperties
{ penLossRed=0.500000 SkillName="Stubbornness" SkillEffects="50% better penetration."
}
class NiceSkillSupportStubbornness extends NiceSkillGenAmmo
abstract;
var float penLossRed;
defaultproperties
{
penLossRed=0.500000
SkillName="Stubbornness"
SkillEffects="50% better penetration."
}

View file

@ -1,6 +1,9 @@
class NiceSkillSupportZEDBore extends NiceSkill
abstract;
var float minHeadshotPrecision;
defaultproperties
{ minHeadshotPrecision=0.100000 SkillName="Bore" SkillEffects="During zed time your bullets' bounce between a zed's body and head 2 times before leaving it."
}
class NiceSkillSupportZEDBore extends NiceSkill
abstract;
var float minHeadshotPrecision;
defaultproperties
{
minHeadshotPrecision=0.100000
SkillName="Bore"
SkillEffects="During zed time your bullets' bounce between a zed's body and head 2 times before leaving it."
}

View file

@ -1,7 +1,11 @@
class NiceSkillSupportZEDBulletStorm extends NiceSkill
abstract;
var float damageCut;
var float projCountMult;
defaultproperties
{ damageCut=0.500000 projCountMult=7.000000 SkillName="Bullet storm" SkillEffects="During zed time you fire seven times as much projectiles, that deal half as much damage."
}
class NiceSkillSupportZEDBulletStorm extends NiceSkill
abstract;
var float damageCut;
var float projCountMult;
defaultproperties
{
damageCut=0.500000
projCountMult=7.000000
SkillName="Bullet storm"
SkillEffects="During zed time you fire seven times as much projectiles, that deal half as much damage."
}

View file

@ -1,8 +1,9 @@
class NiceDamageTypeVetMedic extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetFieldMedicExp', Int(Float(Amount) * class'NicePack'.default.vetFieldMedicDmgExpCost * getScale(HL)));
}
defaultproperties
{
}
class NiceDamageTypeVetMedic extends NiceWeaponDamageType
abstract;
static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none)
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetFieldMedicExp', Int(Float(Amount) * class'NicePack'.default.vetFieldMedicDmgExpCost * getScale(HL)));
}
defaultproperties
{
}

View file

@ -1,4 +1,5 @@
class NiceVetFieldMedicExp extends SRCustomProgressInt;
defaultproperties
{ ProgressName="Field Medic exp."
}
class NiceVetFieldMedicExp extends SRCustomProgressInt;
defaultproperties
{
ProgressName="Field Medic exp."
}

View file

@ -1,5 +1,8 @@
class NiceDamTypeDrug extends NiceWeaponDamageType
abstract;
defaultproperties
{ FemaleSuicide="%o overdosed." MaleSuicide="%o overdosed." bArmorStops=False
}
class NiceDamTypeDrug extends NiceWeaponDamageType
abstract;
defaultproperties
{
FemaleSuicide="%o overdosed."
MaleSuicide="%o overdosed."
bArmorStops=False
}

View file

@ -1,8 +1,14 @@
class NiceSkillMedicAdrenalineShot extends NiceSkill
abstract;
var float boostTime;
var float minHealth;
var float speedBoost, resistBoost;
defaultproperties
{ boostTime=1.000000 minHealth=50.000000 speedBoost=2.000000 resistBoost=1.500000 SkillName="Adrenaline shot" SkillEffects="Wounded players healed by you gain boost in speed (up to 100%) and damage resistance (up to 50%) for one second."
}
class NiceSkillMedicAdrenalineShot extends NiceSkill
abstract;
var float boostTime;
var float minHealth;
var float speedBoost, resistBoost;
defaultproperties
{
boostTime=1.000000
minHealth=50.000000
speedBoost=2.000000
resistBoost=1.500000
SkillName="Adrenaline shot"
SkillEffects="Wounded players healed by you gain boost in speed (up to 100%) and damage resistance (up to 50%) for one second."
}

View file

@ -1,6 +1,9 @@
class NiceSkillMedicAimAssistance extends NiceSkill
abstract;
var float headIncrease;
defaultproperties
{ headIncrease=1.500000 SkillName="Aim assistance" SkillEffects="Zeds' critical points are 50% bigger for you."
}
class NiceSkillMedicAimAssistance extends NiceSkill
abstract;
var float headIncrease;
defaultproperties
{
headIncrease=1.500000
SkillName="Aim assistance"
SkillEffects="Zeds' critical points are 50% bigger for you."
}

View file

@ -1,5 +1,7 @@
class NiceSkillMedicArmament extends NiceSkill
abstract;
defaultproperties
{ SkillName="Armament" SkillEffects="Your grenades restore armor of the other players, but you can't refill them with ammoboxes."
}
class NiceSkillMedicArmament extends NiceSkill
abstract;
defaultproperties
{
SkillName="Armament"
SkillEffects="Your grenades restore armor of the other players, but you can't refill them with ammoboxes."
}

View file

@ -1,8 +1,17 @@
class NiceSkillMedicInjection extends NiceSkill
abstract;
var float boostTime, painTime;
var float withdrawalDamage, healthBoost;
var float bonusAccuracy, bonusMeleeDmg, bonusSpeed, bonusReload;
defaultproperties
{ boostTime=30.000000 painTime=60.000000 withdrawalDamage=5.000000 bonusAccuracy=3.000000 bonusMeleeDmg=2.000000 bonusSpeed=2.000000 bonusReload=2.000000 SkillName="Injection" SkillEffects="Once a wave your teammates can pickup a drug from you that will greatly boost their performance for 30 seconds, but suffer from withdrawal afterwards."
}
class NiceSkillMedicInjection extends NiceSkill
abstract;
var float boostTime, painTime;
var float withdrawalDamage, healthBoost;
var float bonusAccuracy, bonusMeleeDmg, bonusSpeed, bonusReload;
defaultproperties
{
boostTime=30.000000
painTime=60.000000
withdrawalDamage=5.000000
bonusAccuracy=3.000000
bonusMeleeDmg=2.000000
bonusSpeed=2.000000
bonusReload=2.000000
SkillName="Injection"
SkillEffects="Once a wave your teammates can pickup a drug from you that will greatly boost their performance for 30 seconds, but suffer from withdrawal afterwards."
}

View file

@ -1,5 +1,7 @@
class NiceSkillMedicPesticide extends NiceSkill
abstract;
defaultproperties
{ SkillName="Pesticide" SkillEffects="Your grenades effect lasts only half the original time, but they drive small zeds to fight each other."
}
class NiceSkillMedicPesticide extends NiceSkill
abstract;
defaultproperties
{
SkillName="Pesticide"
SkillEffects="Your grenades effect lasts only half the original time, but they drive small zeds to fight each other."
}

View file

@ -1,6 +1,9 @@
class NiceSkillMedicRegeneration extends NiceSkill
abstract;
var float regenFrequency;
defaultproperties
{ regenFrequency=0.500000 SkillName="Regeneration" SkillEffects="You regenerate 2 hp per second."
}
class NiceSkillMedicRegeneration extends NiceSkill
abstract;
var float regenFrequency;
defaultproperties
{
regenFrequency=0.500000
SkillName="Regeneration"
SkillEffects="You regenerate 2 hp per second."
}

View file

@ -1,6 +1,9 @@
class NiceSkillMedicSymbioticHealth extends NiceSkill
abstract;
var float selfBoost;
defaultproperties
{ selfBoost=0.250000 SkillName="Symbiotic health" SkillEffects="Healing teammates will heal you 25% of your total health."
}
class NiceSkillMedicSymbioticHealth extends NiceSkill
abstract;
var float selfBoost;
defaultproperties
{
selfBoost=0.250000
SkillName="Symbiotic health"
SkillEffects="Healing teammates will heal you 25% of your total health."
}

View file

@ -1,6 +1,8 @@
class NiceSkillMedicTranquilizer extends NiceSkill
abstract;
var float healingDebuff;
defaultproperties
{ SkillName="Tranquilizer" SkillEffects="Zeds hit by your darts can be stunned by head-damage, but your darts lose 25% of their healing efficiency."
}
class NiceSkillMedicTranquilizer extends NiceSkill
abstract;
var float healingDebuff;
defaultproperties
{
SkillName="Tranquilizer"
SkillEffects="Zeds hit by your darts can be stunned by head-damage, but your darts lose 25% of their healing efficiency."
}

View file

@ -1,6 +1,9 @@
class NiceSkillMedicZEDFrenzy extends NiceSkill
abstract;
var float madnessTime;
defaultproperties
{ madnessTime=30.000000 SkillName="Frenzy" SkillEffects="Zeds hit by your darts during zed time will become rabid and attack anything indiscriminately for 30 seconds."
}
class NiceSkillMedicZEDFrenzy extends NiceSkill
abstract;
var float madnessTime;
defaultproperties
{
madnessTime=30.000000
SkillName="Frenzy"
SkillEffects="Zeds hit by your darts during zed time will become rabid and attack anything indiscriminately for 30 seconds."
}

View file

@ -1,5 +1,7 @@
class NiceSkillMedicZEDHeavenCanceller extends NiceSkill
abstract;
defaultproperties
{ SkillName="Heaven canceller" SkillEffects="During zed-time your darts instantlyrestore health of your teammates and make them invincible for the duration."
}
class NiceSkillMedicZEDHeavenCanceller extends NiceSkill
abstract;
defaultproperties
{
SkillName="Heaven canceller"
SkillEffects="During zed-time your darts instantlyrestore health of your teammates and make them invincible for the duration."
}

View file

@ -1,7 +1,11 @@
class NiceSkillEnforcerDetermination extends NiceSkill
abstract;
var int healthBound;
var float addedResist;
defaultproperties
{ healthBound=50 addedResist=0.500000 SkillName="Determination" SkillEffects="Receive 50% less damage when your health falls below 50 mark."
}
class NiceSkillEnforcerDetermination extends NiceSkill
abstract;
var int healthBound;
var float addedResist;
defaultproperties
{
healthBound=50
addedResist=0.500000
SkillName="Determination"
SkillEffects="Receive 50% less damage when your health falls below 50 mark."
}

View file

@ -1,33 +1,43 @@
class NiceSkillEnforcerFullCounter extends NiceSkill
abstract;
var int layersAmount;
var float coolDown;
var float damageReduction;
var float damageReductionWeak;
function static SkillSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
local NiceHumanPawn nicePawn;
super.SkillSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(nicePlayer != none) nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn != none) nicePawn.hmgShieldLevel = default.layersAmount;
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return;
niceMutator.AddCounter("npHMGFullCounter", Texture'NicePackT.HudCounter.fullCounter', true, default.class);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillDeSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return;
niceMutator.RemoveCounter("npHMGFullCounter");
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePlayer == none || counterName != "npHMGFullCounter") return 0;
nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn == none) return 0;
return nicePawn.hmgShieldLevel;
}
defaultproperties
{ layersAmount=5 cooldown=15.000000 SkillName="Full counter" SkillEffects="Gives you 5 protection layers, each of which can block a weak hit. One layer restores 15 seconds after you've been hit. Can't withstand strong attacks or attacks of huge enough zeds."
}
class NiceSkillEnforcerFullCounter extends NiceSkill
abstract;
var int layersAmount;
var float coolDown;
var float damageReduction;
var float damageReductionWeak;
function static SkillSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
local NiceHumanPawn nicePawn;
super.SkillSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(nicePlayer != none)
nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn != none)
nicePawn.hmgShieldLevel = default.layersAmount;
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
return;
niceMutator.AddCounter("npHMGFullCounter", Texture'NicePackT.HudCounter.fullCounter', true, default.class);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillDeSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
return;
niceMutator.RemoveCounter("npHMGFullCounter");
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePlayer == none || counterName != "npHMGFullCounter")
return 0;
nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn == none)
return 0;
return nicePawn.hmgShieldLevel;
}
defaultproperties
{
layersAmount=5
cooldown=15.000000
SkillName="Full counter"
SkillEffects="Gives you 5 protection layers, each of which can block a weak hit. One layer restores 15 seconds after you've been hit. Can't withstand strong attacks or attacks of huge enough zeds."
}

View file

@ -1,6 +1,9 @@
class NiceSkillEnforcerUnshakable extends NiceSkill
abstract;
var float skillResist;
defaultproperties
{ skillResist=0.150000 SkillName="Unshakable" SkillEffects="Your screen doesn't shake or blur, and you gain 15% resistance to all damage."
}
class NiceSkillEnforcerUnshakable extends NiceSkill
abstract;
var float skillResist;
defaultproperties
{
skillResist=0.150000
SkillName="Unshakable"
SkillEffects="Your screen doesn't shake or blur, and you gain 15% resistance to all damage."
}

View file

@ -1,6 +1,9 @@
class NiceSkillEnforcerUnstoppable extends NiceSkill
abstract;
var float speedMult;
defaultproperties
{ speedMult=0.750000 SkillName="Unstoppable" SkillEffects="Your speed doesn't decrease from additional weight, low health, poison or siren's pull, but you also receive -25% speed penalty."
}
class NiceSkillEnforcerUnstoppable extends NiceSkill
abstract;
var float speedMult;
defaultproperties
{
speedMult=0.750000
SkillName="Unstoppable"
SkillEffects="Your speed doesn't decrease from additional weight, low health, poison or siren's pull, but you also receive -25% speed penalty."
}

View file

@ -1,5 +1,7 @@
class NiceSkillEnforcerZEDBarrage extends NiceSkill
abstract;
defaultproperties
{ SkillName="Barrage" SkillEffects="Shoot without any recoil during zed-time."
}
class NiceSkillEnforcerZEDBarrage extends NiceSkill
abstract;
defaultproperties
{
SkillName="Barrage"
SkillEffects="Shoot without any recoil during zed-time."
}

View file

@ -1,6 +1,9 @@
class NiceSkillEnforcerZEDJuggernaut extends NiceSkill
abstract;
var float distance;
defaultproperties
{ Distance=800.000000 SkillName="Juggernaut" SkillEffects="You startle zeds around you upon entering zed-time."
}
class NiceSkillEnforcerZEDJuggernaut extends NiceSkill
abstract;
var float distance;
defaultproperties
{
Distance=800.000000
SkillName="Juggernaut"
SkillEffects="You startle zeds around you upon entering zed-time."
}

View file

@ -1,6 +1,9 @@
class NiceSkillHeavyCoating extends NiceSkill
abstract;
var float huskResist;
defaultproperties
{ huskResist=1.000000 SkillName="Coating" SkillEffects="You get immunity from fire and electricity for as long as you wear armor, and your armor can absorb damage from every source."
}
class NiceSkillHeavyCoating extends NiceSkill
abstract;
var float huskResist;
defaultproperties
{
huskResist=1.000000
SkillName="Coating"
SkillEffects="You get immunity from fire and electricity for as long as you wear armor, and your armor can absorb damage from every source."
}

View file

@ -1,6 +1,9 @@
class NiceSkillHeavyOverclocking extends NiceSkill
abstract;
var float fireSpeedMult;
defaultproperties
{ fireSpeedMult=1.300000 SkillName="Overclocking" SkillEffects="+30% fire speed with perked weapons."
}
class NiceSkillHeavyOverclocking extends NiceSkill
abstract;
var float fireSpeedMult;
defaultproperties
{
fireSpeedMult=1.300000
SkillName="Overclocking"
SkillEffects="+30% fire speed with perked weapons."
}

View file

@ -1,6 +1,9 @@
class NiceSkillHeavySafeguard extends NiceSkill
abstract;
var float healingCost;
defaultproperties
{ healingCost=0.250000 SkillName="Safeguard" SkillEffects="Your armor no longer protects you, but it heals you when your health falls too low."
}
class NiceSkillHeavySafeguard extends NiceSkill
abstract;
var float healingCost;
defaultproperties
{
healingCost=0.250000
SkillName="Safeguard"
SkillEffects="Your armor no longer protects you, but it heals you when your health falls too low."
}

View file

@ -1,27 +1,34 @@
class NiceSkillHeavyStablePosition extends NiceSkill
abstract;
var float recoilDampeningBonus;
function static SkillSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return;
niceMutator.AddCounter("npHMGStablePosition", Texture'NicePackT.HudCounter.stability', false, default.class);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillDeSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return;
niceMutator.RemoveCounter("npHMGStablePosition");
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePlayer == none || counterName != "npHMGStablePosition") return 0;
nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn == none || nicePawn.stationaryTime <= 0.0) return 0;
return Min(10, Ceil(2 * nicePawn.stationaryTime) - 1);
}
defaultproperties
{ recoilDampeningBonus=0.100000 SkillName="Stable position" SkillEffects="Each half-second you're crouching and now moving - you gain 10% recoil dampening bonus."
}
class NiceSkillHeavyStablePosition extends NiceSkill
abstract;
var float recoilDampeningBonus;
function static SkillSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
return;
niceMutator.AddCounter("npHMGStablePosition", Texture'NicePackT.HudCounter.stability', false, default.class);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NicePack niceMutator;
super.SkillDeSelected(nicePlayer);
niceMutator = class'NicePack'.static.Myself(nicePlayer.Level);
if(niceMutator == none || niceMutator.Role == Role_AUTHORITY)
return;
niceMutator.RemoveCounter("npHMGStablePosition");
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
if(nicePlayer == none || counterName != "npHMGStablePosition")
return 0;
nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn == none || nicePawn.stationaryTime <= 0.0)
return 0;
return Min(10, Ceil(2 * nicePawn.stationaryTime) - 1);
}
defaultproperties
{
recoilDampeningBonus=0.100000
SkillName="Stable position"
SkillEffects="Each half-second you're crouching and now moving - you gain 10% recoil dampening bonus."
}

View file

@ -1,23 +1,31 @@
class NiceSkill extends ReplicationInfo
abstract;
var bool bBroadcast; // Should we broadcast to clients that someone has this skill?
var string SkillName, SkillEffects;
// Functions that are called when skills becomes active / deactivated
function static SkillSelected(NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
nicePawn = NiceHumanPawn(nicePlayer.Pawn);
if(nicePawn != none){ nicePawn.RecalcAmmo(); if(nicePawn.Role < Role_AUTHORITY) nicePawn.ApplyWeaponStats(nicePawn.weapon);
}
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
nicePawn = NiceHumanPawn(nicePlayer.Pawn);
if(nicePawn != none){ nicePawn.RecalcAmmo(); if(nicePawn.Role < Role_AUTHORITY) nicePawn.ApplyWeaponStats(nicePawn.weapon);
}
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
return 0;
}
defaultproperties
{ SkillName="All Fiction" SkillEffects="Does nothing!"
}
class NiceSkill extends ReplicationInfo
abstract;
var bool bBroadcast; // Should we broadcast to clients that someone has this skill?
var string SkillName, SkillEffects;
// Functions that are called when skills becomes active / deactivated
function static SkillSelected(NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
nicePawn = NiceHumanPawn(nicePlayer.Pawn);
if(nicePawn != none){
nicePawn.RecalcAmmo();
if(nicePawn.Role < Role_AUTHORITY)
nicePawn.ApplyWeaponStats(nicePawn.weapon);
}
}
function static SkillDeSelected(NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn;
nicePawn = NiceHumanPawn(nicePlayer.Pawn);
if(nicePawn != none){
nicePawn.RecalcAmmo();
if(nicePawn.Role < Role_AUTHORITY)
nicePawn.ApplyWeaponStats(nicePawn.weapon);
}
}
function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){
return 0;
}
defaultproperties
{
SkillName="All Fiction"
SkillEffects="Does nothing!"
}

View file

@ -1,16 +1,18 @@
class NiceSkillAbility extends NiceSkill
dependson(NiceAbilityManager)
abstract;
var NiceAbilityManager.NiceAbilityDescription skillAbility;
// Functions that are called when skills becomes active / deactivated
function static SkillSelected(NicePlayerController nicePlayer){
if(nicePlayer != none && nicePlayer.abilityManager != none) nicePlayer.abilityManager.AddAbility(default.skillAbility);
super.SkillSelected(nicePlayer);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
if(nicePlayer != none && nicePlayer.abilityManager != none) nicePlayer.abilityManager.RemoveAbility(default.skillAbility.ID);
super.SkillDeSelected(nicePlayer);
}
defaultproperties
{
}
class NiceSkillAbility extends NiceSkill
dependson(NiceAbilityManager)
abstract;
var NiceAbilityManager.NiceAbilityDescription skillAbility;
// Functions that are called when skills becomes active / deactivated
function static SkillSelected(NicePlayerController nicePlayer){
if(nicePlayer != none && nicePlayer.abilityManager != none)
nicePlayer.abilityManager.AddAbility(default.skillAbility);
super.SkillSelected(nicePlayer);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
if(nicePlayer != none && nicePlayer.abilityManager != none)
nicePlayer.abilityManager.RemoveAbility(default.skillAbility.ID);
super.SkillDeSelected(nicePlayer);
}
defaultproperties
{
}

View file

@ -1,20 +1,32 @@
class NiceSkillGenAmmo extends NiceSkill
abstract;
function static UpdateWeapons(NicePlayerController nicePlayer){
local Inventory I;
local NiceHumanPawn nicePawn;
nicePawn = NiceHumanPawn(nicePlayer.Pawn);
if(nicePawn != none){ for(I = nicePawn.Inventory; I != none; I = I.Inventory) if(NiceWeapon(I) != none){ NiceWeapon(I).UpdateWeaponAmmunition(); NiceWeapon(I).ClientUpdateWeaponMag(); } else if(FragAmmo(I) != none){ FragAmmo(I).MaxAmmo = FragAmmo(I).default.MaxAmmo; if(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill != none) FragAmmo(I).MaxAmmo = float(FragAmmo(I).MaxAmmo) * KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo), class'FragAmmo'); FragAmmo(I).AmmoAmount = Min(FragAmmo(I).AmmoAmount, FragAmmo(I).MaxAmmo); }
}
}
function static SkillSelected(NicePlayerController nicePlayer){
super.SkillSelected(nicePlayer);
UpdateWeapons(nicePlayer);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
super.SkillDeSelected(nicePlayer);
UpdateWeapons(nicePlayer);
}
defaultproperties
{
}
class NiceSkillGenAmmo extends NiceSkill
abstract;
function static UpdateWeapons(NicePlayerController nicePlayer){
local Inventory I;
local NiceHumanPawn nicePawn;
nicePawn = NiceHumanPawn(nicePlayer.Pawn);
if(nicePawn != none){
for(I = nicePawn.Inventory; I != none; I = I.Inventory)
if(NiceWeapon(I) != none){
NiceWeapon(I).UpdateWeaponAmmunition();
NiceWeapon(I).ClientUpdateWeaponMag();
}
else if(FragAmmo(I) != none){
FragAmmo(I).MaxAmmo = FragAmmo(I).default.MaxAmmo;
if(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill != none)
FragAmmo(I).MaxAmmo = float(FragAmmo(I).MaxAmmo)
* KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo), class'FragAmmo');
FragAmmo(I).AmmoAmount = Min(FragAmmo(I).AmmoAmount, FragAmmo(I).MaxAmmo);
}
}
}
function static SkillSelected(NicePlayerController nicePlayer){
super.SkillSelected(nicePlayer);
UpdateWeapons(nicePlayer);
}
function static SkillDeSelected(NicePlayerController nicePlayer){
super.SkillDeSelected(nicePlayer);
UpdateWeapons(nicePlayer);
}
defaultproperties
{
}

View file

@ -1,252 +1,325 @@
class NiceVeterancyTypes extends ScrnVeterancyTypes
dependson(NicePlayerController)
abstract;
// Temporarily needed variable to distinguish between new and old type perks
var bool bNewTypePerk;
// Skills
var class<NiceSkill> SkillGroupA[5];
var class<NiceSkill> SkillGroupB[5];
// Checks if player is can use given skill
static function bool CanUseSkill(NicePlayerController nicePlayer, class<NiceSkill> skill){
local int i;
local int currentLevel;
local KFPlayerReplicationInfo KFPRI;
local class<NiceVeterancyTypes> niceVet;
// Get necessary variables
KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo);
if(KFPRI == none) return false;
niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo);
currentLevel = GetClientVeteranSkillLevel(KFPRI);
// Check if we have that skill at appropriate level
for(i = 0;i < 5 && i < currentLevel;i ++) if(niceVet.default.SkillGroupA[i] == skill || niceVet.default.SkillGroupB[i] == skill) return true;
return false;
}
// Checks if player is using given skill
static function bool HasSkill(NicePlayerController nicePlayer, class<NiceSkill> skill){
local int i;
local int currentLevel;
local KFPlayerReplicationInfo KFPRI;
local class<NiceVeterancyTypes> niceVet;
local NicePlayerController.SkillChoices choices;
// Get necessary variables
if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill)) return false;
KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo);
if(KFPRI == none) return false;
currentLevel = GetClientVeteranSkillLevel(KFPRI);
niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo);
choices = nicePlayer.currentSkills[niceVet.default.PerkIndex];
// Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active)
for(i = 0;i < 5 && i < currentLevel;i ++) if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0) || (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0)) return true;
return false;
}
static function bool SomeoneHasSkill(NicePlayerController player, class<NiceSkill> skill){
local int i;
local Controller P;
local NicePlayerController nicePlayer;
if(player == none) return false;
if(player.Pawn.Role == ROLE_Authority) for(P = player.Level.ControllerList; P != none; P = P.nextController){ nicePlayer = NicePlayerController(P); if(nicePlayer != none && HasSkill(nicePlayer, skill) && nicePlayer.Pawn.Health > 0 && !nicePlayer.Pawn.bPendingDelete && nicePlayer.PlayerReplicationInfo.Team == player.PlayerReplicationInfo.Team) return true; }
else for(i = 0;i < player.broadcastedSkills.Length;i ++) if(player.broadcastedSkills[i] == skill) return true;
return false;
}
// Checks if player will automatically chose given skill at the next opportunity
static function bool IsSkillPending(NicePlayerController nicePlayer, class<NiceSkill> skill){
local int i;
local int currentLevel;
local KFPlayerReplicationInfo KFPRI;
local class<NiceVeterancyTypes> niceVet;
local NicePlayerController.SkillChoices choices;
// Get necessary variables
if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill)) return false;
KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo);
if(KFPRI == none) return false;
currentLevel = GetClientVeteranSkillLevel(KFPRI);
niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo);
choices = nicePlayer.pendingSkills[niceVet.default.PerkIndex];
// Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active)
for(i = 0;i < 5;i ++) if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0) || (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0)) return true;
return false;
}
// Function that checks if given pickup class is marked as perked for current veterancy
static function bool IsPerkedPickup(class<NiceWeaponPickup> pickup){
local int i;
if(pickup == none) return false;
if(pickup.default.CorrespondingPerkIndex == default.PerkIndex) return true;
else for(i = 0;i < pickup.default.crossPerkIndecies.Length;i ++) if(pickup.default.crossPerkIndecies[i] == default.PerkIndex) return true;
return false;
}
static function bool IsPickupLight(class<NiceWeaponPickup> pickup){
if(pickup != none && pickup.default.Weight <= 8) return true;
return false;
}
static function bool IsPickupBackup(class<NiceWeaponPickup> pickup){
if(pickup != none && pickup.default.bBackupWeapon) return true;
return false;
}
// Set of functions for obtaining a pickup class from various other classes, connected with it
static function class<NiceWeaponPickup> GetPickupFromWeapon(class<Weapon> inputClass){
local class<NiceWeapon> niceWeaponClass;
niceWeaponClass = class<NiceWeapon>(inputClass);
if(niceWeaponClass == none) return none;
return class<NiceWeaponPickup>(niceWeaponClass.default.PickupClass);
}
static function class<NiceWeaponPickup> GetPickupFromAmmo(Class<Ammunition> inputClass){
local class<NiceAmmo> niceAmmoClass;
niceAmmoClass = class<NiceAmmo>(inputClass);
if(niceAmmoClass == none) return none;
return niceAmmoClass.default.WeaponPickupClass;
}
static function class<NiceWeapon> GetWeaponFromAmmo(Class<Ammunition> inputClass){
local class<NiceWeaponPickup> nicePickupClass;
nicePickupClass = GetPickupFromAmmo(inputClass);
if(nicePickupClass == none) return none;
return class<NiceWeapon>(nicePickupClass.default.InventoryType);
}
static function class<NiceWeaponPickup> GetPickupFromDamageType(class<DamageType> inputClass){
local class<NiceWeaponDamageType> niceDmgTypeClass;
niceDmgTypeClass = class<NiceWeaponDamageType>(inputClass);
if(niceDmgTypeClass == none) return none;
return GetPickupFromWeapon(class<NiceWeapon>(niceDmgTypeClass.default.WeaponClass));
}
static function class<NiceWeaponPickup> GetPickupFromWeaponFire(WeaponFire fireInstance){
local NiceFire niceFire;
niceFire = NiceFire(fireInstance);
if(niceFire == none) return none;
return GetPickupFromAmmo(class<NiceAmmo>(niceFire.AmmoClass));
}
// Finds correct veterancy for a player
static function class<NiceVeterancyTypes> GetVeterancy(PlayerReplicationInfo PRI){
local KFPlayerReplicationInfo KFPRI;
KFPRI = KFPlayerReplicationInfo(PRI);
if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return none;
return class<NiceVeterancyTypes>(KFPRI.ClientVeteranSkill);
}
// New perk progress function
static function int GetPerkProgressInt(ClientPerkRepLink StatOther, out int FinalInt, byte CurLevel, byte ReqNum) {
local int delta, highestFilled;
local int filledLevels;
local array<int> ProgressArray;
local int DoubleScalingBase;
if(!default.bNewTypePerk) return Super.GetPerkProgressInt(StatOther, FinalInt, CurLevel, ReqNum);
else{ ProgressArray = GetProgressArray(ReqNum, DoubleScalingBase); filledLevels = ProgressArray.Length; if(filledLevels > 1) delta = ProgressArray[filledLevels - 1] - ProgressArray[filledLevels - 2]; else if(filledLevels == 1) delta = ProgressArray[0]; else delta = 10; if(filledLevels > 0) highestFilled = ProgressArray[filledLevels - 1]; else highestFilled = 10; if(CurLevel < filledLevels) FinalInt = ProgressArray[CurLevel]; else FinalInt = highestFilled + (CurLevel - filledLevels) * delta;
}
return Min(GetStatValueInt(StatOther, ReqNum), FinalInt);
}
// Get head-shot multiplier function that passes zed as a parameter
static function float GetNiceHeadShotDamMulti(KFPlayerReplicationInfo KFPRI, NiceMonster zed, class<DamageType> DmgType){
return 1.0;
}
// From which distance can we see enemy's health at given level?
static function float GetMaxHealthDistanceByLevel(int level){
return 0;
}
// From which distance can we see enemy's health?
static function float GetMaxHealthDistance(KFPlayerReplicationInfo KFPRI){
return GetMaxHealthDistanceByLevel(GetClientVeteranSkillLevel(KFPRI));
}
// Allows to increase head-shot check scale for some weapons.
static function float GetHeadshotCheckMultiplier(KFPlayerReplicationInfo KFPRI, class<DamageType> DmgType){
return 1.0;
}
// Allows to buff only regular component of damage.
static function int AddRegDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<NiceWeaponDamageType> DmgType){
return InDamage;
}
// Allows to buff only fire component of damage.
static function int AddFireDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<NiceWeaponDamageType> DmgType){
if(DmgType != none) return InDamage * DmgType.default.heatPart;
return InDamage;
}
static function float stunDurationMult(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, class<NiceWeaponDamageType> DmgType){
return 1.0;
}
static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class<NiceWeaponDamageType> DmgType){
return InStunScore;
}
static function int AddFlinchScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InFlinchScore, class<NiceWeaponDamageType> DmgType){
return InFlinchScore;
}
// If pawn suffers from slow down effect, how much should we boost/lower it?
// 1.0 = leave the same, >1.0 = boost, <1.0 = lower.
static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){
return 1.0;
}
// Can player with this perk be pulled by a siren?
static function bool CanBePulled(KFPlayerReplicationInfo KFPRI){
return true;
}
// What weight value should be used when calculation Pawn's speed?
static function float GetPerceivedWeight(KFPlayerReplicationInfo KFPRI, KFWeapon other){
if(other != none) return other.weight;
return 0;
}
// A new, universal, penetration reduction function that is used by all 'NiceWeapon' subclasses
static function float GetPenetrationDamageMulti(KFPlayerReplicationInfo KFPRI, float DefaultPenDamageReduction, class<NiceWeaponDamageType> fireIntance){
return DefaultPenDamageReduction;
}
// Universal cost scaling for all perks
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<Pickup> Item){
/*local class<NiceWeaponPickup> pickupClass;
pickupClass = class<NiceWeaponPickup>(Item);
if(IsPerkedPickup(pickupClass)) return 0.5;*/
return 1.0;
}
static function bool ShowStalkers(KFPlayerReplicationInfo KFPRI){
return GetStalkerViewDistanceMulti(KFPRI) > 0;
}
static function float GetStalkerViewDistanceMulti(KFPlayerReplicationInfo KFPRI){
if(SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) return class'NiceSkillCommandoStrategist'.default.visionRadius;
return 0.0;
}
// Modify distance at which health bars can be seen; 1.0 = 800 units, max = 2000 units = 2.5
static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){
if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) return class'NiceSkillCommandoStrategist'.default.visionRadius;
return 0.0;
}
static function int GetAdditionalPenetrationAmount(KFPlayerReplicationInfo KFPRI){
return 0;
}
static function int GetInvincibilityExtentions(KFPlayerReplicationInfo KFPRI){
return 0;
}
static function int GetInvincibilityDuration(KFPlayerReplicationInfo KFPRI){
return 2.0;
}
static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){
return 0;
}
static function SpecialHUDInfo(KFPlayerReplicationInfo KFPRI, Canvas C){
local KFMonster KFEnemy;
local HUDKillingFloor HKF;
local float MaxDistanceSquared;
MaxDistanceSquared = 640000;
MaxDistanceSquared *= GetHealthBarsDistanceMulti(KFPRI)**2;
HKF = HUDKillingFloor(C.ViewPort.Actor.myHUD);
if(HKF == none || C.ViewPort.Actor.Pawn == none || MaxDistanceSquared <= 0) return;
foreach C.ViewPort.Actor.DynamicActors(class'KFMonster', KFEnemy){ if(KFEnemy.Health > 0 && (!KFEnemy.Cloaked() || KFEnemy.bZapped || KFEnemy.bSpotted) && VSizeSquared(KFEnemy.Location - C.ViewPort.Actor.Pawn.Location) < MaxDistanceSquared) HKF.DrawHealthBar(C, KFEnemy, KFEnemy.Health, KFEnemy.HealthMax , 50.0);
}
}
// Is player standing still?
static function bool IsStandingStill(KFPlayerReplicationInfo KFPRI){
if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none && VSize(PlayerController(KFPRI.Owner).Pawn.Velocity) > 0.0) return false;
return true;
}
// Is player aiming?
static function bool IsAiming(KFPlayerReplicationInfo KFPRI){
local KFWeapon kfWeap;
if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none) kfWeap = KFWeapon(PlayerController(KFPRI.Owner).Pawn.weapon);
if(kfWeap == none) return false;
return kfWeap.bAimingRifle;
}
// Just display the same fixed bonuses for the new type perks
static function string GetVetInfoText(byte Level, byte Type, optional byte RequirementNum){
if(Type == 1 && default.bNewTypePerk) return default.CustomLevelInfo;
return Super.GetVetInfoText(Level, Type, RequirementNum);
}
static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI){
return class'NicePack.NiceNade';
}
static function SetupAbilities(KFPlayerReplicationInfo KFPRI){}
defaultproperties
{ SkillGroupA(0)=Class'NicePack.NiceSkill' SkillGroupA(1)=Class'NicePack.NiceSkill' SkillGroupA(2)=Class'NicePack.NiceSkill' SkillGroupA(3)=Class'NicePack.NiceSkill' SkillGroupA(4)=Class'NicePack.NiceSkill' SkillGroupB(0)=Class'NicePack.NiceSkill' SkillGroupB(1)=Class'NicePack.NiceSkill' SkillGroupB(2)=Class'NicePack.NiceSkill' SkillGroupB(3)=Class'NicePack.NiceSkill' SkillGroupB(4)=Class'NicePack.NiceSkill'
}
class NiceVeterancyTypes extends ScrnVeterancyTypes
dependson(NicePlayerController)
abstract;
// Temporarily needed variable to distinguish between new and old type perks
var bool bNewTypePerk;
// Skills
var class<NiceSkill> SkillGroupA[5];
var class<NiceSkill> SkillGroupB[5];
// Checks if player is can use given skill
static function bool CanUseSkill(NicePlayerController nicePlayer, class<NiceSkill> skill){
local int i;
local int currentLevel;
local KFPlayerReplicationInfo KFPRI;
local class<NiceVeterancyTypes> niceVet;
// Get necessary variables
KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo);
if(KFPRI == none)
return false;
niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo);
currentLevel = GetClientVeteranSkillLevel(KFPRI);
// Check if we have that skill at appropriate level
for(i = 0;i < 5 && i < currentLevel;i ++)
if(niceVet.default.SkillGroupA[i] == skill || niceVet.default.SkillGroupB[i] == skill)
return true;
return false;
}
// Checks if player is using given skill
static function bool HasSkill(NicePlayerController nicePlayer, class<NiceSkill> skill){
local int i;
local int currentLevel;
local KFPlayerReplicationInfo KFPRI;
local class<NiceVeterancyTypes> niceVet;
local NicePlayerController.SkillChoices choices;
// Get necessary variables
if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill))
return false;
KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo);
if(KFPRI == none)
return false;
currentLevel = GetClientVeteranSkillLevel(KFPRI);
niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo);
choices = nicePlayer.currentSkills[niceVet.default.PerkIndex];
// Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active)
for(i = 0;i < 5 && i < currentLevel;i ++)
if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0)
|| (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0))
return true;
return false;
}
static function bool SomeoneHasSkill(NicePlayerController player, class<NiceSkill> skill){
local int i;
local Controller P;
local NicePlayerController nicePlayer;
if(player == none)
return false;
if(player.Pawn.Role == ROLE_Authority)
for(P = player.Level.ControllerList; P != none; P = P.nextController){
nicePlayer = NicePlayerController(P);
if(nicePlayer != none && HasSkill(nicePlayer, skill) && nicePlayer.Pawn.Health > 0 && !nicePlayer.Pawn.bPendingDelete
&& nicePlayer.PlayerReplicationInfo.Team == player.PlayerReplicationInfo.Team)
return true;
}
else for(i = 0;i < player.broadcastedSkills.Length;i ++)
if(player.broadcastedSkills[i] == skill)
return true;
return false;
}
// Checks if player will automatically chose given skill at the next opportunity
static function bool IsSkillPending(NicePlayerController nicePlayer, class<NiceSkill> skill){
local int i;
local int currentLevel;
local KFPlayerReplicationInfo KFPRI;
local class<NiceVeterancyTypes> niceVet;
local NicePlayerController.SkillChoices choices;
// Get necessary variables
if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill))
return false;
KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo);
if(KFPRI == none)
return false;
currentLevel = GetClientVeteranSkillLevel(KFPRI);
niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo);
choices = nicePlayer.pendingSkills[niceVet.default.PerkIndex];
// Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active)
for(i = 0;i < 5;i ++)
if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0)
|| (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0))
return true;
return false;
}
// Function that checks if given pickup class is marked as perked for current veterancy
static function bool IsPerkedPickup(class<NiceWeaponPickup> pickup){
local int i;
if(pickup == none)
return false;
if(pickup.default.CorrespondingPerkIndex == default.PerkIndex)
return true;
else for(i = 0;i < pickup.default.crossPerkIndecies.Length;i ++)
if(pickup.default.crossPerkIndecies[i] == default.PerkIndex)
return true;
return false;
}
static function bool IsPickupLight(class<NiceWeaponPickup> pickup){
if(pickup != none && pickup.default.Weight <= 8)
return true;
return false;
}
static function bool IsPickupBackup(class<NiceWeaponPickup> pickup){
if(pickup != none && pickup.default.bBackupWeapon)
return true;
return false;
}
// Set of functions for obtaining a pickup class from various other classes, connected with it
static function class<NiceWeaponPickup> GetPickupFromWeapon(class<Weapon> inputClass){
local class<NiceWeapon> niceWeaponClass;
niceWeaponClass = class<NiceWeapon>(inputClass);
if(niceWeaponClass == none)
return none;
return class<NiceWeaponPickup>(niceWeaponClass.default.PickupClass);
}
static function class<NiceWeaponPickup> GetPickupFromAmmo(Class<Ammunition> inputClass){
local class<NiceAmmo> niceAmmoClass;
niceAmmoClass = class<NiceAmmo>(inputClass);
if(niceAmmoClass == none)
return none;
return niceAmmoClass.default.WeaponPickupClass;
}
static function class<NiceWeapon> GetWeaponFromAmmo(Class<Ammunition> inputClass){
local class<NiceWeaponPickup> nicePickupClass;
nicePickupClass = GetPickupFromAmmo(inputClass);
if(nicePickupClass == none)
return none;
return class<NiceWeapon>(nicePickupClass.default.InventoryType);
}
static function class<NiceWeaponPickup> GetPickupFromDamageType(class<DamageType> inputClass){
local class<NiceWeaponDamageType> niceDmgTypeClass;
niceDmgTypeClass = class<NiceWeaponDamageType>(inputClass);
if(niceDmgTypeClass == none)
return none;
return GetPickupFromWeapon(class<NiceWeapon>(niceDmgTypeClass.default.WeaponClass));
}
static function class<NiceWeaponPickup> GetPickupFromWeaponFire(WeaponFire fireInstance){
local NiceFire niceFire;
niceFire = NiceFire(fireInstance);
if(niceFire == none)
return none;
return GetPickupFromAmmo(class<NiceAmmo>(niceFire.AmmoClass));
}
// Finds correct veterancy for a player
static function class<NiceVeterancyTypes> GetVeterancy(PlayerReplicationInfo PRI){
local KFPlayerReplicationInfo KFPRI;
KFPRI = KFPlayerReplicationInfo(PRI);
if(KFPRI == none || KFPRI.ClientVeteranSkill == none)
return none;
return class<NiceVeterancyTypes>(KFPRI.ClientVeteranSkill);
}
// New perk progress function
static function int GetPerkProgressInt(ClientPerkRepLink StatOther, out int FinalInt, byte CurLevel, byte ReqNum) {
local int delta, highestFilled;
local int filledLevels;
local array<int> ProgressArray;
local int DoubleScalingBase;
if(!default.bNewTypePerk)
return Super.GetPerkProgressInt(StatOther, FinalInt, CurLevel, ReqNum);
else{
ProgressArray = GetProgressArray(ReqNum, DoubleScalingBase);
filledLevels = ProgressArray.Length;
if(filledLevels > 1)
delta = ProgressArray[filledLevels - 1] - ProgressArray[filledLevels - 2];
else if(filledLevels == 1)
delta = ProgressArray[0];
else
delta = 10;
if(filledLevels > 0)
highestFilled = ProgressArray[filledLevels - 1];
else
highestFilled = 10;
if(CurLevel < filledLevels)
FinalInt = ProgressArray[CurLevel];
else
FinalInt = highestFilled + (CurLevel - filledLevels) * delta;
}
return Min(GetStatValueInt(StatOther, ReqNum), FinalInt);
}
// Get head-shot multiplier function that passes zed as a parameter
static function float GetNiceHeadShotDamMulti(KFPlayerReplicationInfo KFPRI, NiceMonster zed, class<DamageType> DmgType){
return 1.0;
}
// From which distance can we see enemy's health at given level?
static function float GetMaxHealthDistanceByLevel(int level){
return 0;
}
// From which distance can we see enemy's health?
static function float GetMaxHealthDistance(KFPlayerReplicationInfo KFPRI){
return GetMaxHealthDistanceByLevel(GetClientVeteranSkillLevel(KFPRI));
}
// Allows to increase head-shot check scale for some weapons.
static function float GetHeadshotCheckMultiplier(KFPlayerReplicationInfo KFPRI, class<DamageType> DmgType){
return 1.0;
}
// Allows to buff only regular component of damage.
static function int AddRegDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<NiceWeaponDamageType> DmgType){
return InDamage;
}
// Allows to buff only fire component of damage.
static function int AddFireDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<NiceWeaponDamageType> DmgType){
if(DmgType != none)
return InDamage * DmgType.default.heatPart;
return InDamage;
}
static function float stunDurationMult(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, class<NiceWeaponDamageType> DmgType){
return 1.0;
}
static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class<NiceWeaponDamageType> DmgType){
return InStunScore;
}
static function int AddFlinchScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InFlinchScore, class<NiceWeaponDamageType> DmgType){
return InFlinchScore;
}
// If pawn suffers from slow down effect, how much should we boost/lower it?
// 1.0 = leave the same, >1.0 = boost, <1.0 = lower.
static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){
return 1.0;
}
// Can player with this perk be pulled by a siren?
static function bool CanBePulled(KFPlayerReplicationInfo KFPRI){
return true;
}
// What weight value should be used when calculation Pawn's speed?
static function float GetPerceivedWeight(KFPlayerReplicationInfo KFPRI, KFWeapon other){
if(other != none)
return other.weight;
return 0;
}
// A new, universal, penetration reduction function that is used by all 'NiceWeapon' subclasses
static function float GetPenetrationDamageMulti(KFPlayerReplicationInfo KFPRI, float DefaultPenDamageReduction, class<NiceWeaponDamageType> fireIntance){
return DefaultPenDamageReduction;
}
// Universal cost scaling for all perks
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<Pickup> Item){
/*local class<NiceWeaponPickup> pickupClass;
pickupClass = class<NiceWeaponPickup>(Item);
if(IsPerkedPickup(pickupClass))
return 0.5;*/
return 1.0;
}
static function bool ShowStalkers(KFPlayerReplicationInfo KFPRI){
return GetStalkerViewDistanceMulti(KFPRI) > 0;
}
static function float GetStalkerViewDistanceMulti(KFPlayerReplicationInfo KFPRI){
if(SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist'))
return class'NiceSkillCommandoStrategist'.default.visionRadius;
return 0.0;
}
// Modify distance at which health bars can be seen; 1.0 = 800 units, max = 2000 units = 2.5
static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){
if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist'))
return class'NiceSkillCommandoStrategist'.default.visionRadius;
return 0.0;
}
static function int GetAdditionalPenetrationAmount(KFPlayerReplicationInfo KFPRI){
return 0;
}
static function int GetInvincibilityExtentions(KFPlayerReplicationInfo KFPRI){
return 0;
}
static function int GetInvincibilityDuration(KFPlayerReplicationInfo KFPRI){
return 2.0;
}
static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){
return 0;
}
static function SpecialHUDInfo(KFPlayerReplicationInfo KFPRI, Canvas C){
local KFMonster KFEnemy;
local HUDKillingFloor HKF;
local float MaxDistanceSquared;
MaxDistanceSquared = 640000;
MaxDistanceSquared *= GetHealthBarsDistanceMulti(KFPRI)**2;
HKF = HUDKillingFloor(C.ViewPort.Actor.myHUD);
if(HKF == none || C.ViewPort.Actor.Pawn == none || MaxDistanceSquared <= 0)
return;
foreach C.ViewPort.Actor.DynamicActors(class'KFMonster', KFEnemy){
if(KFEnemy.Health > 0 && (!KFEnemy.Cloaked() || KFEnemy.bZapped || KFEnemy.bSpotted) && VSizeSquared(KFEnemy.Location - C.ViewPort.Actor.Pawn.Location) < MaxDistanceSquared)
HKF.DrawHealthBar(C, KFEnemy, KFEnemy.Health, KFEnemy.HealthMax , 50.0);
}
}
// Is player standing still?
static function bool IsStandingStill(KFPlayerReplicationInfo KFPRI){
if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none && VSize(PlayerController(KFPRI.Owner).Pawn.Velocity) > 0.0)
return false;
return true;
}
// Is player aiming?
static function bool IsAiming(KFPlayerReplicationInfo KFPRI){
local KFWeapon kfWeap;
if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none)
kfWeap = KFWeapon(PlayerController(KFPRI.Owner).Pawn.weapon);
if(kfWeap == none)
return false;
return kfWeap.bAimingRifle;
}
// Just display the same fixed bonuses for the new type perks
static function string GetVetInfoText(byte Level, byte Type, optional byte RequirementNum){
if(Type == 1 && default.bNewTypePerk)
return default.CustomLevelInfo;
return Super.GetVetInfoText(Level, Type, RequirementNum);
}
static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI){
return class'NicePack.NiceNade';
}
static function SetupAbilities(KFPlayerReplicationInfo KFPRI){}
defaultproperties
{
SkillGroupA(0)=Class'NicePack.NiceSkill'
SkillGroupA(1)=Class'NicePack.NiceSkill'
SkillGroupA(2)=Class'NicePack.NiceSkill'
SkillGroupA(3)=Class'NicePack.NiceSkill'
SkillGroupA(4)=Class'NicePack.NiceSkill'
SkillGroupB(0)=Class'NicePack.NiceSkill'
SkillGroupB(1)=Class'NicePack.NiceSkill'
SkillGroupB(2)=Class'NicePack.NiceSkill'
SkillGroupB(3)=Class'NicePack.NiceSkill'
SkillGroupB(4)=Class'NicePack.NiceSkill'
}

View file

@ -1,9 +1,10 @@
class NiceDamageTypeVetSharpshooter extends NiceWeaponDamageType
abstract;
static function ScoredNiceHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class<KFMonster> monsterClass, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSharpshooterExp', Int(class'NicePack'.default.vetSharpHeadshotExpCost * getScale(HL)));
super.ScoredNiceHeadshot(KFStatsAndAchievements, monsterClass, HL);
}
defaultproperties
{
}
class NiceDamageTypeVetSharpshooter extends NiceWeaponDamageType
abstract;
static function ScoredNiceHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class<KFMonster> monsterClass, int HL){
if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none)
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSharpshooterExp', Int(class'NicePack'.default.vetSharpHeadshotExpCost * getScale(HL)));
super.ScoredNiceHeadshot(KFStatsAndAchievements, monsterClass, HL);
}
defaultproperties
{
}

View file

@ -1,4 +1,5 @@
class NiceVetSharpshooterExp extends SRCustomProgressInt;
defaultproperties
{ ProgressName="Sharpshooter exp."
}
class NiceVetSharpshooterExp extends SRCustomProgressInt;
defaultproperties
{
ProgressName="Sharpshooter exp."
}