Menus overhaul #14

Merged
dkanus merged 30 commits from :somechanges into master 2022-01-23 22:14:51 +03:00
30 changed files with 994 additions and 648 deletions

View File

@ -6,6 +6,44 @@ All notable changes to this project will be documented in this file.
List of changes for version 0.2.0 may be incomplete. List of changes for version 0.2.0 may be incomplete.
Weapon and perk changes are described relative to ScrN versions. Weapon and perk changes are described relative to ScrN versions.
## [Update 404] - 00.00.2022
### General
- NicePakc bundle is now in 7z.
- Code break: `meanreplicationinfo` disabled.
- Less scrnbalance hardcode.
- TSC and all it's classes removed.
- README, changelog, file directory updates.
- HUGE amount of accessed none fixes.
- Tabs -> x4 spaces.
- All hardcoded classes / subobjects removed. Now Kaio can compile his fpp 😂
#### Zeds
- Disable all zed collisions on death. Now jumping crawlers, running gorefasts won't interupt your movement.
- Siren has faster iterator.
- Siren won't spawn emitter on death.
- Siren won't scream at low hp zeds, will try to melee instead.
- Husk doesn't shoot if headless, dying, falling, being moved by other husks.
- Husk ignores zeds that the he can't actually see.
- Husk's projectile won't detonate multiple times during slomo.
### GUI
- New lobby footer from base class. New fancy buttons!
- New lobby menu! Much cleaner and doesn't have ad square.
- Skill menu has new backgrounds.
- NiceGUISettings: New dropdown list to control Commando's zed health bars:
- All zeds.
- Only big zeds (>1000hp).
- Disabled.
### Weapons
- Fix for nade throwing if you hold non nice weapon.
- Machete pickup removed, axe spawns instead.
## [Update 008] - 14.01.2022 ## [Update 008] - 14.01.2022
### Changed ### Changed

View File

@ -4,7 +4,7 @@ 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.zip> The link to the compiled NicePack, along with all necessary files, is here: <http://www.insultplayers.ru/killingfloor/downloads/nicepack/NiceBundle.7z>
## Config Files ## Config Files

View File

@ -0,0 +1,13 @@
class NiceGUICheckBoxButton extends GUICheckBoxButton;
defaultproperties
{
CheckedOverlay(0)=Texture'KF_InterfaceArt_tex.Menu.Checkbox' // checked
CheckedOverlay(1)=Texture'KF_InterfaceArt_tex.Menu.checkbox_highlight' // checked, mouse over
CheckedOverlay(2)=Texture'KF_InterfaceArt_tex.Menu.checkbox_highlight' // checked, focused
CheckedOverlay(3)=Texture'KF_InterfaceArt_tex.Menu.checkbox_dark' // checked, clicked
CheckedOverlay(4)=Texture'KF_InterfaceArt_tex.Menu.checkbox_dark' // checked, disabled
ImageIndex=0
bAllOverlay=False
StyleName="CheckBox"
}

View File

@ -1,27 +1,61 @@
class NiceGUISettings extends Settings_Tabs; class NiceGUISettings extends UT2K4TabPanel;
//var automated GUIButton skillButtonA;
var array<string> ForceProjItems; // GENERAL WEAPON SETTINGS
var automated GUISectionBackground bg_WEAP;
var automated moCheckBox ch_WeapManagement; var automated moCheckBox ch_WeapManagement;
var automated moCheckBox ch_AltSwitches; var automated moCheckBox ch_AltSwitches;
var automated moCheckBox ch_DispCounters; var automated moCheckBox ch_DispCounters;
var automated moCheckBox ch_DisWeapProgress; var automated moCheckBox ch_DisWeapProgress;
var automated moCheckBox ch_ShowHLMessages; var automated moCheckBox ch_ShowHLMessages;
// WEAPON RELOAD SETTINGS
var automated GUISectionBackground bg_RELOAD;
var automated moCheckBox ch_CancelFire; var automated moCheckBox ch_CancelFire;
var automated moCheckBox ch_CancelSwitching; var automated moCheckBox ch_CancelSwitching;
var automated moCheckBox ch_CancelNades; var automated moCheckBox ch_CancelNades;
var automated moCheckBox ch_CancelAiming; var automated moCheckBox ch_CancelAiming;
var automated moCheckBox ch_ReloadWontWork; var automated moCheckBox ch_ReloadWontWork;
var automated GUISectionBackground bg_WEAP;
var automated GUISectionBackground bg_RELOAD; // RANDOM SETTINGS
function InitComponent(GUIController MyController, GUIComponent MyOwner){ var automated GUISectionBackground bg_RANDOM;
var automated MoComboBox mo_ZedHPBars;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
super.InitComponent(MyController, MyOwner); super.InitComponent(MyController, MyOwner);
mo_ZedHPBars.AddItem("Big Zeds");
mo_ZedHPBars.AddItem("All Zeds");
mo_ZedHPBars.AddItem("Disable");
// GENERAL WEAPON SETTINGS
bg_WEAP.ManageComponent(ch_WeapManagement);
bg_WEAP.ManageComponent(ch_AltSwitches);
bg_WEAP.ManageComponent(ch_DispCounters);
bg_WEAP.ManageComponent(ch_DisWeapProgress);
bg_WEAP.ManageComponent(ch_ShowHLMessages);
// WEAPON RELOAD SETTINGS
bg_RELOAD.ManageComponent(ch_CancelFire);
bg_RELOAD.ManageComponent(ch_CancelSwitching);
bg_RELOAD.ManageComponent(ch_CancelNades);
bg_RELOAD.ManageComponent(ch_CancelAiming);
bg_RELOAD.ManageComponent(ch_ReloadWontWork);
// RANDOM SETTINGS
bg_RANDOM.ManageComponent(mo_ZedHPBars);
} }
function InternalOnLoadINI(GUIComponent sender, string s){
function InternalOnLoadINI(GUIComponent sender, string s)
{
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
nicePlayer = NicePlayerController(PlayerOwner()); nicePlayer = NicePlayerController(PlayerOwner());
if(nicePlayer == none) if (nicePlayer == none)
return; return;
switch(sender){
switch(sender)
{
case ch_WeapManagement: case ch_WeapManagement:
ch_WeapManagement.Checked(nicePlayer.bNiceWeaponManagement); ch_WeapManagement.Checked(nicePlayer.bNiceWeaponManagement);
break; break;
@ -52,15 +86,22 @@ function InternalOnLoadINI(GUIComponent sender, string s){
case ch_ReloadWontWork: case ch_ReloadWontWork:
ch_ReloadWontWork.Checked(nicePlayer.bFlagUseServerReload); ch_ReloadWontWork.Checked(nicePlayer.bFlagUseServerReload);
break; break;
case mo_ZedHPBars:
mo_ZedHPBars.SetIndex(nicePlayer.ZedHPBarStyle);
break;
} }
} }
function InternalOnChange(GUIComponent Sender){
function InternalOnChange(GUIComponent Sender)
{
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
super.InternalOnChange(Sender);
nicePlayer = NicePlayerController(PlayerOwner()); nicePlayer = NicePlayerController(PlayerOwner());
if(nicePlayer == none) if (nicePlayer == none)
return; return;
switch(sender){
switch(sender)
{
case ch_WeapManagement: case ch_WeapManagement:
nicePlayer.bNiceWeaponManagement = ch_WeapManagement.IsChecked(); nicePlayer.bNiceWeaponManagement = ch_WeapManagement.IsChecked();
break; break;
@ -91,183 +132,85 @@ function InternalOnChange(GUIComponent Sender){
case ch_ReloadWontWork: case ch_ReloadWontWork:
nicePlayer.ServerSetUseServerReload(ch_ReloadWontWork.IsChecked()); nicePlayer.ServerSetUseServerReload(ch_ReloadWontWork.IsChecked());
break; break;
case mo_ZedHPBars:
nicePlayer.ZedHPBarStyle = mo_ZedHPBars.GetIndex();
break;
} }
nicePlayer.ClientSaveConfig(); nicePlayer.ClientSaveConfig();
} }
// size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865) // size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865)
// tab order // tab order
defaultproperties defaultproperties
{ {
Begin Object Class=moCheckBox Name=WeaponManagement // GENERAL WEAPON SETTINGS
CaptionWidth=0.955000
Caption="Nice weapon management"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=WeaponManagement.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, NicePack will use it's own system to manage weapon switching"
WinTop=0.050000
WinLeft=0.012500
WinWidth=0.278000
TabOrder=4
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_WeapManagement=WeaponManagement
Begin Object Class=moCheckBox Name=AltSwitches
CaptionWidth=0.955000
Caption="Alt fire switches modes"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=AltSwitches.InternalOnCreateComponent
IniOption="@Internal"
Hint="Assault-rifle only; if enabled - alt fire button switches between fire modes, otherwise - acts as an alt fire"
WinTop=0.100000
WinLeft=0.012500
WinWidth=0.278000
TabOrder=6
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_AltSwitches=AltSwitches
Begin Object Class=moCheckBox Name=DispCounters
CaptionWidth=0.955000
Caption="Display counters"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=DispCounters.InternalOnCreateComponent
IniOption="@Internal"
Hint="Toggles display of the various counters used by skills"
WinTop=0.150000
WinLeft=0.012500
WinWidth=0.278000
TabOrder=7
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_DispCounters=DispCounters
Begin Object Class=moCheckBox Name=DispWeapProgress
CaptionWidth=0.955000
Caption="Display weapon progress"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=DispWeapProgress.InternalOnCreateComponent
IniOption="@Internal"
Hint="Displays weapon progress rate, however it's defined by a skill that's using this functionality"
WinTop=0.200000
WinLeft=0.012500
WinWidth=0.278000
TabOrder=8
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_DisWeapProgress=DispWeapProgress
Begin Object Class=moCheckBox Name=ShowHLMessages
CaptionWidth=0.955000
Caption="Show Hardcore Level messages"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=ShowHLMessages.InternalOnCreateComponent
IniOption="@Internal"
Hint="Enable to be notified each time Hardcore Level is changed"
WinTop=0.300000
WinLeft=0.012500
WinWidth=0.278000
TabOrder=9
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_ShowHLMessages=ShowHLMessages
Begin Object Class=moCheckBox Name=CancelFire
CaptionWidth=0.955000
Caption="Cancel reload by shooting"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=CancelFire.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by shooting (when you have ammo)"
WinTop=0.050000
WinLeft=0.517500
WinWidth=0.287000
TabOrder=11
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelFire=CancelFire
Begin Object Class=moCheckBox Name=CancelSwitching
CaptionWidth=0.955000
Caption="Cancel reload by switching weapons"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=CancelSwitching.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by switching to different weapon"
WinTop=0.100000
WinLeft=0.517500
WinWidth=0.287000
TabOrder=12
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelSwitching=CancelSwitching
Begin Object Class=moCheckBox Name=CancelNades
CaptionWidth=0.955000
Caption="Cancel reload by throwing grenades"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=CancelNades.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by throwing a grenade"
WinTop=0.150000
WinLeft=0.517500
WinWidth=0.287000
TabOrder=13
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelNades=CancelNades
Begin Object Class=moCheckBox Name=CancelAiming
CaptionWidth=0.955000
Caption="Cancel reload by aiming"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=CancelAiming.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by going into iron sights (when you have ammo)"
WinTop=0.200000
WinLeft=0.517500
WinWidth=0.287000
TabOrder=14
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelAiming=CancelAiming
Begin Object Class=moCheckBox Name=ServerReload
CaptionWidth=0.955000
Caption="My reload doesn't work"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=ServerReload.InternalOnCreateComponent
IniOption="@Internal"
Hint="Check this option ONLY in case converted weapons don't reload at all for you; this option should fix the problem, but then latency will affect both reload and active reload"
WinTop=0.250000
WinLeft=0.517500
WinWidth=0.287000
TabOrder=15
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_ReloadWontWork=ServerReload
Begin Object Class=GUISectionBackground Name=WEAPBG Begin Object Class=GUISectionBackground Name=WEAPBG
Caption="General weapon settings" Caption="General weapon settings"
WinTop=0.012500 WinTop=0.012500
WinWidth=0.495000 WinWidth=0.495000
WinHeight=0.287500 WinHeight=0.287500
RenderWeight=0.100100 RenderWeight=0.100100
OnPreDraw=WeaponsBG.InternalPreDraw // OnPreDraw=WeaponsBG.InternalPreDraw
OnPreDraw=WEAPBG.InternalPreDraw
End Object End Object
bg_WEAP=WEAPBG bg_WEAP=WEAPBG
Begin Object Class=moCheckBox Name=WeaponManagement
Caption="Nice weapon management"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=WeaponManagement.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, NicePack will use it's own system to manage weapon switching"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_WeapManagement=WeaponManagement
Begin Object Class=moCheckBox Name=AltSwitches
Caption="Alt fire switches modes"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=AltSwitches.InternalOnCreateComponent
IniOption="@Internal"
Hint="Assault-rifle only; if enabled - alt fire button switches between fire modes, otherwise - acts as an alt fire"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_AltSwitches=AltSwitches
Begin Object Class=moCheckBox Name=DispCounters
Caption="Display counters"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=DispCounters.InternalOnCreateComponent
IniOption="@Internal"
Hint="Toggles display of the various counters used by skills"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_DispCounters=DispCounters
Begin Object Class=moCheckBox Name=DispWeapProgress
Caption="Display weapon progress"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=DispWeapProgress.InternalOnCreateComponent
IniOption="@Internal"
Hint="Displays weapon progress rate, however it's defined by a skill that's using this functionality"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_DisWeapProgress=DispWeapProgress
Begin Object Class=moCheckBox Name=ShowHLMessages
Caption="Show Hardcore Level messages"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=ShowHLMessages.InternalOnCreateComponent
IniOption="@Internal"
Hint="Enable to be notified each time Hardcore Level is changed"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_ShowHLMessages=ShowHLMessages
// WEAPON RELOAD SETTINGS
Begin Object Class=GUISectionBackground Name=RELOADBG Begin Object Class=GUISectionBackground Name=RELOADBG
Caption="Weapon reload settings" Caption="Weapon reload settings"
WinTop=0.012500 WinTop=0.012500
@ -275,7 +218,87 @@ defaultproperties
WinWidth=0.495000 WinWidth=0.495000
WinHeight=0.287500 WinHeight=0.287500
RenderWeight=0.100100 RenderWeight=0.100100
OnPreDraw=WeaponsBG.InternalPreDraw // OnPreDraw=WeaponsBG.InternalPreDraw
OnPreDraw=RELOADBG.InternalPreDraw
End Object End Object
bg_RELOAD=RELOADBG bg_RELOAD=RELOADBG
Begin Object Class=moCheckBox Name=CancelFire
Caption="Cancel reload by shooting"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=CancelFire.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by shooting (when you have ammo)"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelFire=CancelFire
Begin Object Class=moCheckBox Name=CancelSwitching
Caption="Cancel reload by switching weapons"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=CancelSwitching.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by switching to different weapon"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelSwitching=CancelSwitching
Begin Object Class=moCheckBox Name=CancelNades
Caption="Cancel reload by throwing grenades"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=CancelNades.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by throwing a grenade"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelNades=CancelNades
Begin Object Class=moCheckBox Name=CancelAiming
Caption="Cancel reload by aiming"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=CancelAiming.InternalOnCreateComponent
IniOption="@Internal"
Hint="If checked, you'll be able to cancel reload of converted weapons by going into iron sights (when you have ammo)"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_CancelAiming=CancelAiming
Begin Object Class=moCheckBox Name=ServerReload
Caption="My reload doesn't work"
ComponentClassName="NicePack.NiceGUICheckBoxButton"
OnCreateComponent=ServerReload.InternalOnCreateComponent
IniOption="@Internal"
Hint="Check this option ONLY in case converted weapons don't reload at all for you; this option should fix the problem, but then latency will affect both reload and active reload"
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
ch_ReloadWontWork=ServerReload
// RANDOM SETTINGS
Begin Object Class=GUISectionBackground Name=randbg
Caption="Random settings"
WinTop=0.300000
WinWidth=0.495000
WinHeight=0.287500
WinLeft=0.505000
RenderWeight=0.100100
// OnPreDraw=WeaponsBG.InternalPreDraw
OnPreDraw=randbg.InternalPreDraw
End Object
bg_RANDOM=randbg
Begin Object class=moComboBox Name=zedhbarpmethod
bReadOnly=true
CaptionWidth=0.000000
Caption="Zed health bars"
Hint="Choose what health bars you want to see"
OnCreateComponent=zedhbarpmethod.InternalOnCreateComponent
OnChange=NiceGUISettings.InternalOnChange
OnLoadINI=NiceGUISettings.InternalOnLoadINI
End Object
mo_ZedHPBars=zedhbarpmethod
} }

View File

@ -12,33 +12,66 @@ var float size;
var float InventoryBoxWidth; var float InventoryBoxWidth;
var float InventoryBoxHeight; var float InventoryBoxHeight;
var float BorderSize; var float BorderSize;
event NotifyLevelChange(){
event NotifyLevelChange()
{
Master.RemoveInteraction(self); Master.RemoveInteraction(self);
} }
function RegisterMutator(NicePack activePack){
function RegisterMutator(NicePack activePack)
{
NicePackMutator = activePack; NicePackMutator = activePack;
} }
function bool isPoisoned(ScrnHumanPawn pwn){
final private function bool bIsPoisoned(ScrnHumanPawn pwn)
{
local Inventory I; local Inventory I;
if(pwn.Inventory != none)
for(I = pwn.Inventory; I != none; I = I.Inventory) if (pwn.Inventory != none)
if(I != none && MeanPoisonInventory(I) != none) {
for (I = pwn.Inventory; I != none; I = I.Inventory)
{
if (MeanPoisonInventory(I) != none)
return true; return true;
}
}
return false; return false;
} }
function PostRender(Canvas C){
final private function bool bIsBleeding(ScrnHumanPawn pwn)
{
local Inventory I;
if (pwn.Inventory != none)
{
for (I = pwn.Inventory; I != none; I = I.Inventory)
{
if (MeanBleedInventory(I) != none)
return true;
}
}
return false;
}
function PostRender(Canvas C)
{
local int i; local int i;
local NicePack niceMutator; local NicePack niceMutator;
local NiceHumanPawn nicePawn; local NiceHumanPawn nicePawn;
local class<NiceVeterancyTypes> niceVet; local class<NiceVeterancyTypes> niceVet;
local MeanReplicationInfo szRI;
local NiceWeapon niceWeap; local NiceWeapon niceWeap;
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
local ScrnHUD scrnHUDInstance; local ScrnHUD scrnHUDInstance;
// TODO maybe use scrnhud?
local HUDKillingFloor kfHud;
local Texture barTexture; local Texture barTexture;
local int x, y, center, barWidth, offset; local int x, y, center, barWidth, offset;
local int missesWidth, missesHeight, missesSpace; local int missesWidth, missesHeight, missesSpace;
local int missesX, missesY; local int missesX, missesY;
local Vector CamPos, ViewDir;
local Rotator CamRot;
local float OffsetX, BarLength, BarHeight, XL, YL, posY;
if(C == none) return; if(C == none) return;
if(C.ViewPort == none) return; if(C.ViewPort == none) return;
if(C.ViewPort.Actor == none) return; if(C.ViewPort.Actor == none) return;
@ -48,25 +81,70 @@ function PostRender(Canvas C){
if(nicePlayer == none) if(nicePlayer == none)
return; return;
scrnHUDInstance = ScrnHUD(nicePlayer.myHUD); scrnHUDInstance = ScrnHUD(nicePlayer.myHUD);
//// Draw bleed and poison icons
szRI = class'MeanReplicationInfo'.static.findSZri(ViewportOwner.Actor.PlayerReplicationInfo); //// Draw bleed and poison icons for OWNER
offset = 4; offset = 4;
if(szRI != none){ // BLEED!!!
if(szRI.isBleeding){ if (bIsBleeding(ScrnHumanPawn(C.ViewPort.Actor.Pawn)))
{
x = C.ClipX * 0.007; x = C.ClipX * 0.007;
y = C.ClipY * 0.93 - size * offset; y = C.ClipY * 0.93 - size * offset;
C.SetPos(x, y); C.SetPos(x, y);
C.DrawTile(bleedIcon, size, size, 0, 0, bleedIcon.MaterialUSize(), bleedIcon.MaterialVSize()); C.DrawTile(bleedIcon, size, size, 0, 0, bleedIcon.MaterialUSize(), bleedIcon.MaterialVSize());
} }
offset++; offset++;
if(isPoisoned(ScrnHumanPawn(C.ViewPort.Actor.Pawn))){ // POISON!!!
if (bIsPoisoned(ScrnHumanPawn(C.ViewPort.Actor.Pawn)))
{
x = C.ClipX * 0.007; x = C.ClipX * 0.007;
y = C.ClipY * 0.93 - size * offset; y = C.ClipY * 0.93 - size * offset;
C.SetPos(x, y); C.SetPos(x, y);
C.DrawTile(poisonIcon, size, size, 0, 0, poisonIcon.MaterialUSize(), poisonIcon.MaterialVSize()); C.DrawTile(poisonIcon, size, size, 0, 0, poisonIcon.MaterialUSize(), poisonIcon.MaterialVSize());
} }
}
if(niceWeap != none && niceWeap.bShowSecondaryCharge && scrnHUDInstance != none){ // draw bleed and poison icons for TEAMMATES
// C.GetCAmeraLocation(CamPos, CamRot);
// ViewDir = vector(CamRot);
// kfHud = HUDKillingFloor(ViewportOwner.Actor.myHUD);
// OffsetX = (36.f * kfHud.default.VeterancyMatScaleFactor * 0.6) - (kfHud.default.HealthIconSize + 2.0);
// BarLength = FMin(kfHud.default.BarLength * (float(C.SizeX) / 1024.f), kfHud.default.BarLength);
// BarHeight = FMin(kfHud.default.BarHeight * (float(C.SizeX) / 1024.f), kfHud.default.BarHeight);
// for (i = 0; i < kfHUD.PlayerInfoPawns.Length; i++)
// {
// if (kfHUD.PlayerInfoPawns[i].Pawn != none && kfHUD.PlayerInfoPawns[i].Pawn.Health > 0 &&
// (kfHUD.PlayerInfoPawns[i].Pawn.Location - kfHUD.PawnOwner.Location) dot ViewDir > 0.8 &&
// kfHUD.PlayerInfoPawns[i].RendTime > ViewportOwner.Actor.Level.TimeSeconds)
// {
// C.StrLen(Left(kfHUD.PlayerInfoPawns[i].Pawn.PlayerReplicationInfo.PlayerName, 16), XL, YL);
// if (kfHUD.PlayerInfoPawns[i].Pawn.ShieldStrength <= 0)
// {
// posY = (kfHUD.PlayerInfoPawns[i].PlayerInfoScreenPosY - YL) - 2.75 * BarHeight -
// kfHUD.default.ArmorIconSize * 0.5;
// }
// else
// {
// posY = (kfHUD.PlayerInfoPawns[i].PlayerInfoScreenPosY - YL) - 3.8 * BarHeight -
// kfHUD.default.ArmorIconSize * 0.5;
// }
// offset = 0;
// if (bIsBleeding(ScrnHumanPawn(kfHUD.PlayerInfoPawns[i].Pawn)))
// {
// C.SetPos(kfHUD.PlayerInfoPawns[i].PlayerInfoScreenPosX - OffsetX - 0.15 * BarLength -
// kfHUD.default.ArmorIconSize - 2.0, posY);
// C.DrawTileScaled(bleedIcon, 0.1875, 0.1875);
// }
// if (bIsPoisoned(ScrnHumanPawn(kfHUD.PlayerInfoPawns[i].Pawn)))
// {
// C.SetPos(kfHUD.PlayerInfoPawns[i].PlayerInfoScreenPosX - OffsetX + 0.15 * BarLength -
// kfHUD.default.ArmorIconSize - 2.0, posY);
// C.DrawTileScaled(poisonIcon, 0.1875, 0.1875);
// }
// }
// }
if (niceWeap != none && niceWeap.bShowSecondaryCharge && scrnHUDInstance != none)
{
C.ColorModulate.X = 1; C.ColorModulate.X = 1;
C.ColorModulate.Y = 1; C.ColorModulate.Y = 1;
C.ColorModulate.Z = 1; C.ColorModulate.Z = 1;
@ -77,11 +155,13 @@ function PostRender(Canvas C){
scrnHUDInstance.SecondaryClipsDigits.value = niceWeap.secondaryCharge; scrnHUDInstance.SecondaryClipsDigits.value = niceWeap.secondaryCharge;
scrnHUDInstance.DrawNumericWidget(C, scrnHUDInstance.SecondaryClipsDigits, scrnHUDInstance.DigitsSmall); scrnHUDInstance.DrawNumericWidget(C, scrnHUDInstance.SecondaryClipsDigits, scrnHUDInstance.DigitsSmall);
} }
niceMutator = class'NicePack'.static.Myself(C.ViewPort.Actor.Pawn.Level); niceMutator = class'NicePack'.static.Myself(C.ViewPort.Actor.Pawn.Level);
if(niceMutator == none) if (niceMutator == none)
return; return;
//// Draw counters //// Draw counters
if(nicePlayer != none && nicePlayer.bFlagDisplayCounters){ if(nicePlayer != none && nicePlayer.bFlagDisplayCounters)
{
x = C.ClipX * 0.5 - (64 + 2) * niceMutator.GetVisibleCountersAmount(); x = C.ClipX * 0.5 - (64 + 2) * niceMutator.GetVisibleCountersAmount();
y = C.ClipY * 0.01; y = C.ClipY * 0.01;
for(i = 0;i < niceMutator.niceCounterSet.Length;i ++) for(i = 0;i < niceMutator.niceCounterSet.Length;i ++)
@ -91,7 +171,8 @@ function PostRender(Canvas C){
} }
} }
//// Draw weapons progress bars //// Draw weapons progress bars
if(nicePlayer != none && nicePlayer.bFlagDisplayWeaponProgress){ if(nicePlayer != none && nicePlayer.bFlagDisplayWeaponProgress)
{
x = C.ClipX - InventoryBoxWidth * C.ClipX - 5; x = C.ClipX - InventoryBoxWidth * C.ClipX - 5;
y = C.ClipY * 0.5 - 0.5 * (InventoryBoxHeight * C.ClipX + 4) * niceMutator.niceWeapProgressSet.Length; y = C.ClipY * 0.5 - 0.5 * (InventoryBoxHeight * C.ClipX + 4) * niceMutator.niceWeapProgressSet.Length;
for(i = 0;i < niceMutator.niceWeapProgressSet.Length;i ++){ for(i = 0;i < niceMutator.niceWeapProgressSet.Length;i ++){
@ -102,7 +183,8 @@ function PostRender(Canvas C){
} }
//// Draw invincibility bar //// Draw invincibility bar
nicePawn = NiceHumanPawn(nicePlayer.pawn); nicePawn = NiceHumanPawn(nicePlayer.pawn);
if(nicePawn != none && nicePawn.invincibilityTimer != 0.0){ if(nicePawn != none && nicePawn.invincibilityTimer != 0.0)
{
C.SetDrawColor(255, 255, 255); C.SetDrawColor(255, 255, 255);
if(nicePawn.invincibilityTimer > 0) if(nicePawn.invincibilityTimer > 0)
barTexture = greenBar; barTexture = greenBar;
@ -147,6 +229,7 @@ function PostRender(Canvas C){
for(i = 0;i < nicePlayer.abilityManager.currentAbilitiesAmount;i ++) for(i = 0;i < nicePlayer.abilityManager.currentAbilitiesAmount;i ++)
DrawAbilityCooldown(C, i); DrawAbilityCooldown(C, i);
} }
function DrawCounter(Canvas C, NicePack.CounterDisplay counter, int x, int y, TeamInfo team){ function DrawCounter(Canvas C, NicePack.CounterDisplay counter, int x, int y, TeamInfo team){
local float borderSpace; local float borderSpace;
local Texture textureToDraw; local Texture textureToDraw;

View File

@ -8,16 +8,16 @@ function InitComponent(GUIController MyController, GUIComponent MyOwner){
local SRMenuAddition M; local SRMenuAddition M;
local int indexAfterScrn; local int indexAfterScrn;
// Setup panel classes. // Setup panel classes.
Panels[0].ClassName = string(Class'ScrnBalanceSrv.ScrnTab_MidGamePerks'); Panels[0].ClassName = string(class'ScrnTab_MidGamePerks');
Panels[1].ClassName = string(class'NicePanelSkills'); Panels[1].ClassName = string(class'NicePanelSkills');
Panels[2].ClassName = string(Class'SRTab_MidGameVoiceChat'); Panels[2].ClassName = string(class'SRTab_MidGameVoiceChat');
Panels[3].ClassName = string(Class'SRTab_MidGameStats'); Panels[3].ClassName = string(class'SRTab_MidGameStats');
Panels[0].Caption = Class'KFInvasionLoginMenu'.Default.Panels[1].Caption; Panels[0].Caption = class'KFInvasionLoginMenu'.Default.Panels[1].Caption;
Panels[1].Caption = "Skills"; Panels[1].Caption = "Skills";
Panels[2].Caption = Class'KFInvasionLoginMenu'.Default.Panels[2].Caption; Panels[2].Caption = class'KFInvasionLoginMenu'.Default.Panels[2].Caption;
Panels[0].Hint = Class'KFInvasionLoginMenu'.Default.Panels[1].Hint; Panels[0].Hint = class'KFInvasionLoginMenu'.Default.Panels[1].Hint;
Panels[1].Hint = "Customize your perk"; Panels[1].Hint = "Customize your perk";
Panels[2].Hint = Class'KFInvasionLoginMenu'.Default.Panels[2].Hint; Panels[2].Hint = class'KFInvasionLoginMenu'.Default.Panels[2].Hint;
b_Spec.Caption=class'KFTab_MidGamePerks'.default.b_Spec.Caption; b_Spec.Caption=class'KFTab_MidGamePerks'.default.b_Spec.Caption;
b_MatchSetup.Caption=class'KFTab_MidGamePerks'.default.b_MatchSetup.Caption; b_MatchSetup.Caption=class'KFTab_MidGamePerks'.default.b_MatchSetup.Caption;
b_KickVote.Caption=class'KFTab_MidGamePerks'.default.b_KickVote.Caption; b_KickVote.Caption=class'KFTab_MidGamePerks'.default.b_KickVote.Caption;
@ -28,11 +28,12 @@ function InitComponent(GUIController MyController, GUIComponent MyOwner){
b_Settings.Caption=class'KFTab_MidGamePerks'.default.b_Settings.Caption; b_Settings.Caption=class'KFTab_MidGamePerks'.default.b_Settings.Caption;
b_Browser.Caption=class'KFTab_MidGamePerks'.default.b_Browser.Caption; b_Browser.Caption=class'KFTab_MidGamePerks'.default.b_Browser.Caption;
// Other panels // Other panels
Panels[4].ClassName = "ScrnBalanceSrv.ScrnTab_Achievements"; Panels[4].ClassName = string(class'ScrnTab_Achievements');
Panels[4].Caption = "Achievements"; Panels[4].Caption = "Achievements";
Panels[4].Hint = "ScrN server-side achievements"; Panels[4].Hint = "ScrN server-side achievements";
if(default.bShowScrnMenu){ if (default.bShowScrnMenu)
Panels[5].ClassName = "ScrnBalanceSrv.ScrnTab_UserSettings"; {
Panels[5].ClassName = string(class'ScrnTab_UserSettings');
Panels[5].Caption = "ScrN Features"; Panels[5].Caption = "ScrN Features";
Panels[5].Hint = "ScrN Balance features, settings and info"; Panels[5].Hint = "ScrN Balance features, settings and info";
indexAfterScrn = 6; indexAfterScrn = 6;

View File

@ -78,13 +78,29 @@ function InitComponent(GUIController MyC, GUIComponent MyO)
{ {
super(UT2k4MainPage).InitComponent(MyC, MyO); super(UT2k4MainPage).InitComponent(MyC, MyO);
i_Portrait.WinTop = PlayerPortraitBG.ActualTop() + 30; FixPortrait();
i_Portrait.WinHeight = PlayerPortraitBG.ActualHeight() - 36;
t_ChatBox.FocusInstead = PerkClickLabel; t_ChatBox.FocusInstead = PerkClickLabel;
} }
event ResolutionChanged(int ResX, int ResY)
{
super.ResolutionChanged(ResX, ResY);
FixPortrait();
}
// FUCKING TWI, YOUR FUCKING BUGS
final private function bool FixPortrait()
{
i_Portrait.WinTop = PlayerPortraitBG.RelativeTop(i_Portrait.WinTop); // ActualTop() + 30;
i_Portrait.WinHeight = PlayerPortraitBG.RelativeHeight(i_Portrait.WinHeight); // ActualHeight() - 36;
// log(">>> HideLobbyMenu: FixPortrait() called!!!");
return false;
}
// Called when the Menu Owner is opened // Called when the Menu Owner is opened
event Opened(GUIComponent Sender) event Opened(GUIComponent Sender)
{ {

View File

@ -1,15 +1,36 @@
class NicePanelSkills extends Settings_Tabs; class NicePanelSkills extends UT2K4TabPanel;
var automated NiceGUIPerkButton skillButtonA[5], skillButtonB[5]; var automated NiceGUIPerkButton skillButtonA[5], skillButtonB[5];
function ShowPanel(bool bShow){ var automated GUISectionBackground sb_big_left, sb_big_right;
function ShowPanel(bool bShow)
{
local int i; local int i;
local class<NiceVeterancyTypes> niceVet; local class<NiceVeterancyTypes> niceVet;
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
Super.ShowPanel(bShow);
super.ShowPanel(bShow);
// loops are for puss
sb_big_left.ManageComponent(skillButtonA[0]);
sb_big_left.ManageComponent(skillButtonA[1]);
sb_big_left.ManageComponent(skillButtonA[2]);
sb_big_left.ManageComponent(skillButtonA[3]);
sb_big_left.ManageComponent(skillButtonA[4]);
sb_big_right.ManageComponent(skillButtonB[0]);
sb_big_right.ManageComponent(skillButtonB[1]);
sb_big_right.ManageComponent(skillButtonB[2]);
sb_big_right.ManageComponent(skillButtonB[3]);
sb_big_right.ManageComponent(skillButtonB[4]);
nicePlayer = NicePlayerController(PlayerOwner()); nicePlayer = NicePlayerController(PlayerOwner());
if(nicePlayer != none) if (nicePlayer != none)
niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo); niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo);
if(niceVet != none){ if (niceVet != none)
for(i = 0;i < 5;i ++){ {
for (i = 0;i < 5;i ++)
{
skillButtonA[i].skillIndex = i; skillButtonA[i].skillIndex = i;
skillButtonB[i].skillIndex = i; skillButtonB[i].skillIndex = i;
skillButtonA[i].skillPerkIndex = niceVet.default.PerkIndex; skillButtonA[i].skillPerkIndex = niceVet.default.PerkIndex;
@ -21,16 +42,53 @@ function ShowPanel(bool bShow){
} }
} }
} }
// size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865) // size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865)
// setup caption // setup caption
defaultproperties defaultproperties
{ {
// BACKGROUNDS
Begin Object Class=AltSectionBackground Name=skillbckgrndl
Caption="LEFT SKILLS"
// bNoCaption=true
LeftPadding=0.000000
RightPadding=0.030000
TopPadding=0.000000
BottomPadding=0.000000
WinTop=0.000000
WinLeft=0.000000
WinWidth=0.500000
WinHeight=0.87
bBoundToParent=True
bScaleToParent=True
OnPreDraw=skillbckgrndl.InternalPreDraw
End Object
sb_big_left=skillbckgrndl
Begin Object Class=AltSectionBackground Name=skillbckgrndr
Caption="OBVIOUSLY RIGHT SKILLS"
// bNoCaption=true
LeftPadding=0.000000
RightPadding=0.030000
TopPadding=0.000000
BottomPadding=0.000000
WinTop=0.000000
WinLeft=0.500000
WinWidth=0.500000
WinHeight=0.87
bBoundToParent=True
bScaleToParent=True
OnPreDraw=skillbckgrndr.InternalPreDraw
End Object
sb_big_right=skillbckgrndr
// buttons
Begin Object Class=NiceGUIPerkButton Name=btn1A Begin Object Class=NiceGUIPerkButton Name=btn1A
WinTop=0.012500 // WinTop=0.012500
WinWidth=0.495000 WinWidth=0.495000
WinHeight=0.160000 WinHeight=0.160000
RenderWeight=2.000000 // RenderWeight=2.000000
TabOrder=1 // TabOrder=1
bBoundToParent=True bBoundToParent=True
bScaleToParent=True bScaleToParent=True
bMouseOverSound=False bMouseOverSound=False
@ -40,11 +98,11 @@ defaultproperties
skillButtonA(0)=btn1A skillButtonA(0)=btn1A
Begin Object Class=NiceGUIPerkButton Name=btn2A Begin Object Class=NiceGUIPerkButton Name=btn2A
WinTop=0.188500 // WinTop=0.188500
WinWidth=0.495000 WinWidth=0.495000
WinHeight=0.160000 WinHeight=0.160000
RenderWeight=2.000000 // RenderWeight=2.000000
TabOrder=3 // TabOrder=3
bBoundToParent=True bBoundToParent=True
bScaleToParent=True bScaleToParent=True
bMouseOverSound=False bMouseOverSound=False
@ -54,11 +112,11 @@ defaultproperties
skillButtonA(1)=btn2A skillButtonA(1)=btn2A
Begin Object Class=NiceGUIPerkButton Name=btn3A Begin Object Class=NiceGUIPerkButton Name=btn3A
WinTop=0.364500 // WinTop=0.364500
WinWidth=0.495000 WinWidth=0.495000
WinHeight=0.160000 WinHeight=0.160000
RenderWeight=2.000000 // RenderWeight=2.000000
TabOrder=5 // TabOrder=5
bBoundToParent=True bBoundToParent=True
bScaleToParent=True bScaleToParent=True
bMouseOverSound=False bMouseOverSound=False
@ -68,11 +126,11 @@ defaultproperties
skillButtonA(2)=btn3A skillButtonA(2)=btn3A
Begin Object Class=NiceGUIPerkButton Name=btn4A Begin Object Class=NiceGUIPerkButton Name=btn4A
WinTop=0.540500 // WinTop=0.540500
WinWidth=0.495000 WinWidth=0.495000
WinHeight=0.160000 WinHeight=0.160000
RenderWeight=2.000000 // RenderWeight=2.000000
TabOrder=7 // TabOrder=7
bBoundToParent=True bBoundToParent=True
bScaleToParent=True bScaleToParent=True
bMouseOverSound=False bMouseOverSound=False
@ -82,11 +140,11 @@ defaultproperties
skillButtonA(3)=btn4A skillButtonA(3)=btn4A
Begin Object Class=NiceGUIPerkButton Name=btn5A Begin Object Class=NiceGUIPerkButton Name=btn5A
WinTop=0.716500 // WinTop=0.716500
WinWidth=0.495000 WinWidth=0.495000
WinHeight=0.160000 WinHeight=0.160000
RenderWeight=2.000000 // RenderWeight=2.000000
TabOrder=9 // TabOrder=9
bBoundToParent=True bBoundToParent=True
bScaleToParent=True bScaleToParent=True
bMouseOverSound=False bMouseOverSound=False

View File

@ -67,8 +67,8 @@ function ReplaceRequiredEquipment(){
Super.ReplaceRequiredEquipment(); Super.ReplaceRequiredEquipment();
RequiredEquipment[0] = String(class'NiceMachete'); RequiredEquipment[0] = String(class'NiceMachete');
RequiredEquipment[1] = String(class'Nice9mmPlus'); RequiredEquipment[1] = String(class'Nice9mmPlus');
RequiredEquipment[2] = String(class'ScrnBalanceSrv.ScrnFrag'); RequiredEquipment[2] = String(class'ScrnFrag');
RequiredEquipment[3] = String(class'ScrnBalanceSrv.ScrnSyringe'); RequiredEquipment[3] = String(class'ScrnSyringe');
RequiredEquipment[4] = String(class'KFMod.Welder'); RequiredEquipment[4] = String(class'KFMod.Welder');
} }
simulated function int CalculateCalibrationScore(){ simulated function int CalculateCalibrationScore(){
@ -510,7 +510,7 @@ function bool AddInventory(inventory NewItem){
if((DualDeagle(weap) != none || Dual44Magnum(weap) != none || DualMK23Pistol(weap) != none) if((DualDeagle(weap) != none || Dual44Magnum(weap) != none || DualMK23Pistol(weap) != none)
&& weap.InventoryGroup != 4 ) { && weap.InventoryGroup != 4 ) {
if(KFPRI != none && if(KFPRI != none &&
ClassIsChildOf(KFPRI.ClientVeteranSkill, class'ScrnBalanceSrv.ScrnVetGunslinger')) ClassIsChildOf(KFPRI.ClientVeteranSkill, class'ScrnVetGunslinger'))
weap.InventoryGroup = 3; weap.InventoryGroup = 3;
else else
weap.InventoryGroup = 2; weap.InventoryGroup = 2;
@ -555,16 +555,21 @@ simulated function CookGrenade(){
niceWeap.ClientGrenadeState = GN_TempDown; niceWeap.ClientGrenadeState = GN_TempDown;
niceWeap.PutDown(); niceWeap.PutDown();
} }
simulated function ThrowGrenade(){ simulated function ThrowGrenade()
{
local NiceWeapon niceWeap; local NiceWeapon niceWeap;
niceWeap = NiceWeapon(Weapon); niceWeap = NiceWeapon(Weapon);
if(niceWeap != none) if(niceWeap != none)
niceWeap.ClientForceInterruptReload(CANCEL_NADE); niceWeap.ClientForceInterruptReload(CANCEL_NADE);
if(bThrowingNade || SecondaryItem != none) if(bThrowingNade || SecondaryItem != none)
return; return;
if( niceWeap == none
|| (niceWeap.bIsReloading && !niceWeap.InterruptReload())) if(niceWeap == none || (niceWeap.bIsReloading && !niceWeap.InterruptReload()))
{
super.ThrowGrenade();
return; return;
}
if(playerGrenade == none) if(playerGrenade == none)
playerGrenade = FindPlayerGrenade(); playerGrenade = FindPlayerGrenade();
if(playerGrenade != none && playerGrenade.HasAmmo()){ if(playerGrenade != none && playerGrenade.HasAmmo()){
@ -863,6 +868,40 @@ simulated function AltFire(optional float F){
super.AltFire(F); super.AltFire(F);
} }
// added copy-cated function to disable some log
simulated function Setup(xUtil.PlayerRecord rec, optional bool bLoadNow)
{
local ScrnPlayerController PC;
local string CN;
PC = ScrnPlayerController(Controller);
if ( PC != none && IsLocallyControlled() )
{
// check this only on player side, because it stores
// RedCharacter & BlueCharacter in the config
CN = rec.DefaultName;
if ( !PC.ValidateCharacter(CN) ) {
// character invalid, change it valid one, which was set up in ValidateCharacter()
rec = class'xUtil'.static.FindPlayerRecord(CN);
PC.ChangeCharacter(CN);
}
}
super(KFPawn).Setup(rec, bLoadNow);
if( class<SoldierSpeciesRobot>(Species) != none )
{
BreathingSound = class'KFDARSoundGroup'.default.BreathingSound;
}
else if( class<AshHardingSpecies>(Species) != none )
{
BreathingSound = class'KFFemaleSoundGroup'.default.BreathingSound;
}
// disable the log!!!
// log(BreathingSound);
}
defaultproperties defaultproperties
{ {
defaultInvincibilityDuration=2.000000 defaultInvincibilityDuration=2.000000

View File

@ -176,14 +176,14 @@ simulated function PostBeginPlay(){
class'ScrnHorzineVestPickup'.default.cost = 750; class'ScrnHorzineVestPickup'.default.cost = 750;
class'NicePack'.default.Mut = self; class'NicePack'.default.Mut = self;
// Gun skins // Gun skins
class'NiceMaulerPickup'.default.VariantClasses[class'NiceMaulerPickup'.default.VariantClasses.length] = class'ScrnBalanceSrv.ScrnSPSniperPickup'; class'NiceMaulerPickup'.default.VariantClasses[class'NiceMaulerPickup'.default.VariantClasses.length] = class'ScrnSPSniperPickup';
class'NiceDeaglePickup'.default.VariantClasses[class'NiceDeaglePickup'.default.VariantClasses.length] = class'SkinExecutionerPickup'; class'NiceDeaglePickup'.default.VariantClasses[class'NiceDeaglePickup'.default.VariantClasses.length] = class'SkinExecutionerPickup';
class'NiceDualDeaglePickup'.default.VariantClasses[class'NiceDualDeaglePickup'.default.VariantClasses.length] = class'SkinDualExecutionerPickup'; class'NiceDualDeaglePickup'.default.VariantClasses[class'NiceDualDeaglePickup'.default.VariantClasses.length] = class'SkinDualExecutionerPickup';
class'NiceMagnumPickup'.default.VariantClasses[class'NiceMagnumPickup'.default.VariantClasses.length] = class'SkinCowboyMagnumPickup'; class'NiceMagnumPickup'.default.VariantClasses[class'NiceMagnumPickup'.default.VariantClasses.length] = class'SkinCowboyMagnumPickup';
class'NiceDualMagnumPickup'.default.VariantClasses[class'NiceDualMagnumPickup'.default.VariantClasses.length] = class'SkinDualCowboyMagnumPickup'; class'NiceDualMagnumPickup'.default.VariantClasses[class'NiceDualMagnumPickup'.default.VariantClasses.length] = class'SkinDualCowboyMagnumPickup';
class'NiceWinchesterPickup'.default.VariantClasses[class'NiceWinchesterPickup'.default.VariantClasses.length] = class'SkinRetroLARPickup'; class'NiceWinchesterPickup'.default.VariantClasses[class'NiceWinchesterPickup'.default.VariantClasses.length] = class'SkinRetroLARPickup';
class'NiceM14EBRPickup'.default.VariantClasses[class'NiceM14EBRPickup'.default.VariantClasses.length] = class'SkinM14EBR2ProPickup'; class'NiceM14EBRPickup'.default.VariantClasses[class'NiceM14EBRPickup'.default.VariantClasses.length] = class'SkinM14EBR2ProPickup';
class'ScrnBalanceSrv.ScrnKrissMPickup'.default.VariantClasses[class'ScrnBalanceSrv.ScrnKrissMPickup'.default.VariantClasses.length] = class'SkinGoldenKrissPickup'; class'ScrnKrissMPickup'.default.VariantClasses[class'ScrnKrissMPickup'.default.VariantClasses.length] = class'SkinGoldenKrissPickup';
class'NiceSCARMK17Pickup'.default.VariantClasses[class'NiceSCARMK17Pickup'.default.VariantClasses.length] = class'SkinCamoSCARMK17Pickup'; class'NiceSCARMK17Pickup'.default.VariantClasses[class'NiceSCARMK17Pickup'.default.VariantClasses.length] = class'SkinCamoSCARMK17Pickup';
// Abilities // Abilities
class'NiceAbilityManager'.default.events.static.AddAdapter(class'NiceSharpshooterAbilitiesAdapter', level); class'NiceAbilityManager'.default.events.static.AddAdapter(class'NiceSharpshooterAbilitiesAdapter', level);
@ -468,14 +468,13 @@ simulated function bool CheckReplacement(Actor Other, out byte bSuperRelevant){
local NicePlayerController playerContr; local NicePlayerController playerContr;
local NiceRepInfoRemoteData remoteRI; local NiceRepInfoRemoteData remoteRI;
local NiceReplicationInfo niceRI; local NiceReplicationInfo niceRI;
local MeanReplicationInfo meanRI;
local PlayerReplicationInfo pri; local PlayerReplicationInfo pri;
// Replace loot on levels // Replace loot on levels
if(Other.class == class'KFRandomItemSpawn' || Other.class == class'ScrnBalanceSrv.ScrnRandomItemSpawn'){ if(Other.class == class'KFRandomItemSpawn' || Other.class == class'ScrnRandomItemSpawn'){
ReplaceWith(Other, string(class'NiceRandomItemSpawn')); ReplaceWith(Other, string(class'NiceRandomItemSpawn'));
return false; return false;
} }
else if(Other.class == class'KFAmmoPickup' || Other.class == class'ScrnBalanceSrv.ScrnAmmoPickup') { else if(Other.class == class'KFAmmoPickup' || Other.class == class'ScrnAmmoPickup') {
ReplaceWith(Other, string(class'NiceAmmoPickup')); ReplaceWith(Other, string(class'NiceAmmoPickup'));
return false; return false;
} }
@ -493,8 +492,6 @@ simulated function bool CheckReplacement(Actor Other, out byte bSuperRelevant){
niceRI = spawn(class'NiceReplicationInfo', pri.Owner); niceRI = spawn(class'NiceReplicationInfo', pri.Owner);
niceRI.Mut = self; niceRI.Mut = self;
remoteRI = spawn(class'NiceRepInfoRemoteData', pri.Owner); remoteRI = spawn(class'NiceRepInfoRemoteData', pri.Owner);
meanRI = spawn(class'MeanReplicationInfo', pri.Owner);
meanRI.ownerPRI = pri;
playerContr = NicePlayerController(PlayerReplicationInfo(Other).Owner); playerContr = NicePlayerController(PlayerReplicationInfo(Other).Owner);
playerContr.niceRI = niceRI; playerContr.niceRI = niceRI;
playerContr.remoteRI = remoteRI; playerContr.remoteRI = remoteRI;
@ -1067,18 +1064,20 @@ defaultproperties
bNoLateFFIncrease=True bNoLateFFIncrease=True
junkieNextGoal=1 junkieNextGoal=1
bIsPreGame=True bIsPreGame=True
pickupReplaceArray(0)=(vanillaClass=Class'KFMod.MAC10Pickup',scrnClass=Class'ScrnBalanceSrv.ScrnMAC10Pickup',NewClass=class'NiceMAC10Pickup') pickupReplaceArray(0)=(vanillaClass=Class'KFMod.MAC10Pickup',scrnClass=Class'ScrnMAC10Pickup',NewClass=class'NiceMAC10Pickup')
pickupReplaceArray(1)=(vanillaClass=Class'KFMod.WinchesterPickup',scrnClass=Class'ScrnBalanceSrv.ScrnWinchesterPickup',NewClass=class'NiceWinchesterPickup') pickupReplaceArray(1)=(vanillaClass=Class'KFMod.WinchesterPickup',scrnClass=Class'ScrnWinchesterPickup',NewClass=class'NiceWinchesterPickup')
pickupReplaceArray(2)=(vanillaClass=Class'KFMod.CrossbowPickup',scrnClass=Class'ScrnBalanceSrv.ScrnCrossbowPickup',NewClass=class'NiceCrossbowPickup') pickupReplaceArray(2)=(vanillaClass=Class'KFMod.CrossbowPickup',scrnClass=Class'ScrnCrossbowPickup',NewClass=class'NiceCrossbowPickup')
pickupReplaceArray(3)=(vanillaClass=Class'KFMod.SPSniperPickup',scrnClass=Class'ScrnBalanceSrv.ScrnSPSniperPickup',NewClass=class'NiceMaulerPickup') pickupReplaceArray(3)=(vanillaClass=Class'KFMod.SPSniperPickup',scrnClass=Class'ScrnSPSniperPickup',NewClass=class'NiceMaulerPickup')
pickupReplaceArray(4)=(vanillaClass=Class'KFMod.M14EBRPickup',scrnClass=Class'ScrnBalanceSrv.ScrnM14EBRPickup',NewClass=class'NiceM14EBRPickup') pickupReplaceArray(4)=(vanillaClass=Class'KFMod.M14EBRPickup',scrnClass=Class'ScrnM14EBRPickup',NewClass=class'NiceM14EBRPickup')
pickupReplaceArray(5)=(vanillaClass=Class'KFMod.M99Pickup',scrnClass=Class'ScrnBalanceSrv.ScrnM99Pickup',NewClass=class'NiceM99Pickup') pickupReplaceArray(5)=(vanillaClass=Class'KFMod.M99Pickup',scrnClass=Class'ScrnM99Pickup',NewClass=class'NiceM99Pickup')
pickupReplaceArray(6)=(vanillaClass=Class'KFMod.ShotgunPickup',scrnClass=Class'ScrnBalanceSrv.ScrnShotgunPickup',NewClass=class'NiceShotgunPickup') pickupReplaceArray(6)=(vanillaClass=Class'KFMod.ShotgunPickup',scrnClass=Class'ScrnShotgunPickup',NewClass=class'NiceShotgunPickup')
pickupReplaceArray(7)=(vanillaClass=Class'KFMod.BoomStickPickup',scrnClass=Class'ScrnBalanceSrv.ScrnBoomStickPickup',NewClass=class'NiceBoomStickPickup') pickupReplaceArray(7)=(vanillaClass=Class'KFMod.BoomStickPickup',scrnClass=Class'ScrnBoomStickPickup',NewClass=class'NiceBoomStickPickup')
pickupReplaceArray(8)=(vanillaClass=Class'KFMod.NailGunPickup',scrnClass=Class'ScrnBalanceSrv.ScrnNailGunPickup',NewClass=class'NiceNailGunPickup') pickupReplaceArray(8)=(vanillaClass=Class'KFMod.NailGunPickup',scrnClass=Class'ScrnNailGunPickup',NewClass=class'NiceNailGunPickup')
pickupReplaceArray(9)=(vanillaClass=Class'KFMod.KSGPickup',scrnClass=Class'ScrnBalanceSrv.ScrnKSGPickup',NewClass=class'NiceKSGPickup') pickupReplaceArray(9)=(vanillaClass=Class'KFMod.KSGPickup',scrnClass=Class'ScrnKSGPickup',NewClass=class'NiceKSGPickup')
pickupReplaceArray(10)=(vanillaClass=Class'KFMod.BenelliPickup',scrnClass=Class'ScrnBalanceSrv.ScrnBenelliPickup',NewClass=class'NiceBenelliPickup') pickupReplaceArray(10)=(vanillaClass=Class'KFMod.BenelliPickup',scrnClass=Class'ScrnBenelliPickup',NewClass=class'NiceBenelliPickup')
pickupReplaceArray(11)=(vanillaClass=Class'KFMod.AA12Pickup',scrnClass=Class'ScrnBalanceSrv.ScrnAA12Pickup',NewClass=class'NiceAA12Pickup') pickupReplaceArray(11)=(vanillaClass=Class'KFMod.AA12Pickup',scrnClass=Class'ScrnAA12Pickup',NewClass=class'NiceAA12Pickup')
pickupReplaceArray(12)=(vanillaClass=Class'KFMod.MachetePickup',scrnClass=Class'ScrnMachetePickup',NewClass=class'NiceMachetePickup')
NiceUniversalDescriptions(0)="Survive on %m in ScrN Balance mode" NiceUniversalDescriptions(0)="Survive on %m in ScrN Balance mode"
NiceUniversalDescriptions(1)="Survive on %m in ScrN Balance mode with Hardcore Level 5+" NiceUniversalDescriptions(1)="Survive on %m in ScrN Balance mode with Hardcore Level 5+"
NiceUniversalDescriptions(2)="Survive on %m in ScrN Balance mode with Hardcore Level 10+" NiceUniversalDescriptions(2)="Survive on %m in ScrN Balance mode with Hardcore Level 10+"

View File

@ -2,6 +2,8 @@ class NicePlayerController extends ScrnPlayerController
config(NiceUser) config(NiceUser)
dependson(NicePack) dependson(NicePack)
dependson(NiceFire); dependson(NiceFire);
var globalconfig int ZedHPBarStyle; // 0 - big zeds, 1 - all, 2 - disabled
var globalconfig int nicePlayerInfoVersionNumber; var globalconfig int nicePlayerInfoVersionNumber;
// These are values stored in a settings file // These are values stored in a settings file
var globalconfig bool bDebug; var globalconfig bool bDebug;
@ -403,12 +405,12 @@ simulated event Destroyed(){
// Screw that // Screw that
simulated function ClientWeaponDestroyed(class<Weapon> WClass){} simulated function ClientWeaponDestroyed(class<Weapon> WClass){}
// This event is generated when new pawn spawns // This event is generated when new pawn spawns
function PawnSpawned(){ function PawnSpawned()
{
local bool bFoundExp; local bool bFoundExp;
local float convertedExp; local float convertedExp;
local ClientPerkRepLink R; local ClientPerkRepLink R;
local SRCustomProgress exp; local SRCustomProgress exp;
local MeanReplicationInfo meanRI;
local NicePack.PlayerRecord record; local NicePack.PlayerRecord record;
//local NiceHumanPawn nicePawn; //local NiceHumanPawn nicePawn;
// Make sure our health is at it's top // Make sure our health is at it's top
@ -496,10 +498,6 @@ function PawnSpawned(){
exp.IncrementProgress(convertedExp); exp.IncrementProgress(convertedExp);
} }
} }
// Stop after-death bleeding
meanRI = class'MeanReplicationInfo'.static.findSZri(PlayerReplicationInfo);
if(meanRI != none)
meanRI.stopBleeding();
// Give necessary dosh to the player // Give necessary dosh to the player
if(NicePackMutator != none) if(NicePackMutator != none)
NicePackMutator.GiveProgressiveDosh(self); NicePackMutator.GiveProgressiveDosh(self);
@ -1442,6 +1440,101 @@ exec simulated function Siren(float value)
sirenScreamMod = value; sirenScreamMod = value;
} }
// copy-cat to fix MyTrader accessed none log spam
function ClientLocationalVoiceMessage(PlayerReplicationInfo Sender,
PlayerReplicationInfo Recipient,
name MessageType, byte MessageID,
optional Pawn SenderPawn, optional vector SenderLocation)
{
local VoicePack Voice;
local ShopVolume Shop;
if (Sender == none || Sender.VoiceType == none || Player.Console == none || Level.NetMode == NM_DedicatedServer)
{
return;
}
Voice = Spawn(Sender.VoiceType, self);
if (KFVoicePack(Voice) != none)
{
if (MessageType == 'TRADER')
{
if (Pawn != none && MessageID >= 4)
{
foreach Pawn.TouchingActors(class'ShopVolume', Shop)
{
// fix this
if (Shop.MyTrader != none)
SenderLocation = Shop.MyTrader.Location;
else
SenderLocation = Shop.Location;
// Only play the 30 Seconds remaining messages come across as Locational Speech if we're in the Shop
if (MessageID == 4)
{
return;
}
else if (MessageID == 5)
{
MessageID = 999;
}
break;
}
}
// Only play the 10 Seconds remaining message if we are in the Shop
// and only play the 30 seconds remaning message if we haven't been to the Shop
if (MessageID == 5 || (MessageID == 4 && bHasHeardTraderWelcomeMessage))
{
return;
}
else if (MessageID == 999)
{
MessageID = 5;
}
// Store the fact that we've heard the Trader's Welcome message on the client
if (MessageID == 7)
{
bHasHeardTraderWelcomeMessage = true;
}
// If we're hearing the Shop's Closed Message, reset the Trader's Welcome message flag
else if (MessageID == 6)
{
bHasHeardTraderWelcomeMessage = false;
}
KFVoicePack(Voice).ClientInitializeLocational(Sender, Recipient, MessageType, MessageID, SenderPawn, SenderLocation);
if (MessageID > 6 /*&& bBuyMenuIsOpen*/)
{
// TODO: Show KFVoicePack(Voice).GetClientParsedMessage() in the Buy Menu
}
else if (KFVoicePack(Voice).GetClientParsedMessage() != "")
{
// Radio commands print to Text
TeamMessage(Sender, KFVoicePack(Voice).GetClientParsedMessage(), 'Trader');
}
}
else
{
KFVoicePack(Voice).ClientInitializeLocational(Sender, Recipient, MessageType, MessageID, SenderPawn, SenderLocation);
if (KFVoicePack(Voice).GetClientParsedMessage() != "")
{
TeamMessage(Sender, KFVoicePack(Voice).GetClientParsedMessage(), 'Voice');
}
}
}
else if (Voice != none)
{
Voice.ClientInitialize(Sender, Recipient, MessageType, MessageID);
}
}
defaultproperties defaultproperties
{ {
nicePlayerInfoVersionNumber=1 nicePlayerInfoVersionNumber=1

View File

@ -1,11 +1,14 @@
class NiceRandomItemSpawn extends ScrnRandomItemSpawn; class NiceRandomItemSpawn extends ScrnRandomItemSpawn;
defaultproperties defaultproperties
{ {
PickupClasses(0)=class'NiceWinchesterPickup' PickupClasses(0)=Class'NiceWinchesterPickup'
PickupClasses(1)=class'NiceShotgunPickup' PickupClasses(1)=Class'NiceShotgunPickup'
PickupClasses(2)=class'NiceBullpupPickup' PickupClasses(2)=Class'NiceBullpupPickup'
PickupClasses(3)=class'NiceMagnumPickup' PickupClasses(3)=Class'NiceMagnumPickup'
PickupClasses(4)=class'NiceWinchesterPickup' PickupClasses(4)=Class'NiceWinchesterPickup'
PickupClasses(5)=class'NiceM79Pickup' PickupClasses(5)=Class'NiceM79Pickup'
PickupClasses(6)=Class'NiceAxePickup'
PickupClasses(7)=Class'ScrnVestPickup'
PickupClasses(8)=class'NiceMAC10Pickup' PickupClasses(8)=class'NiceMAC10Pickup'
} }

View File

@ -186,24 +186,18 @@ simulated function HandleNiceHealingMechanicsAndSkills
simulated function RemovePoisonAndBleed(NiceHumanPawn healed) simulated function RemovePoisonAndBleed(NiceHumanPawn healed)
{ {
local Inventory I; local Inventory I;
local MeanReplicationInfo MRI;
// log spam fix // log spam fix
if (healed == none) if (healed == none)
return; return;
// No bleeding // No poison and bleed
MRI = class'MeanReplicationInfo'.static.
findSZri(healed.PlayerReplicationInfo);
if (MRI != none)
MRI.stopBleeding();
// No poison
if (healed.inventory == none) if (healed.inventory == none)
return; return;
for (I = healed.inventory; I != none; I = I.inventory) for (I = healed.inventory; I != none; I = I.inventory)
{ {
if (MeanPoisonInventory(I) != none) if (MeanPoisonInventory(I) != none || MeanBleedInventory(I) != none)
I.Destroy(); I.Destroy();
} }
} }

View File

@ -96,7 +96,7 @@ static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI)
//can't cook fire nades //can't cook fire nades
static function bool CanCookNade(KFPlayerReplicationInfo KFPRI, Weapon Weap) static function bool CanCookNade(KFPlayerReplicationInfo KFPRI, Weapon Weap)
{ {
return GetNadeType(KFPRI) != class'ScrnBalanceSrv.ScrnFlameNade'; return GetNadeType(KFPRI) != class'ScrnFlameNade';
} }
//v2.60: +60% faster charge with Husk Gun //v2.60: +60% faster charge with Husk Gun
static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> Other) static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> Other)

View File

@ -285,20 +285,39 @@ static function int GetInvincibilityDuration(KFPlayerReplicationInfo KFPRI){
static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){ static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){
return 0; return 0;
} }
static function SpecialHUDInfo(KFPlayerReplicationInfo KFPRI, Canvas C){
static function SpecialHUDInfo(KFPlayerReplicationInfo KFPRI, Canvas C)
{
local KFMonster KFEnemy; local KFMonster KFEnemy;
local HUDKillingFloor HKF; local HUDKillingFloor HKF;
local int i, hp;
local float MaxDistanceSquared; local float MaxDistanceSquared;
MaxDistanceSquared = 640000; MaxDistanceSquared = 640000;
MaxDistanceSquared *= GetHealthBarsDistanceMulti(KFPRI)**2; MaxDistanceSquared *= GetHealthBarsDistanceMulti(KFPRI)**2;
HKF = HUDKillingFloor(C.ViewPort.Actor.myHUD); HKF = HUDKillingFloor(C.ViewPort.Actor.myHUD);
if(HKF == none || C.ViewPort.Actor.Pawn == none || MaxDistanceSquared <= 0) if (HKF == none || C.ViewPort.Actor.Pawn == none || MaxDistanceSquared <= 0)
return; 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) // read and use player settings
// 0 - big zeds, 1 - all, 2 - disabled
i = NicePlayerController(C.ViewPort.actor).ZedHPBarStyle;
if (i == 2)
return;
else if (i == 1)
hp = 0;
else
hp = 1000;
foreach C.ViewPort.Actor.DynamicActors(class'KFMonster', KFEnemy)
{
// check with stopwatch
if (KFEnemy.Health > hp && (!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); HKF.DrawHealthBar(C, KFEnemy, KFEnemy.Health, KFEnemy.HealthMax , 50.0);
} }
} }
// Is player standing still? // Is player standing still?
static function bool IsStandingStill(KFPlayerReplicationInfo KFPRI){ 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) if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none && VSize(PlayerController(KFPRI.Owner).Pawn.Velocity) > 0.0)

View File

@ -1626,8 +1626,8 @@ defaultproperties
{ {
recordedZoomTime=-1.000000 recordedZoomTime=-1.000000
SecondaryCharge=1 SecondaryCharge=1
LaserAttachmentClass=Class'ScrnBalanceSrv.ScrnLaserAttachmentFirstPerson' LaserAttachmentClass=Class'ScrnLaserAttachmentFirstPerson'
LaserDotClass=Class'ScrnBalanceSrv.ScrnLocalLaserDot' LaserDotClass=Class'ScrnLocalLaserDot'
LaserAttachmentBone="LightBone" LaserAttachmentBone="LightBone"
MagazineBone="Magazine" MagazineBone="Magazine"
bHasChargePhase=True bHasChargePhase=True

View File

@ -135,7 +135,7 @@ simulated function HurtRadius( float DamageAmount, float DamageRadius, class<Dam
if( Role == ROLE_Authority ) if( Role == ROLE_Authority )
{ {
if ( bBlewInHands && NumKilled >= 5 && Stats != none ) if ( bBlewInHands && NumKilled >= 5 && Stats != none )
class'ScrnBalanceSrv.ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'SuicideBomber', 1); class'ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'SuicideBomber', 1);
if ( NumKilled >= 4 ) if ( NumKilled >= 4 )
{ {

View File

@ -11,7 +11,7 @@ function Timer()
// if (AmmoInCharge == MaxChargeAmmo) { // if (AmmoInCharge == MaxChargeAmmo) {
// Player = Level.GetLocalPlayerController(); // Player = Level.GetLocalPlayerController();
// if (Player != none) // if (Player != none)
// Player.ReceiveLocalizedMessage(class'ScrnBalanceSrv.ScrnPlayerMessage',0); // Player.ReceiveLocalizedMessage(class'ScrnPlayerMessage',0);
// } // }
} }
super.Timer(); super.Timer();

View File

@ -0,0 +1,67 @@
class MeanBleedInventory extends Inventory;
const dmtype_bleed=class'NiceDamTypeStalkerBleed';
var int maxBleedCount;
var private float fBleedPeriod;
var int bleedLevel;
var MeanZombieCrawler stalker;
event PostBeginPlay()
{
super.PostBeginPlay();
// start the timer
SetTimer(fBleedPeriod, true);
}
event Timer()
{
local pawn locpawn;
local bool amAlive;
local int bleedDamage;
locpawn = Pawn(Owner);
amAlive = locpawn != none && locpawn.Health > 0;
bleedDamage = bleedLevel * 7;
// if pawn owner is dead or bleed count is done - destroy
if (!amAlive || maxBleedCount < 0 || bleedDamage < 1.0)
{
Destroy();
return;
}
maxBleedCount--;
if (stalker != none)
locpawn.TakeDamage(bleedDamage, stalker, locpawn.Location,
vect(0, 0, 0), dmtype_bleed);
else
locpawn.TakeDamage(bleedDamage, locpawn, locpawn.Location,
vect(0, 0, 0), dmtype_bleed);
if (locpawn.isA('KFPawn'))
{
KFPawn(locpawn).HealthToGive -= 2 * bleedLevel;
}
}
// cleanup
function Destroyed()
{
if (stalker != none)
stalker = none;
super.Destroyed();
}
defaultproperties
{
maxBleedCount=7
fBleedPeriod=1.500000
}

View File

@ -192,18 +192,47 @@ function bool MeleeDamageTarget(int hitdamage, vector pushdir)
{ {
if (targetPawn.ShieldStrength > 100) 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 MakeBleed(targetPawn, effectStrenght);
.findSZri(targetPawn.PlayerReplicationInfo)
.setBleeding(Self, effectStrenght);
} }
return result; return result;
} }
final private function MakeBleed(NiceHumanPawn poorpawn, coerce int effectStrenght)
{
local Inventory I;
local MeanBleedInventory bleedinv;
local bool bFoundPoison;
if (poorpawn.Inventory != none)
{
for (I = poorpawn.Inventory; I != none; I = I.Inventory)
{
if (MeanBleedInventory(I) != none)
{
bleedinv = MeanBleedInventory(I);
bFoundPoison = true;
bleedinv.stalker = self;
bleedinv.bleedLevel = effectStrenght;
// reset bleed count
bleedinv.maxBleedCount = bleedinv.default.maxBleedCount;
}
}
}
if (!bFoundPoison)
{
I = Controller.Spawn(class<Inventory>(DynamicLoadObject(string(class'MeanBleedInventory'), class'Class')));
bleedinv = MeanBleedInventory(I);
bleedinv.stalker = self;
bleedinv.bleedLevel = effectStrenght;
bleedinv.GiveTo(poorpawn);
}
}
function RemoveHead() function RemoveHead()
{ {
Super(NiceMonster).RemoveHead(); Super(NiceMonster).RemoveHead();

View File

@ -1,82 +1,4 @@
// Copy pasted from super zombies mutator with small alterations // no use atm
class MeanReplicationInfo extends ReplicationInfo; class MeanReplicationInfo extends ReplicationInfo;
struct BleedingState {
var float nextBleedTime;
var Pawn instigator;
var int count;
};
var PlayerReplicationInfo ownerPRI;
var bool isBleeding;
var int maxBleedCount;
var BleedingState bleedState;
var float bleedPeriod;
var float bleedLevel;
replication {
reliable if (bNetDirty && Role == ROLE_Authority)
isBleeding, ownerPRI;
}
// Returns bleed damage, corresponding to given bleed level and damage scale.
// Rand(7) should be used as a scale.
// Separate function created to allow for lowest/highest damage value computing.
function int calcBleedDamage(float level, int scale){
return level * (3 + scale);
}
function Tick(float DeltaTime) {
local PlayerController ownerCtrllr;
local bool amAlive;
local float bleedDamage;
ownerCtrllr = PlayerController(Owner);
amAlive = ownerCtrllr != none && ownerCtrllr.Pawn != none && ownerCtrllr.Pawn.Health > 0;
if(amAlive && bleedState.count > 0) {
if(bleedState.nextBleedTime < Level.TimeSeconds) {
bleedState.count--;
bleedState.nextBleedTime+= bleedPeriod;
// Fix bleeding when stalker dies
bleedDamage = calcBleedDamage(bleedLevel, rand(7));
if(bleedDamage < 1.0)
stopBleeding();
if(bleedState.instigator != none)
ownerCtrllr.Pawn.TakeDamage(bleedDamage, bleedState.instigator, ownerCtrllr.Pawn.Location,
vect(0, 0, 0), class'NiceDamTypeStalkerBleed');
else
ownerCtrllr.Pawn.TakeDamage(bleedDamage, ownerCtrllr.Pawn, ownerCtrllr.Pawn.Location,
vect(0, 0, 0), class'NiceDamTypeStalkerBleed');
if (ownerCtrllr.Pawn.isA('KFPawn')) {
KFPawn(ownerCtrllr.Pawn).HealthToGive -= 2 * bleedLevel;
}
}
} else {
isBleeding= false;
}
}
function stopBleeding(){
isBleeding = false;
bleedState.count = 0;
}
function setBleeding(Pawn instigator, float effectStrenght) {
// Can max possible damage do anything? If no, then don't even bother.
if(calcBleedDamage(effectStrenght, 7) < 1.0)
return;
bleedState.instigator = instigator;
bleedState.count = maxBleedCount;
bleedLevel = effectStrenght;
if(!isBleeding){
bleedState.nextBleedTime = Level.TimeSeconds;
isBleeding = true;
}
}
static function MeanReplicationInfo findSZri(PlayerReplicationInfo pri) {
local MeanReplicationInfo repInfo;
if(pri == none)
return none;
foreach pri.DynamicActors(Class'MeanReplicationInfo', repInfo)
if(repInfo.ownerPRI == pri)
return repInfo;
return none; defaultproperties{}
}
defaultproperties
{
maxBleedCount=7
bleedPeriod=1.500000
}

View File

@ -158,7 +158,12 @@ function SpawnTwoShots()
{ {
local vector X,Y,Z, FireStart; local vector X,Y,Z, FireStart;
local rotator FireRotation; local rotator FireRotation;
if( Controller!=none && KFDoorMover(Controller.Target)!=none )
// check this from the very start to prevent any log spam
if (Controller == none || IsInState('ZombieDying'))
return;
if (KFDoorMover(Controller.Target)!=none )
{ {
Controller.Target.TakeDamage(22,Self,Location,vect(0,0,0),Class'DamTypeVomit'); Controller.Target.TakeDamage(22,Self,Location,vect(0,0,0),Class'DamTypeVomit');
return; return;
@ -195,7 +200,10 @@ simulated function Tick(float deltatime)
{ {
local vector BileExplosionLoc; local vector BileExplosionLoc;
local FleshHitEmitter GibBileExplosion; local FleshHitEmitter GibBileExplosion;
Super.tick(deltatime); Super.tick(deltatime);
if( Role == ROLE_Authority && bMovingPukeAttack ) if( Role == ROLE_Authority && bMovingPukeAttack )
{ {
// Keep moving toward the target until the timer runs out (anim finishes) // Keep moving toward the target until the timer runs out (anim finishes)
@ -238,7 +246,8 @@ simulated function Tick(float deltatime)
{ {
if ( !class'GameInfo'.static.UseLowGore() ) if ( !class'GameInfo'.static.UseLowGore() )
{ {
BileExplosionLoc = self.Location; // remove self.
BileExplosionLoc = Location;
BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5)); BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5));
if (bDecapitated) if (bDecapitated)
@ -253,10 +262,10 @@ simulated function Tick(float deltatime)
} }
else else
{ {
BileExplosionLoc = self.Location; BileExplosionLoc = Location;
BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5)); BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5));
GibBileExplosion = Spawn(class 'LowGoreBileExplosion',self,, BileExplosionLoc ); GibBileExplosion = Spawn(class'LowGoreBileExplosion',self,, BileExplosionLoc );
bPlayBileSplash = true; bPlayBileSplash = true;
} }
} }

View File

@ -1,14 +1,17 @@
// Zombie Monster for KF Invasion gametype // Zombie Monster for KF Invasion gametype
class NiceZombieClot extends NiceZombieClotBase; class NiceZombieClot extends NiceZombieClotBase;
#exec OBJ LOAD FILE=KF_Freaks_Trip.ukx #exec OBJ LOAD FILE=KF_Freaks_Trip.ukx
#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx #exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx
#exec OBJ LOAD FILE=MeanZedSkins.utx #exec OBJ LOAD FILE=MeanZedSkins.utx
function ClawDamageTarget() function ClawDamageTarget()
{ {
local vector PushDir; local vector PushDir;
local KFPawn KFP; local KFPawn KFP;
local float UsedMeleeDamage; local float UsedMeleeDamage;
// TODO Controller fix
if( MeleeDamage > 1 ) if( MeleeDamage > 1 )
{ {
UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1)); UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1));
@ -40,6 +43,7 @@ function ClawDamageTarget()
} }
} }
} }
function RangedAttack(Actor A) function RangedAttack(Actor A)
{ {
if ( bShotAnim || Physics == PHYS_Swimming) if ( bShotAnim || Physics == PHYS_Swimming)

View File

@ -69,6 +69,7 @@ simulated function int DoAnimAction( name AnimName )
} }
return Super.DoAnimAction(AnimName); return Super.DoAnimAction(AnimName);
} }
simulated event SetAnimAction(name NewAction) simulated event SetAnimAction(name NewAction)
{ {
local int meleeAnimIndex; local int meleeAnimIndex;

View File

@ -1,7 +1,7 @@
// Zombie Monster for KF Invasion gametype // Zombie Monster for KF Invasion gametype
class NiceZombieCrawlerBase extends NiceMonster class NiceZombieCrawlerBase extends NiceMonster
abstract; abstract;
#exec OBJ LOAD FILE= // #exec OBJ LOAD FILE=
var() float PounceSpeed; var() float PounceSpeed;
var bool bPouncing; var bool bPouncing;
var(Anims) name MeleeAirAnims[3]; // Attack anims for when flying through the air var(Anims) name MeleeAirAnims[3]; // Attack anims for when flying through the air
@ -9,101 +9,7 @@ var(Anims) name MeleeAirAnims[3]; // Attack anims for when flying through th
// NOTE: All Code resides in the child class(this class was only created to // NOTE: All Code resides in the child class(this class was only created to
// eliminate hitching caused by loading default properties during play) // eliminate hitching caused by loading default properties during play)
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
function bool DoPounce()
{
if ( bZapped || bIsCrouched || bWantsToCrouch || (Physics != PHYS_Walking) || VSize(Location - Controller.Target.Location) > (MeleeRange * 5) )
return false;
Velocity = Normal(Controller.Target.Location-Location)*PounceSpeed;
Velocity.Z = JumpZ;
SetPhysics(PHYS_Falling);
ZombieSpringAnim();
bPouncing=true;
return true;
}
simulated function ZombieSpringAnim()
{
SetAnimAction('ZombieSpring');
}
event Landed(vector HitNormal)
{
bPouncing=false;
super.Landed(HitNormal);
}
event Bump(actor Other)
{
// TODO: is there a better way
if(bPouncing && KFHumanPawn(Other)!=none )
{
KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class'NiceZedMeleeDamageType');
if (KFHumanPawn(Other).Health <=0)
{
//TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget
KFHumanPawn(Other).SpawnGibs(self.rotation, 1);
}
//After impact, there'll be no momentum for further bumps
bPouncing=false;
}
}
// Blend his attacks so he can hit you in mid air.
simulated function int DoAnimAction( name AnimName )
{
if( AnimName=='InAir_Attack1' || AnimName=='InAir_Attack2' )
{
AnimBlendParams(1, 1.0, 0.0,, FireRootBone);
PlayAnim(AnimName,, 0.0, 1);
return 1;
}
if( AnimName=='HitF' )
{
AnimBlendParams(1, 1.0, 0.0,, NeckBone);
PlayAnim(AnimName,, 0.0, 1);
return 1;
}
if( AnimName=='ZombieSpring' )
{
PlayAnim(AnimName,,0.02);
return 0;
}
return Super.DoAnimAction(AnimName);
}
simulated event SetAnimAction(name NewAction)
{
local int meleeAnimIndex;
if( NewAction=='' )
Return;
if(NewAction == 'Claw')
{
meleeAnimIndex = Rand(2);
if( Physics == PHYS_Falling )
{
NewAction = MeleeAirAnims[meleeAnimIndex];
}
else
{
NewAction = meleeAnims[meleeAnimIndex];
}
}
ExpectingChannel = DoAnimAction(NewAction);
if( AnimNeedsWait(NewAction) )
{
bWaitForAnim = true;
}
if( Level.NetMode!=NM_Client )
{
AnimAction = NewAction;
bResetAnimAct = True;
ResetAnimActTime = Level.TimeSeconds+0.3;
}
}
// The animation is full body and should set the bWaitForAnim flag
simulated function bool AnimNeedsWait(name TestAnim)
{
if( TestAnim == 'ZombieSpring' || TestAnim == 'DoorBash' )
{
return true;
}
return false;
}
defaultproperties defaultproperties
{ {
PounceSpeed=330.000000 PounceSpeed=330.000000

View File

@ -2,7 +2,7 @@
// He's not quite as speedy as the other Zombies, But his attacks are TRULY damaging. // He's not quite as speedy as the other Zombies, But his attacks are TRULY damaging.
class NiceZombieScrakeBase extends NiceMonster class NiceZombieScrakeBase extends NiceMonster
abstract; abstract;
#exec OBJ LOAD FILE= // #exec OBJ LOAD FILE=
var(Sounds) sound SawAttackLoopSound; // THe sound for the saw revved up, looping var(Sounds) sound SawAttackLoopSound; // THe sound for the saw revved up, looping
var(Sounds) sound ChainSawOffSound; //The sound of this zombie dieing without a head var(Sounds) sound ChainSawOffSound; //The sound of this zombie dieing without a head
var bool bCharging; // Scrake charges when his health gets low var bool bCharging; // Scrake charges when his health gets low

View File

@ -77,20 +77,23 @@ function DiscardCurrentScreamBall(){
currScreamTiming = -1; currScreamTiming = -1;
} }
} }
function RangedAttack(Actor A) function RangedAttack(Actor A)
{ {
local int LastFireTime; local int LastFireTime;
local float Dist; local float Dist;
if ( bShotAnim )
if (bShotAnim)
return; return;
Dist = VSize(A.Location - Location); Dist = VSize(A.Location - Location);
if ( Physics == PHYS_Swimming )
if (Physics == PHYS_Swimming)
{ {
SetAnimAction('Claw'); SetAnimAction('Claw');
bShotAnim = true; bShotAnim = true;
LastFireTime = Level.TimeSeconds; LastFireTime = Level.TimeSeconds;
} }
else if(Dist < MeleeRange + CollisionRadius + A.CollisionRadius && A != Self) else if (Dist < MeleeRange + CollisionRadius + A.CollisionRadius && A != Self)
{ {
bShotAnim = true; bShotAnim = true;
LastFireTime = Level.TimeSeconds; LastFireTime = Level.TimeSeconds;
@ -98,16 +101,17 @@ function RangedAttack(Actor A)
Controller.bPreparingMove = true; Controller.bPreparingMove = true;
Acceleration = vect(0,0,0); Acceleration = vect(0,0,0);
} }
else if( Dist <= ScreamRadius && !bDecapitated && !bZapped ) // ok se we DO NOT want to scream at other nice zeds
else if (!bNotAHuman() && Dist <= ScreamRadius && !bDecapitated && !bZapped)
{ {
bShotAnim=true; bShotAnim = true;
SetAnimAction('Siren_Scream'); SetAnimAction('Siren_Scream');
if(screamStartTime > 0) if (screamStartTime > 0)
DiscardCurrentScreamBall(); DiscardCurrentScreamBall();
currScreamTiming = 0; currScreamTiming = 0;
screamStartTime = Level.TimeSeconds; screamStartTime = Level.TimeSeconds;
// Only stop moving if we are close // Only stop moving if we are close
if( Dist < ScreamRadius * 0.25 ) if (Dist < ScreamRadius * 0.25)
{ {
Controller.bPreparingMove = true; Controller.bPreparingMove = true;
Acceleration = vect(0,0,0); Acceleration = vect(0,0,0);
@ -119,6 +123,16 @@ function RangedAttack(Actor A)
Acceleration.Z = FMin(Acceleration.Z, 0.0f); Acceleration.Z = FMin(Acceleration.Z, 0.0f);
} }
} }
final private function bool bNotAHuman()
{
if (Controller == none || Controller.Enemy == none)
return false;
// log("Zed enemy classname was " $ Controller.Enemy.class);
return ClassIsChildOf(Controller.Enemy.class, class'NiceMonster');
}
simulated function int DoAnimAction( name AnimName ) simulated function int DoAnimAction( name AnimName )
{ {
if( AnimName=='Siren_Scream' || AnimName=='Siren_Bite' || AnimName=='Siren_Bite2' ) if( AnimName=='Siren_Scream' || AnimName=='Siren_Bite' || AnimName=='Siren_Bite2' )

View File

@ -1,7 +1,7 @@
// Zombie Monster for KF Invasion gametype // Zombie Monster for KF Invasion gametype
class NiceZombieStalkerBase extends NiceMonster class NiceZombieStalkerBase extends NiceMonster
abstract; abstract;
#exec OBJ LOAD FILE= // #exec OBJ LOAD FILE=
#exec OBJ LOAD FILE=KFX.utx #exec OBJ LOAD FILE=KFX.utx
#exec OBJ LOAD FILE=KF_BaseStalker.uax #exec OBJ LOAD FILE=KF_BaseStalker.uax
var float NextCheckTime; var float NextCheckTime;

View File

@ -899,42 +899,46 @@ function BileDamageEffect( int damage,
NextBileTime = Level.TimeSeconds + BileFrequency; NextBileTime = Level.TimeSeconds + BileFrequency;
} }
} }
function float GetDecapDamageModifier( class<NiceWeaponDamageType> damageType, function float GetDecapDamageModifier( class<NiceWeaponDamageType> damageType,
NicePlayerController nicePlayer, NicePlayerController nicePlayer,
KFPlayerReplicationInfo KFPRI){ KFPlayerReplicationInfo KFPRI)
{
local float damageMod; local float damageMod;
local bool shouldDoGoodDecap; local bool shouldDoGoodDecap;
local bool hasTrashCleaner; local bool hasTrashCleaner;
local bool isPerkedPickup; local bool isPerkedPickup;
local class<NiceWeaponPickup> pickupClass; local class<NiceWeaponPickup> pickupClass;
local class<NiceVeterancyTypes> niceVet; local class<NiceVeterancyTypes> niceVet;
// KFPRI accessed none fix
if (KFPRI != none)
niceVet = class<NiceVeterancyTypes>(KFPRI.ClientVeteranSkill); niceVet = class<NiceVeterancyTypes>(KFPRI.ClientVeteranSkill);
isPerkedPickup = false; isPerkedPickup = false;
if(niceVet != none){ if (niceVet != none)
{
pickupClass = niceVet.static.GetPickupFromDamageType(damageType); pickupClass = niceVet.static.GetPickupFromDamageType(damageType);
if(pickupClass != none) if (pickupClass != none)
isPerkedPickup = niceVet.static.IsPerkedPickup(pickupClass); isPerkedPickup = niceVet.static.IsPerkedPickup(pickupClass);
} }
shouldDoGoodDecap = false; shouldDoGoodDecap = false;
shouldDoGoodDecap = (damageType.default.decapType == DB_DROP); shouldDoGoodDecap = (damageType.default.decapType == DB_DROP);
shouldDoGoodDecap = shouldDoGoodDecap || shouldDoGoodDecap = shouldDoGoodDecap ||
(damageType.default.decapType == DB_PERKED && isPerkedPickup); (damageType.default.decapType == DB_PERKED && isPerkedPickup);
if(shouldDoGoodDecap) if (shouldDoGoodDecap)
damageMod = damageType.default.goodDecapMod; damageMod = damageType.default.goodDecapMod;
else else
damageMod = damageType.default.badDecapMod; damageMod = damageType.default.badDecapMod;
if(nicePlayer != none) if (nicePlayer != none)
hasTrashCleaner = class'NiceVeterancyTypes'.static. hasTrashCleaner = class'NiceVeterancyTypes'.static.
hasSkill(nicePlayer, class'NiceSkillCommandoTrashCleaner'); hasSkill(nicePlayer, class'NiceSkillCommandoTrashCleaner');
if(hasTrashCleaner){ if (hasTrashCleaner)
damageMod = FMin( {
damageMod, damageMod = FMin(damageMod, class'NiceSkillCommandoTrashCleaner'.default.decapitationMultiLimit);
class'NiceSkillCommandoTrashCleaner'.default.
decapitationMultiLimit
);
} }
return damageMod; return damageMod;
} }
function DealDecapDamage( int damage, function DealDecapDamage( int damage,
Pawn instigatedBy, Pawn instigatedBy,
Vector hitLocation, Vector hitLocation,

View File

@ -414,36 +414,47 @@ Begin:
} }
WhatToDoNext(99); WhatToDoNext(99);
} }
function bool SetEnemy( pawn newEnemy, function bool SetEnemy( pawn newEnemy,
optional bool bHateMonster, optional bool bHateMonster,
optional float MonsterHateChanceOverride){ optional float MonsterHateChanceOverride)
{
local NiceMonster niceZed; local NiceMonster niceZed;
local NiceZombieFleshpound niceFP; local NiceZombieFleshpound niceFP;
local bool bCanForceFight; local bool bCanForceFight;
// Can we fight anything? // Can we fight anything?
niceZed = NiceMonster(pawn); niceZed = NiceMonster(pawn);
niceFP = NiceZombieFleshpound(niceZed); niceFP = NiceZombieFleshpound(niceZed);
if(niceZed != none)
if (niceZed != none)
{
bCanForceFight = bCanForceFight =
KFMonster(pawn).HeadHealth <= 0 KFMonster(pawn).HeadHealth <= 0
|| KFMonster(pawn).bDecapitated || KFMonster(pawn).bDecapitated
|| newEnemy.Health <= 15; || (newEnemy != none && newEnemy.Health <= 15);
}
if (niceFP != none && niceFP.IsInState('RageCharging')) if (niceFP != none && niceFP.IsInState('RageCharging'))
bCanForceFight = false; bCanForceFight = false;
if(newEnemy != none)
bCanForceFight = bCanForceFight if (newEnemy != none)
&& newEnemy.Health > 0 && newEnemy != enemy; bCanForceFight = bCanForceFight && newEnemy.Health > 0 && newEnemy != enemy;
else else
bCanForceFight = false; bCanForceFight = false;
// Do fight if we can // Do fight if we can
if(bCanForceFight){ if(bCanForceFight)
{
ChangeEnemy(newEnemy, true); ChangeEnemy(newEnemy, true);
FightEnemy(false); FightEnemy(false);
return true; return true;
} }
// Otherwise - do the usual stupid stuff // Otherwise - do the usual stupid stuff
return super.SetEnemy(newEnemy, bHateMonster, monsterHateChanceOverride); return super.SetEnemy(newEnemy, bHateMonster, monsterHateChanceOverride);
} }
simulated function AddKillAssistant(Controller PC, float damage){ simulated function AddKillAssistant(Controller PC, float damage){
local bool bIsalreadyAssistant; local bool bIsalreadyAssistant;
local int i; local int i;