1
0
This commit is contained in:
GenZmeY 2020-12-13 18:09:05 +03:00
parent dd42f84140
commit 1fd126afa1
109 changed files with 6341 additions and 241 deletions

View File

@ -1516,6 +1516,9 @@ struct native ItemProperties
var int AltPerkId; //index bassed off our array
var int WeaponType;
var int FilterIdIndex;
var bool ItemOnSale;
var string BasePrice;
var string DiscountRate;
structcpptext
{
@ -1537,6 +1540,9 @@ struct native ItemProperties
};
var array<ItemProperties> ItemPropertiesList;
var bool bSalesEvent;
var bool bSalesEventChecked;
struct native ExchangeRule
{
var int Definition;

View File

@ -358,7 +358,7 @@ simulated function SetCharacterMeshFromArch( KFPawn KFP, optional KFPlayerReplic
{
NumberOfCosmetics++;
bMaskHeadMesh = bMaskHeadMesh || CosmeticVariants[CosmeticMeshIdx].bMaskHeadMesh;
// Attach all saved attachments to the character
SetAttachmentMeshAndSkin(
CosmeticMeshIdx,
@ -368,21 +368,21 @@ simulated function SetCharacterMeshFromArch( KFPawn KFP, optional KFPlayerReplic
}
// Check again for all cosmetic in case one of them was removed, this will fix problems with masked heads
for( AttachmentIdx=0; AttachmentIdx < `MAX_COSMETIC_ATTACHMENTS; AttachmentIdx++ )
/*for( AttachmentIdx=0; AttachmentIdx < `MAX_COSMETIC_ATTACHMENTS; AttachmentIdx++ )
{
CosmeticMeshIdx = KFPRI.RepCustomizationInfo.AttachmentMeshIndices[AttachmentIdx];
if ( CosmeticMeshIdx != `CLEARED_ATTACHMENT_INDEX && CosmeticMeshIdx != INDEX_NONE)
{
NumberOfCosmeticsPostRemoval++;
}
}
}*/
// If the number of cosmetics changed, made a new set of the mesh/cosmetics recursively and return
if(NumberOfCosmeticsPostRemoval != NumberOfCosmetics)
/*if(NumberOfCosmeticsPostRemoval != NumberOfCosmetics)
{
SetCharacterMeshFromArch( KFP, KFPRI );
return;
}
}*/
InitCharacterMICs(KFP, bMaskHeadMesh);
}
@ -781,7 +781,6 @@ private function SetAttachmentMeshAndSkin(
local string CharAttachmentMeshName;
local name CharAttachmentSocketName;
local int AttachmentSlotIndex;
if (KFP.WorldInfo.NetMode == NM_DedicatedServer)
{
return;
@ -791,7 +790,6 @@ private function SetAttachmentMeshAndSkin(
//DetachConflictingAttachments(CurrentAttachmentMeshIndex, KFP, KFPRI);
// Get a slot where this attachment could fit
AttachmentSlotIndex = GetAttachmentSlotIndex(CurrentAttachmentMeshIndex, KFP, KFPRI);
if (AttachmentSlotIndex == INDEX_NONE)
{
return;
@ -880,11 +878,11 @@ private function SetAttachmentMeshAndSkin(
* Removes any attachments that exist in the same socket or have overriding cases
* Network: Local Player
*/
function DetachConflictingAttachments(int NewAttachmentMeshIndex, KFPawn KFP, optional KFPlayerReplicationInfo KFPRI)
function array<int> DetachConflictingAttachments(int NewAttachmentMeshIndex, KFPawn KFP, optional KFPlayerReplicationInfo KFPRI, optional out array<int> out_RemovedAttachments )
{
local name NewAttachmentSocketName;
local int i, CurrentAttachmentIdx;
if ( CosmeticVariants.length > 0 &&
NewAttachmentMeshIndex < CosmeticVariants.length && NewAttachmentMeshIndex != INDEX_NONE)
{
@ -902,6 +900,7 @@ function DetachConflictingAttachments(int NewAttachmentMeshIndex, KFPawn KFP, op
KFP.ThirdPersonAttachmentSocketNames[i] == NewAttachmentSocketName )
{
RemoveAttachmentMeshAndSkin(i, KFP, KFPRI);
out_RemovedAttachments.AddItem(i);
continue;
}
@ -909,6 +908,7 @@ function DetachConflictingAttachments(int NewAttachmentMeshIndex, KFPawn KFP, op
if( GetOverrideCase(CurrentAttachmentIdx, NewAttachmentMeshIndex) )
{
RemoveAttachmentMeshAndSkin(i, KFP, KFPRI);
out_RemovedAttachments.AddItem(i);
continue;
}
@ -916,6 +916,7 @@ function DetachConflictingAttachments(int NewAttachmentMeshIndex, KFPawn KFP, op
if( GetOverrideCase(NewAttachmentMeshIndex, CurrentAttachmentIdx) )
{
RemoveAttachmentMeshAndSkin(i, KFP, KFPRI);
out_RemovedAttachments.AddItem(i);
continue;
}
}
@ -995,8 +996,7 @@ function int GetAttachmentSlotIndex(
// Return the next available attachment index or the index that matches this mesh
for( AttachmentIdx=0; AttachmentIdx < `MAX_COSMETIC_ATTACHMENTS; AttachmentIdx++ )
{
if (KFPRI.RepCustomizationInfo.AttachmentMeshIndices[AttachmentIdx] == INDEX_NONE ||
KFPRI.RepCustomizationInfo.AttachmentMeshIndices[AttachmentIdx] == CurrentAttachmentMeshIndex)
if (KFPRI.RepCustomizationInfo.AttachmentMeshIndices[AttachmentIdx] == CurrentAttachmentMeshIndex)
{
return AttachmentIdx;
}

View File

@ -261,6 +261,44 @@ exec function TestNumbPrompts(int NumberOfPrompts)
}
}
exec function TestMapMessage(String S, float time)
{
local Pawn P;
local KFPlayerController KFPC;
P = GetMyPawn();
KFPC = KFPlayerController(Outer);
if(P == none || KFPC == None)
{
return;
}
if(KFPC.MyGFxHUD != none )
{
KFPC.MyGFxHUD.MapTextWidget.DisplayMapText(S, time, true);
}
}
exec function TestMapCounterMessage(String S, float time)
{
local Pawn P;
local KFPlayerController KFPC;
P = GetMyPawn();
KFPC = KFPlayerController(Outer);
if(P == none || KFPC == None)
{
return;
}
if(KFPC.MyGFxHUD != none )
{
KFPC.MyGFxHUD.MapCounterTextWidget.DisplayMapText(S, time);
}
}
exec function MakeFakePopUp()
{
local Pawn P;
@ -883,6 +921,14 @@ simulated exec function Minigun()
GiveWeapon( "KFGameContent.KFWeap_Minigun" );
}
/**
* Give the player the Vampire
*/
simulated exec function Vampire()
{
GiveWeapon( "KFGameContent.KFWeap_HRG_Vampire" );
}
/**
* Give the player all pistol weapons
*/
@ -995,6 +1041,11 @@ simulated exec function MineRec()
GiveWeapon( "KFGameContent.KFWeap_Mine_Reconstructor" );
}
simulated exec function FrostSAxe()
{
GiveWeapon( "KFGameContent.KFWeap_Rifle_FrostShotgunAxe" );
}
/**
* Give the player all Medic weapons
*/
@ -1010,6 +1061,7 @@ simulated exec function Medic()
GiveWeapon( "KFGameContent.KFWeap_Rifle_HRGIncision" );
GiveWeapon( "KFGameContent.KFWeap_AssaultRifle_MedicRifleGrenadeLauncher" );
GiveWeapon( "KFGameContent.KFWeap_Blunt_MedicBat" );
GiveWeapon( "KFGameContent.KFWeap_HRG_Vampire" );
}
/**
@ -2361,7 +2413,7 @@ exec function PathInfo()
ClientMessage( "Paths last built: "$WorldInfo.LastSuccessfulPathBuildTime, CheatType );
}
/** Sends all active NPCs and not-yet-spawned NPCs into or out of debug mode */
/** Sends all active NPCs and not-yet-spawned NPCs into or out of debug mode */
exec function AIDebugMode( optional bool bDebugMode=true )
{
local KFGameInfo KFG;

View File

@ -0,0 +1,219 @@
//=============================================================================
// KFEmit_DirectionalPath
//=============================================================================
// Directional emitter
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//============================================================================
class KFEmit_DirectionalPath extends Emitter;
/** The Template to use for this emitter */
var() ParticleSystem EmitterTemplate;
/** path points to travel to */
var vector DestinationFinal;
var vector DestinationMidPoint;
var vector DestinationCurrent;
/** limit to destroy the partcile */
var float LimitDistanceCurrent;
var float LimitDistanceCurrentPowed;
var float LimitDistanceDestinationFinal;
var float LimitDistanceDestinationMidPoint;
/** rate to changed dir on curves */
var float CurveTurnRateCurrent;
var float CurveTurnRateUntilDestinationFinal;
var float CurveTurnRateUntilDestinationMidPoint;
var float RateTickCheckHasReached;
var vector LastDir;
var vector NewDir;
var bool IsEnabled;
/*********************************************************************************************
* Acceleration physics
********************************************************************************************* */
/** Acceleration magnitude */
var() float ParticleSpeed;
var float HalfAngleSpawnCone;
var transient bool bInitialized;
var transient bool bReachDestinationFinal;
var transient bool bReachDestinationMidPoint;
var transient float TickCheckHasReachedTime;
simulated function PostBeginPlay()
{
//LifeSpan = 3.0;
TickCheckHasReachedTime = RateTickCheckHasReached;
Super.PostBeginPlay();
}
/** Override the final waypoint (optional) */
simulated function SetDestination( vector NewDestinationFinal,
vector NewDestinationMidPoint,
float NewLimitDistanceDestinationFinal,
float NewLimitDistanceDestinationMidPoint,
float NewCurveTurnRateUntilDestinationFinal,
float NewCurveTurnRateUntilDestinationMidPoint,
float NewHalfAngleSpawnCone)
{
DestinationFinal = NewDestinationFinal;
DestinationMidPoint = NewDestinationMidPoint;
LimitDistanceDestinationFinal = NewLimitDistanceDestinationFinal;
LimitDistanceDestinationMidPoint = NewLimitDistanceDestinationMidPoint;
CurveTurnRateUntilDestinationFinal = NewCurveTurnRateUntilDestinationFinal;
CurveTurnRateUntilDestinationMidPoint = NewCurveTurnRateUntilDestinationMidPoint;
bReachDestinationFinal = false;
bReachDestinationMidPoint = false;
HalfAngleSpawnCone = NewHalfAngleSpawnCone;
DestinationCurrent = DestinationMidPoint;
LimitDistanceCurrent = LimitDistanceDestinationMidPoint;
LimitDistanceCurrentPowed = LimitDistanceCurrent * LimitDistanceCurrent;
CurveTurnRateCurrent = CurveTurnRateUntilDestinationMidPoint;
Velocity = VRandCone(Normal(DestinationCurrent - Location), HalfAngleSpawnCone) * ParticleSpeed;
LastDir = Normal(Velocity);
SetRotation(rotator(Normal(Velocity)));
SetPhysics(PHYS_Projectile);
//OriginalDistanceToDestination = VSize(Destination - Location);
bInitialized = true;
}
simulated function UpdateDestination( vector NewDestinationFinal, optional vector NewDestinationMidPoint )
{
DestinationFinal = NewDestinationFinal;
DestinationMidPoint = NewDestinationMidPoint;
DestinationCurrent = DestinationFinal;
if (!bReachDestinationMidPoint)
{
DestinationCurrent = DestinationMidPoint;
}
}
simulated event SetTemplate(ParticleSystem NewTemplate, optional bool bDestroyOnFinish)
{
Super(Emitter).SetTemplate(NewTemplate, bDestroyOnFinish);
}
simulated function bool HasReachedDestinationFinal()
{
Local bool bCloseEnough;
bCloseEnough = VSizeSq(Location - DestinationFinal) <= LimitDistanceCurrentPowed ;
return bCloseEnough;
}
simulated function bool HasReachedDestinationMidPoint()
{
Local bool bCloseEnough;
bCloseEnough = VSizeSq(Location - DestinationMidPoint) <= LimitDistanceCurrentPowed ;
return bCloseEnough;
}
simulated function Tick(float DeltaTime)
{
if ( !bInitialized || IsEnabled == false )
{
return;
}
TickCheckHasReachedTime -= DeltaTime;
if (TickCheckHasReachedTime <= 0)
{
TickCheckHasReachedTime = RateTickCheckHasReached;
if (bReachDestinationMidPoint)
{
if (bReachDestinationFinal)
{
SetLocation(DestinationFinal);
return;
}
if( HasReachedDestinationFinal() )
{
bReachDestinationFinal = true;
SetLocation(DestinationFinal);
return;
}
}
else
{
if( HasReachedDestinationMidPoint() )
{
bReachDestinationMidPoint = true;
DestinationCurrent = DestinationFinal;
LimitDistanceCurrent = LimitDistanceDestinationFinal;
LimitDistanceCurrentPowed = LimitDistanceCurrent * LimitDistanceCurrent;
CurveTurnRateCurrent = CurveTurnRateUntilDestinationFinal;
}
}
}
//Acceleration = CurveTurnRate * DeltaTime * ACCEL_RATE * Normal(Destination - Location);
//Velocity = Velocity + Acceleration; // force double acceleration
NewDir = Normal(DestinationCurrent - Location);
SetRotation(rotator(LastDir + CurveTurnRateCurrent * NewDir));
Velocity = vector(Rotation) * ParticleSpeed;
//SetRotation(rotator(Normal(Velocity)));
LastDir = vector(Rotation);
//Velocity = vector(Rotation) * ParticleSpeed;
//DrawDebugSphere(Location, 12, 12, 255, 0, 0, false);
}
simulated function DeactivateEmitter()
{
ParticleSystemComponent.DeactivateSystem();
IsEnabled = false;
bReachDestinationFinal = false;
bReachDestinationMidPoint = false;
SetTickIsDisabled(true);
SetHidden(true);
}
simulated function ActivateEmitter()
{
ParticleSystemComponent.ActivateSystem();
IsEnabled = true;
bInitialized = true;
SetTickIsDisabled(false);
SetHidden(false);
}
simulated function OnParticleSystemFinished(ParticleSystemComponent FinishedComponent)
{
return;
}
defaultproperties
{
ParticleSpeed=600
bNoDelete=false
bStatic=false
HalfAngleSpawnCone=60
LimitDistanceDestinationFinal=5
LimitDistanceDestinationMidPoint=16
CurveTurnRateUntilDestinationFinal=0.4
CurveTurnRateUntilDestinationMidPoint=4.0
RateTickCheckHasReached=0.05
}

View File

@ -0,0 +1,27 @@
class KFGFXSpecialEventObjectivesContainer_Xmas2020 extends KFGFxSpecialEventObjectivesContainer;
function Initialize(KFGFxObject_Menu NewParentMenu)
{
super.Initialize(NewParentMenu);
}
DefaultProperties
{
ObjectiveIconURLs[0] = "Xmas_UI.UI_Objectives_Christmas2020_FrozenRoses" // Collect 3 roses in Elysium
ObjectiveIconURLs[1] = "Xmas_UI.UI_Objectives_Christmas2020_FourDifferentTales" // Collect 4 tomes in Elysium
ObjectiveIconURLs[2] = "Xmas_UI.UI_Objectives_Christmas2020_UnderTheMistletoe" // Complete one wave in Elysium's Botanica arena
ObjectiveIconURLs[3] = "Xmas_UI.UI_Objectives_Christmas2020_AChristmasCarol" // Complete one wave in Elysium's Loremaster Sanctum arena
ObjectiveIconURLs[4] = "Xmas_UI.UI_Objectives_Christmas2020_EverlastingWinter" // Complete wave 15 on Endless Hard or higher difficulty on Elysium
//defaults
AllCompleteRewardIconURL="CHR_CosmeticSet_XMAS_04_Item_TEX.tacticalelfpack.tacticalelfpack_precious_large"
ChanceDropIconURLs[0]="CHR_Cosmetic_XMAS_Item_TEX.Tickets.Krampus_Ticket"
ChanceDropIconURLs[1]="CHR_Cosmetic_XMAS_Item_TEX.Tickets.Krampus_Ticket_Golden"
IconURL="Xmas_UI.KF2_Christmas_ChristmasCrackdown_SmallLogo"
UsesProgressList[0] = true
UsesProgressList[1] = true
UsesProgressList[2] = false
UsesProgressList[3] = false
UsesProgressList[4] = false
}

View File

@ -21,6 +21,12 @@ var localized string MouseString;
var localized string MouseSmoothingString;
var localized string ZoomSensitivityString;
var localized string ControllerZoomSensitivityString;
var localized string ControllerDeadzoneString;
var localized string ControllerDeadzoneDescriptionString;
var localized string ControllerDeadzoneDescriptionXboxString;
var localized string ControllerAccelerationJumpString;
var localized string ControllerAccelerationJumpDescriptionString;
var localized string ControllerAccelerationJumpDescriptionXboxString;
var localized string AimAssistLockOnString;
var localized string AimAssistRotationString;
var localized string AimAssistSlowDownString;
@ -32,7 +38,6 @@ var KFGFxOptionsMenu_Controls ControlsMenu;
function Initialize( KFGFxObject_Menu NewParentMenu )
{
super.Initialize( NewParentMenu );
ControlsMenu = KFGFxOptionsMenu_Controls(NewParentMenu);
LocalizeText();
InitializeOptions();
@ -43,20 +48,36 @@ function LocalizeText()
local GFxObject LocalizedObject;
LocalizedObject = CreateObject( "Object" );
LocalizedObject.SetString("sensitivityLabel" , SensitivityString);
LocalizedObject.SetString("invertedLabel" , InvertedString);
LocalizedObject.SetString("Mouse" , MouseString);
LocalizedObject.SetString("controllerSensitivityLabel" , SensitivityString);
LocalizedObject.SetString("controllerInvertedLabel" , InvertedString);
LocalizedObject.SetString("controllerString" , ControllerString);
LocalizedObject.SetString("sensitivityLabel" , SensitivityString);
LocalizedObject.SetString("invertedLabel" , InvertedString);
LocalizedObject.SetString("Mouse" , MouseString);
LocalizedObject.SetString("controllerSensitivityLabel" , SensitivityString);
LocalizedObject.SetString("controllerInvertedLabel" , InvertedString);
LocalizedObject.SetString("controllerString" , ControllerString);
LocalizedObject.SetString("mouseSmoothingLabel" , MouseSmoothingString);
LocalizedObject.SetString("zoomSensitivityLabel" , ZoomSensitivityString);
LocalizedObject.SetString("controllerZoomSensitivityLabel" , ControllerZoomSensitivityString);
LocalizedObject.SetString("controllerDeadzoneLabel" , ControllerDeadzoneString);
LocalizedObject.SetString("controllerAccelerationJumpLabel" , ControllerAccelerationJumpString);
// Localization alternative for Xbox
if( class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Durango) )
{
LocalizedObject.SetString("controllerDeadzoneDescriptionLabel" , ControllerDeadzoneDescriptionXboxString);
LocalizedObject.SetString("controllerAccelerationJumpDescriptionLabel" , ControllerAccelerationJumpDescriptionXboxString);
}
else
{
LocalizedObject.SetString("controllerDeadzoneDescriptionLabel" , ControllerDeadzoneDescriptionString);
LocalizedObject.SetString("controllerAccelerationJumpDescriptionLabel" , ControllerAccelerationJumpDescriptionString);
}
LocalizedObject.SetString("aimAssistLockOnLabel" , aimAssistLockOnString);
LocalizedObject.SetString("aimAssistRotationLabel" , aimAssistRotationString);
LocalizedObject.SetString("aimAssistSlowDownLabel" , aimAssistSlowDownString);
LocalizedObject.SetString("forceFeedbackLabel" , forceFeedbackString);
LocalizedObject.SetString("mouseSmoothingLabel" , MouseSmoothingString);
LocalizedObject.SetString("zoomSensitivityLabel" , ZoomSensitivityString);
LocalizedObject.SetString("controllerZoomSensitivityLabel" , ControllerZoomSensitivityString);
LocalizedObject.SetString("aimAssistLockOnLabel" , aimAssistLockOnString);
LocalizedObject.SetString("aimAssistRotationLabel" , aimAssistRotationString);
LocalizedObject.SetString("aimAssistSlowDownLabel" , aimAssistSlowDownString);
LocalizedObject.SetString("forceFeedbackLabel" , forceFeedbackString);
LocalizedObject.SetString("resetDefault", Localize("KFGFxOptionsMenu_Graphics","DefaultString","KFGame"));
SetObject("localizedText", LocalizedObject);
@ -95,6 +116,14 @@ function InitializeOptions()
ValuesObject.SetFloat("controllerZoomSensitivityValueMin" , 100 * ControlsMenu.MinControllerZoomLookSensitivity);
ValuesObject.SetFloat("controllerZoomSensitivityValueMax" , 100 * ControlsMenu.MaxControllerZoomLookSensitivity);
ValuesObject.SetFloat("controllerDeadzoneValue" , 100 * KFPI.GamepadDeadzoneScale);
ValuesObject.SetFloat("controllerDeadzoneValueMin" , 100 * ControlsMenu.MinControllerDeadzone);
ValuesObject.SetFloat("controllerDeadzoneValueMax" , 100 * ControlsMenu.MaxControllerDeadzone);
ValuesObject.SetFloat("controllerAccelerationJumpValue" , 100 * KFPI.GamepadAccelerationJumpScale);
ValuesObject.SetFloat("controllerAccelerationJumpValueMin" , 100 * ControlsMenu.MinControllerAccelerationJump);
ValuesObject.SetFloat("controllerAccelerationJumpValueMax" , 100 * ControlsMenu.MaxControllerAccelerationJump);
ValuesObject.SetBool("controllerInvertedValue" , KFPI.bInvertController);
ValuesObject.SetBool("aimAssistLockOnValue" , KFPI.bAutoTargetEnabled);
ValuesObject.SetBool("aimAssistRotationValue" , KFPI.bTargetAdhesionEnabled);
@ -137,6 +166,12 @@ function ResetInputOptions()
KFPI.GamepadZoomedSensitivityScale = ControlsMenu.Manager.CachedProfile.GetDefaultFloat(KFID_GamepadZoomedSensitivityScale);
ControlsMenu.Manager.CachedProfile.SetProfileSettingValueFloat(KFID_GamepadZoomedSensitivityScale, KFPI.GamepadZoomedSensitivityScale);
KFPI.GamepadDeadzoneScale = ControlsMenu.Manager.CachedProfile.GetDefaultFloat(KFID_GamepadDeadzoneScale);
ControlsMenu.Manager.CachedProfile.SetProfileSettingValueFloat(KFID_GamepadDeadzoneScale, KFPI.GamepadDeadzoneScale);
KFPI.GamepadAccelerationJumpScale = ControlsMenu.Manager.CachedProfile.GetDefaultFloat(KFID_GamepadAccelerationJumpScale);
ControlsMenu.Manager.CachedProfile.SetProfileSettingValueFloat(KFID_GamepadAccelerationJumpScale, KFPI.GamepadAccelerationJumpScale);
KFPI.bInvertController = ControlsMenu.Manager.CachedProfile.GetDefaultBool(KFID_InvertController);
ControlsMenu.Manager.CachedProfile.SetProfileSettingValueBool(KFID_InvertController, KFPI.bInvertController);

View File

@ -32,12 +32,17 @@ var int LastWeight;
var byte LastSecondaryAmmo;
var bool bWasUsingAltFireMode;
var bool bUsesSecondaryAmmo;
var bool bUsesGrenadesAsSecondaryAmmo;
var class<KFPerk> LastPerkClass;
var KFWeapon LastWeapon;
var KFInventoryManager MyKFInvManager;
var ASColorTransform DefaultColor;
var ASColorTransform RedColor;
var name OldState;
function InitializeHUD()
{
MyKFPC = KFPlayerController(GetPC());
@ -46,6 +51,9 @@ function InitializeHUD()
{
MyKFInvManager = KFInventoryManager(MyKFPC.Pawn.InvManager);
}
DefaultColor = GetObject("secondaryAmmoContainer").GetColorTransform();
RedColor = GetObject("FlashlightContainer").GetColorTransform();
}
function TickHud(float DeltaTime)
@ -132,6 +140,9 @@ function UpdateWeapon()
local byte CurrentSecondaryAmmo;
local string CurrentSpecialAmmo;
local KFWeapon CurrentWeapon;
local ASColorTransform ColorChange;
local name StateName;
local bool ForceSecondaryWeaponIconUpdate;
if(MyKFPC != none && MyKFPC.Pawn != none && MyKFPC.Pawn.Weapon != none )
{
@ -143,6 +154,7 @@ function UpdateWeapon()
{
LastWeapon = CurrentWeapon;
RefreshWeapon(CurrentWeapon);
ForceSecondaryWeaponIconUpdate = true;
}
else if( bWasUsingAltFireMode != CurrentWeapon.bUseAltFireMode )
{
@ -180,14 +192,40 @@ function UpdateWeapon()
// always reset the last special ammo since setting a new string turns the default "---" off
LastSpecialAmmo = CurrentSpecialAmmo;
StateName = CurrentWeapon.GetStateName();
if (bUsesSecondaryAmmo)
{
CurrentSecondaryAmmo = CurrentWeapon.GetSecondaryAmmoForHUD();
if (CurrentSecondaryAmmo != LastSecondaryAmmo)
// Update the amount of ammo
if (CurrentSecondaryAmmo != LastSecondaryAmmo)
{
SetInt("secondaryAmmo" , CurrentSecondaryAmmo);
LastSecondaryAmmo = CurrentSecondaryAmmo;
}
// Force the color of the background if we detect a weapon change and the weapon doesn't use secondary ammo
if( !bUsesGrenadesAsSecondaryAmmo && ForceSecondaryWeaponIconUpdate )
{
GetObject("secondaryAmmoContainer").SetColorTransform(DefaultColor);
}
// Update the aspect of the icon
if ( bUsesGrenadesAsSecondaryAmmo && StateName != OldState)
{
OldState = StateName;
if(CurrentWeapon.HasToReloadSecondaryAmmoForHUD())
{
ColorChange.Add = MakeLinearColor(0.65f,0.23f,0.00f,0.2f);
GetObject("secondaryAmmoContainer").SetColorTransform(ColorChange);
SetString("secondaryIcon", "img://"$CurrentWeapon.SecondaryAmmoTexture.GetPackageName()$".UI_FireModeSelect_BulletSingleProhibited");
}
else
{
SetString("secondaryIcon", "img://"$CurrentWeapon.SecondaryAmmoTexture.GetPackageName()$"."$CurrentWeapon.SecondaryAmmoTexture);
GetObject("secondaryAmmoContainer").SetColorTransform(DefaultColor);
}
}
}
}
@ -213,6 +251,7 @@ function RefreshWeapon(KFWeapon CurrentWeapon)
SetBool("bUsesAmmo", bUsesAmmo);
bUsesSecondaryAmmo = CurrentWeapon.UsesSecondaryAmmo();
bUsesGrenadesAsSecondaryAmmo = CurrentWeapon.UsesGrenadesAsSecondaryAmmo();
SetBool("bUsesSecondaryAmmo", bUsesSecondaryAmmo);
if( bUsesSecondaryAmmo )
{

View File

@ -45,6 +45,9 @@ var localized string BioString;
var localized string HeadString;
var localized string BodyString;
var localized string AttachmentsString;
var localized string Attachment0String;
var localized string Attachment1String;
var localized string Attachment2String;
var localized string SkinsString;
var localized string BackString;
var localized string NoneString;
@ -149,6 +152,9 @@ function LocalizeText()
LocalizedObject.SetString("bodiesString", BodyString);
LocalizedObject.SetString("skinsString", SkinsString);
LocalizedObject.SetString("attachmentsString", AttachmentsString);
LocalizedObject.SetString("attachment0String", Attachment0String);
LocalizedObject.SetString("attachment1String", Attachment1String);
LocalizedObject.SetString("attachment2String", Attachment2String);
SetObject("localizeText", LocalizedObject);
}
@ -498,7 +504,7 @@ function SetAttachmentButtons(string AttachmentMeshKey, string sectionFunctionNa
for(i = 0; i < `MAX_COSMETIC_ATTACHMENTS; i++)
{
AttachmentIndex = MyKFPRI.RepCustomizationInfo.AttachmentMeshIndices[i];
AttachmentIndex = MyKFPRI.RepCustomizationInfo.AttachmentMeshIndices[i];
if( AttachmentIndex == `CLEARED_ATTACHMENT_INDEX )
{
DataObject.SetString("selectedAttachment_"$i, "----");
@ -674,12 +680,25 @@ private function Callback_Body( int MeshIndex, int SkinIndex )
SetGearButtons(MeshIndex, SkinIndex, BodyMeshKey, BodySkinKey, BodyFunctionKey);
}
private function Callback_Attachment( int MeshIndex, int SkinIndex )
private function Callback_Attachment1( int MeshIndex, int SkinIndex )
{
Callback_AttachmentNumbered(MeshIndex, SkinIndex, 0);
}
private function Callback_Attachment2( int MeshIndex, int SkinIndex )
{
Callback_AttachmentNumbered(MeshIndex, SkinIndex, 1);
}
private function Callback_Attachment3( int MeshIndex, int SkinIndex )
{
Callback_AttachmentNumbered(MeshIndex, SkinIndex, 2);
}
private function Callback_AttachmentNumbered(int MeshIndex, int SkinIndex, int SlotIndex)
{
local Pawn P;
local KFPawn KFP;
local int SlotIndex;
local int i;
local array<int> RemovedAttachments;
P = GetPC().Pawn;
if( P != none )
{
@ -687,6 +706,29 @@ private function Callback_Attachment( int MeshIndex, int SkinIndex )
if ( KFP != none && MyKFPRI != None )
{
//CurrentCharInfo.RemoveAttachmentMeshAndSkin(SlotIndex, KFP, MyKFPRI);
CurrentCharInfo.DetachConflictingAttachments(MeshIndex, KFP, MyKFPRI, RemovedAttachments);
SelectCustomizationOption(KFP, CO_Attachment, MeshIndex, SkinIndex, SlotIndex);
}
}
SetAttachmentButtons(AttachmentKey, AttachmentFunctionKey);
}
private function Callback_Attachment( int MeshIndex, int SkinIndex )
{
local Pawn P;
local KFPawn KFP;
local int SlotIndex;
P = GetPC().Pawn;
if( P != none )
{
KFP = KFPawn( P );
if ( KFP != none && MyKFPRI != None )
{
CurrentCharInfo.DetachConflictingAttachments(MeshIndex, KFP, MyKFPRI);
SlotIndex = CurrentCharInfo.GetAttachmentSlotIndex(MeshIndex, KFP, MyKFPRI);
SelectCustomizationOption(KFP, CO_Attachment, MeshIndex, SkinIndex, SlotIndex);

View File

@ -11,6 +11,8 @@
class KFGFxMenu_Store extends KFGFxObject_Menu
native(UI);
`include(KFProfileSettings.uci)
var localized string ExitKF2;
/** Caches a local reference to the online subsystem */
@ -22,8 +24,6 @@ var KFGFxStoreContainer_Cart CartContainer;
var GFxObject AddCartButton;
struct StoreItem
{
var int SKU;
@ -65,6 +65,9 @@ function InitializeMenu( KFGFxMoviePlayer_Manager InManager )
function OnOpen()
{
local KFProfileSettings ProfileSettings;
local bool bHasTabbedToStore;
if( class'WorldInfo'.static.IsConsoleBuild( CONSOLE_Orbis ) )
{
CheckForEmptyStore();
@ -78,6 +81,17 @@ function OnOpen()
{
OnlineSub.AddOnInventoryReadCompleteDelegate(OnInventoryReadComplete);
}
ProfileSettings = Manager.CachedProfile;
bHasTabbedToStore = ProfileSettings != none ? ProfileSettings.GetProfileInt(KFID_HasTabbedToStore) != 0 : false;
if( Class'KFGameEngine'.static.IsSalesEventActive() && ProfileSettings != none && !bHasTabbedToStore )
{
ProfileSettings.SetProfileSettingValueInt(KFID_HasTabbedToStore, 1);
}
else if( !Class'KFGameEngine'.static.IsSalesEventActive() && Class'KFGameEngine'.static.IsSalesEventChecked() && ProfileSettings != none )
{
ProfileSettings.SetProfileSettingValueInt(KFID_HasTabbedToStore, 0);
}
RefreshItemList();

View File

@ -64,6 +64,10 @@ var KFGFxWidget_NonCriticalGameMessage InviteGameMessageWidget;
var KFGFxWidget_RhythmCounter RhythmCounterWidget;
// Widget that displays health bar
var KFGFxWidget_BossHealthBar bossHealthBar;
// Widget that displays map texts
var KFGFxWidget_MapText MapTextWidget;
// Widget that displays map texts
var KFGFxWidget_MapCounterText MapCounterTextWidget;
var KFPlayerController KFPC;
@ -172,6 +176,22 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
BossHealthBar.InitializeHUD();
}
break;
case 'mapTextWidget':
if( MapTextWidget == none )
{
MapTextWidget=KFGFxWidget_MapText(Widget);
SetWidgetPathBinding( Widget, WidgetPath );
MapTextWidget.InitializeHUD();
}
break;
case 'counterMapTextWidget':
if( MapCounterTextWidget == none )
{
MapCounterTextWidget=KFGFxWidget_MapCounterText(Widget);
SetWidgetPathBinding( Widget, WidgetPath );
MapCounterTextWidget.InitializeHUD();
}
break;
case 'KickVoteWidget':
if( KickVoteWidget == none )
{
@ -351,7 +371,7 @@ function TickHud(float DeltaTime)
{
return;
}
if (WaveInfoWidget != none)
{
WaveInfoWidget.TickHUD(DeltaTime);
@ -377,6 +397,16 @@ function TickHud(float DeltaTime)
BossHealthBar.TickHud( DeltaTime );
}
if(MapTextWidget != none)
{
MapTextWidget.TickHud( UpdateInterval );
}
if(MapCounterTextWidget != none)
{
MapCounterTextWidget.TickHud( UpdateInterval );
}
if( SpectatorInfoWidget != none )
{
SpectatorInfoWidget.TickHud( DeltaTime );
@ -678,6 +708,22 @@ function HideBossNamePlate()
}
}
function DisplayMapText(string MessageText, float DisplayTime, bool bWaitForTheNextMessageToFinish)
{
if(MapTextWidget != none)
{
MapTextWidget.DisplayMapText(MessageText, DisplayTime, bWaitForTheNextMessageToFinish);
}
}
function DisplayMapCounterText(string MessageText, float DisplayTime)
{
if(MapCounterTextWidget != none)
{
MapCounterTextWidget.DisplayMapText(MessageText, DisplayTime);
}
}
function DisplayPriorityMessage(string InPrimaryMessageString, string InSecondaryMessageString, int LifeTime, optional EGameMessageType MessageType)
{
local GFxObject PriorityMessageObject;
@ -1348,6 +1394,8 @@ DefaultProperties
WidgetBindings.Add((WidgetName="InviteMessageWidget", WidgetClass=class'KFGFxWidget_NonCriticalGameMessage'))
WidgetBindings.Add((WidgetName="RhythmCounter", WidgetClass=class'KFGFxWidget_RhythmCounter'))
WidgetBindings.Add((WidgetName="bossHealthBar", WidgetClass=class'KFGFxWidget_BossHealthBar'))
WidgetBindings.Add((WidgetName="mapTextWidget", WidgetClass=class'KFGFxWidget_MapText'))
WidgetBindings.Add((WidgetName="counterMapTextWidget", WidgetClass=class'KFGFxWidget_MapCounterText'))
SpecialWaveIconPath(AT_Clot)="UI_Endless_TEX.ZEDs.UI_ZED_Endless_Cyst"

View File

@ -20,6 +20,10 @@ var const float MinControllerLookSensitivity;
var const float MaxControllerLookSensitivity;
var const float MinControllerZoomLookSensitivity;
var const float MaxControllerZoomLookSensitivity;
var const float MinControllerDeadzone;
var const float MaxControllerDeadzone;
var const float MinControllerAccelerationJump;
var const float MaxControllerAccelerationJump;
var const float MinMouseLookSensitivity;
var const float MaxMouseLookSensitivity;
var const float MinMouseLookZoomSensitivity;
@ -98,6 +102,7 @@ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
case ('inputContainer'):
if ( InputContainer == none )
{
//`log(`location@" case ('inputContainer') ");
InputContainer = KFGFxControlsContainer_Input( Widget );
InputContainer.Initialize( self );
}
@ -164,6 +169,26 @@ function Callback_ControllerZoomSensitivity( float NewSensitivity )
Manager.CachedProfile.SetProfileSettingValueFloat(KFID_GamepadZoomedSensitivityScale, KFPI.GamepadZoomedSensitivityScale);
}
function Callback_ControllerDeadzone( float NewDeadzone )
{
local KFPlayerInput KFPI;
KFPI = KFPlayerInput(GetPC().PlayerInput);
KFPI.GamepadDeadzoneScale = NewDeadzone / 100;
Manager.CachedProfile.SetProfileSettingValueFloat(KFID_GamepadDeadzoneScale, KFPI.GamepadDeadzoneScale);
}
function Callback_ControllerAccelerationJump( float NewAccelerationJump )
{
local KFPlayerInput KFPI;
KFPI = KFPlayerInput(GetPC().PlayerInput);
KFPI.GamepadAccelerationJumpScale = NewAccelerationJump / 100;
Manager.CachedProfile.SetProfileSettingValueFloat(KFID_GamepadAccelerationJumpScale, KFPI.GamepadAccelerationJumpScale);
}
function Callback_ControllerInvertChanged( bool bInvertController )
{
local KFPlayerInput KFPI;
@ -311,6 +336,10 @@ defaultproperties
MaxControllerLookSensitivity=3.5
MinControllerZoomLookSensitivity=.1
MaxControllerZoomLookSensitivity=1
MinControllerDeadzone=.0
MaxControllerDeadzone=.3
MinControllerAccelerationJump=.0
MaxControllerAccelerationJump=1
MinMouseLookSensitivity=.01
MaxMouseLookSensitivity=.7
MinMouseLookZoomSensitivity=.2

View File

@ -41,9 +41,9 @@ function Initialize( KFGFxObject_Menu NewParentMenu )
super.Initialize( NewParentMenu );
StartMenu = KFGFxMenu_StartGame( NewParentMenu );
OnlineSub = class'GameEngine'.static.GetOnlineSubsystem();
FillWhatsNew();
LocalizeMenu();
SetWhatsNewItems();
if( class'KFGameEngine'.static.IsSoloPlayDisabled())
{
DisableSoloButton();
@ -142,8 +142,11 @@ function SetWhatsNewItems()
if (!class'WorldInfo'.static.isEosBuild() && WhatsNewItems[i].TextField == "PS4Key") continue;
DataObject = CreateObject("Object");
DataObject.SetString("label", Localize("WhatsNewMessages",WhatsNewItems[i].TextField,"KFGame"));
`log("label"@WhatsNewItems[i].TextField);
DataObject.SetString("imageURL",WhatsNewItems[i].ImageURL);
`log("imageURL"@WhatsNewItems[i].ImageURL);
DataObject.SetString("redirectURL",WhatsNewItems[i].RedirectURL);
`log("redirectURL"@WhatsNewItems[i].RedirectURL);
DataArray.SetElementObject(index++, DataObject);
}
}
@ -167,36 +170,54 @@ function LocalizeMenu()
SetObject("localizedText", TextObject);
}
function FillWhatsNew()
{
local SWhatsNew item;
WhatsNewItems.Remove(0, WhatsNewItems.Length);
// Latest Update
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_ChristmasBreakdown_Event", "LatestUpdate", "http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/");
WhatsNewItems.AddItem(item);
// Featured Time Limited Item
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_PremiumTicket", "FeaturedEventItem", "https://store.steampowered.com/buyitem/232090/5588");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Xmas_IceBreaker", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/8616");
WhatsNewItems.AddItem(item);
// Featured Weapon Skin Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_Spectre", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/8618");
WhatsNewItems.AddItem(item);
// Featured Cosmetic Bundle
item = SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Winter","FeaturedItemBundle","https://store.steampowered.com/buyitem/232090/8617");
WhatsNewItems.AddItem(item);
// Featured Weapon Bundle
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Christmas_FrostGun", "FeaturedItemBundle", "https://store.steampowered.com/buyitem/232090/8619");
WhatsNewItems.AddItem(item);
// Misc Community Links
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityHub", "Jaegorhorn", "https://steamcommunity.com/app/232090");
WhatsNewItems.AddItem(item);
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityForums", "Forums", "http://forums.tripwireinteractive.com/");
WhatsNewItems.AddItem(item);
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Survey", "Survey", "http://www.tripwireinteractive.com/redirect/KF2Survey/");
WhatsNewItems.AddItem(item);
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_CommunityIssue", "CommunityTracker", "https://trello.com/b/ZOwMRlcW/killing-floor-2-community-issue-roadmap");
WhatsNewItems.AddItem(item);
item=SetWhatsNewItem("img://UI_WhatsNew.UI_WhatsNew_Merch", "Merch", "http://www.tripwireinteractive.com/redirect/shop/");
WhatsNewItems.AddItem(item);
item=SetWhatsNewItem("img://UI_WhatsNew_PS4.UI_WhatsNew_KFUncovered", "Uncovered", "https://www.youtube.com/watch?v=fTdfedt9B48/");
WhatsNewItems.AddItem(item);
}
function SWhatsNew SetWhatsNewItem(string image, string TextField, string URL)
{
local SWhatsNew item;
item.ImageURL = image;
item.Textfield = TextField;
item.RedirectURL = URL;
return item;
}
DefaultProperties
{
// Latest Update
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Halloween_InfernalInsurrection_Event", Textfield="LatestUpdate", RedirectURL="http://www.tripwireinteractive.com/redirect/KF2LatestUpdate/"))
// Featured Time Limited Item
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Halloween_PremiumTicket", Textfield="FeaturedEventItem", RedirectURL="https://store.steampowered.com/buyitem/232090/4928"))
// Featured Weapon Skin Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Fall_JaegerMKIII", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8464"))
// Featured Cosmetic Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Apocalypse", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8465"))
// Featured Cosmetic Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_WW1", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8466"))
// Featured Weapon Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Fall_Minigun", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8467"))
// Featured Weapon Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Fall_MineReconstructor", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8468"))
// Featured Weapon Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Fall_InfernalInsurrection_Bundle", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8469"))
// Featured Cosmetic Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Halloween_FullGearInfernalInsurrection", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8463"))
// Featured Outfit Bundle
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Fall_ReaperOutfit", Textfield="FeaturedItemBundle", RedirectURL="https://store.steampowered.com/buyitem/232090/8462"))
// Epic Horzine key
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew_PS4.UI_WhatsNew_PS4Key", Textfield="PS4Key", RedirectURL="https://store.steampowered.com/buyitem/232090/4303"))
// Misc Community Links
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_CommunityHub", Textfield="Jaegorhorn", RedirectURL="https://steamcommunity.com/app/232090"))
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_CommunityForums", Textfield="Forums", RedirectURL="http://forums.tripwireinteractive.com/"))
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Survey", Textfield="Survey", RedirectURL="http://www.tripwireinteractive.com/redirect/KF2Survey/"))
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_CommunityIssue", Textfield="CommunityTracker", RedirectURL="https://trello.com/b/ZOwMRlcW/killing-floor-2-community-issue-roadmap"))
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew.UI_WhatsNew_Merch", Textfield="Merch", RedirectURL="http://www.tripwireinteractive.com/redirect/shop/"))
WhatsNewItems.Add((ImageURL="img://UI_WhatsNew_PS4.UI_WhatsNew_KFUncovered", Textfield="Uncovered", RedirectURL="https://www.youtube.com/watch?v=fTdfedt9B48/"))
}

View File

@ -339,6 +339,18 @@ function GFxObject CreateStoreItem(ItemProperties StoreItem)
DataObject.SetString("label", StoreItem.Name);
DataObject.SetString("description", StoreItem.Description);
//`log("Price"@StoreItem.Price@"- BasePrice"@StoreItem.BasePrice@"- DiscountRate"@StoreItem.DiscountRate@"- ItemOnSale"@StoreItem.ItemOnSale);
if( StoreItem.ItemOnSale )
{
DataObject.SetString("itemOnSale", StoreItem.ItemOnSale ? "1" : "0");
DataObject.SetString("itemPriceBase", StoreItem.BasePrice);
if(StoreItem.DiscountRate != "")
{
DataObject.SetString("discountRate", StoreItem.DiscountRate);
}
}
DataObject.SetString("price", class'WorldInfo'.static.IsConsoleBuild() ? "" : StoreItem.Price);
DataObject.SetString("imageURL", "img://"$StoreItem.IconURL);
DataObject.SetString("imageURLLarge", "img://"$StoreItem.IconURLLarge);
@ -434,25 +446,19 @@ DefaultProperties
XboxFilterExceptions[0]="Wasteland Bundle" // Wasteland Outfit Bundle
FeaturedItemIDs[0]=8462
FeaturedItemIDs[1]=8463
FeaturedItemIDs[2]=8464
FeaturedItemIDs[3]=8465
FeaturedItemIDs[4]=8466
FeaturedItemIDs[5]=8468
FeaturedItemIDs[6]=8467
FeaturedItemIDs[7]=8469
FeaturedItemIDs[8]=7619
FeaturedItemIDs[0]=7944
FeaturedItemIDs[1]=8615
FeaturedItemIDs[2]=8616
FeaturedItemIDs[3]=8617
FeaturedItemIDs[4]=8618
FeaturedItemIDs[5]=8619
ConsoleFeaturedItemIDs[0]=8462
ConsoleFeaturedItemIDs[1]=8463
ConsoleFeaturedItemIDs[2]=8464
ConsoleFeaturedItemIDs[3]=8465
ConsoleFeaturedItemIDs[4]=8466
ConsoleFeaturedItemIDs[5]=8468
ConsoleFeaturedItemIDs[6]=8467
ConsoleFeaturedItemIDs[7]=8469
ConsoleFeaturedItemIDs[8]=7783
ConsoleFeaturedItemIDs[0]=7947
ConsoleFeaturedItemIDs[1]=8615
ConsoleFeaturedItemIDs[2]=8616
ConsoleFeaturedItemIDs[3]=8617
ConsoleFeaturedItemIDs[4]=8618
ConsoleFeaturedItemIDs[5]=8619
MaxFeaturedItems=5
}

View File

@ -216,11 +216,10 @@ function CreatePlayerOptions(UniqueNetId PlayerID, int SlotIndex)
if( ProfileString != "" )
{
//View profile option Added at the end if we are on PC but first on console.
if (isPlayerFromSteam(PlayerID))
if (isPlayerFromSteam(PlayerID) || class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Orbis) || class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Durango))
{
AddStringOptionToList(ViewProfileKey, OptionIndex, ProfileString, DataProvider);
}
}
OptionIndex++;

View File

@ -0,0 +1,56 @@
//=============================================================================
// KFGFxWidget_MapCounterText
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFGFxWidget_MapCounterText extends GFxObject;
var GFxObject counterMapTextField;
var KFPlayerController KFPC;
var transient float CurrentDisplayTime;
var transient float ControlTime;
function InitializeHUD()
{
KFPC = KFPlayerController(GetPC());
counterMapTextField = GetObject("counterMapText");
SetVisible(false);
}
function DisplayMapText(string CountText, float DisplayTime)
{
if(counterMapTextField != none)
{
ControlTime = DisplayTime;
CurrentDisplayTime = DisplayTime;
counterMapTextField.SetText(CountText);
SetVisible(true);
}
}
function TickHud(float DeltaTime)
{
if(ControlTime > 0)
{
ControlTime -= DeltaTime;
if(ControlTime <= 0)
{
HideMessage();
}
}
}
function HideMessage()
{
counterMapTextField.SetText("");
SetVisible(false);
}
DefaultProperties
{ }

View File

@ -0,0 +1,81 @@
//=============================================================================
// KFGFxWidget_MapText
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFGFxWidget_MapText extends GFxObject;
var GFxObject mapTextField;
var KFPlayerController KFPC;
var transient float CurrentDisplayTime;
var transient float ControlTime;
struct MapStoredMessage
{
var string Text;
var float DisplayTime;
};
var array<MapStoredMessage> StoredMessageList;
function InitializeHUD()
{
KFPC = KFPlayerController(GetPC());
mapTextField = GetObject("mapText");
SetVisible(false);
}
function DisplayMapText(string MapText, float DisplayTime, bool bWaitForTheNextMessageToFinish)
{
Local MapStoredMessage StoredMessage;
if(mapTextField != none)
{
if(ControlTime > 0 && bWaitForTheNextMessageToFinish)
{
StoredMessage.Text = MapText;
StoredMessage.DisplayTime = DisplayTime;
StoredMessageList.AddItem(StoredMessage);
return;
}
ControlTime = DisplayTime;
CurrentDisplayTime = DisplayTime;
mapTextField.SetText(MapText);
SetVisible(true);
}
}
function TickHud(float DeltaTime)
{
if(ControlTime > 0)
{
ControlTime -= DeltaTime;
if(ControlTime <= 0)
{
HideMessage();
}
}
}
function HideMessage()
{
if(StoredMessageList.Length > 0)
{
ControlTime += StoredMessageList[0].DisplayTime;
CurrentDisplayTime = StoredMessageList[0].DisplayTime;
mapTextField.SetText(StoredMessageList[0].Text);
SetVisible(true);
StoredMessageList.Remove(0, 1);
return;
}
mapTextField.SetText("");
SetVisible(false);
}
DefaultProperties
{ }

View File

@ -10,6 +10,8 @@
class KFGFxWidget_MenuBar extends KFGFxObject_Menu;
`include(KFProfileSettings.uci)
var localized array<string> MenuStrings;
var localized string ExitString;
var localized string CancelString;
@ -93,6 +95,9 @@ function UpdateMenu(byte CurrentMenuIndex)
function HandleButtonSpecialCase(byte ButtonIndex, out GFxObject GfxButton)
{
local KFProfileSettings ProfileSettings;
local bool bHasTabbedToStore;
GfxButton.SetInt( "index", ButtonIndex );
// For XB1, we change the EXIT button to logout while in the menus
@ -133,6 +138,13 @@ function HandleButtonSpecialCase(byte ButtonIndex, out GFxObject GfxButton)
GfxButton.SetString( "label", ConsoleLocalize("StoreStringXB1", "KFGFxMenu_Store") );
}
GfxButton.SetBool("enabled", CanUseStore() ); // Disabled for E3 build
ProfileSettings = Manager.CachedProfile;
bHasTabbedToStore = ProfileSettings != none ? ProfileSettings.GetProfileInt(KFID_HasTabbedToStore) != 0 : false;
if( CanUseStore() && Class'KFGameEngine'.static.IsSalesEventActive() && Class'KFGameEngine'.static.IsSalesEventChecked() && ProfileSettings != none && !bHasTabbedToStore)
{
GfxButton.SetBool( "bPulsing", true );
}
StoreButton = GfxButton;
return;
//@HSL_END

View File

@ -47,6 +47,7 @@ var private const int LoadedSeasonalEventId;
/** Week index of the year - Used as index into weekly event */
var private int WeeklyEventIndex;
/************************************************************************************
* @name Content
***********************************************************************************/
@ -469,7 +470,8 @@ function ClearOnlineDelegates()
/** Static because these are both called on default object */
native static function int GetSeasonalEventID();
native static function int GetWeeklyEventIndex();
native static function bool IsSalesEventActive();
native static function bool IsSalesEventChecked();
/***********************************************************************************
* @name Game Options
***********************************************************************************/

View File

@ -208,7 +208,7 @@ static function class<KFGFxSpecialeventObjectivesContainer> GetSpecialEventClass
case SEI_Fall:
return class'KFGFxSpecialEventObjectivesContainer_Fall2020';
case SEI_Winter:
return class'KFGFxSpecialEventObjectivesContainer_Xmas2019';
return class'KFGFXSpecialEventObjectivesContainer_Xmas2020';
}
return class'KFGFxSpecialEventObjectivesContainer';

View File

@ -245,6 +245,7 @@ var bool bMenusOpen; // true if we're using menus, otherwise we're using the HUD
var bool bMenusActive; //@HSL - JRO - 6/21/2016 - Same as bMenusOpen but doesn't include the closing animation
var bool bSearchingForGame; // true if we are in the process of finding a game
var bool bCanCloseMenu; // Set to true after a menu has been completely opened and allows a player to close the menu
var bool bForceCloseMenuNextTime; // Allows the system to close the menu
var bool bPlayerInLobby;
//@HSL_MOD_BEGIN - amiller 5/11/2016 - Adding support to save extra data into profile settings - removing config
var bool bSetGamma; // Set to true if we've already set the gamma on the first launch
@ -1278,6 +1279,7 @@ function CloseMenus(optional bool bForceClose=false)
if ( (bMenusOpen && bCanCloseMenu) || bForceClose)
{
bForceCloseMenuNextTime = false;
UnloadCurrentPopup();
if ( !bAfterLobby && PartyWidget != none || GetPC() == none || GetPC().WorldInfo.GRI == none || GetPC().WorldInfo.GRI.bMatchIsOver )
@ -1304,6 +1306,10 @@ function CloseMenus(optional bool bForceClose=false)
SetMenuVisibility( false );
SetHUDVisiblity( true) ;
}
else if(bForceCloseMenuNextTime)
{
`TimerHelper.SetTimer( 0.1, false, nameof(CloseMenus), self );
}
}
/** Called when the movie player is closed */
@ -1851,6 +1857,7 @@ event bool FilterButtonInput(int ControllerId, name ButtonName, EInputEvent Inpu
}
else if(KFPRI.bHasSpawnedIn && !KFGRI.bMatchIsOver && KFGRI.bMatchHasBegun && KFGRI.bTraderIsOpen && CurrentMenu != TraderMenu && bMenusOpen)
{
bForceCloseMenuNextTime = true;
CurrentMenu.Callback_ReadyClicked(true);
}
}

View File

@ -800,11 +800,11 @@ simulated function bool DrawFriendlyHumanPlayerInfo( KFPawn_Human KFPH )
// drop shadow for player name text
Canvas.SetDrawColorStruct(PlayerBarShadowColor);
Canvas.SetPos(ScreenPos.X - (BarLength * 0.5f) + 1, ScreenPos.Y + 8);
Canvas.SetPos(ScreenPos.X - (BarLength * 0.5f) + 1, ScreenPos.Y - 2.5f * BarHeight + (36 * FontScale * ResModifier) + 1); //KFII-52291: -2.5 is a bit of a magic number, but it works (intuition says it should be 0 if we look at where armor bar is being drawn).
Canvas.DrawText(KFPRI.PlayerName, , FontScale, FontScale, MyFontRenderInfo);
Canvas.SetDrawColorStruct(PlayerBarTextColor);
Canvas.SetPos(ScreenPos.X - (BarLength * 0.5f), ScreenPos.Y + 7);
Canvas.SetPos(ScreenPos.X - (BarLength * 0.5f), ScreenPos.Y - 2.5f * BarHeight + (36 * FontScale * ResModifier)); //KFII-52291: -2.5 is a bit of a magic number, but it works (intuition says it should be 0 if we look at where armor bar is being drawn).
Canvas.DrawText(KFPRI.PlayerName, , FontScale, FontScale, MyFontRenderInfo);
//Draw armor bar

View File

@ -0,0 +1,19 @@
//=============================================================================
// KFKismetMapLocalization
//=============================================================================
// Base class for Kismet localization
//=============================================================================
// Killing Floor 2
// Copyright (C) 2017 Tripwire Interactive LLC
//=============================================================================
class KFKismetMapLocalization extends Object within KFSeqAct_DrawLocalizedText
hidedropdown;
var Font TextFont;
static simulated function string GetLocalization(int Id);
static simulated function Font GetFont()
{
return default.TextFont;
}

View File

@ -0,0 +1,72 @@
//=============================================================================
// KFKismetMapLocalization_Elysium
//=============================================================================
// Class for Elysium Kismet localization
//=============================================================================
// Killing Floor 2
// Copyright (C) 2017 Tripwire Interactive LLC
//=============================================================================
class KFKismetMapLocalization_Elysium extends KFKismetMapLocalization;
var localized string FuneralPyreIgnitionText;
var localized string TomeMissingText;
var localized string LeverWarningText;
var localized string LoreMastersKnowsText;
var localized string SandTomeCollectedText;
var localized string SteelTomeCollectedText;
var localized string SludgeTomeCollectedText;
var localized string WoodTomeCollectedText;
var localized string RedRoseCollectedText;
var localized string MagentaRoseollectedText;
var localized string YellowRoseCollectedText;
var localized string FlowerActivationText;
var localized string BotanicaOpenText;
var localized string OneOfThreeCollectedText;
var localized string TwoOfThreeCollectedText;
var localized string ThreeOfThreeCollectedText;
var localized string OneOfFourCollectedText;
var localized string TwoOfFourCollectedText;
var localized string ThreeOfFourCollectedText;
var localized string FourOfFourCollectedText;
static simulated function string GetLocalization(int MessageId)
{
switch(MessageId)
{
case 0: return default.FuneralPyreIgnitionText;
case 1: return default.TomeMissingText;
case 2: return default.LeverWarningText;
case 3: return default.LoreMastersKnowsText;
case 4: return default.SandTomeCollectedText;
case 5: return default.SteelTomeCollectedText;
case 6: return default.SludgeTomeCollectedText;
case 7: return default.WoodTomeCollectedText;
case 8: return default.RedRoseCollectedText;
case 9: return default.MagentaRoseollectedText;
case 10: return default.YellowRoseCollectedText;
case 11: return default.FlowerActivationText;
case 12: return default.BotanicaOpenText;
case 13: return default.OneOfThreeCollectedText;
case 14: return default.TwoOfThreeCollectedText;
case 15: return default.ThreeOfThreeCollectedText;
case 16: return default.OneOfFourCollectedText;
case 17: return default.TwoOfFourCollectedText;
case 18: return default.ThreeOfFourCollectedText;
case 19: return default.FourOfFourCollectedText;
}
return "";
}
defaultproperties
{
TextFont=Font'UI_Canvas_Fonts.Font_General'
}

View File

@ -88,6 +88,16 @@ var float MeleeImpactCamShakeScale;
* Anim Notify / Impact Timing
*********************************************************************************************/
simulated function EPawnOctant GetNextAttackDir()
{
return NextAttackDir;
}
simulated function SetNextAttackDir(EPawnOctant _nextAttackDir)
{
NextAttackDir = _nextAttackDir;
}
/** Notification called from KFAnimNotify_MeleeImpact. */
simulated function MeleeImpactNotify(KFAnimNotify_MeleeImpact_1P Notify)
{
@ -727,16 +737,21 @@ simulated function ProcessMeleeHit(byte FiringMode, ImpactInfo Impact)
// play effects before doing damage, because doing damage can change the actor (e.g. destructibles) and result in incorrect sounds
PlayMeleeHitEffects(Impact.HitActor, Impact.HitLocation, Impact.RayDir);
Impact.HitActor.TakeDamage( GetMeleeDamage(FiringMode, Impact.RayDir), Instigator.Controller,
Impact.HitLocation, Momentum,
GetDamageType(FiringMode), Impact.HitInfo, Outer );
PawnTakeDamage(Impact, FiringMode, Momentum);
// notify weapon for custom code
NotifyMeleeCollision(Impact.HitActor, Impact.HitLocation);
}
}
simulated function PawnTakeDamage(ImpactInfo Impact,byte FiringMode, vector Momentum)
{
Impact.HitActor.TakeDamage( GetMeleeDamage(FiringMode, Impact.RayDir), Instigator.Controller,
Impact.HitLocation, Momentum,
GetDamageType(FiringMode), Impact.HitInfo, Outer );
}
/** returns the damage type to use for this attack */
simulated function class<DamageType> GetDamageType(byte FiringMode)
{

View File

@ -0,0 +1,165 @@
//=============================================================================
// KFMeleeHelperWeapon
//=============================================================================
// Manages melee attack related functionality for 1st person weapons
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFMeleeHelperWeaponFrostShotgunAxe extends KFMeleeHelperWeapon
config(Game);
var bool bIcedEnemy;
var ParticleSystem ChargedEffect;
var ParticleSystemComponent FullyChargedPSC;
var AkEvent oFrozenSound;
var AkEvent oHitSoundAkEvent;
simulated function PawnTakeDamage(ImpactInfo Impact,byte FiringMode, vector Momentum)
{
local int InstantDamage;
bIcedEnemy = false;
if(Impact.HitActor.IsA('KFPawn_Monster'))
{
if(KFPawn_Monster(Impact.HitActor).IsDoingSpecialMove(SM_Frozen))
{
bIcedEnemy = true;
}
}
InstantDamage = GetMeleeDamage(FiringMode, Impact.RayDir);
Impact.HitActor.TakeDamage(InstantDamage, Instigator.Controller,
Impact.HitLocation, Momentum,
GetDamageType(FiringMode), Impact.HitInfo, Outer );
}
simulated function bool IsEnemyIced(){
return bIcedEnemy;
}
/** Called from state MeleeAtacking */
simulated function BeginMeleeAttack(optional bool bIsChainAttack)
{
local Pawn P;
local KFPawn_Monster KFPM;
local vector Projection;
local float MeleeDuration;
// Don't let a weak zed grab us when we just melee attacked
// Ramm - commented out, too exploitable
// SetWeakZedGrabCooldownOnPawn(0.5);
// initialize attack settings
bHasAlreadyHit = false;
bHitEnemyThisAttack = false;
// Let the playercontroller know we did an attack
if ( Instigator != None && Instigator.Controller != none &&
KFPlayerController(Instigator.Controller) != none )
{
KFPlayerController(Instigator.Controller).AddShotsFired(1);
}
// Clear reset flag (see InitAttackSequence, ContinueMeleeAttack)
bResetChainSequence = false;
// save the direction of this attack
CurrentAttackDir = ( CurrentFireMode == CUSTOM_FIREMODE ) ? DIR_None : GetNextAttackDir();
// Notify enemy pawns of melee strike
if( WorldInfo.NetMode != NM_Client )
{
foreach WorldInfo.AllPawns( class'Pawn', P )
{
if( P.GetTeamNum() != Instigator.GetTeamNum() && P.IsAliveAndWell() && !P.IsHumanControlled() )
{
Projection = Instigator.Location - P.Location;
if( VSizeSQ(Projection) <= Square(MaxHitRange + P.CylinderComponent.CollisionRadius) )
{
KFPM = KFPawn_Monster( P );
if( KFPM != none && KFPM.MyKFAIC != none )
{
KFPM.MyKFAIC.ReceiveMeleeWarning( CurrentAttackDir, Projection, Instigator );
}
}
}
}
}
// Select and play attack animation
MeleeDuration = PlayMeleeAttackAnimation();
if ( MeleeDuration > 0.f )
{
// @hack: Add current DeltaSeconds to timer. This fixes an off-by-one frame issue that can
// that can cause the timer to interrupt animation at low framerate. This is particularly
// bad for melee when using impact anim notifies.
SetTimer(MeleeDuration + WorldInfo.DeltaSeconds, FALSE, nameof(MeleeCheckTimer), self);
// set the timer to check for hits
if( bUseMeleeHitTimer && InitialImpactDelay > 0.f )
{
// Clear complete time so it is intialized properly
ImpactComplete_ActorTime = -1.f;
SetTimer(InitialImpactDelay, FALSE, nameof(MeleeImpactTimer), self);
}
}
else
{
`warn("MeleeDuration is zero!!!");
SetTimer(0.001, false, nameof(HandleFinishedFiring));
}
}
/**
* Called by ProcessMeleeHit to spawn effects
* Network: Local Player and Server
*/
simulated function PlayMeleeHitEffects(Actor Target, vector HitLocation, vector HitDirection, optional bool bShakeInstigatorCamera=true)
{
// @note: Skipping super(). No victim camera shake is intentional
if( WorldInfo.NetMode != NM_DedicatedServer )
{
// first person (local) fire effects
if ( Instigator.IsFirstPerson() )
{
PlayerController(Instigator.Controller).ClientPlayCameraShake(MeleeImpactCamShake, MeleeImpactCamShakeScale, true, CAPS_UserDefined, rotator(-HitDirection));
if ( Target.IsA('Pawn') )
{
AddBlood(0.01f, 0.1f);
if(KFPawn_Monster(Target).IsDoingSpecialMove(SM_Frozen))
{
if( IsZero(HitDirection) && Instigator != none )
{
HitDirection = Normal(Instigator.Location - HitLocation);
}
WorldInfo.MyEmitterPool.SpawnEmitter(ChargedEffect, HitLocation, rotator(HitDirection), Target);
Instigator.PlayAkEvent(oFrozenSound);
Instigator.PlayAkEvent(oHitSoundAkEvent);
}
}
}
// If we hit a pawn we can skip the Tracing code in PlayImpactEffects. Pawn FX are handled in
// PlayHit and this prevents incorrect (world) FX from playing if the trace is bad.
if ( !(Target.bCanBeDamaged && Target.IsA('Pawn')) )
{
// Use ImpactEffectManager to material based world impacts
`ImpactEffectManager.PlayImpactEffects(HitLocation, Instigator, HitDirection, WorldImpactEffects);
}
}
}
defaultproperties
{
oFrozenSound=AkEvent'WW_WEP_SA_CompoundBow.Play_Arrow_Impact_Cryo'
oHitSoundAkEvent=AkEvent'WW_WEP_FrostFang.Play_FrostFang_Base_Impact'
ChargedEffect=ParticleSystem'WEP_Frost_Shotgun_Axe_EMIT.FX_FrostFang_Melee_ImpactFrozen_01';
HitboxBoneName=RW_Weapon
}

View File

@ -65,6 +65,7 @@ defaultproperties
ColumnIds.Add(STATID_ACHIEVE_BiolapseCollectibles)
ColumnIds.Add(STATID_ACHIEVE_DesolationCollectibles)
ColumnIds.Add(STATID_ACHIEVE_HellmarkStationCollectibles)
ColumnIds.Add(STATID_ACHIEVE_ElysiumEndlessWaveFifteen)
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky5, Name="AchievementMrPerky5"))
ColumnMappings.Add((Id=STATID_ACHIEVE_MrPerky10, Name = "AchievementMrPerky10"))
@ -118,4 +119,5 @@ defaultproperties
ColumnMappings.Add((Id=STATID_ACHIEVE_BiolapseCollectibles,Name="AchievementCollectBiolapse"))
ColumnMappings.Add((Id=STATID_ACHIEVE_DesolationCollectibles,Name="AchievementCollectDesolation"))
ColumnMappings.Add((Id=STATID_ACHIEVE_HellmarkStationCollectibles,Name="AchievementCollectHellmarkStation"))
ColumnMappings.Add((Id=STATID_ACHIEVE_ElysiumEndlessWaveFifteen,Name="AchievementEndlessElysium"))
}

View File

@ -421,6 +421,10 @@ const KFACHID_HellmarkStationHard = 274;
const KFACHID_HellmarkStationHellOnEarth = 275;
const KFACHID_HellmarkStationCollectibles = 276;
const KFACHID_ElysiumHard = 277;
const KFACHID_ElysiumHellOnEarth = 278;
const KFACHID_ElysiumEndlessWaveFifteen = 279;
/* __TW_ANALYTICS_ */
var int PerRoundWeldXP;
var int PerRoundHealXP;
@ -1698,14 +1702,17 @@ final function bool CanCacheSpecialEvent()
/** Verify what event we're in and cache local event state. If we've changed to a new event,
* clear out the status flags before caching new date value.
*/
native final private function CacheSpecialEventState(int Value);
native final private function CacheSpecialEventState(int Value, int Year, int Month);
native final function int GetSpecialEventRewardValue();
/** Triggered by KF PC when the special event ID is passed through as a valid value */
final function UpdateSpecialEventState()
{
CacheSpecialEventState(InitialSpecialEventInfo);
local int year, month, dayofweek, day, hour, minute, second, msec;
GetSystemTime(year, month, dayofweek, day, hour, minute, second, msec);
CacheSpecialEventState(InitialSpecialEventInfo, year, month);
if( InitialSpecialEventInfo != SpecialEventInfo )
{
// Flush stats write if we did a reset
@ -1717,7 +1724,7 @@ final function UpdateSpecialEventState()
* special event index, do not update the stat. Also, if the map name passed doesn't match
* the list of allowed maps in native, don't record.
*/
native final function UpdateSpecialEvent(int EventIndex, int ObjectiveIndex);
native final function UpdateSpecialEvent(int EventIndex, int ObjectiveIndex, int Year, int Month);
/** Grab the state of a special event objective at a specific index. */
native final function bool IsEventObjectiveComplete(int ObjectiveIndex);
@ -1993,7 +2000,7 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_Revolver_Buckshot, KFDT_Ballistic_HRGBuckshot, KFDT_Bludgeon_HRGBuckshot),CompletionAmount=10000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_HZ12, KFDT_Ballistic_HZ12,KFDT_Bludgeon_HZ12),CompletionAmount=10000)) //7000
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_M4, KFDT_Ballistic_M4Shotgun,KFDT_Bludgeon_M4Shotgun),CompletionAmount=10000)) //7000
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_AA12, KFDT_Ballistic_AA12Shotgun,KFDT_Bludgeon_AA12Shotgun),CompletionAmount=10000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_AA12, KFDT_Ballistic_AA12Shotgun,KFDT_Bludgeon_AA12Shotgun),CompletionAmount=10000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Shotgun_ElephantGun, KFDT_Ballistic_ElephantGun,KFDT_Bludgeon_ElephantGun),CompletionAmount=10000))
//Medic Weapons
@ -2004,7 +2011,8 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_Hemogoblin, KFDT_Ballistic_Hemogoblin, KFDT_Bludgeon_Hemogoblin),CompletionAmount=9000)) //7000
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_AssaultRifle_Medic, KFDT_Ballistic_Assault_Medic,KFDT_Bludgeon_Assault_Medic),CompletionAmount=9000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_Rifle_HRGIncision, KFDT_Ballistic_HRGIncisionHurt, KFDT_Ballistic_HRGIncisionHeal,KFDT_Bludgeon_HRGIncision),CompletionAmount=5000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_AssaultRifle_MedicRifleGrenadeLauncher, KFDT_Ballistic_MedicRifleGrenadeLauncher, KFDT_Bludgeon_MedicRifleGrenadeLauncher, KFDT_Toxic_MedicGrenadeLauncher, KFDT_Ballistic_MedicRifleGrenadeLauncherImpact),CompletionAmount=10000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_HRG_Vampire, KFDT_Bleeding_HRG_Vampire_BloodSuck, KFDT_Ballistic_HRG_Vampire_BloodBallImpact, KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact, KFDT_Toxic_HRG_Vampire_BloodBall, KFDT_Piercing_HRG_Vampire_CrystalSpike, KFDT_Bludgeon_HRG_Vampire),CompletionAmount=9000))
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_AssaultRifle_MedicRifleGrenadeLauncher, KFDT_Ballistic_MedicRifleGrenadeLauncher, KFDT_Bludgeon_MedicRifleGrenadeLauncher, KFDT_Toxic_MedicGrenadeLauncher, KFDT_Ballistic_MedicRifleGrenadeLauncherImpact),CompletionAmount=10000))
//Demo Weapons
DailyEvents.Add((ObjectiveType=DOT_WeaponDamage,ObjectiveClasses=(KFWeap_GrenadeLauncher_HX25, KFDT_ExplosiveSubmunition_HX25,KFDT_Ballistic_HX25Impact,KFDT_Ballistic_HX25SubmunitionImpact,KFDT_Bludgeon_HX25),CompletionAmount=5000)) //3000
@ -2192,6 +2200,9 @@ defaultproperties
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-HELLMARKSTATION),CompletionAmount=1))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-HELLMARKSTATION),CompletionAmount=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-HELLMARKSTATION),CompletionAmount=3))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-ELYSIUM),CompletionAmount=1))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-ELYSIUM),CompletionAmount=2))
DailyEvents.Add((ObjectiveType=DOT_Maps,SecondaryType=DOST_MapCompletion,ObjectiveClasses=(KF-ELYSIUM),CompletionAmount=3))
//Versus Damage
// Per design doc that I have right now, these are x class damage y players, not damage y amount

View File

@ -67,4 +67,5 @@ defaultproperties
Properties.Add((PropertyId = STATID_ACHIEVE_BiolapseCollectibles,Data = (Type = SDT_Int32,Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_DesolationCollectibles,Data = (Type = SDT_Int32,Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_HellmarkStationCollectibles,Data = (Type = SDT_Int32,Value1 = 0)))
Properties.Add((PropertyId = STATID_ACHIEVE_ElysiumEndlessWaveFifteen,Data = (Type = SDT_Int32,Value1 = 0)))
}

View File

@ -4401,9 +4401,9 @@ simulated function SetPawnAmbientSound(AkEvent NewAmbientSound)
}
}
simulated function bool IsWeaponAmbientSoundPlaying(AkEvent AmbientSound)
simulated function bool IsWeaponAmbientSoundPlaying(AkEvent AmbientSoundToCheck)
{
return WeaponAkComponent.IsPlaying(AmbientSound);
return WeaponAkComponent.IsPlaying(AmbientSoundToCheck);
}
/** starts playing the given sound via the WeaponAmbientSound AudioComponent and sets WeaponAmbientSoundCue for replicating to clients

View File

@ -255,7 +255,8 @@ simulated function ModifySpeed( out float Speed )
}
}
if( MyKFWeapon != none && MyKFWeapon.IsMeleeWeapon() )
if (MyKFWeapon != none &&
(MyKFWeapon.IsMeleeWeapon() || IsWeaponOnPerk(MyKFWeapon,, self.class)))
{
Speed += Speed * GetSkillValue( PerkSkills[EBerserkerNinja] );
}

View File

@ -58,6 +58,7 @@ var private int HeadShotComboCountDisplay;
/** The maximum number of headshots that count toward the Rhythm Method perk skill damage multiplier */
var private const int MaxHeadShotComboCount;
var private const float HeadShotCountdownIntervall;
var private const float SteadySkillDamageModifier;
/*********************************************************************************************
* @name Perk init and spawning
@ -133,10 +134,13 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
local float TempDamage;
TempDamage = InDamage;
if( DamageCauser != none )
{
KFW = GetWeaponFromDamageCauser( DamageCauser );
if(KFW == none && DamageCauser.IsA('KFPawn_Human'))
{
KFW = KFWeapon(KFPawn_Human(DamageCauser).Weapon);
}
}
if( (KFW != none && IsWeaponOnPerk( KFW,, self.class )) || (DamageType != none && IsDamageTypeOnPerk( DamageType )) )
@ -160,6 +164,11 @@ simulated function ModifyDamageGiven( out int InDamage, optional Actor DamageCau
`QALog( "Bone Breaker arms and leg damage =" @ Indamage * static.GetBoneBreakerDamage(), bLogPerk );
TempDamage += Indamage * static.GetBoneBreakerDamage();
}
if( IsShootnMoveActive() && KFW.bUsingSights )
{
TempDamage += Indamage * SteadySkillDamageModifier;
}
}
`QALog( "Total Damage Given" @ DamageType @ KFW @ GetPercentage( InDamage, Round( TempDamage ) ), bLogPerk );
@ -801,6 +810,7 @@ DefaultProperties
PerkBuildStatID=STATID_Guns_Build
ShootnMooveBobDamp=1.11f
SteadySkillDamageModifier=0.075f
MaxHeadShotComboCount=5
RhytmMethodRTPCName="R_Method"

View File

@ -359,7 +359,10 @@ function ModifyHealth( out int InHealth )
simulated function float GetTightChokeModifier()
{
if( IsTightChokeActive() )
local KFWeapon MyKFWeapon;
MyKFWeapon = GetOwnerWeapon();
if( IsTightChokeActive() && IsWeaponOnPerk(MyKFWeapon,, self.class) )
{
return GetSkillValue( PerkSkills[ESupportTightChoke] );
}

View File

@ -41,6 +41,7 @@ var private const GameExplosion ShrapnelExplosionTemplate;
var private const float ShrapnelChance;
var private const float SnarePower;
var private const float MeleeExpertMovementSpeedModifier;
var private const float PassiveWeaponSwitchModifier;
var class<KFWeaponDefinition> HealingGrenadeWeaponDef;
var class<KFWeaponDefinition> MolotovGrenadeWeaponDef;
@ -301,6 +302,22 @@ function ModifyArmor( out byte MaxArmor )
}
}
/**
* @brief The passive skill of the survivalist modifies the weapon switch speed
*
* @param ModifiedSwitchTime Duration of putting down or equipping the weapon
*/
simulated function ModifyWeaponSwitchTime( out float ModifiedSwitchTime )
{
`QALog( "(Passive Weapon Switch) Increase:" @ GetPercentage( ModifiedSwitchTime, ModifiedSwitchTime * (1.f - static.GetPassiveWeaponSwitchModifier()) ), bLogPerk );
ModifiedSwitchTime *= 1.f - static.GetPassiveWeaponSwitchModifier();
}
simulated final static function float GetPassiveWeaponSwitchModifier()
{
return default.PassiveWeaponSwitchModifier;
}
/*********************************************************************************************
* @name Selectable skills functions
********************************************************************************************* */
@ -445,7 +462,7 @@ simulated function float GetAoERadiusModifier()
simulated function float GetZedTimeModifier( KFWeapon W )
{
local name StateName;
if( GetMadManActive() && !W.IsMeleeWeapon() )
if( GetMadManActive() && !W.IsMeleeWeapon() || KFWeap_MeleeBase(W).default.bHasToBeConsideredAsRangedWeaponForPerks )
{
StateName = W.GetStateName();
`Warn(StateName);
@ -712,11 +729,13 @@ simulated static function GetPassiveStrings( out array<string> PassiveValues, ou
PassiveValues[1] = Round( GetPassiveValue( default.DamageResistance, Level ) * 100 ) $ "%";
PassiveValues[2] = Round( GetPassiveValue( default.HeavyBodyArmor, Level ) * 100 ) $ "%";
PassiveValues[3] = Round( GetPassiveValue( default.ZedTimeReload, Level ) * 100 ) $ "%";
PassiveValues[4] = "";
Increments[0] = "[" @ Left( string( default.WeaponDamage.Increment * 100 ), InStr(string(default.WeaponDamage.Increment * 100), ".") + 2 ) $ "% /" @ default.LevelString @ "]";
Increments[1] = "[" @ Left( string( default.DamageResistance.Increment * 100 ), InStr(string(default.DamageResistance.Increment * 100), ".") + 2 ) $ "% /" @ default.LevelString @ "]";
Increments[2] = "[" @ Left( string( default.HeavyBodyArmor.Increment * 100 ), InStr(string(default.HeavyBodyArmor.Increment * 100), ".") + 2 ) $ "% /" @ default.LevelString @ "]";
Increments[3] = "[" @ Left( string( default.ZedTimeReload.Increment * 100 ), InStr(string(default.ZedTimeReload.Increment * 100), ".") + 2 ) $ "% /" @ default.LevelString @ "]";
Increments[4] = "";
}
simulated function string GetGrenadeImagePath()
@ -767,6 +786,8 @@ DefaultProperties
HeavyBodyArmor=(Name="Heavy Body Armor",Increment=0.01,Rank=0,StartingValue=0.f,MaxValue=0.25)
ZedTimeReload=(Name="Zed Time Reload",Increment=0.03f,Rank=0,StartingValue=0.f,MaxValue=0.75f)
PassiveWeaponSwitchModifier=0.35f
PerkSkills(ESurvivalist_TacticalReload)=(Name="TacticalReload",IconPath="UI_PerkTalent_TEX.Survivalist.UI_Talents_Survivalist_TacticalReload", Increment=0.f,Rank=0,StartingValue=0.25,MaxValue=0.25)
PerkSkills(ESurvivalist_HeavyWeaponsReload)=(Name="HeavyWeaponsReload",IconPath="UI_PerkTalent_TEX.Survivalist.UI_Talents_Survivalist_HeavyWeapons", Increment=0.f,Rank=0,StartingValue=2.5f,MaxValue=2.5f)
PerkSkills(ESurvivalist_FieldMedic)=(Name="FieldMedic",IconPath="UI_PerkTalent_TEX.Survivalist.UI_Talents_Survivalist_FieldMedic", Increment=0.f,Rank=0,StartingValue=0.5f,MaxValue=0.5f)

View File

@ -356,7 +356,7 @@ simulated function float GetZedTimeModifier( KFWeapon W )
local name StateName;
StateName = W.GetStateName();
if( IsRapidAssaultActive() && (Is9mm(W) || IsWeaponOnPerk( W,, self.class )) )
if( IsRapidAssaultActive() && (Is9mm(W) || IsWeaponOnPerk( W,, self.class ) || W.IsA('KFWeap_Pistol_Dual9mm') ) )
{
if( ZedTimeModifyingStates.Find( StateName ) != INDEX_NONE )
{
@ -404,7 +404,7 @@ function float GetStumblePowerModifier( optional KFPawn KFP, optional class<KFDa
*/
simulated function bool GetIsUberAmmoActive( KFWeapon KFW )
{
return IsRapidAssaultActive() && (Is9mm(KFW) || IsWeaponOnPerk( KFW,, self.class ));
return IsRapidAssaultActive() && (Is9mm(KFW) || IsWeaponOnPerk( KFW,, self.class ) || KFW.IsA('KFWeap_Pistol_Dual9mm'));
}
simulated function bool ShouldKnockDownOnBump()

View File

@ -1549,6 +1549,8 @@ function OnReadProfileSettingsComplete(byte LocalUserNum,bool bWasSuccessful)
KFInput.bTargetFrictionEnabled = Profile.GetProfileBool(KFID_TargetFrictionEnabled);
KFInput.GamepadSensitivityScale = Profile.GetProfileFloat(KFID_GamepadSensitivityScale);
KFInput.GamepadZoomedSensitivityScale = Profile.GetProfileFloat(KFID_GamepadZoomedSensitivityScale);
KFInput.GamepadDeadzoneScale = Profile.GetProfileFloat(KFID_GamepadDeadzoneScale);
KFInput.GamepadAccelerationJumpScale = Profile.GetProfileFloat(KFID_GamepadAccelerationJumpScale);
KFInput.SetGamepadLayout(Profile.GetProfileInt(KFID_CurrentLayoutIndex));
KFInput.bToggleToRun = Profile.GetProfileBool(KFID_ToggleToRun);
@ -11432,6 +11434,67 @@ event ShowInviteMessage(string InviteMessageName)
MyGFxHUD.ShowInviteMessage(InviteMessageName);
}
function OnDrawCountText(KFSeqAct_DrawCountText inAction)
{
if(inAction.InputLinks[0].bHasImpulse)
{
if( WorldInfo.NetMode == NM_DedicatedServer )
{
DrawCountTextOnHud(inAction.DrawTextInfo.MessageText, inAction.DisplayTimeSeconds);
}
else if( MyGFxHUD != none )
{
MyGFxHUD.DisplayMapCounterText(inAction.DrawTextInfo.MessageText, inAction.DisplayTimeSeconds);
}
}
}
reliable client function DrawCountTextOnHud(string Message, float DisplayTime)
{
if( MyGFxHUD != none )
{
MyGFxHUD.DisplayMapCounterText(Message, DisplayTime);
}
}
function OnDrawLocalizedText(KFSeqAct_DrawLocalizedText inAction)
{
if(inAction.InputLinks[0].bHasImpulse)
{
if( WorldInfo.NetMode == NM_DedicatedServer )
{
DrawLocalizedTextOnHud(inAction.DrawTextInfo.MessageText, inAction.DisplayTimeSeconds);
}
else if( MyGFxHUD != none )
{
MyGFxHUD.DisplayMapText(inAction.DrawTextInfo.MessageText, inAction.DisplayTimeSeconds, true);
}
}
}
function OnDrawRandomLocalizedText(KFSeqAct_DrawRandomLocalizedText inAction)
{
if(inAction.InputLinks[0].bHasImpulse)
{
if( WorldInfo.NetMode == NM_DedicatedServer )
{
DrawLocalizedTextOnHud(inAction.DrawTextInfo.MessageText, inAction.DisplayTimeSeconds);
}
else if( MyGFxHUD != none )
{
MyGFxHUD.DisplayMapText(inAction.DrawTextInfo.MessageText, inAction.DisplayTimeSeconds, true);
}
}
}
reliable client function DrawLocalizedTextOnHud(string Message, float DisplayTime)
{
if( MyGFxHUD != none )
{
MyGFxHUD.DisplayMapText(Message, DisplayTime, true);
}
}
event OnLoginOnOtherPlatformDoneAndFriendsReady()
{
if (MyGFxManager != none)

View File

@ -90,6 +90,10 @@ var(Sensitivity) float SprintingSensitivityScale;
var(Sensitivity) config float ZoomedSensitivityScale;
/** Used to scale the sensitivity of the joystick based on how zoomed the player is. */
var(Sensitivity) config float GamepadZoomedSensitivityScale;
/** Used to scale when start detecting input for looking. */
var(Sensitivity) config float GamepadDeadzoneScale;
/** Used to scale when to start using acceleration jump */
var(Sensitivity) config float GamepadAccelerationJumpScale;
////////////////////////////////
// View Smoothing
@ -115,11 +119,15 @@ var(ViewAcceleration) float ViewAccel_JoyMagThreshold;
var(ViewAcceleration) float ViewAccel_JoyPitchThreshold;
/** Max turn speed **/
var(ViewAcceleration) float ViewAccel_MaxTurnSpeed;
/** Min turn speed **/
var(ViewAcceleration) float ViewAccel_MinTurnSpeed;
/** How long to blend to max turn speed */
var(ViewAcceleration) float ViewAccel_BlendTime;
/** Timer for BlendTime */
var transient float ViewAccel_BlendTimer;
var float ViewAccel_TurnSpeed;
var config protected bool bDebugViewAcceleration;
/** Store previous remainder of aTurn for smoothing slow rotations. */
var float RemainingaTurn;
@ -1750,6 +1758,7 @@ function PreProcessGamepadInput( float DeltaTime )
local KFPawn KFP;
local float FOVScale;
local float ScaledJoyMagnitude;
local vector RawJoyLookVector;
if( bExtendedSprinting )
{
@ -1771,6 +1780,16 @@ function PreProcessGamepadInput( float DeltaTime )
CurrLookUp = ScaledJoyMagnitude * (RawJoyLookUp/RawJoyLookMagnitude);
}
//Checking if values are inside circular deadzone
RawJoyLookVector.X = RawJoyLookRight;
RawJoyLookVector.Y = RawJoyLookUp;
if (VSize2D(RawJoyLookVector) < GamepadDeadzoneScale)
{
CurrTurn = 0;
CurrLookUp = 0;
}
ViewAccel_TurnSpeed = Lerp(ViewAccel_MinTurnSpeed, ViewAccel_MaxTurnSpeed, GamepadAccelerationJumpScale);
// sets CurrTurn/CurrLookUp directly if applicable, does not multiply (aka Turn Assist)
if( CanApplyViewAcceleration() )
{
@ -1882,11 +1901,11 @@ function ApplyViewAcceleration( float DeltaTime )
if( CurrTurn > 0 )
{
CurrTurn = Lerp( CurrTurn, ViewAccel_MaxTurnSpeed, ViewAccel_BlendTimer / ViewAccel_BlendTime );
CurrTurn = Lerp( CurrTurn, ViewAccel_TurnSpeed, ViewAccel_BlendTimer / ViewAccel_BlendTime );
}
else
{
CurrTurn = Lerp( CurrTurn, -ViewAccel_MaxTurnSpeed, ViewAccel_BlendTimer / ViewAccel_BlendTime );
CurrTurn = Lerp( CurrTurn, -ViewAccel_TurnSpeed, ViewAccel_BlendTimer / ViewAccel_BlendTime );
}
}
@ -2952,8 +2971,9 @@ defaultproperties
ViewAccel_JoyMagThreshold=0.97
ViewAccel_JoyPitchThreshold=0.4
ViewAccel_BlendTime=0.25
ViewAccel_MaxTurnSpeed=2.4
ViewAccel_MaxTurnSpeed=4.5
ViewAccel_MinTurnSpeed=1.0
ForceLookAtPawnMinAngle=0.9f
ForceLookAtPawnRotationRate=22
ForceLookAtPawnDampenedRotationRate=8

View File

@ -251,6 +251,9 @@ defaultproperties
ProfileMappings.Add((Id=KFID_SavedInProgressIndex, Name="SavedInProgressIndex", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_ControllerSoundEnabled, Name="Controller Sound Enabled", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_MatchmakingRegion, Name="Matchmaking Region", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_GamepadDeadzoneScale, Name="Gamepad Deadzone", MappingType=PVMT_RawValue))
ProfileMappings.Add((Id=KFID_GamepadAccelerationJumpScale, Name="Gamepad Acceleration Jump", MappingType=PVMT_RawValue))
//Added 7/11/2016
ProfileMappings.Add((Id=KFID_UseAltAimOnDuals, Name="Use alt Dual Aim", MappingType=PVMT_RawValue))
@ -282,6 +285,8 @@ defaultproperties
//Added 3/6/2019 - Classic Player Info
ProfileMappings.Add((Id = KFID_ClassicPlayerInfo, Name = "Legacy Health Bars", MappingType = PVMT_RawValue))
//Added 10/15/2020 - Has Enter to Store Tab during sales
ProfileMappings.Add((Id = KFID_HasTabbedToStore, Name = "Has Tabbed To Store", MappingType = PVMT_RawValue))
// Hex values for SDT_Float values, I use http://www.h-schmidt.net/FloatConverter/IEEE754.html for conversion
@ -364,4 +369,12 @@ defaultproperties
//Added 3/6/2019 - Classic Player Info
DefaultSettings.Add((Owner=OPPO_Game, ProfileSetting=(PropertyId=KFID_ClassicPlayerInfo, Data=(Type=SDT_INT32, Value1=0))))
//Added 10/1/2020 - Support for deadzone and acceleration jump gamepad settings
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_GamepadDeadzoneScale,Data=(Type=SDT_Float,Value1=0x3e4ccccd)))) // 0.20f
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_GamepadAccelerationJumpScale,Data=(Type=SDT_Float,Value1=0x3ecccccd)))) // 0.4f
//Saber Added 10/15/2020 - Has Enter to Store Tab during sales
ProfileMappings.Add((Id = KFID_HasTabbedToStore, Name = "Has Tabbed To Store", MappingType = PVMT_RawValue))
DefaultSettings.Add((Owner=OPPO_Game,ProfileSetting=(PropertyId=KFID_HasTabbedToStore,Data=(Type=SDT_Int32,Value1=0))))
}

View File

@ -34,6 +34,7 @@ private event GrantEventItems();
final protected simulated function FinishedObjective(int EventIndex, int ObjectiveIndex)
{
local KFPlayerController KFPC;
local int year, month, dayofweek, day, hour, minute, second, msec;
if (!IsValid())
{
@ -45,7 +46,8 @@ final protected simulated function FinishedObjective(int EventIndex, int Objecti
!KFPC.PlayerReplicationInfo.bOnlySpectator && !Outer.HasCheated() &&
!Outer.IsEventObjectiveComplete(ObjectiveIndex))
{
Outer.UpdateSpecialEvent(EventIndex, ObjectiveIndex);
GetSystemTime(year, month, dayofweek, day, hour, minute, second, msec);
Outer.UpdateSpecialEvent(EventIndex, ObjectiveIndex, year, month);
if (KFPC.MyGFxHUD != none && KFPC.MyGFxHUD.LevelUpNotificationWidget != none &&
((class'KFGameEngine'.static.GetSeasonalEventID() % 10) == EventIndex))

View File

@ -0,0 +1,78 @@
//=============================================================================
// KFSeqAct_DrawCountText
//=============================================================================
// Kismet node to draw texts in the counter container of the HUD
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFSeqAct_DrawCountText extends SequenceAction
dependson(HUD)
native;
var(Message) string Message;
var() class<KFKismetMapLocalization> MapLocalizationClass;
var() float DisplayTimeSeconds;
var() vector2d MessageFontScale;
var() vector2d MessageOffset;
var() Color MessageColor;
var bool bDisplayOnObject;
cpptext
{
UBOOL UpdateOp(FLOAT deltaTime);
virtual void Activated();
};
var HUD.KismetDrawTextInfo DrawTextInfo;
/**
* Return the version number for this class. Child classes should increment this method by calling Super then adding
* a individual class version to the result. When a class is first created, the number should be 0; each time one of the
* link arrays is modified (VariableLinks, OutputLinks, InputLinks, etc.), the number that is added to the result of
* Super.GetObjClassVersion() should be incremented by 1.
*
* @return the version number for this specific class.
*/
static event int GetObjClassVersion()
{
return Super.GetObjClassVersion() + 2;
}
event Initialize()
{
DrawTextInfo.MessageText = Message;
DrawTextInfo.MessageFont = GetFontText();
DrawTextInfo.MessageFontScale = MessageFontScale;
DrawTextInfo.MessageOffset = MessageOffset;
DrawTextInfo.MessageColor = MessageColor;
}
simulated function Font GetFontText()
{
return MapLocalizationClass.static.GetFont();
}
defaultproperties
{
ObjName="Draw Count Text"
ObjCategory="Killing Floor"
DisplayTimeSeconds=-1
MessageFontScale=(X=1,Y=1)
MessageOffset=(X=0,Y=0)
MessageColor=(R=255,G=255,B=255,A=255)
InputLinks(0)=(LinkDesc="Show")
InputLinks(1)=(LinkDesc="Hide")
VariableLinks(1)=(ExpectedType=class'SeqVar_String',LinkDesc="String",MinVars=0,bHidden=TRUE)
bLatentExecution=TRUE
bAutoActivateOutputLinks=FALSE
}

View File

@ -0,0 +1,111 @@
//=============================================================================
// KFSeqAct_DrawLocalizedText
//=============================================================================
// Kismet node to draw localized texts in the HUD
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFSeqAct_DrawLocalizedText extends SequenceAction
dependson(HUD)
native;
var int SecondaryIDValue;
enum ELocalizedID
{
LID_0,
LID_1, LID_2, LID_3, LID_4, LID_5, LID_6, LID_7, LID_8, LID_9, LID_10,
LID_11, LID_12, LID_13, LID_14, LID_15, LID_16, LID_17, LID_18, LID_19, LID_20,
LID_21, LID_22, LID_23, LID_24, LID_25, LID_26, LID_27, LID_28, LID_29, LID_30,
LID_31, LID_32, LID_33, LID_34, LID_35, LID_36, LID_37, LID_38, LID_39, LID_40,
LID_41, LID_42, LID_43, LID_44, LID_45, LID_46, LID_47, LID_48, LID_49, LID_MAX,
};
var(Message) ELocalizedID MessageLocalizedID;
var(Message) array<ELocalizedID> SecondaryMessageLocalizedIDList;
var(Message) bool bUseSecondaryMessage;
var(Message) string TextForReplace;
var() class<KFKismetMapLocalization> MapLocalizationClass;
var() float DisplayTimeSeconds;
var() vector2d MessageFontScale;
var() vector2d MessageOffset;
var() Color MessageColor;
var bool bDisplayOnObject;
cpptext
{
UBOOL UpdateOp(FLOAT deltaTime);
virtual void Activated();
};
var HUD.KismetDrawTextInfo DrawTextInfo;
/**
* Return the version number for this class. Child classes should increment this method by calling Super then adding
* a individual class version to the result. When a class is first created, the number should be 0; each time one of the
* link arrays is modified (VariableLinks, OutputLinks, InputLinks, etc.), the number that is added to the result of
* Super.GetObjClassVersion() should be incremented by 1.
*
* @return the version number for this specific class.
*/
static event int GetObjClassVersion()
{
return Super.GetObjClassVersion() + 2;
}
event Initialize()
{
DrawTextInfo.MessageText = GetLocalizationText();
DrawTextInfo.MessageFont = GetFontText();
DrawTextInfo.MessageFontScale = MessageFontScale;
DrawTextInfo.MessageOffset = MessageOffset;
DrawTextInfo.MessageColor = MessageColor;
}
simulated function string GetLocalizationText()
{
Local string finalText;
Local string secondaryText;
finalText = MapLocalizationClass.static.GetLocalization(MessageLocalizedID);
`log("bUseSecondaryMessage"@bUseSecondaryMessage);
if(bUseSecondaryMessage)
{
`log("SecondaryIDValue"@SecondaryIDValue);
secondaryText = MapLocalizationClass.static.GetLocalization(SecondaryMessageLocalizedIDList[SecondaryIDValue]);
class'Actor'.static.ReplaceText(finalText, TextForReplace, secondaryText);
}
return finalText;
}
simulated function Font GetFontText()
{
return MapLocalizationClass.static.GetFont();
}
defaultproperties
{
ObjName="Draw Localized Text"
ObjCategory="Killing Floor"
DisplayTimeSeconds=-1
MessageFontScale=(X=1,Y=1)
MessageOffset=(X=0,Y=0)
MessageColor=(R=255,G=255,B=255,A=255)
InputLinks(0)=(LinkDesc="Show")
InputLinks(1)=(LinkDesc="Hide")
VariableLinks(1)=(ExpectedType=class'SeqVar_String',LinkDesc="String",MinVars=0,bHidden=TRUE)
VariableLinks(2)=(ExpectedType=class'SeqVar_Int',LinkDesc="SecondaryIDValue",MinVars=0,bHidden=TRUE,bWriteable=true,PropertyName=SecondaryIDValue)
bLatentExecution=TRUE
bAutoActivateOutputLinks=FALSE
}

View File

@ -0,0 +1,60 @@
//=============================================================================
// KFSeqAct_DrawRandomLocalizedText
//=============================================================================
// Kismet node to draw random localized texts in the HUD
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFSeqAct_DrawRandomLocalizedText extends KFSeqAct_DrawLocalizedText
dependson(HUD)
HideCategories(Message)
native;
var(RandomMessage) array<ELocalizedID> MessageLocalizedIDList;
cpptext
{
UBOOL UpdateOp(FLOAT deltaTime);
virtual void Activated();
};
/**
* Return the version number for this class. Child classes should increment this method by calling Super then adding
* a individual class version to the result. When a class is first created, the number should be 0; each time one of the
* link arrays is modified (VariableLinks, OutputLinks, InputLinks, etc.), the number that is added to the result of
* Super.GetObjClassVersion() should be incremented by 1.
*
* @return the version number for this specific class.
*/
static event int GetObjClassVersion()
{
return Super.GetObjClassVersion() + 3;
}
simulated function string GetLocalizationText()
{
Local int RandomValue;
RandomValue = Rand(MessageLocalizedIDList.length);
return MapLocalizationClass.static.GetLocalization(MessageLocalizedIDList[RandomValue]);
}
defaultproperties
{
ObjName="Draw Random Localized Text"
ObjCategory="Killing Floor"
DisplayTimeSeconds=-1
MessageFontScale=(X=1,Y=1)
MessageOffset=(X=0,Y=0)
MessageColor=(R=255,G=255,B=255,A=255)
InputLinks(0)=(LinkDesc="Show")
InputLinks(1)=(LinkDesc="Hide")
VariableLinks(1)=(ExpectedType=class'SeqVar_String',LinkDesc="String",MinVars=0,bHidden=TRUE)
bLatentExecution=TRUE
bAutoActivateOutputLinks=FALSE
}

View File

@ -480,6 +480,27 @@ simulated function SetFOV( float NewFOV )
SkeletalSprayMesh.SetFOV(NewFOV);
}
simulated function vector GetLastContactPositionMeshHit()
{
local KFPawn_Monster KFPM;
local vector ClosestBonePosition;
KFPM = KFPawn_Monster(HighestSprayMeshContactThisTick.Actor);
if (KFPM != none && KFPM.Mesh != none && HighestSprayMeshContactThisTick.BoneName != '')
{
return KFPM.Mesh.GetBoneLocation(HighestSprayMeshContactThisTick.BoneName);
}
if (KFPM != none && KFPM.Mesh != none)
{
KFPM.Mesh.FindClosestBone(HighestSprayMeshContactThisTick.ContactPosition, ClosestBonePosition);
return ClosestBonePosition;
}
//Based on KFSprayActor.cpp and value assigned to DesiredSplashLoc (however there it is adding instead of subtracting, worth taking a look)
return HighestSprayMeshContactThisTick.ContactPosition - HighestSprayMeshContactThisTick.ContactNormal * 32;
}
simulated function SetupFX()
{
local int ChainIdx, Idx;
@ -698,7 +719,6 @@ simulated function DetachAndFinish()
simulated function CleanupEndFire()
{
local int Idx;
// turn off fire particles
for (Idx=0; Idx<BoneChain.length; ++Idx)
{

View File

@ -26,6 +26,7 @@ enum ESharedContentUnlock
SCU_Blunderbuss,
SCU_Minigun,
SCU_MineReconstructor,
SCU_FrostFang,
};
@ -320,4 +321,8 @@ defaultproperties
Name=KFWeap_Mine_Reconstructor,
IconPath="WEP_UI_Mine_Reconstructor_TEX.UI_WeaponSelect_HMTechMineReconstructor",
ID=8472)}
SharedContentList(SCU_FrostFang)={(
Name=KFWeap_Rifle_FrostShotgunAxe,
IconPath="WEP_UI_Frost_Shotgun_Axe_TEX.UI_WeaponSelect_FrostGun",
ID=8609)}
}

View File

@ -0,0 +1,22 @@
//=============================================================================
// KFWeapDef_HRG_Vampire
//=============================================================================
// Killing Floor 2
// Copyright (C) 2017 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_HRG_Vampire extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_HRG_Vampire"
BuyPrice=1500
AmmoPricePerMag=60 //70
ImagePath="WEP_UI_HRG_Vampire_TEX.UI_WeaponSelect_HRG_Vampire"
EffectiveRange=70
UpgradePrice[0]=1500
UpgradeSellPrice[0]=1125
}

View File

@ -0,0 +1,29 @@
//=============================================================================
// KFWeapDef_Rifle_FrostShotgunAxe
//=============================================================================
//=============================================================================
// Killing Floor 2
// Copyright (C) 2019 Tripwire Interactive LLC
//=============================================================================
class KFWeapDef_Rifle_FrostShotgunAxe extends KFWeaponDefinition
abstract;
DefaultProperties
{
WeaponClassPath="KFGameContent.KFWeap_Rifle_FrostShotgunAxe"
BuyPrice=1300 //1200
AmmoPricePerMag=39 //36
ImagePath="WEP_UI_Frost_Shotgun_Axe_TEX.UI_WeaponSelect_FrostGun"
EffectiveRange=35
UpgradePrice[0]=700
UpgradePrice[1]=1500
UpgradeSellPrice[0]=525
UpgradeSellPrice[1]=1650
SharedUnlockId=SCU_FrostFang
}

View File

@ -35,6 +35,9 @@ var private const float ReloadCancelTimeLimit;
/** Whether this can be interrupted by another attack/reload/etc. */
var bool StartFireDisabled;
/** Special flag in order to make weapons like the frost shotgun axe (frostfang) have the access to perk skills */
var bool bHasToBeConsideredAsRangedWeaponForPerks;
/*********************************************************************************************
* @name Defensive Abilities
*********************************************************************************************/
@ -1382,4 +1385,6 @@ defaultproperties
UpgradeFireModes(CUSTOM_FIREMODE) = 1
ReloadCancelTimeLimit = 0.5f;
bHasToBeConsideredAsRangedWeaponForPerks=false;
}

View File

@ -320,6 +320,8 @@ var(Inventory) Texture2D WeaponSelectTexture;
var(Inventory) Texture2D SecondaryAmmoTexture;
/** The path that locates the image for this weapon */
var(Inventory) bool bCanRefillSecondaryAmmo;
/** Flag to know if the weapon uses grenades as secondary ammo to change the HUD display when not loaded or empty */
var(Inventory) bool bUseGrenadeAsSecondaryAmmo;
/** used when aborting a weapon switch (state WeaponAbortEquip) */
var float EquipAbortTime;
@ -4394,6 +4396,14 @@ static simulated event bool UsesSecondaryAmmo()
return default.MagazineCapacity[1] > 0;
}
/**
* Returns true if this weapon uses greandes as secondary ammo
*/
static simulated event bool UsesGrenadesAsSecondaryAmmo()
{
return default.bUseGrenadeAsSecondaryAmmo;
}
/**
* Returns true if this weapon uses a secondary ammo pool
*/
@ -4744,6 +4754,12 @@ simulated function int GetSecondaryAmmoForHUD()
return AmmoCount[1] + SpareAmmoCount[1];
}
/** Determines if we have to reload the secondary ammo of the weapon (EX: m16 grenades) */
simulated function bool HasToReloadSecondaryAmmoForHUD()
{
return AmmoCount[1] == 0;
}
/**
* Called by Player to force current weapon to be reloaded
* NOTE: A reload will only begin once the weapons FireInterval has completed
@ -7907,6 +7923,7 @@ defaultproperties
WeaponSelectTexture=Texture2D'ui_weaponselect_tex.UI_WeaponSelect_AR15'
SecondaryAmmoTexture=Texture2D'UI_SecondaryAmmo_TEX.GasTank'
bCanRefillSecondaryAmmo=true
bUseGrenadeAsSecondaryAmmo=false
bNoMagazine=false
bAllowClientAmmoTracking=true

View File

@ -3297,4 +3297,113 @@ defaultproperties
//Mine Reconstructor Wastelander
Skins.Add((Id=8477, Weapondef=class'KFWeapDef_Mine_Reconstructor', MIC_1P=("wep_skinset36_mat.Wep_1stP_MineReconstructor_Wastelander_MIC"), MIC_3P="wep_skinset36_mat.Wep_3rdP_MineReconstructor_Wastelander_MIC", MIC_Pickup="wep_skinset36_mat.Wep_3rdP_MineReconstructor_Wastelander_Pickup_MIC"))
//IceBreaker Sub Zero AK12
Skins.Add((Id=8510, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Ak12', MIC_1P=("WEP_SkinSet38_MAT.winter_ak12.Winter_AK12_1P_Mint_MIC", "WEP_SkinSet38_MAT.winter_ak12.Winter_AK12_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_ak12.Winter_AK12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_ak12.Winter_AK12_3P_Pickup_MIC"))
//IceBreaker Sub Zero Boomstick
Skins.Add((Id=8511, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("WEP_SkinSet38_MAT.winter_doublebarrel.Winter_DoubleBarrel_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_doublebarrel.Winter_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_doublebarrel.Winter_DoubleBarrel_3P_Pickup_MIC"))
//IceBreaker Sub Zero Desert Eagle
Skins.Add((Id=8512, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet38_MAT.winter_deagle.Winter_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_deagle.Winter_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_deagle.Winter_Deagle_3P_Pickup_MIC"))
//IceBreaker Sub Zero Dragonsbreath
Skins.Add((Id=8513, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Dragonsbreath', MIC_1P=("WEP_SkinSet38_MAT.winter_dragonsbreath.Winter_Dragonsbreath_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_dragonsbreath.Winter_Dragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_dragonsbreath.Winter_Dragonsbreath_3P_Pickup_MIC"))
//IceBreaker Sub Zero Hemoclobber
Skins.Add((Id=8514, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MedicBat', MIC_1P=("WEP_SkinSet38_MAT.winter_medicbat.Winter_MedicBat_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_medicbat.Winter_MedicBat_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_medicbat.Winter_MedicBat_3P_Pickup_MIC"))
//IceBreaker Sub Zero Kriss
Skins.Add((Id=8515, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Kriss', MIC_1P=("WEP_SkinSet38_MAT.winter_kriss.Winter_Kriss_1P_Mint_MIC", "WEP_SkinSet38_MAT.winter_kriss.Winter_Kriss_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_kriss.Winter_Kriss_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_kriss.Winter_Kriss_3P_Pickup_MIC"))
//IceBreaker Sub Zero M79
Skins.Add((Id=8516, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M79', MIC_1P=("wep_skinset38_mat.winter_m79.Winter_M79_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_m79.Winter_M79_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_m79.Winter_M79_3P_Pickup_MIC"))
//IceBreaker Sub Zero M99
Skins.Add((Id=8517, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M99', MIC_1P=("WEP_SkinSet38_MAT.winter_m99.Winter_M99_1P_Mint_MIC", "WEP_SkinSet38_MAT.winter_m99.Winter_M99_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_m99.Winter_m99_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_m99.Winter_M99_3P_Pickup_MIC"))
//IceBreaker Sub Zero Pulverizer
Skins.Add((Id=8518, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Pulverizer', MIC_1P=("WEP_SkinSet38_MAT.winter_pulverizer.Winter_Pulverizer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_pulverizer.Winter_Pulverizer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_pulverizer.Winter_Pulverizer_3P_Pickup_MIC"))
//IceBreaker Sub Zero RPG-7
Skins.Add((Id=8519, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet38_MAT.winter_rpg7.Winter_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.winter_rpg7.Winter_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.winter_rpg7.Winter_RPG7_3P_Pickup_MIC"))
//IceBreaker Precious AK12
Skins.Add((Id=8520, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Ak12', MIC_1P=("WEP_SkinSet38_MAT.wintergold_ak12.WinterGold_AK12_1P_Mint_MIC", "WEP_SkinSet38_MAT.wintergold_ak12.WinterGold_AK12_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_ak12.WinterGold_AK12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_ak12.WinterGold_AK12_3P_Pickup_MIC"))
//IceBreaker Precious Boomstick
Skins.Add((Id=8521, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_DoubleBarrel', MIC_1P=("WEP_SkinSet38_MAT.wintergold_doublebarrel.WinterGold_DoubleBarrel_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_doublebarrel.WinterGold_DoubleBarrel_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_doublebarrel.WinterGold_DoubleBarrel_3P_Pickup_MIC"))
//IceBreaker Precious Desert Eagle
Skins.Add((Id=8522, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Deagle', MIC_1P=("WEP_SkinSet38_MAT.wintergold_deagle.WinterGold_Deagle_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_deagle.WinterGold_Deagle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_deagle.WinterGold_Deagle_3P_Pickup_MIC"))
//IceBreaker Precious Dragonsbreath
Skins.Add((Id=8523, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Dragonsbreath', MIC_1P=("WEP_SkinSet38_MAT.wintergold_dragonsbreath.WinterGold_Dragonsbreath_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_dragonsbreath.WinterGold_Dragonsbreath_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_dragonsbreath.WinterGold_Dragonsbreath_3P_Pickup_MIC"))
//IceBreaker Precious Hemoclobber
Skins.Add((Id=8524, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_MedicBat', MIC_1P=("WEP_SkinSet38_MAT.wintergold_medicbat.WinterGold_MedicBat_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_medicbat.WinterGold_MedicBat_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_medicbat.WinterGold_MedicBat_3P_Pickup_MIC"))
//IceBreaker Precious Kriss
Skins.Add((Id=8525, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Kriss', MIC_1P=("WEP_SkinSet38_MAT.wintergold_kriss.WinterGold_Kriss_1P_Mint_MIC", "WEP_SkinSet38_MAT.wintergold_kriss.WinterGold_Kriss_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_kriss.WinterGold_Kriss_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_kriss.WinterGold_Kriss_3P_Pickup_MIC"))
//IceBreaker Precious M79
Skins.Add((Id=8526, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M79', MIC_1P=("wep_skinset38_mat.wintergold_m79.WinterGold_M79_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_m79.WinterGold_M79_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_m79.WinterGold_M79_3P_Pickup_MIC"))
//IceBreaker Precious M99
Skins.Add((Id=8527, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_M99', MIC_1P=("WEP_SkinSet38_MAT.wintergold_m99.WinterGold_M99_1P_Mint_MIC", "WEP_SkinSet38_MAT.wintergold_m99.WinterGold_M99_Scope_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_m99.WinterGold_m99_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_m99.WinterGold_M99_3P_Pickup_MIC"))
//IceBreaker Precious Pulverizer
Skins.Add((Id=8528, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_Pulverizer', MIC_1P=("WEP_SkinSet38_MAT.wintergold_pulverizer.WinterGold_Pulverizer_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_pulverizer.WinterGold_Pulverizer_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_pulverizer.WinterGold_Pulverizer_3P_Pickup_MIC"))
//IceBreaker Precious RPG-7
Skins.Add((Id=8529, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_RPG7', MIC_1P=("WEP_SkinSet38_MAT.wintergold_rpg7.WinterGold_RPG7_1P_Mint_MIC"), MIC_3P="WEP_SkinSet38_MAT.wintergold_rpg7.WinterGold_RPG7_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet38_MAT.wintergold_rpg7.WinterGold_RPG7_3P_Pickup_MIC"))
//Spectre Dynamic HRG Arc Generator
Skins.Add((Id=8530, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_EMP_ArcGenerator', MIC_1P=("WEP_SkinSet37_MAT.spectre_hrgarcgenerator.Spectre_HRGArcGenerator_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectre_hrgarcgenerator.Spectre_HRGArcGenerator_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectre_hrgarcgenerator.Spectre_HRGArcGenerator_3P_Pickup_MIC"))
//Spectre Dynamic HRG Scorcher
Skins.Add((Id=8531, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRGScorcher', MIC_1P=("WEP_SkinSet37_MAT.spectre_hrgscorcher.Spectre_HRGScorcher_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectre_hrgscorcher.Spectre_HRGScorcher_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectre_hrgscorcher.Spectre_HRGScorcher_3P_Pickup_MIC"))
//Spectre Dynamic HRG Kaboomstick
Skins.Add((Id=8532, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Kaboomstick', MIC_1P=("WEP_SkinSet37_MAT.spectre_hrgkaboomstick.Spectre_HRGKaboomstick_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectre_hrgkaboomstick.Spectre_HRGKaboomstick_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectre_hrgkaboomstick.Spectre_HRGKaboomstick_3P_Pickup_MIC"))
//Spectre Dynamic HRG Teslauncher
Skins.Add((Id=8533, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRGTeslauncher', MIC_1P=("WEP_SkinSet37_MAT.spectre_hrgteslauncher.Spectre_HRGTesLauncher_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectre_hrgteslauncher.Spectre_HRGTesLauncher_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectre_hrgteslauncher.Spectre_HRGTesLauncher_3P_Pickup_MIC"))
//Spectre Dynamic HRG Incendiary Rifle
Skins.Add((Id=8534, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRGIncendiaryRifle', MIC_1P=("WEP_SkinSet37_MAT.spectre_hrgincendiaryrifle.Spectre_HRGIncendiaryRifle_1P_Mint_MIC", "WEP_SkinSet37_MAT.spectre_hrgincendiaryrifle.Spectre_HRGIncendiaryRifleM203_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectre_hrgincendiaryrifle.Spectre_HRGIncendiaryRifle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectre_hrgincendiaryrifle.Spectre_HRGIncendiaryRifle_3P_Pickup_MIC"))
//Spectre Dynamic HRG Vampire
Skins.Add((Id=8535, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Vampire', MIC_1P=("WEP_SkinSet37_MAT.spectre_hrgvampire.Spectre_HRGVampire_1P_Mint_MIC", "WEP_SkinSet37_MAT.spectre_hrgvampire.Spectre_HRGVampire_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectre_hrgvampire.Spectre_HRGVampire_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectre_hrgvampire.Spectre_HRGVampire_3P_Pickup_MIC"))
//Spectre Dynamic Chroma HRG Arc Generator
Skins.Add((Id=8536, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_EMP_ArcGenerator', MIC_1P=("WEP_SkinSet37_MAT.spectrechroma_hrgarcgenerator.SpectreChroma_HRGArcGenerator_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectrechroma_hrgarcgenerator.SpectreChroma_HRGArcGenerator_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectrechroma_hrgarcgenerator.SpectreChroma_HRGArcGenerator_3P_Pickup_MIC"))
//Spectre Dynamic Chroma HRG Scorcher
Skins.Add((Id=8537, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRGScorcher', MIC_1P=("WEP_SkinSet37_MAT.spectrechroma_hrgscorcher.SpectreChroma_HRGScorcher_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectrechroma_hrgscorcher.SpectreChroma_HRGScorcher_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectrechroma_hrgscorcher.SpectreChroma_HRGScorcher_3P_Pickup_MIC"))
//Spectre Dynamic Chroma HRG Kaboomstick
Skins.Add((Id=8538, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Kaboomstick', MIC_1P=("WEP_SkinSet37_MAT.spectrechroma_hrgkaboomstick.SpectreChroma_HRGKaboomstick_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectrechroma_hrgkaboomstick.SpectreChroma_HRGKaboomstick_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectrechroma_hrgkaboomstick.SpectreChroma_HRGKaboomstick_3P_Pickup_MIC"))
//Spectre Dynamic Chroma HRG Teslauncher
Skins.Add((Id=8539, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRGTeslauncher', MIC_1P=("WEP_SkinSet37_MAT.spectrechroma_hrgteslauncher.SpectreChroma_HRGTesLauncher_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectrechroma_hrgteslauncher.SpectreChroma_HRGTesLauncher_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectrechroma_hrgteslauncher.SpectreChroma_HRGTesLauncher_3P_Pickup_MIC"))
//Spectre Dynamic Chroma HRG Incendiary Rifle
Skins.Add((Id=8540, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRGIncendiaryRifle', MIC_1P=("WEP_SkinSet37_MAT.spectrechroma_hrgincendiaryrifle.SpectreChroma_HRGIncendiaryRifle_1P_Mint_MIC", "WEP_SkinSet37_MAT.spectrechroma_hrgincendiaryrifle.SpectreChroma_HRGIncendiaryRifleM203_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectrechroma_hrgincendiaryrifle.SpectreChroma_HRGIncendiaryRifle_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectrechroma_hrgincendiaryrifle.SpectreChroma_HRGIncendiaryRifle_3P_Pickup_MIC"))
//Spectre Dynamic Chroma HRG Vampire
Skins.Add((Id=8541, bNeedsCodeUpdates = true, Weapondef=class'KFWeapDef_HRG_Vampire', MIC_1P=("WEP_SkinSet37_MAT.spectrechroma_hrgvampire.SpectreChroma_HRGVampire_1P_Mint_MIC", "WEP_SkinSet37_MAT.spectrechroma_hrgvampire.SpectreChroma_HRGVampire_Sight_1P_Mint_MIC"), MIC_3P="WEP_SkinSet37_MAT.spectrechroma_hrgvampire.SpectreChroma_HRGVampire_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet37_MAT.spectrechroma_hrgvampire.SpectreChroma_HRGVampire_3P_Pickup_MIC"))
//8609 Frost Fang | Standard
Skins.Add((Id=8609, Weapondef=class'KFWeapDef_Rifle_FrostShotgunAxe', MIC_1P=("WEP_1P_Frost_Shotgun_Axe_MAT.WEP_1stP_Frost_Shotgun_MIC"), MIC_3P="WEP_3P_Frost_Shotgun_Axe_MAT.Wep_3rdP_Frost_Shotgun_MIC", MIC_Pickup="WEP_3P_Frost_Shotgun_Axe_MAT.Wep_3rdP_Frost_Shotgun_Pickup_MIC"))
//8610 Frost Fang | Wood
Skins.Add((Id=8610, Weapondef=class'KFWeapDef_Rifle_FrostShotgunAxe', MIC_1P=("WEP_SkinSet39_MAT.Wep_1stP_Frost_Shotgun_Wood_MIC"), MIC_3P="WEP_SkinSet39_MAT.Wep_3rdP_Frost_Shotgun_Wood_MIC", MIC_Pickup="WEP_SkinSet39_MAT.Wep_3rdP_Frost_Shotgun_Wood_Pickup_MIC"))
//8611 Frost Fang | Cabala
Skins.Add((Id=8611, Weapondef=class'KFWeapDef_Rifle_FrostShotgunAxe', MIC_1P=("WEP_SkinSet39_MAT.Wep_1stP_Frost_Shotgun_Cabala_MIC"), MIC_3P="WEP_SkinSet39_MAT.Wep_3stP_Frost_Shotgun_Cabala_MIC", MIC_Pickup="WEP_SkinSet39_MAT.Wep_3stP_Frost_Shotgun_Cabala_Pickup_MIC"))
//8612 Frost Fang | Runic
Skins.Add((Id=8612, Weapondef=class'KFWeapDef_Rifle_FrostShotgunAxe', MIC_1P=("WEP_SkinSet39_MAT.Wep_1stP_Frost_Shotgun_Runic_MIC"), MIC_3P="WEP_SkinSet39_MAT.Wep_3stP_Frost_Shotgun_Runic_MIC", MIC_Pickup="WEP_SkinSet39_MAT.Wep_3rdP_Frost_Shotgun_Runic_Pickup_MIC"))
//8613 Frost Fang | Deco Ice
Skins.Add((Id=8613, Weapondef=class'KFWeapDef_Rifle_FrostShotgunAxe', MIC_1P=("WEP_SkinSet39_MAT.Wep_1stP_Frost_Shotgun_DecoIce_MIC"), MIC_3P="WEP_SkinSet39_MAT.Wep_3stP_Frost_Shotgun_DecoIce_MIC", MIC_Pickup="WEP_SkinSet39_MAT.Wep_3rdP_Frost_Shotgun_DecoIce_Pickup_MIC"))
//8614 Frost Fang | Burned Land
Skins.Add((Id=8614, Weapondef=class'KFWeapDef_Rifle_FrostShotgunAxe', MIC_1P=("WEP_SkinSet39_MAT.Wep_1stP_Frost_Shotgun_BurnedLand_MIC"), MIC_3P="WEP_SkinSet39_MAT.Wep_3stP_Frost_Shotgun_BurnedLand_MIC", MIC_Pickup="WEP_SkinSet39_MAT.Wep_3rdP_Frost_Shotgun_BurnedLand_Pickup_MIC"))
}

View File

@ -151,4 +151,5 @@ const STATID_ACHIEVE_DefeatMatriarch = 4053;
const STATID_ACHIEVE_BiolapseCollectibles = 4054;
const STATID_ACHIEVE_DesolationCollectibles = 4055;
const STATID_ACHIEVE_HellmarkStationCollectibles = 4056;
const STATID_ACHIEVE_ElysiumEndlessWaveFifteen = 4057;
/** `endif */

View File

@ -70,4 +70,6 @@ const KFID_SavedHeadshotID= 171;
const KFID_ToggleToRun=172;
const KFID_ClassicPlayerInfo=173;
const KFID_VOIPMicVolumeMultiplier = 174;
const KFID_GamepadDeadzoneScale = 175;
const KFID_GamepadAccelerationJumpScale = 176;
const KFID_HasTabbedToStore = 177;

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Ballistic_DragonsBreath extends KFDT_Ballistic_Shotgun
abstract
hidedropdown;
abstract;
// Damage type to use for the burning damage over time
var class<KFDamageType> BurnDamageType;

View File

@ -0,0 +1,50 @@
//=============================================================================
// KFDT_Ballistic_Frost_Shotgun_Axe
//=============================================================================
// Ballistic damage with light impact energy, but stronger hit reactions
//=============================================================================
// Killing Floor 2
// Copyright (C) 2019 Tripwire Interactive LLC
//=============================================================================
class KFDT_Ballistic_Frost_Shotgun_Axe extends KFDT_Ballistic_Shotgun
abstract
hidedropdown;
/** Allows the damage type to customize exactly which hit zones it can dismember */
static simulated function bool CanDismemberHitZone( name InHitZoneName )
{
if( super.CanDismemberHitZone( InHitZoneName ) )
{
return true;
}
switch ( InHitZoneName )
{
case 'lupperarm':
case 'rupperarm':
return true;
}
return false;
}
defaultproperties
{
// Physics
KDamageImpulse=2500 //2750
KDeathUpKick=800
KDeathVel=650
// Afflictions
StumblePower =20 //40
GunHitPower =20
FreezePower =11 //17
WeaponDef=class'KFWeapDef_Rifle_FrostShotgunAxe'
ModifierPerkList(0)=class'KFPerk_Support'
ModifierPerkList(1)=class'KFPerk_Berserker'
EffectGroup=FXG_Freeze
}

View File

@ -0,0 +1,23 @@
//=============================================================================
// KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2019 Tripwire Interactive LLC
//=============================================================================
class KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact extends KFDT_Ballistic_HRG_Vampire_BloodBallImpact
abstract
hidedropdown;
defaultproperties
{
PoisonPower=30 //80
StumblePower=350
KnockdownPower=140
GunHitPower=350
ModifierPerkList(0)=class'KFPerk_FieldMedic'
WeaponDef=class'KFWeapDef_HRG_Vampire'
}

View File

@ -0,0 +1,32 @@
//=============================================================================
// KFDT_Ballistic_HRG_Vampire_BloodBallImpact
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2019 Tripwire Interactive LLC
//=============================================================================
class KFDT_Ballistic_HRG_Vampire_BloodBallImpact extends KFDT_Ballistic_Shell
abstract
hidedropdown;
static simulated function bool CanDismemberHitZone( name InHitZoneName )
{
return false;
}
defaultproperties
{
DoT_Type=DOT_NONE
EffectGroup=FXG_Toxic
PoisonPower=10 //20
StumblePower=40 //100
KnockdownPower=0 //25
GunHitPower=40 //100
ModifierPerkList(0)=class'KFPerk_FieldMedic'
WeaponDef=class'KFWeapDef_HRG_Vampire'
}

View File

@ -0,0 +1,46 @@
//=============================================================================
// KFDT_Bleeding_HRG_Vampire_BloodSuck
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFDT_Bleeding_HRG_Vampire_BloodSuck extends KFDT_Bleeding
abstract;
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{
local class<KFDamageType> ToxicDT;
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
if ( ToxicDT != None )
{
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
}
}
defaultproperties
{
//physics
KDamageImpulse=0
KDeathUpKick=350
KDeathVel=350
//Afflictions
BleedPower=50 //50
StumblePower=0 //20
GunHitPower=5
//Damage Over Time Components
DoT_Type=DOT_Bleeding
DoT_Duration=0.5 //5.0
DoT_Interval=0.5 //1.0
DoT_DamageScale=0.1
bStackDoT=true
ModifierPerkList(0)=class'KFPerk_FieldMedic'
WeaponDef=class'KFWeapDef_HRG_Vampire'
}

View File

@ -15,7 +15,7 @@ defaultproperties
KDeathUpKick=0
KDeathVel=500
StumblePower=150
StumblePower=200 //150
MeleeHitPower=100
WeaponDef=class'KFWeapDef_FireAxe'

View File

@ -0,0 +1,19 @@
//=============================================================================
// KFDT_Bludgeon_HRG_Vampire
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFDT_Bludgeon_HRG_Vampire extends KFDT_Bludgeon_RifleButt
abstract
hidedropdown;
DefaultProperties
{
StumblePower=200
MeleeHitPower=100
ModifierPerkList(0)=class'KFPerk_FieldMedic'
WeaponDef=class'KFWeapDef_HRG_Vampire'
}

View File

@ -7,8 +7,7 @@
//=============================================================================
class KFDT_Explosive_HRGIncendiaryRifle extends KFDT_Fire
abstract
hidedropdown;
abstract;
// Damage type to use for the burning damage over time
var class<KFDamageType> BurnDamageType;

View File

@ -8,8 +8,7 @@
//=============================================================================
class KFDT_Explosive_HuskCannon extends KFDT_Explosive
abstract
hidedropdown;
abstract;
// Damage type to use for the burning damage over time
var class<KFDamageType> BurnDamageType;

View File

@ -7,8 +7,7 @@
// Copyright (C) 2017 Tripwire Interactive LLC
//=============================================================================
class KFDT_Fire_FlareGun_Dual extends KFDT_Fire_FlareGun
abstract
hidedropdown;
abstract;
defaultproperties
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_Ground_DragonsBreath extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
static function int GetKillerDialogID()
{

View File

@ -8,8 +8,7 @@
// Tulio Beloqui (Saber Interactive)
//=============================================================================
class KFDT_Fire_Ground_FlareGun extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
static function int GetKillerDialogID()
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_Ground_HRGScorcher extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
static function int GetKillerDialogID()
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_Ground_MolotovGrenade extends KFDT_Fire_Ground
abstract
hidedropdown;
abstract;
defaultproperties
{

View File

@ -9,8 +9,7 @@
//=============================================================================
class KFDT_Fire_MolotovGrenade extends KFDT_Fire
abstract
hidedropdown;
abstract;
defaultproperties
{

View File

@ -0,0 +1,37 @@
//=============================================================================
// KFDT_Piercing_HRG_Vampire_CrystalSpike
//=============================================================================
// Damage type for crystal spike (alternate fire) of HRG Vampire
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFDT_Piercing_HRG_Vampire_CrystalSpike extends KFDT_Piercing
abstract
hidedropdown;
/** Called when damage is dealt to apply additional damage type (e.g. Damage Over Time) */
static function ApplySecondaryDamage( KFPawn Victim, int DamageTaken, optional Controller InstigatedBy )
{
local class<KFDamageType> ToxicDT;
ToxicDT = class'KFDT_Ballistic_Assault_Medic'.static.GetMedicToxicDmgType( DamageTaken, InstigatedBy );
if ( ToxicDT != None )
{
Victim.ApplyDamageOverTime(DamageTaken, InstigatedBy, ToxicDT);
}
}
defaultproperties
{
KDamageImpulse=1500
KDeathUpKick=250
KDeathVel=150
StumblePower=250
GunHitPower=100
ModifierPerkList(0)=class'KFPerk_FieldMedic'
WeaponDef=class'KFWeapDef_HRG_Vampire'
}

View File

@ -6,8 +6,7 @@
//=============================================================================
class KFDT_Piercing_IonThrusterStab extends KFDT_Piercing
abstract
hidedropdown;
abstract;
// Damage type to use for the burning damage over time
var class<KFDamageType> BurnDamageType;

View File

@ -126,8 +126,9 @@ static simulated function ModifyDismembermentHitImpulse(KFPawn_Monster InPawn, n
defaultproperties
{
KDamageImpulse=200
KDeathUpKick=250
KDamageImpulse=2000
KDeathUpKick=500
KDeathVel=500
StumblePower=50
MeleeHitPower=150

View File

@ -29,11 +29,12 @@ static simulated function bool CanDismemberHitZone(name InHitZoneName)
defaultproperties
{
KDamageImpulse=300
KDeathUpKick=400
KDamageImpulse=2500
KDeathUpKick=700
KDeathVel=700
StumblePower=75
StunPower=75
StunPower=100 //75
MeleeHitPower=100
WeaponDef=class'KFWeapDef_FireAxe'

View File

@ -0,0 +1,142 @@
//=============================================================================
// KFDT_Slashing_Frost_Shotgun_Axe
//=============================================================================
// Killing Floor 2
// Copyright (C) 2017 Tripwire Interactive LLC
//=============================================================================
class KFDT_Slashing_Frost_Shotgun_Axe extends KFDT_Slashing
abstract
hidedropdown;
/** Allows the damage type to customize exactly which hit zones it can dismember */
static simulated function bool CanDismemberHitZone( name InHitZoneName )
{
return true;
}
/** Allows the damage type to map a hit zone to a different bone for dismemberment purposes */
static simulated function GetBoneToDismember(KFPawn_Monster InPawn, vector HitDirection, name InHitZoneName, out name OutBoneName)
{
local EPawnOctant SlashDir;
local KFCharacterInfo_Monster MonsterInfo;
MonsterInfo = InPawn.GetCharacterMonsterInfo();
if ( MonsterInfo == none )
{
return;
}
SlashDir = GetLastSlashDirection(InPawn, HitDirection);
if( SlashDir == DIR_Forward || SlashDir == DIR_Backward )
{
if( InHitZoneName == 'chest' || InHitZoneName == 'head' )
{
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
{
// Randomly pick the left or right shoulder bone and split the guy in half vertically
OutBoneName = Rand(2) == 0
? MonsterInfo.SpecialMeleeDismemberment.LeftShoulderBoneName
: MonsterInfo.SpecialMeleeDismemberment.RightShoulderBoneName;
}
}
}
else if( SlashDir == DIR_Left || SlashDir == DIR_Right )
{
if( InHitZoneName == 'chest' || InHitZoneName == 'abdomen' || InHitZoneName == 'stomach' )
{
if( MonsterInfo.SpecialMeleeDismemberment.bAllowHorizontalSplit )
{
// Split the guy in half horizontally
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.SpineBoneName;
}
}
}
else if( SlashDir == DIR_ForwardLeft || SlashDir == DIR_BackwardRight )
{
if( InHitZoneName == 'chest' )
{
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
{
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.RightShoulderBoneName;
}
}
else if( InHitZoneName == 'head' )
{
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
{
// Use a random chance to decide whether to dismember the head or the shoulder constraints
if( Rand(2) == 0 )
{
// ... and choose one of the shoulder constraints at random
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.RightShoulderBoneName;
}
}
}
}
else if( SlashDir == DIR_ForwardRight || SlashDir == DIR_BackwardLeft )
{
if( InHitZoneName == 'chest' )
{
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
{
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.LeftShoulderBoneName;
}
}
else if( InHitZoneName == 'head' )
{
if( MonsterInfo.SpecialMeleeDismemberment.bAllowVerticalSplit )
{
// Use a random chance to decide whether to dismember the head or the shoulder constraints
if( Rand(2) == 0 )
{
OutBoneName = MonsterInfo.SpecialMeleeDismemberment.LeftShoulderBoneName;
}
}
}
}
}
/** Allows the damage type to modify the impulse when a specified hit zone is dismembered */
static simulated function ModifyDismembermentHitImpulse(KFPawn_Monster InPawn, name InHitZoneName, vector HitDirection,
out vector OutImpulseDir, out vector OutParentImpulseDir,
out float OutImpulseScale, out float OutParentImpulseScale)
{
local EPawnOctant SlashDir;
SlashDir = GetLastSlashDirection(InPawn, HitDirection);
// Apply upward impulse on decapitation from a clean horizontal slash
if( InHitZoneName == 'head' &&
( SlashDir == DIR_Left || SlashDir == DIR_Right ) )
{
OutImpulseDir += 10*vect(0,0,1);
OutImpulseDir = Normal(OutImpulseDir);
OutParentImpulseScale = 0.f;
}
// Do not apply any impulse on split in half from a vertical slash
else if( (InHitZoneName == 'head' || InHitZoneName == 'chest' ) &&
( SlashDir == DIR_Forward || SlashDir == DIR_Backward) )
{
OutImpulseScale = 0.f;
OutParentImpulseScale = 0.f;
}
}
//IsDoingSpecialMove(SM_Frozen)
defaultproperties
{
//KDamageImpulse=200
//KDeathUpKick=250
KDamageImpulse=2500
KDeathUpKick=700
KDeathVel=700
StumblePower=250
MeleeHitPower=200
WeaponDef=class'KFWeapDef_Rifle_FrostShotgunAxe'
ModifierPerkList(0)=class'KFPerk_Berserker'
}

View File

@ -6,8 +6,7 @@
//=============================================================================
class KFDT_Slashing_IonThruster extends KFDT_Slashing
abstract
hidedropdown;
abstract;
// Damage type to use for the burning damage over time
var class<KFDamageType> BurnDamageType;

View File

@ -6,8 +6,7 @@
//=============================================================================
class KFDT_Slashing_IonThrusterHeavy extends KFDT_Slashing_IonThruster
abstract
hidedropdown;
abstract;
/** Allows the damage type to customize exactly which hit zones it can dismember */
static simulated function bool CanDismemberHitZone( name InHitZoneName )

View File

@ -6,8 +6,7 @@
//=============================================================================
class KFDT_Slashing_IonThrusterSpecial extends KFDT_Slashing_IonThruster
abstract
hidedropdown;
abstract;
/** Allows the damage type to customize exactly which hit zones it can dismember */
static simulated function bool CanDismemberHitZone( name InHitZoneName )

View File

@ -0,0 +1,27 @@
//=============================================================================
// KFDT_Toxic_HRG_Vampire_BloodBall
//=============================================================================
// Toxic Cloud DamageType
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFDT_Toxic_HRG_Vampire_BloodBall extends KFDT_Toxic
abstract
hidedropdown;
defaultproperties
{
PoisonPower=16
StumblePower=40 //200
KnockdownPower=0 //40
DoT_Type=DOT_Toxic
DoT_Duration=2.0 //1.0
DoT_Interval=0.5 //1.0
DoT_DamageScale=0.1
ModifierPerkList(0)=class'KFPerk_FieldMedic'
WeaponDef=class'KFWeapDef_HRG_Vampire'
}

View File

@ -0,0 +1,282 @@
//=============================================================================
// KFExplosion_HRG_Vampire_BloodBall
//=============================================================================
// Used by projectiles and kismet to spawn an explosion
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFExplosion_HRG_Vampire_BloodBall extends KFExplosionActorLingering;
var() class<KFDamageType> HealingDamageType;
var() float HealingAmount;
var AkEvent SmokeLoopStartEvent;
var AkEvent SmokeLoopStopEvent;
var KFPerk CachedInstigatorPerk;
var float ChargePercentage;
var float DamageByChargePercentage;
var float fMinAmmoutHealing;
var float fMaxAmmoutHealing;
var float fAltMinAmmoutHealing;
var float fAltMaxAmmoutHealing;
var bool bHealsInstigator;
var bool bHealsDifferentAmmoutToInstigator;
var float ImpactDecalSizeMax;
var float ImpactDecalSizeMin;
simulated function SpawnExplosionParticleSystem(ParticleSystem Template)
{
local ParticleSystemComponent PSC;
local vector vec;
// If the template is none, grab the default
if( !ExplosionTemplate.bAllowPerMaterialFX && Template == none )
{
Template = KFGameExplosion(ExplosionTemplate).ExplosionEffects.DefaultImpactEffect.ParticleTemplate;
}
// Use custom pool
PSC = WorldInfo.MyEmitterPool.SpawnEmitter(Template, Location, rotator(ExplosionTemplate.HitNormal), None);
//ChargePercentage
vec.X = ChargePercentage;
vec.Y = ChargePercentage;
vec.Z = ChargePercentage;
PSC.SetVectorParameter( name("BlobCharge"), vec);
PSC.SetFloatParameter( name("MineFxControlParam"), ChargePercentage);
}
/*
* @param Direction For bDirectionalExplosion=true explosions, this is the forward direction of the blast.
* Overridden to add the ability to spawn fragments from the explosion
**/
simulated function Explode(GameExplosion NewExplosionTemplate, optional vector Direction)
{
local KFPawn KFP;
super.Explode(NewExplosionTemplate, Direction);
if( Instigator != none )
{
KFP = KFPawn(Instigator);
if( KFP != none )
{
CachedInstigatorPerk = KFP.GetPerk();
}
}
if (Role == Role_Authority)
{
//DelayedExplosionDamage();
SetTimer(Interval, false, nameof(DelayedExplosionDamage), self);
}
}
/**
* Deal damage or heal players
*/
protected simulated function AffectsPawn(Pawn Victim, float DamageScale)
{
local KFPawn_Human HumanVictim;
local KFPawn_Monster MonsterVictim;
local KFProj_MedicGrenade OwnerProjectile;
local bool bCanRepairArmor;
local Box BBox;
local vector BBoxCenter;
local Actor HitActor;
local bool bDamageBlocked;
local float AmountToHeal;
if( Victim != none && Victim.IsAliveAndWell() )
{
MonsterVictim = KFPawn_Monster(Victim);
if( MonsterVictim != none )
{
if( bWasFadedOut|| bDeleteMe || bPendingDelete )
{
return;
}
Victim.GetComponentsBoundingBox(BBox);
BBoxCenter = (BBox.Min + BBox.Max) * 0.5f;
HitActor = TraceExplosive(BBoxCenter, Location + vect(0, 0, 20));
bDamageBlocked = (HitActor != None && HitActor != Victim);
if(bDamageBlocked && HitActor.IsA('KFDoorActor'))
{
bDamageBlocked = false;
}
if( !bDamageBlocked )
{
Victim.TakeRadiusDamage(InstigatorController, ExplosionTemplate.Damage * DamageScale, ExplosionTemplate.DamageRadius,
ExplosionTemplate.MyDamageType, ExplosionTemplate.MomentumTransferScale, Location, bDoFullDamage,
(Owner != None) ? Owner : self, ExplosionTemplate.DamageFalloffExponent);
}
}
else
{
Victim.GetComponentsBoundingBox(BBox);
BBoxCenter = (BBox.Min + BBox.Max) * 0.5f;
HitActor = TraceExplosive(BBoxCenter, Location + vect(0, 0, 20));
bDamageBlocked = (HitActor != None && HitActor != Victim);
if(bDamageBlocked && HitActor.IsA('KFDoorActor'))
{
bDamageBlocked = false;
}
if(!bDamageBlocked)
{
if(!bHealsInstigator && Victim == Instigator)
{
return;
}
HumanVictim = KFPawn_Human(Victim);
if( HumanVictim != none && HumanVictim.GetExposureTo(Location) > 0 )
{
OwnerProjectile = KFProj_MedicGrenade(Owner);
if( OwnerProjectile != none )
{
bCanRepairArmor = OwnerProjectile.HealedPawns.Find( HumanVictim ) == INDEX_NONE;
}
if(bHealsDifferentAmmoutToInstigator && bHealsInstigator && Victim == Instigator)
{
AmountToHeal = FMax(fAltMinAmmoutHealing, Lerp(fAltMinAmmoutHealing, fAltMaxAmmoutHealing, DamageByChargePercentage));
HumanVictim.HealDamage( AmountToHeal, InstigatorController, HealingDamageType, bCanRepairArmor);
}
else
{
AmountToHeal = FMax(fMinAmmoutHealing, Lerp(fMinAmmoutHealing, fMaxAmmoutHealing, DamageByChargePercentage));
HumanVictim.HealDamage( AmountToHeal, InstigatorController, HealingDamageType, bCanRepairArmor);
}
if( bCanRepairArmor )
{
OwnerProjectile.HealedPawns.AddItem( HumanVictim );
}
}
}
}
}
}
simulated protected function UpdateExplosionTemplateWithPerMaterialFX(PhysicalMaterial PhysMaterial)
{
super.UpdateExplosionTemplateWithPerMaterialFX(PhysMaterial);
// Set a default impact effect if there isn't a physical material
if( PhysMaterial == none )
{
MyImpactEffect = KFGameExplosion(ExplosionTemplate).ExplosionEffects.DefaultImpactEffect;
}
else if( WorldInfo.MyImpactEffectManager != none ) // none on dedicated server
{
`ImpactEffectManager.GetImpactEffect(PhysMaterial, MyImpactEffect,KFGameExplosion(ExplosionTemplate).ExplosionEffects);
}
if( MyImpactEffect.ParticleTemplate != none )
{
ExplosionTemplate.ExplosionSound = MyImpactEffect.Sound;
}
}
//Copied from KFExplosionActor -> SpawnExplosionDecal
//Added support to variable DecalSize depending on blood ball charge.
simulated function SpawnExplosionDecal()
{
local MaterialInterface MI;
local MaterialInstanceTimeVarying MITV_Decal;
local int DecalMaterialsLength;
local float DecalSize, DecalThickness;
local KFGameExplosion KFExplosionTemplate;
if( WorldInfo.bDropDetail )
{
return;
}
// If the template is none, grab the default
if( !ExplosionTemplate.bAllowPerMaterialFX )
{
KFExplosionTemplate = KFGameExplosion(ExplosionTemplate);
if( KFExplosionTemplate == none || KFExplosionTemplate.ExplosionEffects == none )
{
return;
}
MyImpactEffect = KFExplosionTemplate.ExplosionEffects.DefaultImpactEffect;
}
// if we have a decal to spawn on impact
DecalMaterialsLength = MyImpactEffect.DecalMaterials.length;
if( DecalMaterialsLength > 0 )
{
MI = MyImpactEffect.DecalMaterials[Rand(DecalMaterialsLength)];
if( MI != None )
{
DecalSize = Lerp(ImpactDecalSizeMin, ImpactDecalSizeMax, ChargePercentage);
//Always extend decal thickness for explosions
DecalThickness = DecalSize * 2.f;
if( MaterialInstanceTimeVarying(MI) != none )
{
MITV_Decal = new(self) class'MaterialInstanceTimeVarying';
MITV_Decal.SetParent( MI );
WorldInfo.ExplosionDecalManager.SpawnDecal(MITV_Decal, ExplosionTemplate.HitLocation, rotator(-ExplosionTemplate.HitNormal), DecalSize, DecalSize, DecalThickness, FALSE,(MyImpactEffect.bNoDecalRotation) ? 0.f : (FRand() * 360.0) );
//here we need to see if we are an MITV and then set the burn out times to occur
MITV_Decal.SetScalarStartTime( MyImpactEffect.DecalDissolveParamName, MyImpactEffect.DecalDuration );
}
else
{
WorldInfo.ExplosionDecalManager.SpawnDecal( MI, ExplosionTemplate.HitLocation, rotator(-ExplosionTemplate.HitNormal), DecalSize, DecalSize, DecalThickness, true,
(MyImpactEffect.bNoDecalRotation) ? 0.f : (FRand() * 360.0),,,,,,, MyImpactEffect.DecalDuration );
}
}
}
}
DefaultProperties
{
HealingDamageType=class'KFDT_Healing'
HealingAmount=0;
fMinAmmoutHealing=12; //10;
fMaxAmmoutHealing=60; //50;
ImpactDecalSizeMax=425.f
ImpactDecalSizeMin=178.f
Interval=0
MaxTime=0.0
FadeOutTime=0.0
bExplodeMoreThanOnce=false
bDoFullDamage=false
bOnlyDamagePawns=true
bSkipLineCheckForPawns=true
LoopStartEvent=none
LoopStopEvent=none
//EXPERIMENTAL FEATURES FOR DESIGN
bHealsInstigator = false;
bHealsDifferentAmmoutToInstigator = false;
fAltMinAmmoutHealing=1;
fAltMaxAmmoutHealing=5;
}

View File

@ -767,6 +767,16 @@ defaultproperties
DamageTypeModifiers.Add((DamageType=class'KFDT_EMP_ArcGenerator_AltFiremodeZapDamage', DamageScale=(1.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.25)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
ParryResistance=4

View File

@ -203,6 +203,9 @@ defaultproperties
DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic_BloatPukeMine', DamageScale=(0.00)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic_BloatKingPukeMine', DamageScale=(0.00)))
//Special cases
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(2.0)))

View File

@ -675,6 +675,15 @@ DefaultProperties
DamageTypeModifiers.Add((DamageType=class'KFDT_EMP_ArcGenerator_AltFiremodeZapDamage', DamageScale=(1.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.6)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
Begin Object Class=KFGameExplosion Name=ExploTemplate0
Damage=40 //20

View File

@ -1231,6 +1231,13 @@ DefaultProperties
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.6)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.9)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
// ---------------------------------------------
// Block Settings

View File

@ -1953,6 +1953,16 @@ defaultproperties
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.25)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
// ---------------------------------------------
// Armor

View File

@ -2188,6 +2188,15 @@ defaultproperties
DamageTypeModifiers.Add((DamageType=class'KFDT_EMP_ArcGenerator_AltFiremodeZapDamage', DamageScale=(1.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRGScorcherLightingImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_HRGScorcherDoT', DamageScale=(0.4)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.3)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.25)))
//DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.5)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_HRG_Vampire_BloodBallHeavyImpact', DamageScale=(0.4)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing_HRG_Vampire_CrystalSpike', DamageScale=(0.3)))
DamageTypeModifiers.Add((DamageType=class'KFDT_Bleeding_HRG_Vampire_BloodSuck', DamageScale=(0.7)))
// ---------------------------------------------
// Block Settings

View File

@ -0,0 +1,297 @@
//=============================================================================
// KFProj_BloodBall_HRG_Vampire
//=============================================================================
// Projectile class for Vampire
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFProj_BloodBall_HRG_Vampire extends KFProjectile;
/** Storing all relative info about Blood Ball charged (in order to help in replication) */
struct BloodBallChargeInfo
{
var float ChargePercentage;
var float DamageByChargePercentage;
};
/** Dampen amount for every bounce */
var float DampenFactor;
/** Dampen amount for parallel angle to velocity */
var float DampenFactorParallel;
/** Vector to offset the ground FX particle system by when landing */
var vector LandedFXOffset;
/** Armed mine collision settings */
/** Decal settings */
var MaterialInterface ImpactDecalMaterial;
var float ImpactDecalWidth;
var float ImpactDecalHeight;
var float ImpactDecalThickness;
var float MaxExplodeTriggerHeightPerPercentage;
var float MinExplodeTriggerHeightPerPercentage;
var float MaxDamageRadiusPerPercentage;
var float MinDamageRadiusPerPercentage;
var float MaxCollisionRadius;
var float MinCollisionRadius;
var float MaxCollisionHeight;
var float MinCollisionHeight;
var float MaxDamagePerPercentage;
var float MinDamagePerPercentage;
var repnotify BloodBallChargeInfo BloodBallCharge;
var float fCachedCylinderWidth, fCachedCylinderHeight;
//EXPERIMENTAL FEATURES
var bool bCantBeTouchedByInstigator;
var bool bManuallyDetonated;
var bool bCantDetonateOnFullHP;
replication
{
if( bNetDirty && Role == Role_Authority)
BloodBallCharge;
}
simulated event ReplicatedEvent( name VarName )
{
super.ReplicatedEvent( VarName );
if( VarName == nameOf(BloodBallCharge))
{
ScalingExplosionTemplateByBloodBallCharge();
ScalingProjEffectsByBloodBallCharge();
}
}
simulated function SetInheritedScale(float NewChargePercentage, float NewDamageByChargePercentage)
{
BloodBallCharge.DamageByChargePercentage=NewDamageByChargePercentage;
BloodBallCharge.ChargePercentage = FMax(0.1, NewChargePercentage);//We want to see at least a bit of the projectile.
ScalingExplosionTemplateByBloodBallCharge();
ScalingProjEffectsByBloodBallCharge();
bNetDirty=true;
}
simulated function ScalingExplosionTemplateByBloodBallCharge()
{
fCachedCylinderWidth = Lerp(MinCollisionRadius, MaxCollisionRadius, BloodBallCharge.ChargePercentage);
fCachedCylinderHeight = Lerp(MinCollisionHeight, MaxCollisionHeight, BloodBallCharge.ChargePercentage);
CylinderComponent(CollisionComponent).SetCylinderSize(fCachedCylinderWidth, fCachedCylinderHeight);
ExplosionTemplate.DamageRadius = FMax(MinDamageRadiusPerPercentage, Lerp(MinDamageRadiusPerPercentage, MaxDamageRadiusPerPercentage, BloodBallCharge.DamageByChargePercentage));
ExplosionTemplate.Damage = FMax(MinDamagePerPercentage, Lerp(MinDamagePerPercentage, MaxDamagePerPercentage, BloodBallCharge.DamageByChargePercentage));
}
simulated function ScalingProjEffectsByBloodBallCharge()
{
local vector ChargePercentageVector;
ChargePercentageVector.X = BloodBallCharge.ChargePercentage;
ChargePercentageVector.Y = BloodBallCharge.ChargePercentage;
ChargePercentageVector.Z = BloodBallCharge.ChargePercentage;
if(ProjEffects != None)
{
ProjEffects.SetVectorParameter( name("BlobCharge"), ChargePercentageVector);
ProjEffects.SetFloatParameter( name("MineFxControlParam"), BloodBallCharge.ChargePercentage);
}
}
simulated event PostBeginPlay()
{
super.PostBeginPlay();
BloodBallCharge.ChargePercentage=0;
BloodBallCharge.DamageByChargePercentage=0;
}
simulated function SpawnFlightEffects()
{
super.SpawnFlightEffects();
}
/** Validates a touch */
simulated protected function PrepareExplosionTemplate()
{
local Weapon OwnerWeapon;
local Pawn OwnerPawn;
super(KFProjectile).PrepareExplosionTemplate();
OwnerWeapon = Weapon(Owner);
if (OwnerWeapon != none)
{
OwnerPawn = Pawn(OwnerWeapon.Owner);
if (OwnerPawn != none)
{
ExplosionTemplate.DamageRadius *= KFPawn(OwnerPawn).GetPerk().GetAoERadiusModifier();
}
}
}
simulated protected function PrepareExplosionActor(GameExplosionActor GEA)
{
KFExplosion_HRG_Vampire_BloodBall(GEA).ChargePercentage = BloodBallCharge.ChargePercentage;
KFExplosion_HRG_Vampire_BloodBall(GEA).DamageByChargePercentage = BloodBallCharge.DamageByChargePercentage;
super.PrepareExplosionActor(GEA);
}
/** Call ProcessBulletTouch */
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
if (Other == Instigator || CheckRepeatingTouch(Other))
{
return;
}
if (IgnoreTouchActor != Other)
{
ProcessBulletTouch(Other, HitLocation, HitNormal);
}
super.ProcessTouch(Other, HitLocation, HitNormal);
}
defaultproperties
{
Speed=2000
MaxSpeed=2000
TerminalVelocity=2000
TossZ=150
GravityScale=0.5
MomentumTransfer=50000.0
LifeSpan=300
PostExplosionLifetime=1
Physics=PHYS_Falling
bBounce=true
ProjFlightTemplate= ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_BlobProjectile_01'
ExplosionActorClass=class'KFExplosion_HRG_Vampire_BloodBall'
bSuppressSounds=false
bAmbientSoundZedTimeOnly=false
bAutoStartAmbientSound=false
bStopAmbientSoundOnExplode=true
AmbientSoundPlayEvent=None
AmbientSoundStopEvent=None
Begin Object Class=AkComponent name=AmbientAkSoundComponent
bStopWhenOwnerDestroyed=true
bForceOcclusionUpdateInterval=true
OcclusionUpdateInterval=0.25f
End Object
AmbientComponent=AmbientAkSoundComponent
Components.Add(AmbientAkSoundComponent)
//ImpactDecalMaterial=DecalMaterial'FX_Mat_Lib.FX_Puke_Mine_Splatter_DM'
ImpactDecalWidth=178.f
ImpactDecalHeight=178.f
ImpactDecalThickness=28.f
Begin Object Name=CollisionCylinder
CollisionRadius=10.f
CollisionHeight=10.f
CollideActors=true
//PhysMaterialOverride=PhysicalMaterial'WEP_Mine_Reconstructor_EMIT.BloatPukeMine_PM'
End Object
bCollideActors=true
bProjTarget=true
bCanBeDamaged=false
bCollideComplex=true
bNoEncroachCheck=true
bPushedByEncroachers=false
DampenFactor=0.125f
DampenFactorParallel=0.175f
LandedFXOffset=(X=0,Y=0,Z=2)
// Since we're still using an extent cylinder, we need a line at 0
ExtraLineCollisionOffsets.Add(())
// Explosion
Begin Object Class=KFGameExplosion Name=ExploTemplate0
Damage=200
DamageRadius=200
DamageFalloffExponent=0.5f
DamageDelay=0.f
MyDamageType=class'KFDT_Toxic_HRG_Vampire_BloodBall'
//bIgnoreInstigator is set to true in PrepareExplosionTemplate
//Impulse applied to Zeds
MomentumTransferScale=45000
// Damage Effects
KnockDownStrength=0
KnockDownRadius=0
FractureMeshRadius=0
FracturePartVel=0
ExplosionEffects=KFImpactEffectInfo'WEP_HRG_Vampire_Arch.HRG_Vampire_BlobFireImpacts'
ExplosionSound=None
bAllowPerMaterialFX=true
//MomentumTransferScale=0
// Dynamic Light
ExploLight=none
// Camera Shake
CamShake=CameraShake'WEP_Mine_Reconstructor_Arch.Camera_Shake'
CamShakeInnerRadius=200
CamShakeOuterRadius=400
CamShakeFalloff=1.f
bOrientCameraShakeTowardsEpicenter=true
End Object
ExplosionTemplate=ExploTemplate0
GlassShatterType=FMGS_ShatterAll
MaxExplodeTriggerHeightPerPercentage=22
MinExplodeTriggerHeightPerPercentage=11
MaxDamageRadiusPerPercentage=280 //340
MinDamageRadiusPerPercentage=130 //160
MaxDamagePerPercentage=200 //150
MinDamagePerPercentage=20 //15
MaxCollisionRadius=20
MinCollisionRadius=10
MaxCollisionHeight=20
MinCollisionHeight=10
bBlockedByInstigator=true
bNetTemporary=false
bSyncToOriginalLocation=true
bSyncToThirdPersonMuzzleLocation=true
bUseClientSideHitDetection=true
bUpdateSimulatedPosition=false
TouchTimeThreshhold=0.05
//EXPERIMENTAL FEATURES FOR DESING
bManuallyDetonated=false
bCantBeTouchedByInstigator=true
bCantDetonateOnFullHP=true
AssociatedPerkClass=class'KFPerk_FieldMedic'
}

View File

@ -0,0 +1,247 @@
//=============================================================================
// KFProj_Blood Splash
//=============================================================================
// Projectile class for blood splashes that can leave decals.
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFProj_BloodSplash extends KFProjectile;
var DecalMaterial ImpactDecalMaterial;
var float ImpactDecalMaxSize;
var float ImpactDecalMinSize;
var float ImpactDecalThickness;
var KFPawn BloodOriginPawn;
/** Blow up on impact */
simulated event HitWall(vector HitNormal, Actor Wall, PrimitiveComponent WallComp)
{
if( StaticMeshComponent(WallComp) != none && StaticMeshComponent(WallComp).CanBecomeDynamic() )
{
// pass through meshes that can move
return;
}
SpawnBloodDecal(Location, HitNormal);
//Explode( Location, HitNormal );
}
/** Blow up on impact */
simulated function ProcessTouch( Actor Other, Vector HitLocation, Vector HitNormal )
{
if( Other.bBlockActors )
{
// don't hit pawns because we don't want to see floating flames when the victim pawn dies
if ( Pawn(Other) != None )
{
return;
}
// don't hit client-side destructible actors
// @todo: maybe don't hit any destructibles for the same reason we don't hit pawns (floating flames when destroyed)?
if( KFDestructibleActor(Other) != none && KFDestructibleActor(Other).ReplicationMode == RT_ClientSide )
{
return;
}
//Explode( Location, HitNormal );
SpawnBloodDecal(Location, HitNormal);
}
}
/** Overridden to adjust particle system for different surface orientations (wall, ceiling)
* and nudge location
*/
simulated protected function PrepareExplosionActor(GameExplosionActor GEA)
{
/*
local KFExplosion_Molotov KFEM;
local vector ExplosionDir;
super.PrepareExplosionActor( GEA );
// KFProjectile::Explode gives GEA a "nudged" location of 32 units, but it's too much, so use a smaller nudge
GEA.SetLocation( Location + vector(GEA.Rotation) * 10 );
KFEM = KFExplosion_Molotov( GEA );
if( KFEM != none )
{
ExplosionDir = vector( KFEM.Rotation );
if( ExplosionDir.Z < -0.95 )
{
// ceiling
KFEM.LoopingParticleEffect = KFEM.default.LoopingParticleEffectCeiling;
}
else if( ExplosionDir.Z < 0.05 )
{
// wall
KFEM.LoopingParticleEffect = KFEM.default.LoopingParticleEffectWall;
}
// else floor
}
*/
}
simulated function SpawnBloodDecal(vector HitLocation, vector HitNormal )
{
local KFGoreManager GoreManager;
// Grab the gore manager
GoreManager = KFGoreManager(WorldInfo.MyGoreEffectManager);
if (GoreManager == none || BloodOriginPawn == none)
{
return;
}
GoreManager.LeaveABloodSplatterDecal(BloodOriginPawn, HitLocation, Normal(Velocity));
//GoreManager. LeaveAPersistentBloodSplat(HitLocation, HitNormal, 1.0);
if (KFPawn_Monster(BloodOriginPawn) != none)
{
GoreManager.CausePersistentBlood(KFPawn_Monster(BloodOriginPawn), class'KFDamageType', HitLocation, Normal(Velocity), 0, false, false);
}
}
/**
* Use alternative explosion effects when Ground Fire Perk is active
*/
simulated function PostBeginPlay()
{
/*
local KFPlayerReplicationInfo InstigatorPRI;
if( AltExploEffects != none && Instigator != none )
{
InstigatorPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo);
if( InstigatorPRI != none )
{
bAltExploEffects = InstigatorPRI.bSplashActive;
}
}
else
{
bAltExploEffects = false;
}
super.PostBeginPlay();
*/
}
/**
* Force the fire not to burn the instigator, since setting it in the default props is not working for some reason - Ramm
* Use the alternative FX for the Ground Fire Perk Skill - Tulio
*/
simulated protected function PrepareExplosionTemplate()
{
/*
ExplosionTemplate.bIgnoreInstigator=true;
super.PrepareExplosionTemplate();
if( bAltExploEffects )
{
ExplosionTemplate.ExplosionEffects = AltExploEffects;
}
*/
}
defaultproperties
{
Physics=PHYS_Falling
bCollideComplex=TRUE // Ignore simple collision on StaticMeshes, and collide per poly
// network
bNetTemporary=False
bAlwaysReplicateExplosion=true
AlwaysRelevantDistanceSquared=6250000 // 25m
// gameplay
bBlockedByInstigator=false
GlassShatterType=FMGS_ShatterNone
// audio
bStopAmbientSoundOnExplode=false
bAutoStartAmbientSound=false
bAmbientSoundZedTimeOnly=false
AmbientSoundPlayEvent=None
AmbientSoundStopEvent=None
/*
Begin Object Class=AkComponent name=AmbientAkSoundComponent
bStopWhenOwnerDestroyed=true
bForceOcclusionUpdateInterval=true
OcclusionUpdateInterval=0.25;
End Object
AmbientComponent=AmbientAkSoundComponent
Components.Add(AmbientAkSoundComponent)
*/
// light
/*
Begin Object Class=PointLightComponent Name=FlamePointLight
LightColor=(R=245,G=190,B=140,A=255)
Brightness=2.f
Radius=300.f
FalloffExponent=10.f
CastShadows=False
CastStaticShadows=FALSE
CastDynamicShadows=FALSE
bCastPerObjectShadows=false
bEnabled=FALSE
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
End Object
*/
// explosion
/*
Begin Object Class=KFGameExplosion Name=ExploTemplate0
Damage=10
DamageRadius=150
DamageFalloffExponent=1.f
DamageDelay=0.f
// Don't burn the guy that tossed it, it's just too much damage with multiple fires, its almost guaranteed to kill the guy that tossed it
bIgnoreInstigator=true
MomentumTransferScale=1
// Damage Effects
MyDamageType=class'KFDT_Fire_Ground_MolotovGrenade'
KnockDownStrength=0
FractureMeshRadius=0
ExplosionEffects=KFImpactEffectInfo'wep_molotov_arch.Molotov_GroundFire'
bDirectionalExplosion=true
// Camera Shake
CamShake=none
// Dynamic Light
ExploLight=FlamePointLight
ExploLightStartFadeOutTime=4.2
ExploLightFadeOutTime=0.3
End Object
ExplosionTemplate=ExploTemplate0
*/
ProjFlightTemplate=None
//ExplosionActorClass=class'KFExplosion_Molotov'
AssociatedPerkClass=None
ImpactDecalMaterial=DecalMaterial'FX_Mat_Lib.FX_CH_BloodSplatter_DM'
ImpactDecalMaxSize=125.f
ImpactDecalMinSize=75.f
ImpactDecalThickness=12.f
// Ground Fire Perk Skill Alternative FX
//AltExploEffects=KFImpactEffectInfo'WEP_Flamethrower_ARCH.GroundFire_Splash_Impacts'
}

View File

@ -259,5 +259,7 @@ defaultproperties
End Object
ExplosionTemplate=ExploTemplate0
ExplosionActorClass=class'KFExplosionActor'
bDamageDestructiblesOnTouch=true
}

View File

@ -0,0 +1,42 @@
//=============================================================================
// KFProj_Bullet_Frost_Shotgun_Axe
//=============================================================================
// Bullet class for the Frost_Shotgun_Axe
//=============================================================================
// Killing Floor 2
// Copyright (C) 2019 Tripwire Interactive LLC
//=============================================================================
class KFProj_Bullet_Frost_Shotgun_Axe extends KFProj_Bullet_Pellet
hidedropdown;
var AkEvent oFrozenSound;
simulated function ProcessTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
local KFPawn p;
p = KFPawn(Other);
super.ProcessTouch(Other, HitLocation, HitNormal);
if(p != none)
{
if(KFPawn_Monster(p).IsDoingSpecialMove(SM_Frozen))
{
p.PlayAkEvent(oFrozenSound);
}
}
}
defaultproperties
{
MaxSpeed=7000 //24000.0
Speed=7000 //24000.0
DamageRadius=0
ProjFlightTemplate=ParticleSystem'WEP_Frost_Shotgun_Axe_EMIT.FX_FrostFang_Tracer_01'
ProjFlightTemplateZedTime=ParticleSystem'WEP_Frost_Shotgun_Axe_EMIT.FX_FrostFang_Tracer_Zedtime_01'
ImpactEffects=KFImpactEffectInfo'WEP_Frost_Shotgun_Axe_ARCH.WEP_FrostFang_Projectile_Impact'
oFrozenSound=AkEvent'WW_WEP_SA_CompoundBow.Play_Arrow_Impact_Cryo'
AssociatedPerkClass=class'KFPerk_Support'
}

View File

@ -19,12 +19,13 @@ defaultproperties
ProjFlightTemplate=ParticleSystem'FX_Projectile_EMIT.FX_Tracer_9MM_ZEDTime'
bSpawnShrapnel=true
//bDebugShrapnel=true
bDebugShrapnel=false
NumSpawnedShrapnel=3
ShrapnelSpreadWidthEnvironment=0.5
ShrapnelSpreadHeightEnvironment=0.5
ShrapnelSpreadWidthZed=0.5
ShrapnelSpreadHeightZed=0.5
ShrapnelSpreadWidthEnvironment=0.25 //0.5
ShrapnelSpreadHeightEnvironment=0.25 //0.5
ShrapnelSpreadWidthZed=0.75 //0.5
ShrapnelSpreadHeightZed=0.75 //0.5
ShrapnelClass = class'KFProj_Bullet_Pistol_ChiappaRhinoShrapnel'
ShrapnelSpawnSoundEvent = AkEvent'WW_WEP_ChiappaRhinos.Play_WEP_ChiappaRhinos_Bullet_Fragmentation'
ShrapnelSpawnVFX=ParticleSystem'WEP_ChiappaRhino_EMIT.FX_ChiappaRhino_Shrapnel_Hit'

View File

@ -0,0 +1,63 @@
//=============================================================================
// KFProj_CrystalSpike_HRG_Vampire
//=============================================================================
// Bullet class for the HRG Vampire crystal spikes.
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//
//=============================================================================
class KFProj_CrystalSpike_HRG_Vampire extends KFProj_Bullet
hidedropdown;
simulated function ProcessBulletTouch(Actor Other, Vector HitLocation, Vector HitNormal)
{
super.ProcessBulletTouch(Other, HitLocation, HitNormal);
if( WorldInfo.NetMode != NM_DedicatedServer )
{
if ( Other.IsA('Pawn') && Other.bCanBeDamaged)
{
WorldInfo.MyEmitterPool.SpawnEmitter(ImpactEffects.DefaultImpactEffect.ParticleTemplate, HitLocation, rotator(HitNormal), Other);
PlaySoundBase(ImpactEffects.DefaultImpactEffect.Sound, true,,, HitLocation);
}
}
}
defaultproperties
{
bWarnAIWhenFired=true
MaxSpeed=12000.0 //15000.0
Speed=12000.0 ///15000.0
TerminalVelocity=12000.0 //15000.0
DamageRadius=0
ProjFlightTemplate=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_Projectile_ALT'
LifeSpan=10
bBlockedByInstigator=false
bCollideActors=true
bCollideComplex=true
bNoEncroachCheck=true
bNoReplicationToInstigator=false
bUseClientSideHitDetection=true
bUpdateSimulatedPosition=false
bRotationFollowsVelocity=false
bNetTemporary=false
bSyncToOriginalLocation=true
ImpactEffects = KFImpactEffectInfo'WEP_HRG_Vampire_Arch.HRG_Vampire_SpikeFireImpacts'
AmbientSoundPlayEvent=None
AmbientSoundStopEvent=None
TouchTimeThreshhold=0.15
AssociatedPerkClass=class'KFPerk_FieldMedic'
}

View File

@ -142,7 +142,7 @@ defaultproperties
FractureMeshRadius=200.0
FracturePartVel=500.0
//ExplosionEffects=KFImpactEffectInfo'WEP_HX25_Pistol_ARCH.HX25_Pistol_Submunition_Explosion'
ExplosionSound=AkEvent'WW_WEP_SA_HX25.Play_WEP_SA_HX25_Explosion'
ExplosionSound=AkEvent'ww_wep_hrg_kaboomstick.WEP_HRG_Kaboomstick_Projectile_Explo'
ExplosionEffects=KFImpactEffectInfo'WEP_HRG_Kaboomstick_ARCH.WEP_HRG_Kaboomstick_Explosion'
//ExplosionSound=AkEvent'WW_WEP_Seeker_6.Play_WEP_Seeker_6_Explosion'

View File

@ -27,6 +27,7 @@ simulated event HitWall(vector HitNormal, actor Wall, PrimitiveComponent WallCom
* Returns true if projectile actually bounced / was allowed to bounce */
simulated function bool Bounce( vector HitNormal, Actor BouncedOff )
{
SetLocation(Location + HitNormal);
super.Bounce(HitNormal, BouncedOff);
// stop and drop

View File

@ -29,9 +29,6 @@ var float DampenFactor;
/** Dampen amount for parallel angle to velocity */
var float DampenFactorParallel;
/** How much to offset the mine when spawning inside of collision */
var float SpawnCollisionOffsetAmt;
/** Vector to offset the ground FX particle system by when landing */
var vector LandedFXOffset;
@ -175,8 +172,6 @@ simulated function SetInheritedScale(float Scale, float ChargePercentage)
/** Adds our puke mine to the pool */
simulated event PostBeginPlay()
{
local vector Hitlocation, HitNormal;
// Cache team num
TeamNum = GetTeamNum();
@ -197,13 +192,6 @@ simulated event PostBeginPlay()
if( Role == ROLE_Authority )
{
// If we're spawning in collision for some reason, offset it towards the instigator to keep it in play
Instigator.Trace( HitLocation, HitNormal, Location, Instigator.Location, false,,, TRACEFLAG_Bullet );
if( !IsZero(HitLocation) )
{
SetLocation( HitLocation + HitNormal*SpawnCollisionOffsetAmt );
}
SetTimer( FuseDuration, false, nameOf(Timer_Explode) );
}
}
@ -864,8 +852,6 @@ defaultproperties
// Since we're still using an extent cylinder, we need a line at 0
ExtraLineCollisionOffsets.Add(())
SpawnCollisionOffsetAmt=28.f
// Collision size we should use when waiting to be triggered
ExplodeTriggerRadius=60.f
ExplodeTriggerHeight=22.f

View File

@ -0,0 +1,110 @@
//=============================================================================
// KFSeasonalEventStats_Xmas2020
//=============================================================================
// Tracks event-specific challenges/accomplishments for Xmas 2020
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFSeasonalEventStats_Xmas2020 extends KFSeasonalEventStats;
var transient private const int RosesRequired, TomesRequired, EndlessWaveRequired, XmasEventIndex;
private event Initialize(string MapName)
{
local string CapsMapName;
CapsMapName = Caps(MapName);
bObjectiveIsValidForMap[0] = 0; // Collect 3 roses in Elysium
bObjectiveIsValidForMap[1] = 0; // Collect 4 tomes in Elysium
bObjectiveIsValidForMap[2] = 0; // Complete one wave in Elysium's Botanica arena
bObjectiveIsValidForMap[3] = 0; // Complete one wave in Elysium's Loremaster Sanctum arena
bObjectiveIsValidForMap[4] = 0; // Complete wave 15 on Endless Hard or higher difficulty on Elysium
if (CapsMapName == "KF-ELYSIUM")
{
bObjectiveIsValidForMap[0] = 1;
bObjectiveIsValidForMap[1] = 1;
bObjectiveIsValidForMap[2] = 1;
bObjectiveIsValidForMap[3] = 1;
bObjectiveIsValidForMap[4] = 1;
}
SetSeasonalEventStatsMax(RosesRequired, TomesRequired, 0, 0, 0);
}
private event GrantEventItems()
{
if (Outer.IsEventObjectiveComplete(0) &&
Outer.IsEventObjectiveComplete(1) &&
Outer.IsEventObjectiveComplete(2) &&
Outer.IsEventObjectiveComplete(3) &&
Outer.IsEventObjectiveComplete(4))
{
GrantEventItem(8608);
}
}
simulated function OnTryCompleteObjective(int ObjectiveIndex, int EventIndex)
{
local int ObjIdx;
// Collect 3 roses in Elysium
ObjIdx = 0;
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
{
IncrementSeasonalEventStat(ObjIdx, 1);
if (Outer.GetSeasonalEventStatValue(ObjIdx) >= RosesRequired)
{
FinishedObjective(XmasEventIndex, ObjIdx);
}
}
// Collect 4 tomes in Elysium
ObjIdx = 1;
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
{
IncrementSeasonalEventStat(ObjIdx, 1);
if (Outer.GetSeasonalEventStatValue(ObjIdx) >= TomesRequired)
{
FinishedObjective(XmasEventIndex, ObjIdx);
}
}
// Complete one wave in Elysium's Botanica arena
ObjIdx = 2;
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
{
FinishedObjective(XmasEventIndex, ObjIdx);
}
// Complete one wave in Elysium's Loremaster Sanctum arena
ObjIdx = 3;
if (bObjectiveIsValidForMap[ObjIdx] != 0 && ObjectiveIndex == ObjIdx && EventIndex == XmasEventIndex)
{
FinishedObjective(XmasEventIndex, ObjIdx);
}
}
simulated event OnWaveCompleted(class<GameInfo> GameClass, int Difficulty, int WaveNum)
{
local int ObjIdx;
// Complete wave 15 on Endless Hard or higher difficulty on Elysium
ObjIdx = 4;
if (bObjectiveIsValidForMap[ObjIdx] != 0)
{
if (WaveNum >= EndlessWaveRequired && GameClass == class'KFGameInfo_Endless' && Difficulty >= `DIFFICULTY_HARD)
{
FinishedObjective(XmasEventIndex, ObjIdx);
}
}
}
defaultproperties
{
RosesRequired=3
TomesRequired=4
EndlessWaveRequired=15
XmasEventIndex=SEI_Winter
}

View File

@ -0,0 +1,56 @@
//=============================================================================
// KFSeqAct_ProgressSeasonalObjective
//=============================================================================
// Sequence action to allow a map to have add progress to seasonal objectives
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFSeqAct_ProgressSeasonalObjective extends SequenceAction;
/** Objective index for the event this is tied to */
var() int ObjectiveIndex;
/** Index of the event this is tied to */
var() int EventIndex;
/** Increment progress for all players? */
var() bool bAllPlayersAffected;
event Activated()
{
local KFPlayercontroller KFPC;
local bool bIsObjectiveDataValid;
bIsObjectiveDataValid = ObjectiveIndex >= 0 && ObjectiveIndex < 5 && EventIndex > SEI_None && EventIndex < SEI_MAX;
if (bAllPlayersAffected)
{
foreach GetWorldInfo().AllControllers(class'KFPlayerController', KFPC)
{
if(bIsObjectiveDataValid)
{
KFPC.ClientOnTryCompleteObjective(ObjectiveIndex, EventIndex);
}
}
}
else
{
KFPC = KFPlayerController(GetWorldInfo().GetALocalPlayerController());
if(bIsObjectiveDataValid)
{
KFPC.ClientOnTryCompleteObjective(ObjectiveIndex, EventIndex);
}
}
}
defaultproperties
{
ObjName="Progress Seasonal Objective"
ObjCategory="Killing Floor"
ObjectiveIndex=-1
EventIndex=-1
bAllPlayersAffected=true
}

View File

@ -0,0 +1,749 @@
//=============================================================================
// KFSprayActor_HRG_Vampire
//=============================================================================
// Base class for spray actor that sucks enemies blood
//=============================================================================
// Killing Floor 2
// Copyright (C) 2019 Tripwire Interactive LLC
//=============================================================================
class KFSprayActor_HRG_Vampire extends KFSprayActor
hidecategories(Object, Movement, Display, Attachment, Collision, Physics, Advanced, Debug, Mobile)
placeable;
/** Transient PSCs to workaround issue with setting the BonePSC in an archetype */
var transient array<KFParticleSystemComponent> BoneChainComponents;
var transient array<KFParticleSystemComponent> BoneChainComponents_1stP;
/** Firebug Perk can modify the flame length, we need an alternative anim for that */
var(SprayMesh) AnimSet AltSprayAnimSet;
var(SuckerConfig) int MaxNumberOfZedsZapped;
var(SuckerConfig) int MaxDistanceToBeZapped;
var(SuckerConfig) float ZapInterval;
var(SuckerConfig) int ChainDamage;
var KFWeap_HRG_Vampire OwnerWeapon;
/***************************************
INHERITED FROM SPRAY AND NOT MODIFIED
***************************************/
event PreBeginPlay()
{
super.PreBeginPlay();
SetBoneChainComponents();
}
/**
* Set (or create) PSC's for the BoneChain. Use this when creating an archetype template spray
* effect to workaround an issue where assigning a transient default BoneChain PSC doesn't work.
*/
simulated function SetBoneChainComponents()
{
local int Idx;
for (Idx = 0; Idx < BoneChain.length; ++Idx)
{
if ( Idx < BoneChainComponents.Length )
{
BoneChain[Idx].BonePSC0 = BoneChainComponents[Idx];
}
if ( Idx < BoneChainComponents_1stP.Length )
{
BoneChain[Idx].BonePSC1 = BoneChainComponents_1stP[Idx];
}
}
}
simulated function BeginSpray()
{
local KFPerk InstigatorPerk;
if( bDeleteMe )
{
return;
}
super.BeginSpray();
if( OwningKFPawn != none )
{
InstigatorPerk = OwningKFPawn.GetPerk();
if( InstigatorPerk != none )
{
SplashDamage = default.SplashDamage;
}
//SetSprayLength();
}
}
/***************************************
END INHERITED FROM SPRAY AND NOT MODIFIED
***************************************/
/**
* Overridden to handle the rotation sound pitching for the flamethrower sound
*/
simulated event Tick(float DeltaTime)
{
super.Tick(DeltaTime);
// Set the rotation speed for the flamethrower sound
if( !bDetached && OwningKFPawn != none && WorldInfo.NetMode != NM_DedicatedServer )
{
OwningKFPawn.SetWeaponComponentRTPCValue( "FlamethrowerRotation", RotationSpeed);
}
}
simulated function CleanupEndFire()
{
super.CleanupEndFire();
SprayMeshExitCollision();
}
simulated event SprayMeshHit(Actor _TouchActor)
{
local KFPawn_Monster TouchActor;
//if (Role == ROLE_Authority)
//{
//`Warn("TOUCHED IN: "$_TouchActor.Location$"");
//if the sprayed actor is a monster, then we start zapping enemies
if(_TouchActor.IsA('KFPawn_Monster'))
{
TouchActor = KFPawn_Monster(_TouchActor);
if(OwnerWeapon != none && TouchActor != OwnerWeapon.oZedCurrentlyBeingSprayed)
{
OwnerWeapon.SetCurrentSprayedZed(TouchActor);
}
}
else
{
SprayMeshExitCollision();
}
//}
/*if (!CheckRecentlyZapped(_TouchActor))
{
NewActorInfo.HitActor = _TouchActor;
NewActorInfo.HitTime = WorldInfo.TimeSeconds;
vRecentlyZappedActors.AddItem(NewActorInfo);
}*/
super.SprayMeshHit(_TouchActor);
}
simulated event SprayMeshExitCollision()
{
if (OwnerWeapon == none)
{
return;
}
OwnerWeapon.SetCurrentSprayedZed(none);
}
/**
* @brief Changes the flame's length if the Firebug's Range skill is selected
*
* @param InstigatorPerk Instigator's current perk
*/
/*simulated function SetSprayLength()
{
local AnimSet TempAnimSet;
local KFPlayerReplicationInfo OwningPawnPRI;
if ( default.AltSprayAnimSet == None )
{
return; // only once length available
}
// Firebug range skill can affect the flame weapons range
OwningPawnPRI = KFPlayerReplicationInfo(OwningKFPawn.PlayerReplicationInfo);
if( OwningPawnPRI != none )
{
TempAnimSet = OwningPawnPRI.bExtraFireRange ? default.AltSprayAnimSet : default.SprayAnimSet;
}
// Don't set the anim set to nothing if the archetype is screwed up
// Don't set the anim set and tree if they do not need to be changed
if( TempAnimSet == none || TempAnimSet == SkeletalSprayMesh.AnimSets[0] )
{
return;
}
SkeletalSprayMesh.AnimSets[0] = TempAnimSet;
SkeletalSprayMesh.UpdateAnimations();
SetupFX();
}*/
DefaultProperties
{
Physics=PHYS_Interpolating
TickGroup=TG_PostAsyncWork
bStatic=false
bCollideActors=TRUE
bBlockActors=false
bWorldGeometry=false
// This must not be bCollideWorld or it will get pushed around in FarMoveActor
bCollideWorld=false
bProjTarget=false
bIgnoreEncroachers=FALSE
bNoEncroachCheck=TRUE
RemoteRole=ROLE_None
GravityScaleRange=(X=0.f,Y=-15.f)
GravityScaleInTime=0.5f
MomentumScale=0.15f
MyDamageType=class'KFDT_EMP'
// ---------------------------------------------
// Splash damage
SplashGlancingDotLimit=-0.9f
SplashRotInterpSpeed=8.f
SplashLocInterpSpeed=40.f
bDoCollideComplex=TRUE
SprayDamageScaleDistRange=(X=300,Y=300)
SprayDamage=(X=10,Y=10)
SplashDamageRadius=300.f
SplashDamage=10
SplashDamageFalloffExponent=1.f
// ---------------------------------------------
// Per-bone Fire FX
PerBoneSprayFXGlobalScale=1.f
bDoPerBoneSprayFX=TRUE
// ---------------------------------------------
// Material params
MaterialHeatRampTime=0.65f
MaterialHeatRange=(X=0.f,Y=0.8f)
MaterialFadeOutTime=0.2f
MaterialCurrentFadeVal=1.f
MatFadePow=2.f
// ---------------------------------------------
// Content
Begin Object Class=KFSkeletalMeshComponent Name=FlameCore0
CollideActors=true
BlockActors=false
BlockZeroExtent=true
BlockNonZeroExtent=true
bUpdateSkelWhenNotRendered=TRUE
bIgnoreControllersWhenNotRendered=FALSE
bOverrideAttachmentOwnerVisibility=TRUE
CastShadow=FALSE
bAcceptsStaticDecals=FALSE
bAcceptsDynamicDecals=FALSE
Rotation=(Roll=-16384)
SkeletalMesh=SkeletalMesh'FX_Flamethrower_MESH.WEP_Flamethrower_Flame_A'
AnimTreeTemplate=AnimTree'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_AT'
AnimSets(0)=AnimSet'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_Anim'
End Object
SkeletalSprayMesh=FlameCore0
CollisionComponent=FlameCore0
Components.Add(FlameCore0)
SkelMesh=SkeletalMesh'FX_Flamethrower_MESH.WEP_Flamethrower_Flame_A'
SprayAnimSet=AnimSet'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_Anim'
SprayAnimTreeTemplate=AnimTree'FX_Flamethrower_ANIM.WEP_Flamethrower_Flame_AT'
AltSprayAnimSet=AnimSet'FX_Flamethrower_ANIM.Wep_Caulk_Flame_Anim'
// bLeaveStickyFire=FALSE
// StickyFireMinTimeBetweenSpawns=0.25f
// StickyFireOwnerSafeRadius=64
// StickyFireInitialDelay=0.5f
// StickyFireTestLocInterpSpeed=5.f
// StickyFireTestLocThreshold=64.f
ImpactEffects=KFImpactEffectInfo'WEP_Flamethrower_ARCH.Flame_Impacts'
SprayEndEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_End_muzzleflash_01'
SprayStartEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_Start_muzzleflash'
SplashGlancingEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_flame_deflect_01'
Begin Object Class=KFParticleSystemComponent Name=SplashGlancingPSC0
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
SplashGlancingPSC=SplashGlancingPSC0
Components.Add(SplashGlancingPSC0)
SplashDirectEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_Flame_impact_01'
Begin Object Class=KFParticleSystemComponent Name=SplashDirectPSC0
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
SplashDirectPSC=SplashDirectPSC0
Components.Add(SplashDirectPSC0)
SplashPawnEffect=ParticleSystem'WEP_Flamethrower_EMIT.FX_Flame_impact_player_01'
Begin Object Class=KFParticleSystemComponent Name=SplashPawnPSC0
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
SplashPawnPSC=SplashPawnPSC0
Components.Add(SplashPawnPSC0)
Begin Object Class=KFParticleSystemComponent Name=SplashMaterialBasedPSC0
bAutoActivate=FALSE
Template=None // filled in by the code based on what was hit
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
SplashMaterialBasedPSC=SplashMaterialBasedPSC0
Components.Add(SplashMaterialBasedPSC0)
// per-bone fire fx
LastBoneChainIndexThatCanSpawnSplashEffects=11
// bone01
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone01_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
Rotation=(Yaw=32768)
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone01_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
Rotation=(Yaw=32768)
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone02
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone02_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
Rotation=(Yaw=32768)
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone02_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
Rotation=(Yaw=32768)
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone03
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone03_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
Rotation=(Yaw=32768)
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone03_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
Rotation=(Yaw=32768)
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone04
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone04_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone04_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone05
Begin Object Class=KFParticleSystemComponent Name=Bone05_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone05_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone06
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone06_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone06_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone07
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone07_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone07_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone08
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone08_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone08_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone09
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone09_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone09_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone10
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone10_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone10_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone11
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone11_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone11_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone12
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone12_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone12_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// bone13
// 3rd person
Begin Object Class=KFParticleSystemComponent Name=Bone13_PSC0
bOwnerNoSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
// first person
Begin Object Class=KFParticleSystemComponent Name=Bone13_PSC1
bOnlyOwnerSee=TRUE
bAutoActivate=FALSE
TranslucencySortPriority=1
SecondsBeforeInactive=0
End Object
BoneChain(0)={(BoneName=Bone01,
MaterialParam=0.0,
BoneScale=1.f,
EffectScale=1.0f,
ParticleSystemTemplate=none,
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_Initial_spawn_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone01_PSC0,
BonePSC1=Bone01_PSC1)}
BoneChain(1)={(BoneName=Bone02,
MaterialParam=0.04,
BoneScale=1.f,
EffectScale=1.0f,
ParticleSystemTemplate=none,
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_Initial_spawn_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone01_PSC0,
BonePSC1=Bone01_PSC1)}
BoneChain(2)={(BoneName=Bone03,
MaterialParam=0.080000,
BoneScale=1.f,
EffectScale=0.250000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_reverse_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_reverse_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone02_PSC0,
BonePSC1=Bone02_PSC1)}
BoneChain(3)={(BoneName=Bone04,
MaterialParam=0.130000,
BoneScale=1.f,
EffectScale=0.250000,
ParticleSystemTemplate=None,
ParticleSystemTemplate1P=None,
ParticleActivationDelay=0.0f,
BonePSC0=Bone03_PSC0,
BonePSC1=Bone03_PSC1)}
BoneChain(4)={(BoneName=Bone05,
MaterialParam=0.190000,
BoneScale=1.f,
EffectScale=0.500000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone04_PSC0,
BonePSC1=Bone04_PSC1)}
BoneChain(5)={(BoneName=Bone06,
MaterialParam=0.240000,
BoneScale=1.f,
EffectScale=0.500000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone05_PSC0,
BonePSC1=Bone05_PSC1)}
BoneChain(6)={(BoneName=Bone07,
MaterialParam=0.310000,
BoneScale=1.f,
EffectScale=1.800000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone06_PSC0,
BonePSC1=Bone06_PSC1)}
BoneChain(7)={(BoneName=Bone08,
MaterialParam=0.370000,
BoneScale=1.f,
EffectScale=0.500000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone07_PSC0,
BonePSC1=Bone07_PSC1)}
BoneChain(8)={(BoneName=Bone09,
MaterialParam=0.440000,
BoneScale=1.f,
EffectScale=1.000000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone08_PSC0,
BonePSC1=Bone08_PSC1)}
BoneChain(9)={(BoneName=Bone10,
MaterialParam=0.500000,
BoneScale=1.f,
EffectScale=1.000000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone09_PSC0,
BonePSC1=Bone09_PSC1)}
BoneChain(10)={(BoneName=Bone11,
MaterialParam=0.560000,
BoneScale=1.f,
EffectScale=1.000000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone10_PSC0,
BonePSC1=Bone10_PSC1)}
BoneChain(11)={(BoneName=Bone12,
MaterialParam=0.620000,
BoneScale=1.f,
EffectScale=1.000000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone11_PSC0,
BonePSC1=Bone11_PSC1)}
BoneChain(12)={(BoneName=Bone13,
MaterialParam=0.690000,
BoneScale=1.f,
EffectScale=1.000000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone12_PSC0,
BonePSC1=Bone12_PSC1)}
BoneChain(13)={(BoneName=Bone14,
MaterialParam=0.760000,
BoneScale=1.f,
EffectScale=1.000000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_End_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f,
BonePSC0=Bone13_PSC0,
BonePSC1=Bone13_PSC1)}
BoneChain(14)={(BoneName=Bone15,
MaterialParam=0.820000,
BoneScale=0.f,
EffectScale=1.000000,
ParticleSystemTemplate=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_End_01_3P',
ParticleSystemTemplate1P=ParticleSystem'WEP_Flamethrower_EMIT.Materials.FX_Flamethrower_BSpawns_01_1P',
ParticleActivationDelay=0.0f)}
BoneChainComponents={(Bone01_PSC0, Bone01_PSC0, Bone02_PSC0, Bone03_PSC0, Bone04_PSC0, Bone05_PSC0, Bone06_PSC0,
Bone07_PSC0, Bone08_PSC0, Bone09_PSC0, Bone10_PSC0, Bone11_PSC0, Bone12_PSC0, Bone13_PSC0)}
BoneChainComponents_1stP={(Bone01_PSC1, Bone01_PSC1, Bone02_PSC1, Bone03_PSC1, Bone04_PSC1, Bone05_PSC1, Bone06_PSC1,
Bone07_PSC1, Bone08_PSC1, Bone09_PSC1, Bone10_PSC1, Bone11_PSC1, Bone12_PSC1, Bone13_PSC1)}
// pointlight at far end of spray
Begin Object Class=PointLightComponent Name=FlamePointLight2
LightColor=(R=245,G=190,B=140,A=255)
Brightness=4.f
Radius=500.f
FalloffExponent=10.f
CastShadows=False
CastStaticShadows=FALSE
CastDynamicShadows=TRUE
bCastPerObjectShadows=false
bEnabled=FALSE
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
End Object
// Muzzle Flash point light
// want this light to illuminate characters only, so Marcus gets the glow
Begin Object Class=PointLightComponent Name=FlamePointLight0
LightColor=(R=250,G=150,B=85,A=255)
Brightness=6.0f
FalloffExponent=10.f
Radius=750.f
CastShadows=False
CastStaticShadows=FALSE
CastDynamicShadows=TRUE
bCastPerObjectShadows=false
bEnabled=FALSE
LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE)
End Object
SprayLights(0)=(Light=FlamePointLight0,BoneChainIndex=1,FlickerIntensity=5.f,FlickerInterpSpeed=15.f)
SprayLights(1)=(Light=FlamePointLight2,BoneChainIndex=9,FlickerIntensity=5.f,FlickerInterpSpeed=15.f)
// MaterialHeatRampTime=0.65f
// MaterialHeatRange=(X=0.f,Y=0.8f)
// MaterialFadeOutTime=0.2f
// MaterialCurrentFadeVal=1.f
// MatFadePow=2.f
// Begin Object Class=AudioComponent Name=SplashMaterialBasedAC0
// // cue will be filled in from physicalmaterial data
// SoundCue=None
// bStopWhenOwnerDestroyed=TRUE
// bUseOwnerLocation=FALSE
// End Object
// SplashMaterialBasedAC=SplashMaterialBasedAC0
// Splash audio
Begin Object Class=AkComponent name=CurrentSplashAkSoundComponent
bStopWhenOwnerDestroyed=true
bForceOcclusionUpdateInterval=true
OcclusionUpdateInterval=0.2;
End Object
CurrentSplashAKC=CurrentSplashAkSoundComponent
Components.Add(CurrentSplashAkSoundComponent)
SplashPawnAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Play_WEP_SA_Flamethrower_Impact_Flesh'
SplashDirectAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Play_WEP_SA_Flamethrower_Impact_Default'
SplashGlancingAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Play_WEP_SA_Flamethrower_Impact_Default'
SplashPawnStopAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Stop_WEP_SA_Flamethrower_Impact_Flesh_Loop'
SplashDirectStopAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Stop_WEP_SA_Flamethrower_Impact_Default_Loop'
SplashGlancingStopAKEvent=AkEvent'WW_WEP_SA_Flamethrower.Stop_WEP_SA_Flamethrower_Impact_Default_Loop'
Begin Object Class=KFParticleSystemComponent Name=StartFirePSC0
bAutoActivate=TRUE
TickGroup=TG_PostUpdateWork
End Object
SprayStartPSC=StartFirePSC0
SeedSprayVel=10000.f//5000.f
SeedDecel=28000.f//13000.f
SeedMaxAge=0.4f
SeedMinChainLength=0.f
SeedSimFreq=60.f
SeedWarmupTime=0.25f
VelocityScaleZ=0.3f//0.15f
bUseExtentTracing=true
SpraySocketName=MuzzleFlash
//ImpactProjectileClass=class'KFProj_GroundFire'
ImpactProjectileInterval=0.099
}

View File

@ -0,0 +1,496 @@
//=============================================================================
// KFWeapAttach_HRG_Vampire
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2020 Tripwire Interactive LLC
//=============================================================================
class KFWeapAttach_HRG_Vampire extends KFWeapAttach_SprayBase;
var transient ParticleSystemComponent ChargingPSC;
var transient ParticleSystemComponent ChargedPSC;
var ParticleSystem ChargingEffect;
var ParticleSystem ChargedEffect;
var ParticleSystem BloodStolenEffect;
var bool bIsCharging;
var bool bIsFullyCharged;
var bool bIsChargeEffectsActive;
var bool bIsBloodParticlesEffectActive;
var bool bIsDisabledSprayVisualAndMesh;
var repnotify float StartFireTime;
var int ChargeLevel;
var float FXScalingFactorByCharge;
var float ChargeRTPC;
var KFPawn_Monster oZedCurrentlyBeingSprayed;
var KFPawn_Monster oZedPreviouslyBeingSprayed;
var KFWeap_HRG_Vampire Weapon;
var KFEmit_DirectionalPath BloodStolenParticles[15];
var int NumBloodStolenParticlesForPool;
var transient float BloodStolenControlTime;
var float RateUpdateDestinationBloodParticles;
var transient float UpdateDestinationBloodParticlesTime;
var class<KFProj_BloodSplash> BloodSplashClass;
var bool bHasToStopDoingFireAnim;
var bool bHasToStopDoingFireAnimB;
/** Blood Particles */
var(BloodParticles) float SpeedBloodParticles;
var(BloodParticles) float SpawnRateBloodParticles;
var(BloodParticles) float SpeedBloodParticles_3P;
var(BloodParticles) float SpawnRateBloodParticles_3P;
var(BloodParticles) float HalfAngleSpawnCone;
var(BloodParticles) float CurveTurnRateUntilDestinationFinal;
var(BloodParticles) float CurveTurnRateUntilDestinationMidPoint;
var(BloodParticles) float LimitDistanceFinalPoint;
var(BloodParticles) float LimitDistanceMidPoint;
simulated function PostBeginPlay()
{
local int Index;
super.PostBeginPlay();
UpdateDestinationBloodParticlesTime = RateUpdateDestinationBloodParticles;
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
{
BloodStolenParticles[Index] = Spawn(class'KFEmit_DirectionalPath');
BloodStolenParticles[Index].DeactivateEmitter();
BloodStolenParticles[Index].SetTemplate(BloodStolenEffect, true);
}
}
simulated function StartFire()
{
StartFireTime = WorldInfo.TimeSeconds;
bIsCharging = false;
bIsFullyCharged = false;
bIsDisabledSprayVisualAndMesh = false;
if (ChargingPSC == none)
{
ChargingPSC = new(self) class'ParticleSystemComponent';
if (WeapMesh != none)
{
WeapMesh.AttachComponentToSocket(ChargingPSC, 'MuzzleFlash');
}
else
{
AttachComponent(ChargingPSC);
}
ChargingPSC.SetTemplate(ChargingEffect);
}
if (ChargedPSC == none)
{
ChargedPSC = new(self) class'ParticleSystemComponent';
if (WeapMesh != none)
{
WeapMesh.AttachComponentToSocket(ChargedPSC, 'MuzzleFlash');
}
else
{
AttachComponent(ChargedPSC);
}
ChargedPSC.SetTemplate(ChargedEffect);
}
ChargingPSC.SetActive( false );
ChargedPSC.SetActive( false );
}
simulated event Tick(float DeltaTime)
{
local int Index;
local vector MuzzleFlashSocketLocation, BloodParticlesMidPointSocketLocation;
local KFEmit_DirectionalPath EmitterToRemove;
local vector VectorParameterParticle;
local vector ChargePercentageVector;
local Rotator DestinationRotation, BloodParticlesMidPointSocketRotation;
local vector BloodSplashVelocity;
if(bIsChargeEffectsActive)
{
if(bIsCharging)
{
ChargingPSC.SetActive( true, true );
ChargePercentageVector.X = ChargeRTPC;
ChargePercentageVector.Y = ChargeRTPC;
ChargePercentageVector.Z = ChargeRTPC;
ChargingPSC.SetVectorParameter( name("BlobCharge"), ChargePercentageVector);
}
if(bIsFullyCharged)
{
ChargedPSC.SetActive( true, true );
ChargingPSC.SetFloatParameter( name("InflateBlob"), ChargeRTPC);
}
}
if (bIsDisabledSprayVisualAndMesh)
{
TurnOffFireSpray();
ActiveFlameSpray.CleanupEndFire();
}
//Spawning blood particles if conditions met
if (bIsBloodParticlesEffectActive)
{
if(oZedCurrentlyBeingSprayed != none && oZedCurrentlyBeingSprayed.IsAliveAndWell())
{
CreateBloodParticle(DeltaTime, oZedCurrentlyBeingSprayed);
}
}
// Updating blood stolen particles FX destination position
UpdateDestinationBloodParticlesTime -= DeltaTime;
if (UpdateDestinationBloodParticlesTime <= 0)
{
UpdateDestinationBloodParticlesTime = RateUpdateDestinationBloodParticles;
if( WeapMesh != none )
{
GetFlameSocketLocAndRot(MuzzleFlashSocketLocation, DestinationRotation);
WeapMesh.GetSocketWorldLocationAndRotation('BloodParticlesMidPoint', BloodParticlesMidPointSocketLocation, BloodParticlesMidPointSocketRotation);
}
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
{
if(!BloodStolenParticles[Index].IsEnabled || BloodStolenParticles[Index] == None)
{
continue;
}
if( BloodStolenParticles[Index].bReachDestinationFinal )
{
EmitterToRemove = BloodStolenParticles[Index];
//BloodStolenParticles.Remove(Index, 1);
EmitterToRemove.DeactivateEmitter();
}
else
{
if (BloodStolenParticles[Index].ParticleSystemComponent != None)
{
VectorParameterParticle.X = WorldInfo.TimeDilation;
VectorParameterParticle.Y = WorldInfo.TimeDilation;
VectorParameterParticle.Z = WorldInfo.TimeDilation;
BloodStolenParticles[Index].ParticleSystemComponent.SetVectorParameter( name("ZedtimeScale"), VectorParameterParticle );
}
BloodStolenParticles[Index].UpdateDestination( MuzzleFlashSocketLocation, BloodParticlesMidPointSocketLocation );
if (FRand() > 0.47)
{
BloodSplashVelocity.x = 0;
BloodSplashVelocity.y = RandRange(-100, 100);
BloodSplashVelocity.z = -200;
SpawnBloodSplash(BloodSplashClass, BloodStolenParticles[Index].Location, BloodSplashVelocity);
}
}
}
}
Super.Tick(DeltaTime);
}
simulated function FirstPersonFireEffects(Weapon W, vector HitLocation)
{
super.FirstPersonFireEffects(W, HitLocation);
}
simulated function bool ThirdPersonFireEffects(vector HitLocation, KFPawn P, byte ThirdPersonAnimRateByte )
{
local EAnimSlotStance AnimType;
local bool bResult;
bIsChargeEffectsActive = true;
bIsBloodParticlesEffectActive = true;
//bResult = Super(KFWeaponAttachment).ThirdPersonFireEffects(HitLocation,P,ThirdPersonAnimRateByte);
SpawnTracer(GetMuzzleLocation(), HitLocation);
// Effects below this point are culled based on visibility and distance
if ( !ActorEffectIsRelevant(P, false, MaxFireEffectDistance) )
{
return false;
}
DecodeThirdPersonAnimRate( ThirdPersonAnimRateByte );
// Weapon shoot anims
if( !bWeapMeshIsPawnMesh && bHasToStopDoingFireAnim == false )
{
PlayWeaponFireAnim();
bHasToStopDoingFireAnim = true;
}
if( P.IsDoingSpecialMove() && P.SpecialMoves[P.SpecialMove].bAllowFireAnims )
{
AnimType = EAS_Additive;
}
else
{
AnimType = EAS_FullBody;
}
// Character shoot anims
if ( !P.IsDoingSpecialMove() || AnimType == EAS_Additive )
{
if(!bHasToStopDoingFireAnimB)
{
bHasToStopDoingFireAnimB = true;
PlayPawnFireAnim( P, AnimType );
}
// interrupt other weapon action anims (e.g. Reload)
if( !P.IsDoingSpecialMove() )
{
P.StopBodyAnim(P.bIsCrouched ? EAS_CH_UpperBody : EAS_UpperBody, 0.1f);
}
if ( OnWeaponStateChanged != None )
{
OnWeaponStateChanged(true);
}
}
CauseMuzzleFlash(P.FiringMode);
// Wider effect distances for fire spray. Called on Instigator to go beyond the weapon mesh cull distance
if ( P.FiringMode != 1 && P.ActorEffectIsRelevant(P, false, 15000, 2000) && !bIsDisabledSprayVisualAndMesh )
{
TurnOnFireSpray();
bResult = true;
}
return bResult;
}
simulated function StopThirdPersonFireEffects(optional bool bForce)
{
Super.StopThirdPersonFireEffects(bForce);
bIsChargeEffectsActive = false;
bIsBloodParticlesEffectActive = false;
RemoveAllBloodParticles();
bIsDisabledSprayVisualAndMesh = false;
if (ChargingPSC != none)
{
ChargingPSC.SetActive(false);
}
if (ChargedPSC != none)
{
ChargedPSC.SetActive(false);
}
bHasToStopDoingFireAnim = false;
bHasToStopDoingFireAnimB = false;
}
simulated function CauseMuzzleFlash(byte FiringMode)
{
if (MuzzleFlash == None && MuzzleFlashTemplate != None)
{
AttachMuzzleFlash();
}
Super.CauseMuzzleFlash(FiringMode);
}
simulated protected function TurnOnPilot()
{
Super.TurnOnPilot();
if( FlamePool[0] != None && KFSprayActor_HRG_Vampire(FlamePool[0]) != None && KFSprayActor_HRG_Vampire(FlamePool[0]).OwnerWeapon == None)
{
KFSprayActor_HRG_Vampire(FlamePool[0]).OwnerWeapon = KFWeap_HRG_Vampire(KFPawn_Human(Instigator).MyKFWeapon);
}
if( FlamePool[1] != None && KFSprayActor_HRG_Vampire(FlamePool[1]) != None && KFSprayActor_HRG_Vampire(FlamePool[1]).OwnerWeapon == None)
{
KFSprayActor_HRG_Vampire(FlamePool[1]).OwnerWeapon = KFWeap_HRG_Vampire(KFPawn_Human(Instigator).MyKFWeapon);
}
}
simulated function CreateBloodParticle(float DeltaTime, KFPawn_Monster Monster)
{
Local KFEmit_DirectionalPath Emitter;
local vector DestinationLocation, MonsterLocation, BloodParticlesMidPointSocketLocation;
local Rotator DestinationRotation, BloodParticlesMidPointSocketRotation;
local vector BloodSplashVelocity;
local int Index;
if( BloodStolenControlTime > 0 )
{
BloodStolenControlTime -= DeltaTime;
return;
}
Emitter = none;
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
{
if(BloodStolenParticles[Index].IsEnabled == false)
{
//`log("I gave the emitter");
Emitter = BloodStolenParticles[Index];
break;
}
}
if(Emitter == none)
{
//`log("NO EMITTER");
return;
}
if( WeapMesh != none && WeapMesh.SkeletalMesh != none)
{
GetFlameSocketLocAndRot(DestinationLocation, DestinationRotation);
WeapMesh.GetSocketWorldLocationAndRotation('BloodParticlesMidPoint', BloodParticlesMidPointSocketLocation, BloodParticlesMidPointSocketRotation);
}
BloodStolenControlTime += SpawnRateBloodParticles_3P;
MonsterLocation = ActiveFlameSpray.GetLastContactPositionMeshHit();
if (IsZero(MonsterLocation))
{
Monster.Mesh.GetBoneLocation('Spine1');
}
if(MonsterLocation == vect(0,0,0))
{
MonsterLocation = Monster.Location + vect(0,0,20);
}
if (FRand() > 0.4)
{
BloodSplashVelocity = BloodParticlesMidPointSocketLocation - MonsterLocation;
BloodSplashVelocity = VRandCone(vect(0,0,-1), PI / 5) * 100;
SpawnBloodSplash(BloodSplashClass, MonsterLocation, BloodSplashVelocity);
}
//Emitter = Spawn(class'KFEmit_DirectionalPath',,, MonsterLocation);
Emitter.ParticleSpeed = SpeedBloodParticles_3P;
Emitter.RateTickCheckHasReached = 0.2;
//BloodStolenParticles.AddItem(Emitter);
Emitter.SetLocation(MonsterLocation);
Emitter.SetDestination(DestinationLocation, BloodParticlesMidPointSocketLocation, 20, 20, 50, 50, 0);
Emitter.ActivateEmitter();
//Emitter.isEnabled = true;
}
simulated function SetChargePercentage(float ChargePercentage)
{
ChargeRTPC = ChargePercentage;
bIsCharging = false;
bIsFullyCharged = false;
if (ChargeRTPC >= 0.0)
{
bIsCharging = true;
}
if (ChargeRTPC >= 1.0)
{
bIsFullyCharged = true;
}
}
simulated function SetZedCurrentlyBeingSprayed(KFPawn_Monster ZedCurrentlyBeingSprayed)
{
oZedPreviouslyBeingSprayed = oZedCurrentlyBeingSprayed;
oZedCurrentlyBeingSprayed = ZedCurrentlyBeingSprayed;
}
simulated function DisableSprayVisualAndMesh()
{
bIsDisabledSprayVisualAndMesh = true;
}
function SpawnBloodSplash( class<KFProj_BloodSplash> SpawnClass, vector SpawnLoc, vector SpawnVel )
{
local TraceHitInfo HitInfo;
local vector HitLocation, HitRotation;
local KFGoreManager GoreManager;
// Grab the gore manager
GoreManager = KFGoreManager(WorldInfo.MyGoreEffectManager);
if (GoreManager == none || oZedCurrentlyBeingSprayed == none)
{
return;
}
//EffectStartTrace = Location + vect(0,0,1) * 4.f;
//EffectEndTrace = EffectStartTrace - vect(0,0,1) * 32.f;
// Find where to put the decal
Trace(HitLocation, HitRotation, SpawnLoc + SpawnVel * 32.f, SpawnLoc, false,, HitInfo, TRACEFLAG_Bullet);
//DrawDebugLine(SpawnLoc,SpawnLoc + SpawnVel * 32.f,0,255,0,TRUE);
// If the locations are zero (probably because this exploded in the air) set defaults
if( IsZero(HitLocation) )
{
HitLocation = Location;
}
if( IsZero(HitRotation) )
{
HitRotation = vect(0,0,1);
}
//Put the decals
GoreManager.LeaveABloodSplatterDecal(oZedCurrentlyBeingSprayed, HitLocation, HitRotation);
//GoreManager. LeaveAPersistentBloodSplat(HitLocation, HitNormal, 1.0);
if (oZedCurrentlyBeingSprayed != none)
{
GoreManager.CausePersistentBlood(oZedCurrentlyBeingSprayed, class'KFDamageType', HitLocation, vect(0,0,-1), 0, false, false);
}
}
simulated function RemoveAllBloodParticles()
{
local int Index;
local KFEmit_DirectionalPath EmitterToRemove;
for( Index = (NumBloodStolenParticlesForPool - 1) ; Index >= 0 ; Index-- )
{
EmitterToRemove = BloodStolenParticles[Index];
//BloodStolenParticles.Remove(Index, 1);
EmitterToRemove.DeactivateEmitter();
}
}
defaultproperties
{
ChargeRTPC=0
bIsChargeEffectsActive=false
bIsBloodParticlesEffectActive=false
bIsDisabledSprayVisualAndMesh=false
MuzzleFlashTemplate=KFMuzzleFlash'WEP_HRG_Vampire_Arch.Wep_HRG_Vampire_MuzzleFlash_3P'
ChargingEffect=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_BlobCharge_3P_01'
ChargedEffect=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_FullCharge'
BloodStolenEffect=ParticleSystem'WEP_HRG_Vampire_EMIT.FX_HRG_Vampire_BloodStolen_3P'
BloodSplashClass=KFProj_BloodSplash
RateUpdateDestinationBloodParticles = 0.7
NumBloodStolenParticlesForPool = 15;
}

View File

@ -599,6 +599,7 @@ defaultproperties
HippedRecoilModifier=1.5
SecondaryAmmoTexture=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Grenade'
bUseGrenadeAsSecondaryAmmo=true
// Inventory / Grouping
InventorySize=6

View File

@ -565,6 +565,7 @@ defaultproperties
HippedRecoilModifier=1.5
SecondaryAmmoTexture=Texture2D'ui_firemodes_tex.UI_FireModeSelect_Grenade'
bUseGrenadeAsSecondaryAmmo=true
// Inventory / Grouping
InventorySize=8

View File

@ -44,10 +44,10 @@ defaultproperties
End Object
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Slashing_FireAxe'
InstantHitDamage(DEFAULT_FIREMODE)=80 //90
InstantHitDamage(DEFAULT_FIREMODE)=90 //80
InstantHitDamageTypes(HEAVY_ATK_FIREMODE)=class'KFDT_Slashing_FireAxeHeavy'
InstantHitDamage(HEAVY_ATK_FIREMODE)=125 //135
InstantHitDamage(HEAVY_ATK_FIREMODE)=135 //125 //135
InstantHitDamageTypes(BASH_FIREMODE)=class'KFDT_Bludgeon_FireAxeBash'
InstantHitDamage(BASH_FIREMODE)=20

View File

@ -26,9 +26,8 @@ class KFWeap_HRG_EMP_ArcGenerator extends KFWeap_FlameBase;
Replication
{
if(role == role_authority && bNetDirty)
oZedCurrentlyBeingSprayed;
oZedCurrentlyBeingSprayed, MaxNumberOfZedsZapped, MaxDistanceToBeZapped, ZapInterval, ChainDamage;
}
/** Shoot animation to play when shooting secondary fire */
var(Animations) const editconst name FireHeavyAnim;
@ -319,7 +318,6 @@ simulated function int SpawnBeam(Actor _OriginActor, Actor _DestinationActor)
simulated function MarkBeamToDeactivate(BeamAttachedToActor _BeamData)
{
`log(_BeamData.oAttachedZed);
vAuxDeletionArray.AddItem(_BeamData);
}

View File

@ -39,8 +39,8 @@ defaultproperties
GroupPriority=75
// Recoil
maxRecoilPitch=750
minRecoilPitch=675
maxRecoilPitch=525 //750
minRecoilPitch=472 //675
maxRecoilYaw=300
minRecoilYaw=-300
RecoilRate=0.1
@ -63,7 +63,7 @@ defaultproperties
InstantHitDamageTypes(DEFAULT_FIREMODE)=class'KFDT_Ballistic_HRGBuckshot'
PenetrationPower(DEFAULT_FIREMODE)=2.0
NumPellets(DEFAULT_FIREMODE) = 5
Spread(DEFAULT_FIREMODE)=0.15
Spread(DEFAULT_FIREMODE)=0.12 //0.15
// ALTFIRE_FIREMODE
InstantHitDamageTypes(ALTFIRE_FIREMODE) = class'KFDT_Ballistic_HRGBuckshot'

Some files were not shown because too many files have changed in this diff Show More