rott/kf_sources/KFMod/Classes/M14EBRBattleRifle.uc
2026-07-14 20:27:09 +07:00

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
}