467 lines
9.5 KiB
Ucode
467 lines
9.5 KiB
Ucode
//=============================================================================
|
|
// M14 EBR Battle Rifle Inventory class
|
|
//=============================================================================
|
|
class M14EBRBattleRifle extends KFWeapon
|
|
config(user);
|
|
|
|
var LaserDot Spot; // The first person laser site dot
|
|
var() float SpotProjectorPullback; // Amount to pull back the laser dot projector from the hit location
|
|
var bool bLaserActive; // The laser site is active
|
|
var LaserBeamEffect Beam; // Third person laser beam effect
|
|
|
|
var() class<InventoryAttachment> LaserAttachmentClass; // First person laser attachment class
|
|
var Actor LaserAttachment; // First person laser attachment
|
|
|
|
replication
|
|
{
|
|
reliable if(Role < ROLE_Authority)
|
|
ServerSetLaserActive;
|
|
}
|
|
|
|
simulated function PostBeginPlay()
|
|
{
|
|
super.PostBeginPlay();
|
|
|
|
if (Role == ROLE_Authority)
|
|
{
|
|
if (Beam == None)
|
|
{
|
|
Beam = Spawn(class'LaserBeamEffect');
|
|
}
|
|
}
|
|
}
|
|
|
|
simulated function Destroyed()
|
|
{
|
|
if (Spot != None)
|
|
Spot.Destroy();
|
|
|
|
if (Beam != None)
|
|
Beam.Destroy();
|
|
|
|
if (LaserAttachment != None)
|
|
LaserAttachment.Destroy();
|
|
|
|
super.Destroyed();
|
|
}
|
|
|
|
simulated function WeaponTick(float dt)
|
|
{
|
|
local Vector StartTrace, EndTrace, X,Y,Z;
|
|
local Vector HitLocation, HitNormal;
|
|
local Actor Other;
|
|
local vector MyEndBeamEffect;
|
|
local coords C;
|
|
|
|
super.WeaponTick(dt);
|
|
|
|
if( Role == ROLE_Authority && Beam != none )
|
|
{
|
|
if( bIsReloading && WeaponAttachment(ThirdPersonActor) != none )
|
|
{
|
|
C = WeaponAttachment(ThirdPersonActor).GetBoneCoords('tip');
|
|
X = C.XAxis;
|
|
Y = C.YAxis;
|
|
Z = C.ZAxis;
|
|
}
|
|
else
|
|
{
|
|
GetViewAxes(X,Y,Z);
|
|
}
|
|
|
|
// the to-hit trace always starts right in front of the eye
|
|
StartTrace = Instigator.Location + Instigator.EyePosition() + X*Instigator.CollisionRadius;
|
|
|
|
EndTrace = StartTrace + 65535 * X;
|
|
|
|
Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
|
|
|
|
if (Other != None && Other != Instigator && Other.Base != Instigator )
|
|
{
|
|
MyEndBeamEffect = HitLocation;
|
|
}
|
|
else
|
|
{
|
|
MyEndBeamEffect = EndTrace;
|
|
}
|
|
|
|
Beam.EndBeamEffect = MyEndBeamEffect;
|
|
Beam.EffectHitNormal = HitNormal;
|
|
}
|
|
}
|
|
|
|
simulated function BringUp(optional Weapon PrevWeapon)
|
|
{
|
|
Super.BringUp(PrevWeapon);
|
|
|
|
if (Role == ROLE_Authority)
|
|
{
|
|
if (Beam == None)
|
|
{
|
|
Beam = Spawn(class'LaserBeamEffect');
|
|
}
|
|
}
|
|
}
|
|
|
|
simulated function DetachFromPawn(Pawn P)
|
|
{
|
|
TurnOffLaser();
|
|
|
|
Super.DetachFromPawn(P);
|
|
|
|
if (Beam != None)
|
|
{
|
|
Beam.Destroy();
|
|
}
|
|
}
|
|
|
|
simulated function bool PutDown()
|
|
{
|
|
if (Beam != None)
|
|
{
|
|
Beam.Destroy();
|
|
}
|
|
|
|
TurnOffLaser();
|
|
|
|
return super.PutDown();
|
|
}
|
|
|
|
// Use alt fire to switch fire modes
|
|
simulated function AltFire(float F)
|
|
{
|
|
if(ReadyToFire(0))
|
|
{
|
|
ToggleLaser();
|
|
}
|
|
}
|
|
|
|
// Toggle the laser on and off
|
|
simulated function ToggleLaser()
|
|
{
|
|
if( Instigator.IsLocallyControlled() )
|
|
{
|
|
if( Role < ROLE_Authority )
|
|
{
|
|
ServerSetLaserActive(!bLaserActive);
|
|
}
|
|
|
|
bLaserActive = !bLaserActive;
|
|
|
|
if( Beam != none )
|
|
{
|
|
Beam.SetActive(bLaserActive);
|
|
}
|
|
|
|
if( bLaserActive )
|
|
{
|
|
if ( LaserAttachment == none )
|
|
{
|
|
LaserAttachment = Spawn(LaserAttachmentClass,,,,);
|
|
AttachToBone(LaserAttachment,'LightBone');
|
|
}
|
|
LaserAttachment.bHidden = false;
|
|
|
|
if (Spot == None)
|
|
{
|
|
Spot = Spawn(class'LaserDot', self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LaserAttachment.bHidden = true;
|
|
if (Spot != None)
|
|
{
|
|
Spot.Destroy();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
simulated function TurnOffLaser()
|
|
{
|
|
if( Instigator.IsLocallyControlled() )
|
|
{
|
|
if( Role < ROLE_Authority )
|
|
{
|
|
ServerSetLaserActive(false);
|
|
}
|
|
|
|
bLaserActive = false;
|
|
LaserAttachment.bHidden = true;
|
|
|
|
if( Beam != none )
|
|
{
|
|
Beam.SetActive(false);
|
|
}
|
|
|
|
if (Spot != None)
|
|
{
|
|
Spot.Destroy();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set the new fire mode on the server
|
|
function ServerSetLaserActive(bool bNewWaitForRelease)
|
|
{
|
|
if( Beam != none )
|
|
{
|
|
Beam.SetActive(bNewWaitForRelease);
|
|
}
|
|
|
|
if( bNewWaitForRelease )
|
|
{
|
|
bLaserActive = true;
|
|
if (Spot == None)
|
|
{
|
|
Spot = Spawn(class'LaserDot', self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bLaserActive = false;
|
|
if (Spot != None)
|
|
{
|
|
Spot.Destroy();
|
|
}
|
|
}
|
|
}
|
|
|
|
simulated event RenderOverlays( Canvas Canvas )
|
|
{
|
|
local int m;
|
|
local Vector StartTrace, EndTrace;
|
|
local Vector HitLocation, HitNormal;
|
|
local Actor Other;
|
|
local vector X,Y,Z;
|
|
local coords C;
|
|
|
|
if (Instigator == None)
|
|
return;
|
|
|
|
if ( Instigator.Controller != None )
|
|
Hand = Instigator.Controller.Handedness;
|
|
|
|
if ((Hand < -1.0) || (Hand > 1.0))
|
|
return;
|
|
|
|
// draw muzzleflashes/smoke for all fire modes so idle state won't
|
|
// cause emitters to just disappear
|
|
for (m = 0; m < NUM_FIRE_MODES; m++)
|
|
{
|
|
if (FireMode[m] != None)
|
|
{
|
|
FireMode[m].DrawMuzzleFlash(Canvas);
|
|
}
|
|
}
|
|
|
|
SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) );
|
|
SetRotation( Instigator.GetViewRotation() + ZoomRotInterp);
|
|
|
|
// Handle drawing the laser beam dot
|
|
if (Spot != None)
|
|
{
|
|
StartTrace = Instigator.Location + Instigator.EyePosition();
|
|
GetViewAxes(X, Y, Z);
|
|
|
|
if( bIsReloading && Instigator.IsLocallyControlled() )
|
|
{
|
|
C = GetBoneCoords('LightBone');
|
|
X = C.XAxis;
|
|
Y = C.YAxis;
|
|
Z = C.ZAxis;
|
|
}
|
|
|
|
EndTrace = StartTrace + 65535 * X;
|
|
|
|
Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
|
|
|
|
if (Other != None && Other != Instigator && Other.Base != Instigator )
|
|
{
|
|
EndBeamEffect = HitLocation;
|
|
}
|
|
else
|
|
{
|
|
EndBeamEffect = EndTrace;
|
|
}
|
|
|
|
Spot.SetLocation(EndBeamEffect - X*SpotProjectorPullback);
|
|
|
|
if( Pawn(Other) != none )
|
|
{
|
|
Spot.SetRotation(Rotator(X));
|
|
Spot.SetDrawScale(Spot.default.DrawScale * 0.5);
|
|
}
|
|
else if( HitNormal == vect(0,0,0) )
|
|
{
|
|
Spot.SetRotation(Rotator(-X));
|
|
Spot.SetDrawScale(Spot.default.DrawScale);
|
|
}
|
|
else
|
|
{
|
|
Spot.SetRotation(Rotator(-HitNormal));
|
|
Spot.SetDrawScale(Spot.default.DrawScale);
|
|
}
|
|
}
|
|
|
|
//PreDrawFPWeapon(); // Laurent -- Hook to override things before render (like rotation if using a staticmesh)
|
|
|
|
bDrawingFirstPerson = true;
|
|
Canvas.DrawActor(self, false, false, DisplayFOV);
|
|
bDrawingFirstPerson = false;
|
|
}
|
|
|
|
function bool RecommendRangedAttack()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//TODO: LONG ranged?
|
|
function bool RecommendLongRangedAttack()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
function float SuggestAttackStyle()
|
|
{
|
|
return -1.0;
|
|
}
|
|
|
|
exec function SwitchModes()
|
|
{
|
|
DoToggle();
|
|
}
|
|
|
|
function float GetAIRating()
|
|
{
|
|
local Bot B;
|
|
|
|
B = Bot(Instigator.Controller);
|
|
if ( (B == None) || (B.Enemy == None) )
|
|
return AIRating;
|
|
|
|
return AIRating;
|
|
}
|
|
|
|
function byte BestMode()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
simulated function SetZoomBlendColor(Canvas c)
|
|
{
|
|
local Byte val;
|
|
local Color clr;
|
|
local Color fog;
|
|
|
|
clr.R = 255;
|
|
clr.G = 255;
|
|
clr.B = 255;
|
|
clr.A = 255;
|
|
|
|
if( Instigator.Region.Zone.bDistanceFog )
|
|
{
|
|
fog = Instigator.Region.Zone.DistanceFogColor;
|
|
val = 0;
|
|
val = Max( val, fog.R);
|
|
val = Max( val, fog.G);
|
|
val = Max( val, fog.B);
|
|
if( val > 128 )
|
|
{
|
|
val -= 128;
|
|
clr.R -= val;
|
|
clr.G -= val;
|
|
clr.B -= val;
|
|
}
|
|
}
|
|
c.DrawColor = clr;
|
|
}
|
|
|
|
simulated function AddReloadedAmmo()
|
|
{
|
|
super.AddReloadedAmmo();
|
|
|
|
ResetReloadAchievement();
|
|
}
|
|
|
|
function ResetReloadAchievement()
|
|
{
|
|
local PlayerController PC;
|
|
local KFSteamStatsAndAchievements KFSteamStats;
|
|
|
|
PC = PlayerController( Instigator.Controller );
|
|
|
|
if ( PC != none )
|
|
{
|
|
KFSteamStats = KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements);
|
|
|
|
if ( KFSteamStats != none )
|
|
{
|
|
KFSteamStats.OnReloadSPSorM14();
|
|
}
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.M14_cmb"
|
|
SleeveNum=1
|
|
|
|
WeaponReloadAnim=Reload_M14
|
|
IdleAimAnim=Idle_Iron
|
|
|
|
CustomCrosshair=11
|
|
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
|
|
MagCapacity=20
|
|
ReloadRate=3.366
|
|
ReloadAnim="Reload"
|
|
ReloadAnimRate=1.000000
|
|
|
|
Weight=8.000000
|
|
bModeZeroCanDryFire=True
|
|
FireModeClass(0)=Class'KFMod.M14EBRFire'
|
|
FireModeClass(1)=Class'KFMod.NoFire'
|
|
PutDownAnim="PutDown"
|
|
SelectSoundRef="KF_M14EBRSnd.M14EBR_Select"
|
|
SelectForce="SwitchToAssaultRifle"
|
|
bShowChargingBar=True
|
|
Description="An M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight."
|
|
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
|
|
Priority=165
|
|
InventoryGroup=4
|
|
GroupOffset=5
|
|
PickupClass=Class'KFMod.M14EBRPickup'
|
|
PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000)//(X=18.000000,Y=22.000000,Z=-6.000000)
|
|
//PlayerViewPivot=(Pitch=400)
|
|
BobDamping=6.000000
|
|
AttachmentClass=Class'KFMod.M14EBRAttachment'
|
|
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
|
|
ItemName="M14EBR"
|
|
MeshRef="KF_Weapons2_Trip.M14_EBR_Trip"
|
|
DrawScale=1.00000
|
|
TransientSoundVolume=1.250000
|
|
AmbientGlow=0
|
|
|
|
AIRating=0.55
|
|
CurrentRating=0.55
|
|
|
|
DisplayFOV=55.000000
|
|
StandardDisplayFOV=55.0
|
|
PlayerIronSightFOV=60
|
|
ZoomTime=0.25
|
|
FastZoomOutTime=0.2
|
|
ZoomInRotation=(Pitch=-910,Yaw=0,Roll=2910)
|
|
bHasAimingMode=true
|
|
ZoomedDisplayFOV=45
|
|
|
|
HudImageRef="KillingFloor2HUD.WeaponSelect.M14_unselected"
|
|
SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M14"
|
|
TraderInfoTexture=texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M14'
|
|
SpotProjectorPullback=1.0
|
|
LaserAttachmentClass=class'LaserAttachmentFirstPerson'
|
|
|
|
// Achievement Helpers
|
|
bIsTier3Weapon=true
|
|
}
|