Merge pull request 'zedtest3' (#3) from NikC-/NicePack:zedtest3 into master

Reviewed-on: https://insultplayers.ru/git/dkanus/NicePack/pulls/3
This commit is contained in:
dkanus 2022-01-21 11:56:42 +03:00
commit 1438773ffd
22 changed files with 817 additions and 216 deletions

54
Configs/NicePack.ini Normal file
View File

@ -0,0 +1,54 @@
[NicePack.NicePack]
bScaleZedHealth=True
bReplacePickups=True
bInitialTrader=True
bStillDuringInitTrader=False
initialTraderTime=10
bUseProgresiveCash=True
startupCashBeg=500
startupCashNormal=500
startupCashHard=500
startupCashSui=400
startupCashHOE=400
waveCashBeg=350
waveCashNormal=300
waveCashHard=200
waveCashSui=150
waveCashHOE=150
bConvertExp=True
vetFieldMedicExpCost=2.000000
vetFieldMedicDmgExpCost=0.025000
vetSharpHeadshotExpCost=10.000000
vetSupportDamageExpCost=0.050000
vetCommandoDamageExpCost=0.050000
vetDemoDamageExpCost=0.050000
vetZerkDamageExpCost=0.050000
vetHeavyMGDamageExpCost=0.050000
vetGunslingerKillExpCost=20.000000
bAlwaysAllowSkillChange=False
minSpawnRate=0.200000
maxSpawnRate=0.200000
minimalSpawnDistance=1200
bOneFFIncOnly=False
bNoLateFFIncrease=True
bReplaceCrawler=True
bReplaceStalker=True
bReplaceClot=True
bReplaceGorefast=True
bReplaceBloat=True
bReplaceSiren=True
bReplaceHusk=True
bReplaceScrake=True
bReplaceFleshpound=True
lateMultiplier=0.500000
BigZedMinHealth=1000
MediumZedMinHealth=500
waveCash=800
waveCash=750
waveCash=600
waveCash=500
waveCash=450
waveCash=350
waveCash=250
waveCash=100000

View File

@ -2,7 +2,7 @@
Title=Compilation Title=Compilation
set PACKAGE="NicePack" set PACKAGE="NicePack"
@REM set SOURCES="C:\Users\Shtoyan\Documents\NicePack" @REM set SOURCES="D:\Games\SteamLibrary\steamapps\common\KillingFloor\NicePack"
set SOURCES="C:\Users\dkanu\OneDrive\Documents\Programming projects\Killing floor\NicePack\project" set SOURCES="C:\Users\dkanu\OneDrive\Documents\Programming projects\Killing floor\NicePack\project"
set DIR_COMPILE="C:\Program Files (x86)\Steam\steamapps\common\KillingFloor" set DIR_COMPILE="C:\Program Files (x86)\Steam\steamapps\common\KillingFloor"

View File

@ -4,7 +4,11 @@ This repo contains sources for the last public NicePack release.
It is a haphazard bunch of changes that were made to customize ScrN for ourselves. It is unfinished, but due to some reasons I don't want to release it publicly anymore. It is a haphazard bunch of changes that were made to customize ScrN for ourselves. It is unfinished, but due to some reasons I don't want to release it publicly anymore.
The link to the compiled NicePack, along with all necessary files, is here: <http://www.insultplayers.ru/killingfloor/downloads/nicepack/NiceBundle.7z> The link to the compiled NicePack, along with all necessary files, is here: <http://www.insultplayers.ru/killingfloor/downloads/nicepack/NiceBundle.zip>
## Config Files
Only 1 file atm: [NicePack.ini](Configs/NicePack.ini)
## Changelog ## Changelog

View File

@ -1,7 +1,7 @@
// ScrN copy // ScrN copy
class NiceFreezeParticlesDirectional extends NiceFreezeParticlesBase; class NiceFreezeParticlesDirectional extends NiceFreezeParticlesBase;
simulated function Trigger(Actor other, Pawn eventInstigator){ simulated function Trigger(Actor other, Pawn eventInstigator){
emitters[0].SpawnParticle(1); emitters[0].SpawnParticle(1);
} }
defaultproperties defaultproperties
{ {

View File

@ -1,8 +1,8 @@
class NiceIceChunkEmitter extends Emitter; class NiceIceChunkEmitter extends Emitter;
var() array<Sound> ImpactSounds; var() array<Sound> ImpactSounds;
simulated function PostBeginPlay(){ simulated function PostBeginPlay(){
if(ImpactSounds.Length > 0) if(ImpactSounds.Length > 0)
PlaySound(ImpactSounds[Rand(ImpactSounds.Length)]); PlaySound(ImpactSounds[Rand(ImpactSounds.Length)]);
} }
// NICETODO: change linksfrom HTeac_A to NicePackSM (and change that file) // NICETODO: change linksfrom HTeac_A to NicePackSM (and change that file)
defaultproperties defaultproperties

View File

@ -1,87 +1,87 @@
class NiceGUIBuyMenu extends UT2k4MainPage; class NiceGUIBuyMenu extends UT2k4MainPage;
//The "Header" //The "Header"
var automated GUIImage HeaderBG_Left; var automated GUIImage HeaderBG_Left;
var automated GUIImage HeaderBG_Center; var automated GUIImage HeaderBG_Center;
var automated GUIImage HeaderBG_Right; var automated GUIImage HeaderBG_Right;
var automated GUILabel CurrentPerkLabel; var automated GUILabel CurrentPerkLabel;
var automated GUILabel TimeLeftLabel; var automated GUILabel TimeLeftLabel;
var automated GUILabel WaveLabel; var automated GUILabel WaveLabel;
var automated GUILabel HeaderBG_Left_Label; var automated GUILabel HeaderBG_Left_Label;
var automated KFQuickPerkSelect QuickPerkSelect; var automated KFQuickPerkSelect QuickPerkSelect;
var automated KFBuyMenuFilter BuyMenuFilter; var automated KFBuyMenuFilter BuyMenuFilter;
var automated GUIButton StoreTabButton; var automated GUIButton StoreTabButton;
var automated GUIButton PerkTabButton; var automated GUIButton PerkTabButton;
//The "Footer" //The "Footer"
var automated GUIImage WeightBG; var automated GUIImage WeightBG;
var automated GUIImage WeightIcon; var automated GUIImage WeightIcon;
var automated GUIImage WeightIconBG; var automated GUIImage WeightIconBG;
var automated KFWeightBar WeightBar; var automated KFWeightBar WeightBar;
//const BUYLIST_CATS =7; //const BUYLIST_CATS =7;
var() editconst noexport float SavedPitch; var() editconst noexport float SavedPitch;
var color RedColor; var color RedColor;
var color GreenGreyColor; var color GreenGreyColor;
var() UT2K4TabPanel ActivePanel; var() UT2K4TabPanel ActivePanel;
var localized string CurrentPerk; var localized string CurrentPerk;
var localized string NoActivePerk; var localized string NoActivePerk;
var localized string TraderClose; var localized string TraderClose;
var localized string WaveString; var localized string WaveString;
var localized string LvAbbrString; var localized string LvAbbrString;
function InitComponent(GUIController MyC, GUIComponent MyO) function InitComponent(GUIController MyC, GUIComponent MyO)
{ {
local int i; local int i;
super.InitComponent(MyC, MyO); super.InitComponent(MyC, MyO);
c_Tabs.BackgroundImage = none; c_Tabs.BackgroundImage = none;
c_Tabs.BackgroundStyle = none; c_Tabs.BackgroundStyle = none;
InitTabs(); InitTabs();
for ( i = 0; i < c_Tabs.TabStack.Length; i++ ) for ( i = 0; i < c_Tabs.TabStack.Length; i++ )
{ {
c_Tabs.TabStack[i].bVisible = false; c_Tabs.TabStack[i].bVisible = false;
} }
UpdateWeightBar(); UpdateWeightBar();
} }
function InitTabs() function InitTabs()
{ {
local int i; local int i;
for ( i = 0; i < PanelCaption.Length && i < PanelClass.Length && i < PanelHint.Length; i++ ) for ( i = 0; i < PanelCaption.Length && i < PanelClass.Length && i < PanelHint.Length; i++ )
{ {
c_Tabs.AddTab(PanelCaption[i], PanelClass[i],, PanelHint[i]); c_Tabs.AddTab(PanelCaption[i], PanelClass[i],, PanelHint[i]);
} }
} }
function UpdateWeightBar() function UpdateWeightBar()
{ {
if ( KFHumanPawn(PlayerOwner().Pawn) != none ) if ( KFHumanPawn(PlayerOwner().Pawn) != none )
{ {
WeightBar.MaxBoxes = KFHumanPawn(PlayerOwner().Pawn).MaxCarryWeight; WeightBar.MaxBoxes = KFHumanPawn(PlayerOwner().Pawn).MaxCarryWeight;
WeightBar.CurBoxes = KFHumanPawn(PlayerOwner().Pawn).CurrentWeight; WeightBar.CurBoxes = KFHumanPawn(PlayerOwner().Pawn).CurrentWeight;
} }
} }
event Opened(GUIComponent Sender) event Opened(GUIComponent Sender)
{ {
local rotator PlayerRot; local rotator PlayerRot;
super.Opened(Sender); super.Opened(Sender);
c_Tabs.ActivateTabByName(PanelCaption[0], true); c_Tabs.ActivateTabByName(PanelCaption[0], true);
// Tell the controller that he is on a shopping spree // Tell the controller that he is on a shopping spree
if ( KFPlayerController(PlayerOwner()) != none ) if ( KFPlayerController(PlayerOwner()) != none )
{ {
KFPlayerController(PlayerOwner()).bShopping = true; KFPlayerController(PlayerOwner()).bShopping = true;
} }
if ( KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).bAimingRifle ) if ( KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).bAimingRifle )
{ {
KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).IronSightZoomOut(); KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).IronSightZoomOut();
} }
// Set camera's pitch to zero when menu initialised (otherwise spinny weap goes kooky) // Set camera's pitch to zero when menu initialised (otherwise spinny weap goes kooky)
PlayerRot = PlayerOwner().Rotation; PlayerRot = PlayerOwner().Rotation;
SavedPitch = PlayerRot.Pitch; SavedPitch = PlayerRot.Pitch;
PlayerRot.Yaw = PlayerRot.Yaw % 65536; PlayerRot.Yaw = PlayerRot.Yaw % 65536;
PlayerRot.Pitch = 0; PlayerRot.Pitch = 0;
PlayerRot.Roll = 0; PlayerRot.Roll = 0;
PlayerOwner().SetRotation(PlayerRot); PlayerOwner().SetRotation(PlayerRot);
SetTimer(0.05f, true); SetTimer(0.05f, true);
} }
function Timer() function Timer()
{ {
UpdateHeader(); UpdateHeader();
UpdateWeightBar(); UpdateWeightBar();
} }
function InternalOnClose(optional bool bCanceled) function InternalOnClose(optional bool bCanceled)
{ {
@ -94,81 +94,81 @@ function InternalOnClose(optional bool bCanceled)
} }
function UpdateHeader() function UpdateHeader()
{ {
local int TimeLeftMin, TimeLeftSec; local int TimeLeftMin, TimeLeftSec;
local string TimeString; local string TimeString;
if ( KFPlayerController(PlayerOwner()) == none || PlayerOwner().PlayerReplicationInfo == none || if ( KFPlayerController(PlayerOwner()) == none || PlayerOwner().PlayerReplicationInfo == none ||
PlayerOwner().GameReplicationInfo == none ) PlayerOwner().GameReplicationInfo == none )
{
return;
}
// Current Perk
if ( KFPlayerController(PlayerOwner()).SelectedVeterancy != none )
{ {
CurrentPerkLabel.Caption = CurrentPerk$":" @ KFPlayerController(PlayerOwner()).SelectedVeterancy.default.VeterancyName @ LvAbbrString$KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo).ClientVeteranSkillLevel; return;
} }
// Current Perk
if ( KFPlayerController(PlayerOwner()).SelectedVeterancy != none )
{
CurrentPerkLabel.Caption = CurrentPerk$":" @ KFPlayerController(PlayerOwner()).SelectedVeterancy.default.VeterancyName @ LvAbbrString$KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo).ClientVeteranSkillLevel;
}
else else
{ {
CurrentPerkLabel.Caption = CurrentPerk$":" @ NoActivePerk; CurrentPerkLabel.Caption = CurrentPerk$":" @ NoActivePerk;
} }
// Trader time left // Trader time left
TimeLeftMin = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave / 60; TimeLeftMin = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave / 60;
TimeLeftSec = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave % 60; TimeLeftSec = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave % 60;
if ( TimeLeftMin < 1 ) if ( TimeLeftMin < 1 )
{ {
TimeString = "00:"; TimeString = "00:";
} }
else else
{ {
TimeString = "0" $ TimeLeftMin $ ":"; TimeString = "0" $ TimeLeftMin $ ":";
} }
if ( TimeLeftSec >= 10 ) if ( TimeLeftSec >= 10 )
{ {
TimeString = TimeString $ TimeLeftSec; TimeString = TimeString $ TimeLeftSec;
} }
else else
{ {
TimeString = TimeString $ "0" $ TimeLeftSec; TimeString = TimeString $ "0" $ TimeLeftSec;
} }
TimeLeftLabel.Caption = TraderClose @ TimeString; TimeLeftLabel.Caption = TraderClose @ TimeString;
if ( KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave < 10 ) if ( KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave < 10 )
{ {
TimeLeftLabel.TextColor = RedColor; TimeLeftLabel.TextColor = RedColor;
} }
else else
{ {
TimeLeftLabel.TextColor = GreenGreyColor; TimeLeftLabel.TextColor = GreenGreyColor;
} }
// Wave Counter // Wave Counter
WaveLabel.Caption = WaveString$":" @ (KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).WaveNumber + 1)$"/"$KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).FinalWave; WaveLabel.Caption = WaveString$":" @ (KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).WaveNumber + 1)$"/"$KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).FinalWave;
} }
function KFBuyMenuClosed(optional bool bCanceled) function KFBuyMenuClosed(optional bool bCanceled)
{ {
local rotator NewRot; local rotator NewRot;
// Reset player // Reset player
NewRot = PlayerOwner().Rotation; NewRot = PlayerOwner().Rotation;
NewRot.Pitch = SavedPitch; NewRot.Pitch = SavedPitch;
PlayerOwner().SetRotation(NewRot); PlayerOwner().SetRotation(NewRot);
Super.OnClose(bCanceled); Super.OnClose(bCanceled);
if ( KFPlayerController(PlayerOwner()) != none ) if ( KFPlayerController(PlayerOwner()) != none )
{ {
KFPlayerController(PlayerOwner()).bShopping = false; KFPlayerController(PlayerOwner()).bShopping = false;
} }
} }
function CloseSale(bool savePurchases) function CloseSale(bool savePurchases)
{ {
Controller.CloseMenu(!savePurchases); Controller.CloseMenu(!savePurchases);
} }
function bool ButtonClicked(GUIComponent Sender) function bool ButtonClicked(GUIComponent Sender)
{ {
if ( Sender == PerkTabButton ) if ( Sender == PerkTabButton )
{ {
HandleParameters(PanelCaption[1], "OhHi!"); HandleParameters(PanelCaption[1], "OhHi!");
} }
if ( Sender == StoreTabButton ) if ( Sender == StoreTabButton )
{ {
HandleParameters(PanelCaption[0], "OhHi!"); HandleParameters(PanelCaption[0], "OhHi!");
} }
return true; return true;
} }
defaultproperties defaultproperties
{ {

View File

@ -1,23 +1,437 @@
class NiceLobbyFooter extends ScrnLobbyFooter; // base class, not vanilla
class NiceLobbyFooter extends ButtonFooter;
const MidGameMenuString="NicePack.NiceInvasionLoginMenu";
var automated GUIButton b_Menu, b_MapVote, b_KickVote, b_Ready, b_ViewMap, b_Cancel;
var string ReadyString, UnreadyString;
function bool InternalOnPreDraw(Canvas C)
{
if (PlayerOwner().GameReplicationInfo != none)
{
// disable view map if its not a lobby state
if (!PlayerOwner().GameReplicationInfo.bMatchHasBegun)
b_ViewMap.EnableMe();
else
b_ViewMap.DisableMe();
}
// ready-unready text switch
if (PlayerOwner().PlayerReplicationInfo != none && PlayerOwner().PlayerReplicationInfo.bReadyToPlay)
b_Ready.Caption = UnreadyString;
else
b_Ready.Caption = ReadyString;
return super.InternalOnPreDraw(C);
}
// took poosh ScrnLobbyFooter as a reference
// 1. overrided to position buttons by TabOrder
// 2. moved some buttons to left side
function PositionButtons(Canvas C)
{
local int j;
local GUIButton b;
local array<GUIButton> buttonsLEFT, buttonsRIGHT;
local float x, s, m;
s = GetSpacer();
m = GetMargin() / 2;
x = ActualLeft() + ActualWidth() - m;
// position the Disconnect button on the left, others on the right
// right buttons
buttonsRIGHT = GetButtons(false);
for (j = buttonsRIGHT.length - 1; j >= 0; --j)
{
b = buttonsRIGHT[j];
x -= b.ActualWidth();
b.WinLeft = b.RelativeLeft(x, true);
x -= s;
}
// left buttons
buttonsLEFT = GetButtons(true);
for (j = 0; j < buttonsLEFT.length; j++)
{
b = buttonsLEFT[j];
b.WinLeft = b.RelativeLeft(m, true);
m += b.ActualWidth();
m += s;
}
}
final private function array<GUIButton> GetButtons(optional bool bLEFTSIDED)
{
local int i, j;
local GUIButton b;
local array<GUIButton> buttons;
if (bLEFTSIDED)
{
for (i = 0; i < Controls.Length; ++i)
{
b = GUIButton(Controls[i]);
if (b != none && bIsButtonLeft(b) && b.bVisible)
{
// compare tab orders and kepp the array sorted
for (j = 0; j < buttons.length; ++j)
{
if (buttons[j].TabOrder >= b.TabOrder)
break;
}
// fill the array
buttons.insert(j, 1);
buttons[j] = b;
}
}
}
else
{
for (i = 0; i < Controls.Length; ++i)
{
b = GUIButton(Controls[i]);
if (b != none && !bIsButtonLeft(b) && b.bVisible)
{
// compare tab orders and kepp the array sorted
for (j = 0; j < buttons.length; ++j)
{
if (buttons[j].TabOrder >= b.TabOrder)
break;
}
// fill the array
buttons.insert(j, 1);
buttons[j] = b;
}
}
}
return buttons;
}
// which buttons are left sided
final private function bool bIsButtonLeft(GUIButton b)
{
// mapvote, kickvote and main menu must be on left side
if (b == b_MapVote || b == b_KickVote || b == b_Menu)
return true;
return false;
}
function bool ButtonsSized(Canvas C)
{
local int i;
local GUIButton b;
local bool bResult;
local string str;
local float T, AH, AT;
if (!bPositioned)
return false;
bResult = true;
str = GetLongestCaption(C);
AH = ActualHeight();
AT = ActualTop();
for (i = 0; i < Controls.Length; i++)
{
b = GUIButton(Controls[i]);
if (b != none)
{
if (bAutoSize && bFixedWidth)
{
if (b.Caption == "")
b.SizingCaption = Left(str, Len(str) / 2);
else
b.SizingCaption = str;
}
else
b.SizingCaption = "";
bResult = bResult && b.bPositioned;
if (bFullHeight)
b.WinHeight = b.RelativeHeight(AH, true);
else
b.WinHeight = b.RelativeHeight(ActualHeight(ButtonHeight), true);
switch (Justification)
{
case TXTA_Left:
T = ClientBounds[1];
break;
case TXTA_Center:
T = (AT + AH / 2) - (b.ActualHeight() / 2);
break;
case TXTA_Right:
T = ClientBounds[3] - b.ActualHeight();
break;
}
//b.WinTop = AT + ((AH - ActualHeight(ButtonHeight)) / 2);
b.WinTop = b.RelativeTop(T, true) + ((WinHeight - ButtonHeight) / 2);
}
}
return bResult;
}
function float GetButtonLeft()
{
local int i;
local GUIButton b;
local float TotalWidth, AW, AL;
local float FooterMargin;
AL = ActualLeft();
AW = ActualWidth();
FooterMargin = GetMargin();
for (i = 0; i < Controls.Length; i++)
{
b = GUIButton(Controls[i]);
if (b != none)
{
if (TotalWidth > 0)
TotalWidth += GetSpacer();
TotalWidth += b.ActualWidth();
}
}
if (Alignment == TXTA_Center)
return (AL + AW) / 2 - FooterMargin / 2 - TotalWidth / 2;
if (Alignment == TXTA_Right)
return (AL + AW - FooterMargin / 2) - TotalWidth;
return AL + (FooterMargin / 2);
}
// Finds the longest caption of all the buttons
function string GetLongestCaption(Canvas C)
{
local int i;
local float XL, YL, LongestW;
local string str;
local GUIButton b;
if (C == none)
return "";
for (i = 0; i < Controls.Length; i++)
{
b = GUIButton(Controls[i]);
if (b != none)
{
if (b.Style != none)
b.Style.TextSize(C, b.MenuState, b.Caption, XL, YL, b.FontScale);
else
C.StrLen( b.Caption, XL, YL );
if (LongestW == 0 || XL > LongestW)
{
str = b.Caption;
LongestW = XL;
}
}
}
return str;
}
function bool OnFooterClick(GUIComponent Sender) function bool OnFooterClick(GUIComponent Sender)
{ {
if (Sender == b_Perks){ local GUIController C;
PlayerOwner().ClientOpenMenu(string(Class'NicePack.NiceInvasionLoginMenu'), false); local PlayerController PC;
return false;
} PC = PlayerOwner();
else if(Sender == b_ViewMap){ C = Controller;
if(KF_StoryGRI(PlayerOwner().Level.GRI) == none){
LobbyMenu(PageOwner).bAllowClose = true; // midgame menu
PlayerOwner().ClientCloseMenu(true, false); if (Sender == b_Menu)
LobbyMenu(PageOwner).bAllowClose = false; {
} PC.ClientOpenMenu(MidGameMenuString, false);
} }
else if(Sender == b_Ready){ // ready-unready us
return super(LobbyFooter).OnFooterClick(Sender); // bypass serverperks else if (Sender == b_Ready)
{
if (PC.Level.NetMode == NM_Standalone || !PC.PlayerReplicationInfo.bReadyToPlay)
{
if (KFPlayerController(PC) != none)
KFPlayerController(PC).SendSelectedVeterancyToServer(true);
// Set Ready
PC.ServerRestartPlayer();
PC.PlayerReplicationInfo.bReadyToPlay = True;
if (PC.Level.GRI.bMatchHasBegun)
PC.ClientCloseMenu(true, false);
b_Ready.Caption = UnreadyString;
} }
else else
return super.OnFooterClick(Sender); {
if (KFPlayerController(PC) != none)
{
KFPlayerController(PC).ServerUnreadyPlayer();
PC.PlayerReplicationInfo.bReadyToPlay = false;
b_Ready.Caption = ReadyString;
}
}
}
// Kill Window and exit game / disconnect from server
else if (Sender == b_Cancel)
{
// change class to ours
NiceLobbyMenu(PageOwner).bAllowClose = true;
C.ViewportOwner.Console.ConsoleCommand("DISCONNECT");
// Marco SP
PC.ClientCloseMenu(true, false);
C.AutoLoadMenus();
}
// Spectate map while waiting for players to get ready
else if (Sender == b_ViewMap)
{
// change class to ours
NiceLobbyMenu(PageOwner).bAllowClose = true;
PC.ClientCloseMenu(true, false);
}
// open kick vote
else if (Sender == b_KickVote)
{
Controller.OpenMenu(Controller.KickVotingMenu);
}
// open map vote
else if (Sender == b_MapVote)
{
PC.ShowVoteMenu();
}
return false;
} }
function OnSteamStatsAndAchievementsReady()
{
PlayerOwner().ClientOpenMenu("KFGUI.KFProfilePage", false);
}
defaultproperties defaultproperties
{ {
} ReadyString="Ready"
UnreadyString="Unready"
OnPreDraw=NiceLobbyFooter.InternalOnPreDraw
// LEFT buttons
Begin Object Class=GUIButton Name=MenuButton
Caption="Main Menu"
Hint="Open midgame menu."
WinTop=0.966146
WinLeft=0.280000
WinWidth=0.120000
WinHeight=0.033203
RenderWeight=2.000000
TabOrder=0
bBoundToParent=true
ToolTip=none
OnClick=NiceLobbyFooter.OnFooterClick
OnKeyEvent=Cancel.InternalOnKeyEvent
End Object
b_Menu=MenuButton
Begin Object Class=GUIButton Name=MapVote
Caption="Map Vote"
Hint="Shortcut to map vote."
WinTop=0.966146
WinLeft=1.500000 //-0.500000
WinWidth=0.120000
WinHeight=0.033203
RenderWeight=2.000000
TabOrder=1
bBoundToParent=true
ToolTip=none
OnClick=NiceLobbyFooter.OnFooterClick
OnKeyEvent=Cancel.InternalOnKeyEvent
End Object
b_MapVote=MapVote
Begin Object Class=GUIButton Name=KickVote
Caption="Kick Vote"
Hint="Shortcut to kick vote."
WinTop=0.966146
WinLeft=-0.500000
WinWidth=0.120000
WinHeight=0.033203
RenderWeight=2.000000
TabOrder=2
bBoundToParent=true
ToolTip=none
OnClick=NiceLobbyFooter.OnFooterClick
OnKeyEvent=Cancel.InternalOnKeyEvent
End Object
b_KickVote=KickVote
// RIGHT buttons
Begin Object Class=GUIButton Name=ReadyButton
Caption="Ready"
Hint="Click to indicate you are ready to play"
WinTop=0.966146
WinLeft=0.280000
WinWidth=0.120000
WinHeight=0.033203
RenderWeight=2.000000
TabOrder=3
bBoundToParent=true
ToolTip=none
OnClick=NiceLobbyFooter.OnFooterClick
OnKeyEvent=ReadyButton.InternalOnKeyEvent
End Object
b_Ready=ReadyButton
Begin Object Class=GUIButton Name=ViewMap
Caption="View Map"
Hint="Hover around while other players afk to death."
WinTop=0.966146
WinLeft=-0.500000
WinWidth=0.120000
WinHeight=0.033203
RenderWeight=2.000000
TabOrder=4
bBoundToParent=true
ToolTip=none
OnClick=NiceLobbyFooter.OnFooterClick
OnKeyEvent=Cancel.InternalOnKeyEvent
End Object
b_ViewMap=ViewMap
Begin Object Class=GUIButton Name=Cancel
Caption="Disconnect"
Hint="Disconnect From This Server"
WinTop=0.966146
WinLeft=-0.500000
WinWidth=0.120000
WinHeight=0.033203
RenderWeight=2.000000
TabOrder=5
bBoundToParent=true
ToolTip=none
OnClick=NiceLobbyFooter.OnFooterClick
OnKeyEvent=Cancel.InternalOnKeyEvent
End Object
b_Cancel=Cancel
}

View File

@ -182,21 +182,32 @@ simulated function HandleNiceHealingMechanicsAndSkills
healed.bZedTimeInvincible = true; healed.bZedTimeInvincible = true;
} }
} }
simulated function RemovePoisonAndBleed(NiceHumanPawn healed){
simulated function RemovePoisonAndBleed(NiceHumanPawn healed)
{
local Inventory I; local Inventory I;
local MeanReplicationInfo MRI; local MeanReplicationInfo MRI;
// log spam fix
if (healed == none)
return;
// No bleeding // No bleeding
MRI = class'MeanReplicationInfo'.static. MRI = class'MeanReplicationInfo'.static.
findSZri(healed.PlayerReplicationInfo); findSZri(healed.PlayerReplicationInfo);
if(MRI != none) if (MRI != none)
MRI.stopBleeding(); MRI.stopBleeding();
// No poison // No poison
if(healed.inventory == none) return; if (healed.inventory == none)
for(I = healed.inventory; I != none; I = I.inventory){ return;
if(MeanPoisonInventory(I) != none)
for (I = healed.inventory; I != none; I = I.inventory)
{
if (MeanPoisonInventory(I) != none)
I.Destroy(); I.Destroy();
} }
} }
// Tells server to heal given human pawn. // Tells server to heal given human pawn.
simulated function ServerHealTarget(NiceHumanPawn healed, float charPotency, simulated function ServerHealTarget(NiceHumanPawn healed, float charPotency,
Pawn instigator){ Pawn instigator){

View File

@ -5,7 +5,7 @@ static function UpdateWeight(NicePlayerController nicePlayer){
local NiceHumanPawn nicePawn; local NiceHumanPawn nicePawn;
if(nicePawn == none || nicePawn.KFPRI == none) return; if(nicePawn == none || nicePawn.KFPRI == none) return;
nicePawn.maxCarryWeight = nicePawn.default.maxCarryWeight; nicePawn.maxCarryWeight = nicePawn.default.maxCarryWeight;
if(nicePawn.KFPRI.clientVeteranSkill != none) if(nicePawn.KFPRI.clientVeteranSkill != none)
nicePawn.maxCarryWeight += nicePawn.KFPRI.clientVeteranSkill.static.AddCarryMaxWeight(nicePawn.KFPRI); nicePawn.maxCarryWeight += nicePawn.KFPRI.clientVeteranSkill.static.AddCarryMaxWeight(nicePawn.KFPRI);
} }
function static SkillSelected(NicePlayerController nicePlayer){ function static SkillSelected(NicePlayerController nicePlayer){

View File

@ -50,24 +50,35 @@ static function bool HasSkill(NicePlayerController nicePlayer, class<NiceSkill>
return true; return true;
return false; return false;
} }
static function bool SomeoneHasSkill(NicePlayerController player, class<NiceSkill> skill){
static function bool SomeoneHasSkill(NicePlayerController player, class<NiceSkill> skill)
{
local int i; local int i;
local Controller P; local Controller P;
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
if(player == none)
if (player == none)
return false; return false;
if(player.Pawn.Role == ROLE_Authority) // added pawn check coz of log spam
for(P = player.Level.ControllerList; P != none; P = P.nextController){ if (player.Pawn != none && player.Pawn.Role == ROLE_Authority)
{
for(P = player.Level.ControllerList; P != none; P = P.nextController)
{
nicePlayer = NicePlayerController(P); nicePlayer = NicePlayerController(P);
if(nicePlayer != none && HasSkill(nicePlayer, skill) && nicePlayer.Pawn.Health > 0 && !nicePlayer.Pawn.bPendingDelete if (nicePlayer != none && HasSkill(nicePlayer, skill) && nicePlayer.Pawn.Health > 0 && !nicePlayer.Pawn.bPendingDelete
&& nicePlayer.PlayerReplicationInfo.Team == player.PlayerReplicationInfo.Team) && nicePlayer.PlayerReplicationInfo.Team == player.PlayerReplicationInfo.Team)
return true; return true;
} }
else for(i = 0;i < player.broadcastedSkills.Length;i ++) }
if(player.broadcastedSkills[i] == skill) else
{
for (i = 0;i < player.broadcastedSkills.Length;i ++)
if (player.broadcastedSkills[i] == skill)
return true; return true;
}
return false; return false;
} }
// Checks if player will automatically chose given skill at the next opportunity // Checks if player will automatically chose given skill at the next opportunity
static function bool IsSkillPending(NicePlayerController nicePlayer, class<NiceSkill> skill){ static function bool IsSkillPending(NicePlayerController nicePlayer, class<NiceSkill> skill){
local int i; local int i;

View File

@ -1,11 +1,11 @@
class NiceDamTypePipeBomb extends NiceWeaponDamageType; class NiceDamTypePipeBomb extends NiceWeaponDamageType;
static function GetHitEffects(out class<xEmitter> HitEffects[4], int VictimHealth) static function GetHitEffects(out class<xEmitter> HitEffects[4], int VictimHealth)
{ {
HitEffects[0] = class'HitSmoke'; HitEffects[0] = class'HitSmoke';
if(VictimHealth <= 0) if(VictimHealth <= 0)
HitEffects[1] = class'KFHitFlame'; HitEffects[1] = class'KFHitFlame';
else if (FRand() < 0.8) else if (FRand() < 0.8)
HitEffects[1] = class'KFHitFlame'; HitEffects[1] = class'KFHitFlame';
} }
defaultproperties defaultproperties
{ {

View File

@ -2,22 +2,22 @@
class NiceCryoNadeCloud extends Emitter; class NiceCryoNadeCloud extends Emitter;
var bool bFlashed; var bool bFlashed;
simulated function PostBeginPlay(){ simulated function PostBeginPlay(){
super.PostBeginPlay(); super.PostBeginPlay();
NadeLight(); NadeLight();
} }
simulated function NadeLight(){ simulated function NadeLight(){
if(instigator == none) return; if(instigator == none) return;
if(Level.bDropDetail) return; if(Level.bDropDetail) return;
if( (Level.TimeSeconds - LastRenderTime < 0.2) if( (Level.TimeSeconds - LastRenderTime < 0.2)
|| (PlayerController(instigator.controller) != none)){ || (PlayerController(instigator.controller) != none)){
bDynamicLight = true; bDynamicLight = true;
SetTimer(0.25, false); SetTimer(0.25, false);
} }
else else
Timer(); Timer();
} }
simulated function Timer(){ simulated function Timer(){
bDynamicLight = false; bDynamicLight = false;
} }
defaultproperties defaultproperties
{ {

View File

@ -42,10 +42,11 @@ defaultproperties
FireCrouchAltAnims(1)="CHFire_M14" FireCrouchAltAnims(1)="CHFire_M14"
FireCrouchAltAnims(2)="CHFire_M14" FireCrouchAltAnims(2)="CHFire_M14"
FireCrouchAltAnims(3)="CHFire_M14" FireCrouchAltAnims(3)="CHFire_M14"
HitAnims(0)="HitF_M14" // was "HitF_M14" and was log spamming like hell
HitAnims(1)="HitB_M14" HitAnims(0)="HitR_M14_EBR"
HitAnims(2)="HitL_M14" HitAnims(1)="HitR_M14_EBR"
HitAnims(3)="HitR_M14" HitAnims(2)="HitR_M14_EBR"
HitAnims(3)="HitR_M14_EBR"
PostFireBlendStandAnim="Blend_M14" PostFireBlendStandAnim="Blend_M14"
PostFireBlendCrouchAnim="CHBlend_M14" PostFireBlendCrouchAnim="CHBlend_M14"
MeshRef="KF_Weapons3rd2_Trip.M14_EBR_3rd" MeshRef="KF_Weapons3rd2_Trip.M14_EBR_3rd"

View File

@ -23,12 +23,19 @@ simulated function Tick(float DeltaTime) {
} }
} }
} }
function Touch(Actor Other) {
function Touch(Actor Other)
{
if (Other == none)
return;
super.Touch(Other); super.Touch(Other);
if (Other.IsA('ShotgunBullet')) { if (Other.IsA('ShotgunBullet'))
{
ShotgunBullet(Other).Damage = 0; ShotgunBullet(Other).Damage = 0;
} }
} }
function RangedAttack(Actor A) { function RangedAttack(Actor A) {
local int LastFireTime; local int LastFireTime;
if ( bShotAnim ) if ( bShotAnim )

View File

@ -77,13 +77,14 @@ simulated function CloakStalker()
SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true);
} }
} }
simulated function UnCloakStalker() simulated function UnCloakStalker()
{ {
if( bZapped ) if (bZapped)
{ {
return; return;
} }
if( !bCrispified ) if (!bCrispified)
{ {
LastUncloakTime = Level.TimeSeconds; LastUncloakTime = Level.TimeSeconds;
@ -92,8 +93,9 @@ simulated function UnCloakStalker()
bUnlit = false; bUnlit = false;
// 25% chance of our Enemy saying something about us being invisible // 25% chance of our Enemy saying something about us being invisible
if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && // added Controller check here
PlayerController(Controller.Enemy.Controller)!=none ) if (Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller != none && Controller.Enemy!=none &&
PlayerController(Controller.Enemy.Controller)!=none)
{ {
PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, "");
KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; KFGameType(Level.Game).bDidStalkerInvisibleMessage = true;
@ -115,6 +117,7 @@ simulated function UnCloakStalker()
} }
} }
} }
simulated function SetZappedBehavior() simulated function SetZappedBehavior()
{ {
super(NiceMonster).SetZappedBehavior(); super(NiceMonster).SetZappedBehavior();
@ -173,25 +176,34 @@ simulated function int AttackAndMoveDoAnimAction( name AnimName ) {
} }
return super.DoAnimAction( AnimName ); return super.DoAnimAction( AnimName );
} }
function bool MeleeDamageTarget(int hitdamage, vector pushdir) {
function bool MeleeDamageTarget(int hitdamage, vector pushdir)
{
local bool result; local bool result;
local float effectStrenght; local float effectStrenght;
local NiceHumanPawn targetPawn; local NiceHumanPawn targetPawn;
result = Super(NiceMonster).MeleeDamageTarget(hitdamage, pushdir);
targetPawn = NiceHumanPawn(Controller.Target); result = super(NiceMonster).MeleeDamageTarget(hitdamage, pushdir);
if(result && targetPawn != none){ // if true means we checked ctlr and ctrl.target != none
if(targetPawn.ShieldStrength > 100) if (result)
targetPawn = NiceHumanPawn(Controller.Target);
if (result && targetPawn != none)
{
if (targetPawn.ShieldStrength > 100)
return result; return result;
else if(targetPawn.ShieldStrength < 0) else if (targetPawn.ShieldStrength < 0)
effectStrenght = 1.0; effectStrenght = 1.0;
else else
effectStrenght = (100 - targetPawn.ShieldStrength) * 0.01; effectStrenght = (100 - targetPawn.ShieldStrength) * 0.01;
class'MeanReplicationInfo'.static class'MeanReplicationInfo'.static
.findSZri(targetPawn.PlayerReplicationInfo) .findSZri(targetPawn.PlayerReplicationInfo)
.setBleeding(Self, effectStrenght); .setBleeding(Self, effectStrenght);
} }
return result; return result;
} }
function RemoveHead() function RemoveHead()
{ {
Super(NiceMonster).RemoveHead(); Super(NiceMonster).RemoveHead();

View File

@ -1,5 +1,5 @@
class NiceDamTypePoundCrushed extends NiceZedMeleeDamageType class NiceDamTypePoundCrushed extends NiceZedMeleeDamageType
abstract; abstract;
defaultproperties defaultproperties
{ {
DeathString="%o was pounded by %k." DeathString="%o was pounded by %k."

View File

@ -232,6 +232,7 @@ function ClawDamageTarget()
PlaySound(MeleeAttackHitSound, SLOT_Interact, 1.25); PlaySound(MeleeAttackHitSound, SLOT_Interact, 1.25);
} }
} }
function bool ClawDamageSingleTarget(float UsedMeleeDamage, Actor ThisTarget) function bool ClawDamageSingleTarget(float UsedMeleeDamage, Actor ThisTarget)
{ {
local Pawn HumanTarget; local Pawn HumanTarget;
@ -239,6 +240,11 @@ function bool ClawDamageSingleTarget(float UsedMeleeDamage, Actor ThisTarget)
local bool bHitSomeone; local bool bHitSomeone;
local float EnemyAngle; local float EnemyAngle;
local vector PushForceVar; local vector PushForceVar;
// fix log spam
if (Controller == none || ThisTarget == none)
return false;
EnemyAngle = Normal(ThisTarget.Location - Location) dot vector(Rotation); EnemyAngle = Normal(ThisTarget.Location - Location) dot vector(Rotation);
if (EnemyAngle > 0) if (EnemyAngle > 0)
{ {
@ -272,6 +278,7 @@ function bool ClawDamageSingleTarget(float UsedMeleeDamage, Actor ThisTarget)
} }
return bHitSomeone; return bHitSomeone;
} }
function StartCharging() function StartCharging()
{ {
// How many times should we hit before we cool down? // How many times should we hit before we cool down?

View File

@ -156,16 +156,31 @@ defaultproperties
WalkAnims(1)="ZombieScuttleB" WalkAnims(1)="ZombieScuttleB"
WalkAnims(2)="ZombieScuttleL" WalkAnims(2)="ZombieScuttleL"
WalkAnims(3)="ZombieScuttleR" WalkAnims(3)="ZombieScuttleR"
AirAnims(0)="ZombieSpring" // steves dont have "jump" animation
AirAnims(1)="ZombieSpring" // https://github.com/poosh/KF-ScrnZedPack/blob/master/Classes/ZedBaseCrawler.uc
AirAnims(2)="ZombieSpring" AirAnims(0)="ZombieLeapIdle"
AirAnims(3)="ZombieSpring" AirAnims(1)="ZombieLeapIdle"
AirAnims(2)="ZombieLeapIdle"
AirAnims(3)="ZombieLeapIdle"
TakeoffAnims(0)="ZombieSpring" TakeoffAnims(0)="ZombieSpring"
TakeoffAnims(1)="ZombieSpring" TakeoffAnims(1)="ZombieSpring"
TakeoffAnims(2)="ZombieSpring" TakeoffAnims(2)="ZombieSpring"
TakeoffAnims(3)="ZombieSpring" TakeoffAnims(3)="ZombieSpring"
AirStillAnim="ZombieSpring" LandAnims(0)="Landed"
TakeoffStillAnim="ZombieLeapIdle" LandAnims(1)="Landed"
LandAnims(2)="Landed"
LandAnims(3)="Landed"
// these should not use but just in case
DoubleJumpAnims(0)="ZombieSpring"
DoubleJumpAnims(1)="ZombieSpring"
DoubleJumpAnims(2)="ZombieSpring"
DoubleJumpAnims(3)="ZombieSpring"
DodgeAnims(0)="ZombieSpring"
DodgeAnims(1)="ZombieSpring"
DodgeAnims(2)="ZombieSpring"
DodgeAnims(3)="ZombieSpring"
AirStillAnim="Jump2"
TakeoffStillAnim="ZombieSpring"
IdleCrouchAnim="ZombieLeapIdle" IdleCrouchAnim="ZombieLeapIdle"
IdleWeaponAnim="ZombieLeapIdle" IdleWeaponAnim="ZombieLeapIdle"
IdleRestAnim="ZombieLeapIdle" IdleRestAnim="ZombieLeapIdle"

View File

@ -445,6 +445,32 @@ static simulated function PreCacheMaterials(LevelInfo myLevel)
myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.siren_hair'); myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.siren_hair');
myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.siren_hair_fb'); myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.siren_hair_fb');
} }
// DEAD sirens can NOT spawn scream emitter
simulated function PlayDying(class<DamageType> DamageType, vector HitLoc)
{
super.PlayDying(DamageType, HitLoc);
// yea, stop all animations on dead zed
StopAnimating();
}
state ZombieDying
{
ignores AnimEnd, Trigger, Bump, HitWall, HeadVolumeChange, PhysicsVolumeChange, Falling, BreathTimer, Died, RangedAttack;
simulated function BeginState()
{
// yea, stop all animations on dead zed
StopAnimating();
super.BeginState();
}
}
defaultproperties defaultproperties
{ {
screamTimings(0)=0.420000 screamTimings(0)=0.420000

View File

@ -115,13 +115,14 @@ simulated function CloakStalker()
SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true);
} }
} }
simulated function UnCloakStalker() simulated function UnCloakStalker()
{ {
if( bZapped ) if (bZapped)
{ {
return; return;
} }
if( !bCrispified ) if (!bCrispified)
{ {
LastUncloakTime = Level.TimeSeconds; LastUncloakTime = Level.TimeSeconds;
@ -130,8 +131,9 @@ simulated function UnCloakStalker()
bUnlit = false; bUnlit = false;
// 25% chance of our Enemy saying something about us being invisible // 25% chance of our Enemy saying something about us being invisible
if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && // added Controller check here
PlayerController(Controller.Enemy.Controller)!=none ) if (Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller != none && Controller.Enemy!=none &&
PlayerController(Controller.Enemy.Controller) != none )
{ {
PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, "");
KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; KFGameType(Level.Game).bDidStalkerInvisibleMessage = true;
@ -153,6 +155,7 @@ simulated function UnCloakStalker()
} }
} }
} }
// Set the zed to the zapped behavior // Set the zed to the zapped behavior
simulated function SetZappedBehavior() simulated function SetZappedBehavior()
{ {

View File

@ -536,16 +536,23 @@ simulated function NonRelevantSpeedupTick(float deltaTime){
SetGroundSpeed(GetOriginalGroundSpeed()); SetGroundSpeed(GetOriginalGroundSpeed());
} }
} }
// Kill zed if it has been bleeding long enough // Kill zed if it has been bleeding long enough
simulated function BleedOutTick(float deltaTick){ simulated function BleedOutTick(float deltaTick)
if(Role < ROLE_Authority || !bDecapitated) return; {
if(BleedOutTime <= 0 || Level.TimeSeconds < BleedOutTime) return; if (Role < ROLE_Authority || !bDecapitated)
if(LastDamagedBy != none) return;
Died(LastDamagedBy.Controller, class'DamTypeBleedOut', Location); if (BleedOutTime <= 0 || Level.TimeSeconds < BleedOutTime)
else return;
Died(none, class'DamTypeBleedOut', Location); if (LastDamagedBy != none)
BleedOutTime = 0; Died(LastDamagedBy.Controller, class'DamTypeBleedOut', Location);
// else we can say we killed ourselves, none -> controller (self)
// P.S. we really need to use Suicide here D:
else
Died(controller, class'DamTypeBleedOut', Location);
BleedOutTime = 0;
} }
// FX-stuff TWI did in the tick, unchanged // FX-stuff TWI did in the tick, unchanged
simulated function TWIFXTick(float deltaTime){ simulated function TWIFXTick(float deltaTime){
if(Level.netMode == NM_DedicatedServer) return; if(Level.netMode == NM_DedicatedServer) return;
@ -1077,19 +1084,27 @@ function DealBodyDamage(int damage,
damageType, headshotLevel); damageType, headshotLevel);
MakeNoise(1.0); MakeNoise(1.0);
} }
function Died( Controller killer, function Died( Controller killer,
class<DamageType> damageType, class<DamageType> damageType,
vector HitLocation){ vector HitLocation)
local bool bHasManiac; {
local NiceHumanPawn nicePawn; local bool bHasManiac;
bHasManiac = class'NiceVeterancyTypes'.static. local NiceHumanPawn nicePawn;
HasSkill(NicePlayerController(killer), class'NiceSkillDemoManiac');
nicePawn = NiceHumanPawn(killer.pawn); if (killer != none || (Controller != none && killer != Controller))
if(bHasManiac && nicePawn != none) {
nicePawn.maniacTimeout = bHasManiac = class'NiceVeterancyTypes'.static.
class'NiceSkillDemoManiac'.default.reloadBoostTime; HasSkill(NicePlayerController(killer), class'NiceSkillDemoManiac');
super.Died(killer, damageType, HitLocation); nicePawn = NiceHumanPawn(killer.pawn);
if (bHasManiac && nicePawn != none)
nicePawn.maniacTimeout =
class'NiceSkillDemoManiac'.default.reloadBoostTime;
}
super.Died(killer, damageType, HitLocation);
} }
simulated function SetTearOffMomemtum(vector NewMomentum){ simulated function SetTearOffMomemtum(vector NewMomentum){
TearOffMomentum = NewMomentum; TearOffMomentum = NewMomentum;
TearOffMomentumX = NewMomentum.X; TearOffMomentumX = NewMomentum.X;
@ -2130,6 +2145,27 @@ simulated function DisableCollisions()
} }
// Setters for extra collision cylinders
simulated function ToggleAuxCollision(bool newbCollision)
{
if (MyExtCollision == none)
{
log(">> NiceMonster -> ToggleAuxCollision(" $ newbCollision $ ") -> MyExtCollision was none!!!");
return;
}
if (!newbCollision)
{
SavedExtCollision = MyExtCollision.bCollideActors;
MyExtCollision.SetCollision(false);
}
else
{
MyExtCollision.SetCollision(SavedExtCollision);
}
}
defaultproperties defaultproperties
{ {
stunDurationMultiplier=0.5 stunDurationMultiplier=0.5

View File

@ -16,8 +16,8 @@
class NiceMonsterController extends KFMonsterController; class NiceMonsterController extends KFMonsterController;
// Just reset threat assesment flag, since it's not used in NicePack // Just reset threat assesment flag, since it's not used in NicePack
function PostBeginPlay(){ function PostBeginPlay(){
super.PostBeginPlay(); super.PostBeginPlay();
bUseThreatAssessment = true; bUseThreatAssessment = true;
} }
event bool NotifyBump(Actor other){ event bool NotifyBump(Actor other){
local Pawn otherPawn; local Pawn otherPawn;