317 lines
13 KiB
Ucode
317 lines
13 KiB
Ucode
|
//=============================================================================
|
||
|
// KFPawn_ZedHusk_Versus
|
||
|
//=============================================================================
|
||
|
// Husk Versus pawn
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2015 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
class KFPawn_ZedHusk_Versus extends KFPawn_ZedHusk;
|
||
|
|
||
|
/** Speed at which a fireball travels */
|
||
|
var protected const float FireballSpeed;
|
||
|
|
||
|
/** Minimum/maximum strength (damage and radius multiplier) a fireball can have */
|
||
|
var protected const vector2D FireballStrengthRange;
|
||
|
|
||
|
/** How much strength to apply to a fireball per 1 second of holding the attack button down */
|
||
|
var protected const float FireballStrengthPerSecond;
|
||
|
|
||
|
/** How much to multiply FireballStrength by when applying the radius boost */
|
||
|
var protected const float FireballStrengthRadiusMultiplier;
|
||
|
|
||
|
/** Current strength of the fireball */
|
||
|
var protected float FireballStrength;
|
||
|
|
||
|
/** Turns flamethrower on (FX, damage) */
|
||
|
simulated function ANIMNOTIFY_FlameThrowerOn()
|
||
|
{
|
||
|
if( IsDoingSpecialMove(SM_PlayerZedMove_RMB) )
|
||
|
{
|
||
|
KFSM_Husk_FlameThrowerAttack(SpecialMoves[SpecialMove]).TurnOnFlamethrower();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** AnimNotify which launches the fireball projectile */
|
||
|
simulated function ANIMNOTIFY_HuskFireballAttack()
|
||
|
{
|
||
|
local float FireballStartTime;
|
||
|
|
||
|
if( WorldInfo.NetMode != NM_Client )
|
||
|
{
|
||
|
// Determine how strong the fireball attack will be
|
||
|
if( IsDoingSpecialMove(SM_PlayerZedMove_LMB) )
|
||
|
{
|
||
|
FireballStartTime = KFSM_PlayerHusk_FireBallAttack( SpecialMoves[SpecialMove] ).HoldStartTime;
|
||
|
FireballStrength = fClamp( (WorldInfo.TimeSeconds - FireballStartTime) * FireballStrengthPerSecond, FireballStrengthRange.X, FireballStrengthRange.Y );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
FireballStrength = 1.f;
|
||
|
}
|
||
|
|
||
|
ShootFireball();
|
||
|
}
|
||
|
|
||
|
SetFireLightEnabled( false );
|
||
|
}
|
||
|
|
||
|
/** Shoots a fireball at the crosshair */
|
||
|
function ShootFireball()
|
||
|
{
|
||
|
local PlayerController PC;
|
||
|
local KFProjectile MyFireball;
|
||
|
local KFProj_Husk_Fireball_Versus HuskFireball;
|
||
|
local Actor HitActor;
|
||
|
local vector SocketLocation;
|
||
|
local rotator ShootRotation;
|
||
|
local vector HitLocation, HitNormal;
|
||
|
local vector Dir, TraceStart, TraceEnd;
|
||
|
|
||
|
if( Role == ROLE_Authority && Health > 0.f && IsDoingSpecialMove(SM_PlayerZedMove_LMB) && IsHumanControlled() )
|
||
|
{
|
||
|
PC = PlayerController( Controller );
|
||
|
if( PC == none )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Mesh.GetSocketWorldLocationAndRotation( 'FireballSocket', SocketLocation );
|
||
|
|
||
|
Dir = vector( Rotation );
|
||
|
TraceStart = PC.PlayerCamera.CameraCache.POV.Location;
|
||
|
TraceEnd = PC.PlayerCamera.CameraCache.POV.Location + ( vector(PC.PlayerCamera.CameraCache.POV.Rotation)*10000.f );
|
||
|
|
||
|
// Shoot the fireball
|
||
|
MyFireball = Spawn( FireballClass, self,, SocketLocation, Rotation );
|
||
|
if( MyFireball == none )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
MyFireball.Instigator = Self;
|
||
|
MyFireball.InstigatorController = Controller;
|
||
|
MyFireball.Speed = FireballSpeed;
|
||
|
MyFireball.MaxSpeed = FireballSpeed;
|
||
|
MyFireball.ExplosionTemplate.Damage = GetRallyBoostDamage( MyFireball.default.ExplosionTemplate.Damage ) * FireballStrength;
|
||
|
MyFireball.ExplosionTemplate.DamageRadius = MyFireball.default.ExplosionTemplate.DamageRadius * (FireballStrength * FireballStrengthRadiusMultiplier);
|
||
|
|
||
|
// Make sure our own pawn can never get in the way, and make sure we're targeting things in front of us
|
||
|
foreach TraceActors( class'Actor', HitActor, HitLocation, HitNormal, TraceEnd, TraceStart,,, TRACEFLAG_Bullet )
|
||
|
{
|
||
|
if( HitActor == self || !HitActor.StopsProjectile(MyFireball) )
|
||
|
{
|
||
|
HitActor = none;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if( Normal(HitActor.Location - SocketLocation) dot Dir < 0.f )
|
||
|
{
|
||
|
HitActor = none;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// Stop at the first hit in front of us
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Set our desired rotation, from the socket to the hit location
|
||
|
if( HitActor != none )
|
||
|
{
|
||
|
ShootRotation = Rotator( HitLocation - SocketLocation );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Otherwise use the end of the trace
|
||
|
ShootRotation = Rotator( TraceEnd - SocketLocation );
|
||
|
}
|
||
|
MyFireball.SetRotation( ShootRotation );
|
||
|
|
||
|
// Apply fireball size if our projectile is a husk fireball
|
||
|
HuskFireball = KFProj_Husk_Fireball_Versus( MyFireball );
|
||
|
if( HuskFireball != none )
|
||
|
{
|
||
|
HuskFireball.SetDrawScale( fMax(FireballStrength, 1.f) );
|
||
|
}
|
||
|
|
||
|
MyFireball.Init( vector(ShootRotation) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Called by KFSM_Husk_Suicide move after exploding */
|
||
|
simulated function OnExploded( Controller SuicideController )
|
||
|
{
|
||
|
local KFPlayerController KFPC;
|
||
|
|
||
|
// Swap to suicide cam
|
||
|
if( SuicideController != none )
|
||
|
{
|
||
|
KFPC = KFPlayerController( SuicideController );
|
||
|
if( KFPC != none )
|
||
|
{
|
||
|
KFPC.SetCameraMode( 'ZedSuicide' );
|
||
|
KFPlayerCamera_Versus(KFPC.PlayerCamera).SwapToZedSuicideCam( Location );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
simulated function ESpecialMove GetSuicideSM()
|
||
|
{
|
||
|
return SM_PlayerZedMove_G;
|
||
|
}
|
||
|
|
||
|
/** Returns TRUE if we're aiming with the husk cannon */
|
||
|
simulated function bool UseAdjustedControllerSensitivity()
|
||
|
{
|
||
|
return IsDoingSpecialMove( SM_PlayerZedMove_LMB );
|
||
|
}
|
||
|
|
||
|
|
||
|
/** Accessors */
|
||
|
simulated function vector2D GetFireballStrengthRange()
|
||
|
{
|
||
|
return FireballStrengthRange;
|
||
|
}
|
||
|
simulated function float GetFireballStrengthPerSecond()
|
||
|
{
|
||
|
return FireballStrengthPerSecond;
|
||
|
}
|
||
|
|
||
|
DefaultProperties
|
||
|
{
|
||
|
bVersusZed=true
|
||
|
TeammateCollisionRadiusPercent=0.30
|
||
|
|
||
|
Health=600 // KF1=600 //450
|
||
|
DoshValue=20.0 // default because they have the same health as survival
|
||
|
XPValues(0)=30 // 2x default because they are harder to hit/kill
|
||
|
|
||
|
// Faster sprint
|
||
|
SprintSpeed=550.f //500
|
||
|
SprintStrafeSpeed=425.f //250
|
||
|
GroundSpeed=250.0f //170
|
||
|
|
||
|
Begin Object Name=SpecialMoveHandler_0
|
||
|
SpecialMoveClasses(SM_PlayerZedMove_LMB)=class'KFSM_PlayerHusk_FireBallAttack'
|
||
|
SpecialMoveClasses(SM_PlayerZedMove_RMB)=class'KFSM_PlayerHusk_FlameThrowerAttack'
|
||
|
SpecialMoveClasses(SM_PlayerZedMove_V)=class'KFSM_PlayerHusk_Melee'
|
||
|
SpecialMoveClasses(SM_PlayerZedMove_G)=class'KFSM_PlayerHusk_Suicide'
|
||
|
End Object
|
||
|
|
||
|
MoveListGamepadScheme(ZGM_Melee_Square)=SM_PlayerZedMove_V
|
||
|
MoveListGamepadScheme(ZGM_Explosive_Ll)=SM_PlayerZedMove_G
|
||
|
MoveListGamepadScheme(ZGM_Attack_L2)=SM_PlayerZedMove_RMB
|
||
|
MoveListGamepadScheme(ZGM_Attack_R2)=SM_PlayerZedMove_LMB
|
||
|
|
||
|
SpecialMoveCooldowns(0)=(SMHandle=SM_PlayerZedMove_LMB, CooldownTime=0.95f, SpecialMoveIcon=Texture2D'ZED_Husk_UI.ZED-VS_Icons_Husk-Fireball', NameLocalizationKey="Shoot")
|
||
|
SpecialMoveCooldowns(1)=(SMHandle=SM_PlayerZedMove_RMB, CooldownTime=2.0f, SpecialMoveIcon=Texture2D'ZED_Husk_UI.ZED-VS_Icons_Husk-Flamethrower', NameLocalizationKey="Flame")
|
||
|
SpecialMoveCooldowns(2)=(SMHandle=SM_Taunt, CooldownTime=1.0f, bShowOnHud=false,bShowOnHud=false))
|
||
|
SpecialMoveCooldowns(3)=(SMHandle=SM_PlayerZedMove_V, CooldownTime=0.1f, SpecialMoveIcon=Texture2D'ZED_clot_UI.ZED-VS_Icons_AlphaClot-Melee', NameLocalizationKey="Melee")
|
||
|
SpecialMoveCooldowns(6)=(SMHandle=SM_PlayerZedMove_G, CooldownTime=2.5f, SpecialMoveIcon=Texture2D'ZED_Husk_UI.ZED-VS_Icons_Husk-Explode', NameLocalizationKey="Suicide")
|
||
|
SpecialMoveCooldowns.Add((SMHandle=SM_Jump, CooldownTime=1.f, SpecialMoveIcon=Texture2D'ZED_Husk_UI.ZED-VS_Icons_Husk-Jump', bShowOnHud=false)) // Jump always at end of array)) // Jump always at end of array
|
||
|
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Submachinegun', DamageScale=(0.8))) //3.0
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_AssaultRifle', DamageScale=(0.7))) //1.0 //0.5
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Shotgun', DamageScale=(0.5))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Handgun', DamageScale=(0.6))) //1.01 0.4
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Rifle', DamageScale=(0.65))) //0.76 0.5
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Slashing', DamageScale=(0.8))) //0.5
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Bludgeon', DamageScale=(0.8))) //0.5
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire', DamageScale=(0.5))) //0.8 //0.1
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Microwave', DamageScale=(1.0))) //0.25
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Explosive', DamageScale=(0.5))) //0.85 0.35
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Piercing', DamageScale=(0.4))) //1.0
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Toxic', DamageScale=(0.30))) //0.88
|
||
|
|
||
|
|
||
|
// special case
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_AR15', DamageScale=(1.0))
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_MB500', DamageScale=(1.1))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Rem1858', DamageScale=(0.85))) //0.9 0.75
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Colt1911', DamageScale=(0.75))) //0.9 0.65
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_9mm', DamageScale=(1.6))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Pistol_Medic', DamageScale=(1.5))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_Winchester', DamageScale=(0.75))) //0.9 0.7
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Fire_CaulkBurn', DamageScale=(0.7))) //0.9 //0.2
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_ExplosiveSubmunition_HX25', DamageScale=(0.6))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Slashing_EvisceratorProj', DamageScale=(0.4))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Slashing_Eviscerator', DamageScale=(0.3))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Ballistic_DragonsBreath', DamageScale=(1.1))) //0.9
|
||
|
DamageTypeModifiers.Add((DamageType=class'KFDT_Bludgeon_Crovel', DamageScale=(1.2))) //0.8
|
||
|
|
||
|
|
||
|
|
||
|
IncapSettings(AF_Stun)= (Vulnerability=(0.5, 0.5, 0.1, 0.1, 0.1), Cooldown=3.0, Duration=2.0)
|
||
|
IncapSettings(AF_Knockdown)=(Vulnerability=(0.3), Cooldown=10.0) //3.0
|
||
|
IncapSettings(AF_Stumble)= (Vulnerability=(0.2), Cooldown=3.0)
|
||
|
IncapSettings(AF_GunHit)= (Vulnerability=(1.0), Cooldown=0.75)
|
||
|
IncapSettings(AF_MeleeHit)= (Vulnerability=(1.0), Cooldown=0.5)
|
||
|
IncapSettings(AF_Poison)= (Vulnerability=(1), Cooldown=5.0, Duration=2.0)
|
||
|
IncapSettings(AF_Microwave)=(Vulnerability=(1.0), Cooldown=5.0, Duration=2.0)
|
||
|
IncapSettings(AF_FirePanic)=(Vulnerability=(0.1), Cooldown=8.0, Duration=3)
|
||
|
IncapSettings(AF_EMP)= (Vulnerability=(2.5), Cooldown=5.0, Duration=3.0) //1.0
|
||
|
IncapSettings(AF_Freeze)= (Vulnerability=(0.6), Cooldown=1.5, Duration=2.0) //1.0
|
||
|
IncapSettings(AF_Snare)= (Vulnerability=(0.7, 0.7, 1.0, 0.7), Cooldown=8.5, Duration=1.5)
|
||
|
IncapSettings(AF_Bleed)= (Vulnerability=(1.0))
|
||
|
|
||
|
HitZones[HZI_HEAD]=(ZoneName=head, BoneName=Head, Limb=BP_Head, GoreHealth=200, DmgScale=1.001, SkinID=1) // KF1=200 //154
|
||
|
HitZones[3] =(ZoneName=heart, BoneName=Spine2, Limb=BP_Special, GoreHealth=75, DmgScale=1.1, SkinID=2) //0.5 //1.5
|
||
|
HitZones[8] =(ZoneName=rforearm, BoneName=RightForearm, Limb=BP_RightArm, GoreHealth=20, DmgScale=0.5, SkinID=3)
|
||
|
|
||
|
// Fireball/flamethrower
|
||
|
bNeedsCrosshair=true
|
||
|
FireballSpeed=4200.f //3600
|
||
|
FireballStrengthRange=(X=0.5f, Y=1.3f)
|
||
|
FireballStrengthPerSecond=0.4f
|
||
|
FireballStrengthRadiusMultiplier=0.7f
|
||
|
PlayerFireOffset=(X=15.f,Y=32,Z=-12)
|
||
|
FireballClass=class'KFProj_Husk_Fireball_Versus'
|
||
|
|
||
|
// Backpack/Suicide Explosion
|
||
|
Begin Object Class=KFGameExplosion Name=ExploTemplate0
|
||
|
Damage=125
|
||
|
DamageRadius=600
|
||
|
DamageFalloffExponent=0.5f
|
||
|
DamageDelay=0.f
|
||
|
bFullDamageToAttachee=true
|
||
|
|
||
|
// Damage Effects
|
||
|
MyDamageType=class'KFDT_Explosive_HuskSuicide'
|
||
|
FractureMeshRadius=200.0
|
||
|
FracturePartVel=500.0
|
||
|
ExplosionEffects=KFImpactEffectInfo'FX_Impacts_ARCH.Explosions.HuskSuicide_Explosion'
|
||
|
ExplosionSound=AkEvent'WW_ZED_Husk.ZED_Husk_SFX_Suicide_Explode'
|
||
|
MomentumTransferScale=1.f
|
||
|
|
||
|
// Dynamic Light
|
||
|
ExploLight=ExplosionPointLight
|
||
|
ExploLightStartFadeOutTime=0.0
|
||
|
ExploLightFadeOutTime=0.5
|
||
|
|
||
|
// Camera Shake
|
||
|
CamShake=CameraShake'FX_CameraShake_Arch.Misc_Explosions.HuskSuicide'
|
||
|
CamShakeInnerRadius=450
|
||
|
CamShakeOuterRadius=900
|
||
|
CamShakeFalloff=1.f
|
||
|
bOrientCameraShakeTowardsEpicenter=true
|
||
|
End Object
|
||
|
ExplosionTemplate=ExploTemplate0
|
||
|
|
||
|
//defaults
|
||
|
Begin Object Name=MeleeHelper_0
|
||
|
BaseDamage=15.f //30
|
||
|
MaxHitRange=180.f
|
||
|
MomentumTransfer=25000.f
|
||
|
MyDamageType=class'KFDT_Slashing_ZedWeak'
|
||
|
MeleeImpactCamScale=0.2
|
||
|
PlayerDoorDamageMultiplier=5.f
|
||
|
End Object
|
||
|
MeleeAttackHelper=MeleeHelper_0
|
||
|
|
||
|
//defaults
|
||
|
ThirdPersonViewOffset={(
|
||
|
OffsetHigh=(X=-175,Y=75,Z=40),
|
||
|
OffsetLow=(X=-220,Y=75,Z=50),
|
||
|
OffsetMid=(X=-160,Y=60,Z=0),
|
||
|
)}
|
||
|
}
|