1
0
KF2-Dev-Scripts/KFGame/Classes/KFDT_Freeze.uc
2020-12-13 18:01:13 +03:00

141 lines
4.0 KiB
Ucode

//=============================================================================
// KFDT_Freeze
//=============================================================================
// Damage caused by cold or ice weapons
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================
class KFDT_Freeze extends KFDamageType
abstract;
`include(KFGameDialog.uci)
var protected ParticleSystem FrozenShatterTemplate;
var protected AkBaseSoundObject ShatterSound;
/** Returns ID of dialog event for killer to speak after killing a zed using this damage type */
static function int GetKillerDialogID()
{
return `KILL_Freeze;
}
/** Returns ID of dialog event for damager to speak after damaging a zed using this damage type */
static function int GetDamagerDialogID()
{
return `DAMZ_Freeze;
}
static function PlayShatter(KFPawn P, optional bool bSkipParticles, optional bool bMaterialOnly, optional vector RBLinearVelocity)
{
local KFPawn_Monster Zed;
local KFGoreManager GoreManager;
local float IceScalar;
local int MICIndex, i;
IceScalar = 1.f;
if ( !bMaterialOnly )
{
// Switch to gore mesh first so we can apply our gore material param
Zed = KFPawn_Monster(P);
if ( Zed != None && !Zed.bUseDamageInflation )
{
Zed.RepBleedInflateMatParam = 0;
GoreManager = KFGoreManager( P.WorldInfo.MyGoreEffectManager );
if( GoreManager != none && GoreManager.AllowMutilation() )
{
//Reinit phys asset here in the event scale changed. Reinit after constraints break resets constraints
if (Zed.bReinitPhysAssetOnDeath && Zed.CharacterArch != none && Zed.CharacterArch.PhysAsset != none)
{
Zed.bReinitPhysAssetOnDeath = false;
Zed.Mesh.SetPhysicsAsset(Zed.CharacterArch.PhysAsset, , true);
}
if ( !Zed.bIsGoreMesh )
{
Zed.SwitchToGoreMesh();
}
Zed.ForceBreakAllConstraints();
}
else
{
// If we're ragdolling instead of shattering, make the zed look less solid
IceScalar = 0.4f;
}
// Because we're going outside of the standard gore path, allow for some extra some whole body impulse here
if ( !IsZero(RBLinearVelocity) )
{
P.Mesh.SetRBLinearVelocity(RBLinearVelocity, TRUE);
}
}
if ( !bSkipParticles )
{
P.WorldInfo.MyEmitterPool.SpawnEmitter( default.FrozenShatterTemplate, P.Location, rotator(vect(0,0,1)) );
P.PlaySoundBase(default.ShatterSound, true,,, P.Location);
}
}
// Force instant freeze on gore MIC
MICIndex = 0;
if (P.GetCharacterInfo() != none)
{
MICIndex = P.GetCharacterInfo().GoreFXMICIdx;
}
if (P.CharacterMICs.Length > MICIndex)
{
P.CharacterMICs[MICIndex].SetScalarParameterValue('Scalar_Ice', IceScalar);
}
for (i = 0; i < `MAX_COSMETIC_ATTACHMENTS; ++i)
{
if (P.ThirdPersonAttachments[i] != none)
{
ApplyFreeze(P.ThirdPersonAttachments[i], IceScalar);
}
}
if (KFPawn_Monster(P) != none)
{
for (i = 0; i < KFPawn_Monster(P).StaticAttachList.length; i++)
{
if (KFPawn_Monster(P).StaticAttachList[i] != none)
{
ApplyFreeze(KFPawn_Monster(P).StaticAttachList[i], IceScalar);
}
}
}
}
static function ApplyFreeze(MeshComponent MeshToFreeze, float IceScalar)
{
local int i;
local MaterialInstanceConstant MIC;
if (MeshToFreeze == none)
{
return;
}
for (i = 0; i < MeshToFreeze.Materials.Length; i++)
{
MIC = MaterialInstanceConstant(MeshToFreeze.GetMaterial(i));
if (MIC != none)
{
MIC.SetScalarParameterValue('Scalar_Ice', IceScalar);
}
}
}
defaultproperties
{
EffectGroup=FXG_Freeze
FreezePower=2.5f
FrozenShatterTemplate=ParticleSystem'WEP_Freeze_Grenade_EMIT.FX_Freeze_Grenade_Death'
ShatterSound=AkEvent'WW_WEP_Freeze_Grenade.Play_Freeze_Grenade_Shatter'
}