Prepare fixtures

This commit is contained in:
dkanus 2026-07-14 20:27:09 +07:00
commit 9c94356263
6021 changed files with 722805 additions and 22 deletions

View file

@ -0,0 +1,58 @@
class AK12AssaultRifle extends AKBaseWeapon;
defaultproperties
{
ReloadShortAnim="Reload_LLI"
ReloadShortRate=2.000000
MagCapacity=30
ReloadRate=3.000000
ReloadAnim="Reload"
ReloadAnimRate=1.000000
WeaponReloadAnim="Reload_AK47"
Weight=6.000000
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=55.000000
bModeZeroCanDryFire=True
SleeveNum=8
TraderInfoTexture=Texture'ScrnWeaponPack_T.AK12.AK12_trader'
bIsTier3Weapon=True
MeshRef="ScrnWeaponPack_A.AK12_mesh"
SkinRefs(0)="ScrnWeaponPack_T.AK12.AK12_tex_1_cmb"
SkinRefs(1)="ScrnWeaponPack_T.AK12.AK12_tex_2_cmb"
SkinRefs(2)="ScrnWeaponPack_T.AK12.AK12_tex_3_cmb"
SkinRefs(3)="ScrnWeaponPack_T.AK12.AK12_tex_4_cmb"
SkinRefs(4)="ScrnWeaponPack_T.AK12.AK12_tex_5_cmb"
SkinRefs(5)="ScrnWeaponPack_T.AK12.AK12_tex_6_cmb"
SkinRefs(6)="ScrnWeaponPack_T.AK12.AK12_tex_7_cmb"
SkinRefs(7)="ScrnWeaponPack_T.AK12.AK12_aimpoint_sh"
SkinRefs(8)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb"
SelectSoundRef="ScrnWeaponPack_SND.AK12.AK12_select"
HudImageRef="ScrnWeaponPack_T.AK12.AK12_Unselect"
SelectedHudImageRef="ScrnWeaponPack_T.AK12.AK12_select"
PlayerIronSightFOV=65.000000
ZoomedDisplayFOV=20.000000
FireModeClass(0)=Class'ScrnWeaponPack.AK12Fire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectAnimRate=1.300000
SelectForce="SwitchToAssaultRifle"
AIRating=0.550000
CurrentRating=0.550000
bShowChargingBar=True
Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)"
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
DisplayFOV=55.000000
Priority=145
CustomCrosshair=11
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
InventoryGroup=4
GroupOffset=7
PickupClass=Class'ScrnWeaponPack.AK12Pickup'
PlayerViewOffset=(X=-0.500000,Y=20.000000,Z=-3.000000)
BobDamping=6.000000
AttachmentClass=Class'ScrnWeaponPack.AK12Attachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="AK-12 SE"
TransientSoundVolume=1.250000
}

View file

@ -0,0 +1,58 @@
class AK12Attachment extends KFWeaponAttachment;
simulated function WeaponLight();
defaultproperties
{
mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR'
mTracerClass=Class'KFMod.KFNewTracer'
mShellCaseEmitterClass=Class'KFMod.KFShellSpewer'
MovementAnims(0)="JogF_AK47"
MovementAnims(1)="JogB_AK47"
MovementAnims(2)="JogL_AK47"
MovementAnims(3)="JogR_AK47"
TurnLeftAnim="TurnL_AK47"
TurnRightAnim="TurnR_AK47"
CrouchAnims(0)="CHWalkF_AK47"
CrouchAnims(1)="CHWalkB_AK47"
CrouchAnims(2)="CHWalkL_AK47"
CrouchAnims(3)="CHWalkR_AK47"
WalkAnims(0)="WalkF_AK47"
WalkAnims(1)="WalkB_AK47"
WalkAnims(2)="WalkL_AK47"
WalkAnims(3)="WalkR_AK47"
CrouchTurnRightAnim="CH_TurnR_AK47"
CrouchTurnLeftAnim="CH_TurnL_AK47"
IdleCrouchAnim="CHIdle_AK47"
IdleWeaponAnim="Idle_AK47"
IdleRestAnim="Idle_AK47"
IdleChatAnim="Idle_AK47"
IdleHeavyAnim="Idle_AK47"
IdleRifleAnim="Idle_AK47"
FireAnims(0)="Fire_AK47"
FireAnims(1)="Fire_AK47"
FireAnims(2)="Fire_AK47"
FireAnims(3)="Fire_AK47"
FireAltAnims(0)="IS_Fire_AK47"
FireAltAnims(1)="IS_Fire_AK47"
FireAltAnims(2)="IS_Fire_AK47"
FireAltAnims(3)="IS_Fire_AK47"
FireCrouchAnims(0)="CHFire_AK47"
FireCrouchAnims(1)="CHFire_AK47"
FireCrouchAnims(2)="CHFire_AK47"
FireCrouchAnims(3)="CHFire_AK47"
FireCrouchAltAnims(0)="CHFire_AK47"
FireCrouchAltAnims(1)="CHFire_AK47"
FireCrouchAltAnims(2)="CHFire_AK47"
FireCrouchAltAnims(3)="CHFire_AK47"
HitAnims(0)="HitF_AK47"
HitAnims(1)="HitB_AK47"
HitAnims(2)="HitL_AK47"
HitAnims(3)="HitR_AK47"
PostFireBlendStandAnim="Blend_AK47"
PostFireBlendCrouchAnim="CHBlend_AK47"
MeshRef="ScrnWeaponPack_A.AK12_3rd"
bHeavy=True
SplashEffect=Class'ROEffects.BulletSplashEmitter'
CullDistance=5000.000000
}

View file

@ -0,0 +1,39 @@
class AK12Fire extends KFFire;
defaultproperties
{
FireAimedAnim="Fire_Iron"
RecoilRate=0.040000
maxVerticalRecoilAngle=250
maxHorizontalRecoilAngle=150
bRecoilRightOnly=True
ShellEjectClass=Class'ScrnWeaponPack.KFShellEjectAK12AR'
ShellEjectBoneName="Shell_eject"
bAccuracyBonusForSemiAuto=True
bRandomPitchFireSound=False
FireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot"
StereoFireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot"
NoAmmoSoundRef="ScrnWeaponPack_SND.AK12.AK12_empty"
DamageType=Class'ScrnWeaponPack.DamTypeAK12AssaultRifle'
DamageMax=50
Momentum=18500.000000
bPawnRapidFireAnim=True
TransientSoundVolume=3.800000
FireLoopAnim="Fire"
TweenTime=0.025000
FireForce="AssaultRifleFire"
FireRate=0.095000
AmmoClass=Class'ScrnWeaponPack.AK545Ammo'
AmmoPerFire=1
ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000)
ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000)
ShakeRotTime=0.750000
ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=1.250000
BotRefireRate=0.990000
FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR'
aimerror=42.000000
Spread=0.007500
SpreadStyle=SS_Random
}

View file

@ -0,0 +1,27 @@
class AK12Pickup extends KFWeaponPickup;
defaultproperties
{
Weight=6.000000
cost=2750
AmmoCost=10
BuyClipSize=30
PowerValue=55
SpeedValue=80
RangeValue=30
Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)"
ItemName="AK-12 SE"
ItemShortName="AK-12 SE"
AmmoItemName="5.45x39mm"
AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo'
CorrespondingPerkIndex=3
EquipmentCategoryID=2
InventoryType=Class'ScrnWeaponPack.AK12AssaultRifle'
PickupMessage="You got the AK-12"
PickupSound=Sound'ScrnWeaponPack_SND.AK12.AK12_select'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.AK12_st'
DrawScale=1.100000
CollisionRadius=25.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,14 @@
class AK545Ammo extends KFAmmunition;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx
defaultproperties
{
AmmoPickupAmount=30
MaxAmmo=300
InitialAmount=120
PickupClass=Class'ScrnWeaponPack.AK545AmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=336,Y1=82,X2=382,Y2=125)
ItemName="5.45x39mm"
}

View file

@ -0,0 +1,9 @@
class AK545AmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=30
InventoryType=Class'ScrnWeaponPack.AK545Ammo'
PickupMessage="Rounds 5.45x39mm"
StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo'
}

View file

@ -0,0 +1,462 @@
class AKBaseWeapon extends KFWeapon
abstract;
#exec OBJ LOAD FILE=KillingFloorWeapons.utx
#exec OBJ LOAD FILE=KillingFloorHUD.utx
#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax
var name ReloadShortAnim;
var float ReloadShortRate;
var transient KFWeaponPickup PendingPickup;
var transient bool bShortReload;
var const int OriginalMaxAmmo;
var const bool bSharedAmmoPool;
var transient class<KFVeterancyTypes> LastClientVeteranSkill;
var transient int LastClientVeteranSkillLevel;
var KFPlayerReplicationInfo OwnerPRI; // don't access it directly! Use GetOwnerPRI() instead.
simulated function AltFire(float F)
{
// if(ReadyToFire(0))
// {
DoToggle();
// }
}
exec function SwitchModes()
{
DoToggle();
}
function byte BestMode()
{
return 0;
}
simulated function int MaxAmmo(int mode)
{
if ( Ammo[mode] != none )
return Ammo[mode].MaxAmmo;
if ( AmmoClass[mode] != None )
return AmmoClass[mode].default.MaxAmmo * GetAmmoMulti();
return 0;
}
function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned)
{
local bool bJustSpawnedAmmo;
local int addAmount, InitialAmount;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
if ( FireMode[m] != None && FireMode[m].AmmoClass != None )
{
Ammo[m] = Ammunition(Instigator.FindInventoryType(FireMode[m].AmmoClass));
bJustSpawnedAmmo = false;
if ( bNoAmmoInstances )
{
if ( (FireMode[m].AmmoClass == None) || ((m != 0) && (FireMode[m].AmmoClass == FireMode[0].AmmoClass)) )
return;
InitialAmount = FireMode[m].AmmoClass.Default.InitialAmount;
if(WP!=none && WP.bThrown==true)
InitialAmount = WP.AmmoAmount[m];
else
{
// Other change - if not thrown, give the gun a full clip
MagAmmoRemaining = MagCapacity;
}
if ( Ammo[m] != None )
{
addamount = InitialAmount + Ammo[m].AmmoAmount;
Ammo[m].Destroy();
}
else
addAmount = InitialAmount;
AddAmmo(addAmount,m);
}
else
{
if ( (Ammo[m] == None) && (FireMode[m].AmmoClass != None) )
{
Ammo[m] = Spawn(FireMode[m].AmmoClass, Instigator);
Instigator.AddInventory(Ammo[m]);
bJustSpawnedAmmo = true;
}
else if ( (m == 0) || (FireMode[m].AmmoClass != FireMode[0].AmmoClass) )
bJustSpawnedAmmo = ( bJustSpawned || ((WP != None) && !WP.bWeaponStay) );
// and here is the modification for instanced ammo actors
SetMaxAmmo();
if(WP!=none && WP.bThrown==true)
addAmount = WP.AmmoAmount[m];
else if ( bJustSpawnedAmmo ) {
if (default.MagCapacity == 0)
addAmount = 0; // prevent division by zero.
else
addAmount = Ammo[m].InitialAmount * (float(MagCapacity) / float(default.MagCapacity));
}
// Don't double add ammo if primary and secondary fire modes share the same ammo class
if ( WP != none && m > 0 && (FireMode[m].AmmoClass == FireMode[0].AmmoClass) )
return;
Ammo[m].AddAmmo(addAmount);
Ammo[m].GotoState('');
}
}
}
simulated function ClientWeaponSet(bool bPossiblySwitch)
{
super.ClientWeaponSet(bPossiblySwitch);
if ( Instigator != none )
SetMaxAmmo();
}
simulated function Destroyed()
{
SetMaxAmmo();
super.Destroyed();
}
exec simulated function SetMaxAmmo()
{
local Inventory Inv;
local AKBaseWeapon W;
local int c, NewMaxAmmo;
local Actor MyOwner;
local Ammunition MyAmmo;
if ( Instigator == none )
MyOwner = Instigator;
else
MyOwner = Owner;
if ( GetOwnerPRI() != none ) {
LastClientVeteranSkill = OwnerPRI.ClientVeteranSkill;
LastClientVeteranSkillLevel = OwnerPRI.ClientVeteranSkillLevel;
}
else
LastClientVeteranSkill = none;
if ( LastClientVeteranSkill != none )
LastAmmoResult = LastClientVeteranSkill.static.AddExtraAmmoFor(OwnerPRI, FireMode[0].AmmoClass);
else
LastAmmoResult = 1.0;
MyAmmo = Ammo[0];
if ( bSharedAmmoPool ) {
if ( PendingPickup == none && !bPendingDelete )
NewMaxAmmo = OriginalMaxAmmo;
for( Inv = MyOwner.Inventory; Inv!=none && (++c)<1000; Inv=Inv.Inventory ) {
W = AKBaseWeapon(Inv);
if ( W != none && W!= self && !W.bPendingDelete && W.Ammo[0] != none ) {
if ( W.Ammo[0] == MyAmmo )
NewMaxAmmo += W.OriginalMaxAmmo;
else if ( MyAmmo == none && W.Ammo[0].class == FireModeClass[0].default.AmmoClass ) {
MyAmmo = W.Ammo[0];
NewMaxAmmo += W.OriginalMaxAmmo;
}
}
}
}
if ( NewMaxAmmo == 0 )
NewMaxAmmo = FireMode[0].AmmoClass.default.MaxAmmo;
if ( MyAmmo != none ) {
MyAmmo.MaxAmmo = NewMaxAmmo * LastAmmoResult;
LastAmmoResult = float(MyAmmo.MaxAmmo) / MyAmmo.default.MaxAmmo; //used in GetAmmoMulti()
if ( MyAmmo.AmmoAmount > MyAmmo.MaxAmmo ) {
if ( PendingPickup != none ) {
PendingPickup.AmmoAmount[0] += MyAmmo.AmmoAmount - MyAmmo.MaxAmmo;
PendingPickup.MagAmmoRemaining = min(MagAmmoRemaining, PendingPickup.AmmoAmount[0]);
}
MyAmmo.AmmoAmount = MyAmmo.MaxAmmo;
}
if ( bSharedAmmoPool ) {
for( Inv = MyOwner.Inventory; Inv!=none && (++c)<1000; Inv=Inv.Inventory ) {
W = AKBaseWeapon(Inv);
if ( W != none && W != self ) {
W.LastAmmoResult = LastAmmoResult;
W.LastClientVeteranSkill = LastClientVeteranSkill;
W.LastClientVeteranSkillLevel = LastClientVeteranSkillLevel;
}
}
}
}
}
simulated function float GetAmmoMulti()
{
if ( GetOwnerPRI() == none ) {
LastClientVeteranSkill = none;
return 1.0;
}
if ( OwnerPRI.ClientVeteranSkill != LastClientVeteranSkill || OwnerPRI.ClientVeteranSkillLevel != LastClientVeteranSkillLevel )
SetMaxAmmo();
return LastAmmoResult;
}
simulated function KFPlayerReplicationInfo GetOwnerPRI()
{
if ( OwnerPRI == none ) {
if ( Instigator != none )
OwnerPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo);
if ( OwnerPRI == none && Pawn(Owner) != none )
OwnerPRI = KFPlayerReplicationInfo(Pawn(Owner).PlayerReplicationInfo);
}
return OwnerPRI;
}
// ensures that other guns with the same ammunition don't have more bullets in magazine than available
simulated function CheckSharedMags()
{
local int MaxMagAmmo, c;
local Inventory Inv;
local AKBaseWeapon W;
if ( !bSharedAmmoPool || Instigator == none || Ammo[0] == none )
return;
MaxMagAmmo = AmmoAmount(0) - MagAmmoRemaining;
for( Inv = Instigator.Inventory; Inv!=none && (++c)<1000; Inv=Inv.Inventory ) {
W = AKBaseWeapon(Inv);
if ( W != none && W!= self && W.Ammo[0] == Ammo[0] ) {
if ( W.MagAmmoRemaining > MaxMagAmmo )
W.MagAmmoRemaining = min(MaxMagAmmo, W.MagCapacity);
MaxMagAmmo -= W.MagAmmoRemaining;
if ( MaxMagAmmo < 0)
MaxMagAmmo = 0;
}
}
}
simulated function GetAmmoCount(out float MaxAmmoPrimary, out float CurAmmoPrimary)
{
if ( Ammo[0] != None ) {
MaxAmmoPrimary = Ammo[0].MaxAmmo;
CurAmmoPrimary = Ammo[0].AmmoAmount;
}
else {
MaxAmmoPrimary = 0;
CurAmmoPrimary = 0;
}
}
function DropFrom(vector StartLocation)
{
local int m;
local Pickup Pickup;
local vector Direction;
if (!bCanThrow)
return;
ClientWeaponThrown();
for (m = 0; m < NUM_FIRE_MODES; m++)
{
if (FireMode[m].bIsFiring)
StopFire(m);
}
if ( Instigator != None )
{
DetachFromPawn(Instigator);
Direction = vector(Instigator.Rotation);
}
else if ( Owner != none )
{
Direction = vector(Owner.Rotation);
}
Pickup = Spawn(PickupClass,,, StartLocation);
if ( Pickup != None )
{
Pickup.InitDroppedPickupFor(self);
Pickup.Velocity = Velocity + (Direction * 100);
if (Instigator.Health > 0)
WeaponPickup(Pickup).bThrown = true;
}
PendingPickup = KFWeaponPickup(Pickup);
Destroy();
}
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;
}
// copy-pasted to add (MagCapacity+1)
simulated function bool AllowReload()
{
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
if ( KFInvasionBot(Instigator.Controller) != none && !bIsReloading &&
MagAmmoRemaining < MagCapacity && AmmoAmount(0) > MagAmmoRemaining )
return true;
if ( KFFriendlyAI(Instigator.Controller) != none && !bIsReloading &&
MagAmmoRemaining < MagCapacity && AmmoAmount(0) > MagAmmoRemaining )
return true;
if( FireMode[0].IsFiring() || FireMode[1].IsFiring() ||
bIsReloading || MagAmmoRemaining >= MagCapacity ||
ClientState == WS_BringUp ||
AmmoAmount(0) <= MagAmmoRemaining ||
(FireMode[0].NextFireTime - Level.TimeSeconds) > 0.1 )
return false;
return true;
}
exec function ReloadMeNow()
{
local float ReloadMulti;
if(!AllowReload())
return;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( GetOwnerPRI() != none && OwnerPRI.ClientVeteranSkill != none )
{
ReloadMulti = OwnerPRI.ClientVeteranSkill.Static.GetReloadSpeedModifier(OwnerPRI, self);
}
else
{
ReloadMulti = 1.0;
}
bIsReloading = true;
ReloadTimer = Level.TimeSeconds;
bShortReload = MagAmmoRemaining > 0;
if ( bShortReload )
ReloadRate = Default.ReloadShortRate / ReloadMulti;
else
ReloadRate = Default.ReloadRate / ReloadMulti;
if( bHoldToReload )
{
NumLoadedThisReload = 0;
}
ClientReload();
Instigator.SetAnimAction(WeaponReloadAnim);
if ( Level.Game.NumPlayers > 1 && KFGameType(Level.Game).bWaveInProgress && KFPlayerController(Instigator.Controller) != none &&
Level.TimeSeconds - KFPlayerController(Instigator.Controller).LastReloadMessageTime > KFPlayerController(Instigator.Controller).ReloadMessageDelay )
{
KFPlayerController(Instigator.Controller).Speech('AUTO', 2, "");
KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds;
}
}
simulated function ClientReload()
{
local float ReloadMulti;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( GetOwnerPRI() != none && OwnerPRI.ClientVeteranSkill != none )
ReloadMulti = OwnerPRI.ClientVeteranSkill.Static.GetReloadSpeedModifier(OwnerPRI, self);
else
ReloadMulti = 1.0;
bIsReloading = true;
if (MagAmmoRemaining <= 0)
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
else if (MagAmmoRemaining >= 1)
{
PlayAnim(ReloadShortAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
}
function AddReloadedAmmo()
{
local int a;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
a = MagCapacity;
if ( bShortReload )
a++; // 1 bullet already bolted
if ( AmmoAmount(0) >= a )
MagAmmoRemaining = a;
else
MagAmmoRemaining = AmmoAmount(0);
// this seems redudant -- PooSH
// if( !bHoldToReload )
// {
// ClientForceKFAmmoUpdate(MagAmmoRemaining,AmmoAmount(0));
// }
if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none )
{
KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded();
}
}
simulated function ActuallyFinishReloading()
{
super.ActuallyFinishReloading();
if ( bSharedAmmoPool )
CheckSharedMags();
}
defaultproperties
{
ReloadShortAnim="Reload"
ReloadShortRate=3.000000
OriginalMaxAmmo=300
bSharedAmmoPool=True
}

View file

@ -0,0 +1,127 @@
class AKC74AssaultRifle extends AKBaseWeapon
config(user);
simulated function Notify_ShowBullets()
{
if ( !Instigator.IsLocallyControlled() )
return ;
if (AmmoAmount(0) == 0)
{
SetBoneScale (0, 0.0, 'bullet1');
SetBoneScale (1, 0.0, 'bullet2');
SetBoneScale (2, 0.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
else if (AmmoAmount(0) == 1)
{
SetBoneScale (0, 1.0, 'bullet1');
SetBoneScale (1, 0.0, 'bullet2');
SetBoneScale (2, 0.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
else if (AmmoAmount(0) == 2)
{
SetBoneScale (0, 1.0, 'bullet1');
SetBoneScale (1, 1.0, 'bullet2');
SetBoneScale (2, 0.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
else if (AmmoAmount(0) == 3)
{
SetBoneScale (0, 1.0, 'bullet1');
SetBoneScale (1, 1.0, 'bullet2');
SetBoneScale (2, 1.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
else if (AmmoAmount(0) >= 4)
{
SetBoneScale (0, 1.0, 'bullet1');
SetBoneScale (1, 1.0, 'bullet2');
SetBoneScale (2, 1.0, 'bullet3');
SetBoneScale (3, 1.0, 'bullet4');
}
}
simulated function Notify_HideBullets()
{
if ( !Instigator.IsLocallyControlled() )
return ;
if (MagAmmoRemaining <= 1)
{
SetBoneScale (0, 0.0, 'bullet1');
SetBoneScale (1, 0.0, 'bullet2');
SetBoneScale (2, 0.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
else if (MagAmmoRemaining == 2)
{
SetBoneScale (0, 1.0, 'bullet1');
SetBoneScale (1, 0.0, 'bullet2');
SetBoneScale (2, 0.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
else if (MagAmmoRemaining == 3)
{
SetBoneScale (0, 1.0, 'bullet1');
SetBoneScale (1, 1.0, 'bullet2');
SetBoneScale (2, 0.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
else if (MagAmmoRemaining >= 4)
{
SetBoneScale (0, 1.0, 'bullet1');
SetBoneScale (1, 1.0, 'bullet2');
SetBoneScale (2, 0.0, 'bullet3');
SetBoneScale (3, 0.0, 'bullet4');
}
}
defaultproperties
{
ReloadShortRate=2.000000
MagCapacity=30
ReloadRate=3.000000
ReloadAnim="Reload"
ReloadAnimRate=1.000000
WeaponReloadAnim="Reload_AK47"
Weight=5.000000
bHasAimingMode=True
IdleAimAnim="Iron_Idle"
StandardDisplayFOV=65.000000
bModeZeroCanDryFire=True
TraderInfoTexture=Texture'ScrnWeaponPack_T.AK74.AKC74_Trader'
bIsTier2Weapon=True
MeshRef="ScrnWeaponPack_A.akc74mesh"
SkinRefs(0)="ScrnWeaponPack_T.AK74.wpn_ak74"
SkinRefs(1)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb"
SkinRefs(2)="ScrnWeaponPack_T.AK74.wpn_ak74_1"
SkinRefs(3)="ScrnWeaponPack_T.AK12.AK12_tex_4_cmb"
SelectSoundRef="ScrnWeaponPack_SND.AK74.akc74_draw"
HudImageRef="ScrnWeaponPack_T.AK74.AKC74_Unselected"
SelectedHudImageRef="ScrnWeaponPack_T.AK74.AKC74_selected"
PlayerIronSightFOV=65.000000
ZoomedDisplayFOV=42.000000
FireModeClass(0)=Class'ScrnWeaponPack.AKC74Fire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectAnimRate=1.000000
SelectForce="SwitchToAssaultRifle"
AIRating=0.550000
CurrentRating=0.550000
bShowChargingBar=True
Description="The AK-74 is an assault rifle developed in the early 1970s in the Soviet Union as the replacement for the earlier AKM (itself a refined version of the AK-47). It uses a smaller intermediate cartridge, the 5.45x39mm, replacing the 7.62x39mm chambering of earlier Kalashnikov-pattern weapons. Smaller ammunition lowers damage, but makes weapon lighter."
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
DisplayFOV=65.000000
Priority=100
CustomCrosshair=11
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
InventoryGroup=3
GroupOffset=7
PickupClass=Class'ScrnWeaponPack.AKC74Pickup'
PlayerViewOffset=(X=35.000000,Y=22.000000,Z=-6.000000)
BobDamping=5.000000
AttachmentClass=Class'ScrnWeaponPack.AKC74Attachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="AK-74 SE"
TransientSoundVolume=1.250000
}

View file

@ -0,0 +1,69 @@
class AKC74Attachment extends KFWeaponAttachment;
simulated function DoFlashEmitter()
{
if (mMuzFlash3rd == None)
{
mMuzFlash3rd = Spawn(mMuzFlashClass);
AttachToBone(mMuzFlash3rd, 'wpn_silencer');
}
if(mMuzFlash3rd != None)
mMuzFlash3rd.SpawnParticle(1);
}
defaultproperties
{
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP'
mTracerClass=Class'KFMod.KFNewTracer'
mShellCaseEmitterClass=Class'KFMod.KFShellSpewer'
ShellEjectBoneName="wpn_scope"
MovementAnims(0)="JogF_AK47"
MovementAnims(1)="JogB_AK47"
MovementAnims(2)="JogL_AK47"
MovementAnims(3)="JogR_AK47"
TurnLeftAnim="TurnL_AK47"
TurnRightAnim="TurnR_AK47"
CrouchAnims(0)="CHWalkF_AK47"
CrouchAnims(1)="CHWalkB_AK47"
CrouchAnims(2)="CHWalkL_AK47"
CrouchAnims(3)="CHWalkR_AK47"
WalkAnims(0)="WalkF_AK47"
WalkAnims(1)="WalkB_AK47"
WalkAnims(2)="WalkL_AK47"
WalkAnims(3)="WalkR_AK47"
CrouchTurnRightAnim="CH_TurnR_AK47"
CrouchTurnLeftAnim="CH_TurnL_AK47"
IdleCrouchAnim="CHIdle_AK47"
IdleWeaponAnim="Idle_AK47"
IdleRestAnim="Idle_AK47"
IdleChatAnim="Idle_AK47"
IdleHeavyAnim="Idle_AK47"
IdleRifleAnim="Idle_AK47"
FireAnims(0)="Fire_AK47"
FireAnims(1)="Fire_AK47"
FireAnims(2)="Fire_AK47"
FireAnims(3)="Fire_AK47"
FireAltAnims(0)="IS_Fire_AK47"
FireAltAnims(1)="IS_Fire_AK47"
FireAltAnims(2)="IS_Fire_AK47"
FireAltAnims(3)="IS_Fire_AK47"
FireCrouchAnims(0)="CHFire_AK47"
FireCrouchAnims(1)="CHFire_AK47"
FireCrouchAnims(2)="CHFire_AK47"
FireCrouchAnims(3)="CHFire_AK47"
FireCrouchAltAnims(0)="CHFire_AK47"
FireCrouchAltAnims(1)="CHFire_AK47"
FireCrouchAltAnims(2)="CHFire_AK47"
FireCrouchAltAnims(3)="CHFire_AK47"
HitAnims(0)="HitF_AK47"
HitAnims(1)="HitB_AK47"
HitAnims(2)="HitL_AK47"
HitAnims(3)="HitR_AK47"
PostFireBlendStandAnim="Blend_AK47"
PostFireBlendCrouchAnim="CHBlend_AK47"
MeshRef="ScrnWeaponPack_A.AKC74_3rd"
bHeavy=True
SplashEffect=Class'ROEffects.BulletSplashEmitter'
CullDistance=5000.000000
DrawScale=0.700000
}

View file

@ -0,0 +1,40 @@
class AKC74Fire extends KFFire;
defaultproperties
{
FireAimedAnim="Fire_Iron"
RecoilRate=0.040000
maxVerticalRecoilAngle=400
maxHorizontalRecoilAngle=200
bRecoilRightOnly=True
ShellEjectClass=Class'ROEffects.KFShellEjectAK'
ShellEjectBoneName="Shell_eject"
bAccuracyBonusForSemiAuto=True
bRandomPitchFireSound=False
FireSoundRef="ScrnWeaponPack_SND.AK74.akc74_shoot_mono"
StereoFireSoundRef="ScrnWeaponPack_SND.AK74.akc74_shoot_stereo"
NoAmmoSoundRef="ScrnWeaponPack_SND.AK74.akc74__empty"
DamageType=Class'ScrnWeaponPack.DamTypeAK74AssaultRifle'
DamageMin=42
DamageMax=42
Momentum=9500.000000
bPawnRapidFireAnim=True
TransientSoundVolume=1.800000
FireLoopAnim="Fire"
TweenTime=0.025000
FireForce="AssaultRifleFire"
FireRate=0.104000
AmmoClass=Class'ScrnWeaponPack.AK545Ammo'
AmmoPerFire=1
ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000)
ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000)
ShakeRotTime=0.750000
ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=1.250000
BotRefireRate=0.990000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG'
aimerror=42.000000
Spread=0.010000
SpreadStyle=SS_Random
}

View file

@ -0,0 +1,26 @@
class AKC74Pickup extends KFWeaponPickup;
defaultproperties
{
Weight=5.000000
cost=1150
AmmoCost=10
BuyClipSize=30
PowerValue=44
SpeedValue=90
RangeValue=50
Description="The AK-74 is an assault rifle developed in the early 1970s in the Soviet Union as the replacement for the earlier AKM (itself a refined version of the AK-47). It uses a smaller intermediate cartridge, the 5.45x39mm, replacing the 7.62x39mm chambering of earlier Kalashnikov-pattern weapons. Smaller ammunition lowers damage, but makes weapon lighter."
ItemName="AK-74 SE"
ItemShortName="AK-74 SE"
AmmoItemName="5.45x39mm"
AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo'
CorrespondingPerkIndex=3
EquipmentCategoryID=2
InventoryType=Class'ScrnWeaponPack.AKC74AssaultRifle'
PickupMessage="You've got a AK-74"
PickupSound=Sound'ScrnWeaponPack_SND.AK74.akc74_holster'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.AKC74_ST'
CollisionRadius=25.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,158 @@
//=============================================================================
// BallisticEmitter.
//
// A Base class for Ballistic Emitters. Includes some default functionality:
// -Disables individual particle emitters depedning on effects detail.
// -Use EmitterZTestSwitches to auto set ZTest if you want it to be different
// depending on players seeing emitter or not.
// -Static function, VtoRV() can turn min and max vectors into a range vector
// -Static function, ScaleRV() scales a range vector
// -Static function, ScaleEmitter() scales an entire emitter (very handy!)
// -static function, KillEmitter() is can smoothly remove an emitter instead of
// using Destroy(). Obsolete now since Kill() was added...
//
// by Nolan "Dark Carnivour" Richert.
// Copyright(c) 2006 RuneStorm. All Rights Reserved.
//=============================================================================
class BallisticEmitter extends Emitter
placeable;
enum EZTestMode // ZTest switch settings...
{
ZM_None, // Don't do anything
ZM_OnWhenVisible, // Set ZTest on if the emitter is visible
ZM_OffWhenVisible // Set ZTest off if this emitter is visible
};
var() array<EZTestMode> EmitterZTestSwitches; // Swithes to change ZTest of each emitter depending on LOS
simulated event PostBeginPlay()
{
local int i;
local bool bLOS;
super.PostBeginPlay();
if (EmitterZTestSwitches.length > 0)
{
bLOS = Level.GetLocalPlayerController().LineOfSightTo(self);
for (i=0;i<Min(EmitterZTestSwitches.length, Emitters.length);i++)
{
if (EmitterZTestSwitches[i] == ZM_None)
continue;
if (bLOS)
Emitters[i].ZTest = EmitterZTestSwitches[i] == ZM_OnWhenVisible;
else
Emitters[i].ZTest = EmitterZTestSwitches[i] == ZM_OffWhenVisible;
// else if (EmitterZTestSwitches[i] == ZM_OnWhenVisible)
// Emitters[i].ZTest = PlayerCanSeeMe();
// else if (EmitterZTestSwitches[i] == ZM_OffWhenVisible)
// Emitters[i].ZTest = !PlayerCanSeeMe();
}
}
}
//FIXME
simulated function InvertY()
{
local int i;
for (i=0;i<Emitters.length;i++)
Emitters[i].StartLocationOffset.Y *= -1;
}
// Returns a nice neat RangeVector made of two input vectors, Min and Max.
static function RangeVector VtoRV (Vector Max, Vector Min)
{
local RangeVector RV;
RV.X.Max = Max.X; RV.X.Min = Min.X; RV.Y.Max = Max.Y; RV.Y.Min = Min.Y; RV.Z.Max = Max.Z; RV.Z.Min = Min.Z;
return RV;
}
// Scales a RangeVector
static function ScaleRV (out RangeVector RV, float Scale)
{
RV.X.Max*=Scale; RV.Y.Max*=Scale; RV.Z.Max*=Scale;
RV.X.Min*=Scale; RV.Y.Min*=Scale; RV.Z.Min*=Scale;
}
// Scales the parameters of an emitter to resize it
static function ScaleEmitter (Emitter TheOne, float Scale)
{
local int i, j;
for (i=0;i<TheOne.Emitters.Length;i++)
{
ScaleRV (TheOne.Emitters[i].StartVelocityRange, Scale);
TheOne.Emitters[i].SphereRadiusRange.Min*=Scale; TheOne.Emitters[i].SphereRadiusRange.Max*=Scale;
TheOne.Emitters[i].StartVelocityRadialRange.Min*=Scale; TheOne.Emitters[i].StartVelocityRadialRange.Max*=Scale;
TheOne.Emitters[i].MaxAbsVelocity *= Scale;
ScaleRV (TheOne.Emitters[i].StartSizeRange, Scale);
TheOne.Emitters[i].Acceleration *= Scale;
ScaleRV (TheOne.Emitters[i].StartLocationRange, Scale);
TheOne.Emitters[i].StartLocationOffset *= Scale;
ScaleRV (TheOne.Emitters[i].MeshScaleRange, Scale);
ScaleRV (TheOne.Emitters[i].VelocityScaleRange, Scale);
ScaleRV (TheOne.Emitters[i].VelocityLossRange, Scale);
if (BeamEmitter(TheOne.Emitters[i]) != None)
{
for (j=0;j<BeamEmitter(TheOne.Emitters[i]).BeamEndPoints.length;j++)
ScaleRV (BeamEmitter(TheOne.Emitters[i]).BeamEndPoints[j].Offset, Scale);
ScaleRV (BeamEmitter(TheOne.Emitters[i]).LowFrequencyNoiseRange, Scale);
ScaleRV (BeamEmitter(TheOne.Emitters[i]).HighFrequencyNoiseRange, Scale);
ScaleRV (BeamEmitter(TheOne.Emitters[i]).DynamicHFNoiseRange, Scale);
BeamEmitter(TheOne.Emitters[i]).BeamDistanceRange.Max *= Scale; BeamEmitter(TheOne.Emitters[i]).BeamDistanceRange.Min *= Scale;
}
}
}
// Instead of destroying emitters, we can use this to gracefully make them go away
static function KillEmitter (Emitter TheOne)
{
local int i;
TheOne.AutoDestroy = True;
for (i=0; i<TheOne.Emitters.Length; i++)
{
TheOne.Emitters[i].AutoDestroy = True;
TheOne.Emitters[i].AutomaticInitialSpawning = False;
TheOne.Emitters[i].RespawnDeadParticles = False;
TheOne.Emitters[i].InitialParticlesPerSecond = 0;
TheOne.Emitters[i].ParticlesPerSecond = 0;
TheOne.Emitters[i].TriggerDisabled=true;
// TheOne.Emitters[i].SpawnOnTriggerRange.Min=0;
// TheOne.Emitters[i].SpawnOnTriggerRange.Max=0;
}
}
// Make the emitter stop producing particles
static function StopParticles (Emitter TheOne)
{
local int i;
TheOne.AutoDestroy = false;
for (i=0; i<TheOne.Emitters.Length; i++)
{
TheOne.Emitters[i].AutoDestroy = false;
TheOne.Emitters[i].AutomaticInitialSpawning = false;
TheOne.Emitters[i].RespawnDeadParticles = false;
TheOne.Emitters[i].InitialParticlesPerSecond = 0;
TheOne.Emitters[i].ParticlesPerSecond = 0;
TheOne.Emitters[i].TriggerDisabled=true;
}
}
// Make the emitter start producing particles again
static function ResumeParticles (Emitter TheOne)
{
local int i;
for (i=0; i<TheOne.Emitters.Length; i++)
{
TheOne.Emitters[i].AutomaticInitialSpawning = TheOne.Emitters[i].default.AutomaticInitialSpawning;
TheOne.Emitters[i].RespawnDeadParticles = TheOne.Emitters[i].default.RespawnDeadParticles;
TheOne.Emitters[i].InitialParticlesPerSecond = TheOne.Emitters[i].default.InitialParticlesPerSecond;
TheOne.Emitters[i].ParticlesPerSecond = TheOne.Emitters[i].default.ParticlesPerSecond;
TheOne.Emitters[i].TriggerDisabled = TheOne.Emitters[i].default.TriggerDisabled;
}
}
defaultproperties
{
}

View file

@ -0,0 +1,507 @@
class CZ805M extends MP7MMedicGun;
var int MaxHealAmmo;
var MedicDartAttachment FakedHealDartAttach; //faked healing dart attachment
var name ReloadShortAnim;
var float ReloadShortRate;
var transient bool bShortReload;
simulated function PostBeginPlay()
{
super.PostBeginPlay();
if ( Level.NetMode != NM_DedicatedServer ) {
if ( FakedHealDartAttach == none )
FakedHealDartAttach = spawn(class'MedicDartAttachment',self);
if ( FakedHealDartAttach != none ) {
FakedHealDartAttach.SetDrawScale(4.0); //scale
AttachToBone(FakedHealDartAttach, 'body'); //attach to the CZ805M main bone, 'body'
FakedHealDartAttach.SetRelativeRotation(rot(-250,-16834,0)); //pitch yaw roll
FakedHealDartAttach.SetRelativeLocation(vect(1.14, 9.5, 1.13)); //x y z
}
}
}
//destroy it
simulated function Destroyed()
{
if ( FakedHealDartAttach != None )
FakedHealDartAttach.Destroy();
super.Destroyed();
}
//hides mag1 bullets when firing, bullets 1 to 10 are in the magwell so you'll never see them though, bullets 11 to 30 are scaled according to magazine size
simulated function Notify_HideBullets()
{
local float MagFloat;
local int MyAmmos;
//don't do any of this stuff on servers
if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) )
return;
MyAmmos = MagAmmoRemaining;
if (MyAmmos > 9)
{
MagFloat = float(MyAmmos-10)/(MagCapacity-10);
}
if (MyAmmos < 1)
SetBoneScale(1, 0.0, 'mag1b1');
if (MyAmmos < 2)
SetBoneScale(2, 0.0, 'mag1b2');
if (MyAmmos < 3)
SetBoneScale(3, 0.0, 'mag1b3');
if (MyAmmos < 4)
SetBoneScale(4, 0.0, 'mag1b4');
if (MyAmmos < 5)
SetBoneScale(5, 0.0, 'mag1b5');
if (MyAmmos < 6)
SetBoneScale(6, 0.0, 'mag1b6');
if (MyAmmos < 7)
SetBoneScale(7, 0.0, 'mag1b7');
if (MyAmmos < 8)
SetBoneScale(8, 0.0, 'mag1b8');
if (MyAmmos < 9)
SetBoneScale(9, 0.0, 'mag1b9');
if (MyAmmos < 10)
SetBoneScale(10, 0.0, 'mag1b10');
if (MagFloat < 0.05)
SetBoneScale(11, 0.0, 'mag1b11');
if (MagFloat < 0.1)
SetBoneScale(12, 0.0, 'mag1b12');
if (MagFloat < 0.15)
SetBoneScale(13, 0.0, 'mag1b13');
if (MagFloat < 0.2)
SetBoneScale(14, 0.0, 'mag1b14');
if (MagFloat < 0.25)
SetBoneScale(15, 0.0, 'mag1b15');
if (MagFloat < 0.3)
SetBoneScale(16, 0.0, 'mag1b16');
if (MagFloat < 0.35)
SetBoneScale(17, 0.0, 'mag1b17');
if (MagFloat < 0.40)
SetBoneScale(18, 0.0, 'mag1b18');
if (MagFloat < 0.45)
SetBoneScale(19, 0.0, 'mag1b19');
if (MagFloat < 0.50)
SetBoneScale(20, 0.0, 'mag1b20');
if (MagFloat < 0.55)
SetBoneScale(21, 0.0, 'mag1b21');
if (MagFloat < 0.60)
SetBoneScale(22, 0.0, 'mag1b22');
if (MagFloat < 0.65)
SetBoneScale(23, 0.0, 'mag1b23');
if (MagFloat < 0.70)
SetBoneScale(24, 0.0, 'mag1b24');
if (MagFloat < 0.75)
SetBoneScale(25, 0.0, 'mag1b25');
if (MagFloat < 0.80)
SetBoneScale(26, 0.0, 'mag1b26');
if (MagFloat < 0.85)
SetBoneScale(27, 0.0, 'mag1b27');
if (MagFloat < 0.90)
SetBoneScale(28, 0.0, 'mag1b28');
if (MagFloat < 0.95)
SetBoneScale(29, 0.0, 'mag1b29');
if (MagFloat < 1.00)
SetBoneScale(30, 0.0, 'mag1b30');
}
//mag2 gets mag1 bullets on reload start and mag1 gets fresh bullets
simulated function Notify_ReloadStarted()
{
local float MagFloat;
local int MyAmmos;
local float AmmoFloat;
if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) )
return;
MyAmmos = AmmoAmount(0);
MagFloat = float(MagAmmoRemaining-10)/(MagCapacity-10);
AmmoFloat = float(AmmoAmount(0)-10)/(MagCapacity-10);
if (MagAmmoRemaining < 1)
SetBoneScale(31, 0.0, 'mag2b1');
if (MagAmmoRemaining < 2)
SetBoneScale(32, 0.0, 'mag2b2');
if (MagAmmoRemaining < 3)
SetBoneScale(33, 0.0, 'mag2b3');
if (MagAmmoRemaining < 4)
SetBoneScale(34, 0.0, 'mag2b4');
if (MagAmmoRemaining < 5)
SetBoneScale(35, 0.0, 'mag2b5');
if (MagAmmoRemaining < 6)
SetBoneScale(36, 0.0, 'mag2b6');
if (MagAmmoRemaining < 7)
SetBoneScale(37, 0.0, 'mag2b7');
if (MagAmmoRemaining < 8)
SetBoneScale(38, 0.0, 'mag2b8');
if (MagAmmoRemaining < 9)
SetBoneScale(39, 0.0, 'mag2b9');
if (MagAmmoRemaining < 10)
SetBoneScale(40, 0.0, 'mag2b10');
if (MagFloat < 0.05)
SetBoneScale(41, 0.0, 'mag2b11');
if (MagFloat < 0.1)
SetBoneScale(42, 0.0, 'mag2b12');
if (MagFloat < 0.15)
SetBoneScale(43, 0.0, 'mag2b13');
if (MagFloat < 0.2)
SetBoneScale(44, 0.0, 'mag2b14');
if (MagFloat < 0.25)
SetBoneScale(45, 0.0, 'mag2b15');
if (MagFloat < 0.3)
SetBoneScale(46, 0.0, 'mag2b16');
if (MagFloat < 0.35)
SetBoneScale(47, 0.0, 'mag2b17');
if (MagFloat < 0.40)
SetBoneScale(48, 0.0, 'mag2b18');
if (MagFloat < 0.45)
SetBoneScale(49, 0.0, 'mag2b19');
if (MagFloat < 0.50)
SetBoneScale(50, 0.0, 'mag2b20');
if (MagFloat < 0.55)
SetBoneScale(51, 0.0, 'mag2b21');
if (MagFloat < 0.60)
SetBoneScale(52, 0.0, 'mag2b22');
if (MagFloat < 0.65)
SetBoneScale(53, 0.0, 'mag2b23');
if (MagFloat < 0.70)
SetBoneScale(54, 0.0, 'mag2b24');
if (MagFloat < 0.75)
SetBoneScale(55, 0.0, 'mag2b25');
if (MagFloat < 0.80)
SetBoneScale(56, 0.0, 'mag2b26');
if (MagFloat < 0.85)
SetBoneScale(57, 0.0, 'mag2b27');
if (MagFloat < 0.90)
SetBoneScale(58, 0.0, 'mag2b28');
if (MagFloat < 0.95)
SetBoneScale(59, 0.0, 'mag2b29');
if (MagFloat < 1.00)
SetBoneScale(60, 0.0, 'mag2b30');
//show all mag 1 bullets first
SetBoneScale(1, 1.0, 'mag1b1');
SetBoneScale(2, 1.0, 'mag1b2');
SetBoneScale(3, 1.0, 'mag1b3');
SetBoneScale(4, 1.0, 'mag1b4');
SetBoneScale(5, 1.0, 'mag1b5');
SetBoneScale(6, 1.0, 'mag1b6');
SetBoneScale(7, 1.0, 'mag1b7');
SetBoneScale(8, 1.0, 'mag1b8');
SetBoneScale(9, 1.0, 'mag1b9');
SetBoneScale(10, 1.0, 'mag1b10');
SetBoneScale(11, 1.0, 'mag1b11');
SetBoneScale(12, 1.0, 'mag1b12');
SetBoneScale(13, 1.0, 'mag1b13');
SetBoneScale(14, 1.0, 'mag1b14');
SetBoneScale(15, 1.0, 'mag1b15');
SetBoneScale(16, 1.0, 'mag1b16');
SetBoneScale(17, 1.0, 'mag1b17');
SetBoneScale(18, 1.0, 'mag1b18');
SetBoneScale(19, 1.0, 'mag1b19');
SetBoneScale(20, 1.0, 'mag1b20');
SetBoneScale(21, 1.0, 'mag1b21');
SetBoneScale(22, 1.0, 'mag1b22');
SetBoneScale(23, 1.0, 'mag1b23');
SetBoneScale(24, 1.0, 'mag1b24');
SetBoneScale(25, 1.0, 'mag1b25');
SetBoneScale(26, 1.0, 'mag1b26');
SetBoneScale(27, 1.0, 'mag1b27');
SetBoneScale(28, 1.0, 'mag1b28');
SetBoneScale(29, 1.0, 'mag1b29');
SetBoneScale(30, 1.0, 'mag1b30');
//hide mag1 bullets depending on AmmoAmount(0)
if (MyAmmos < 1)
SetBoneScale(1, 0.0, 'mag1b1');
if (MyAmmos < 2)
SetBoneScale(2, 0.0, 'mag1b2');
if (MyAmmos < 3)
SetBoneScale(3, 0.0, 'mag1b3');
if (MyAmmos < 4)
SetBoneScale(4, 0.0, 'mag1b4');
if (MyAmmos < 5)
SetBoneScale(5, 0.0, 'mag1b5');
if (MyAmmos < 6)
SetBoneScale(6, 0.0, 'mag1b6');
if (MyAmmos < 7)
SetBoneScale(7, 0.0, 'mag1b7');
if (MyAmmos < 8)
SetBoneScale(8, 0.0, 'mag1b8');
if (MyAmmos < 9)
SetBoneScale(9, 0.0, 'mag1b9');
if (MyAmmos < 10)
SetBoneScale(10, 0.0, 'mag1b10');
if (AmmoFloat < 0.05)
SetBoneScale(11, 0.0, 'mag1b11');
if (AmmoFloat < 0.1)
SetBoneScale(12, 0.0, 'mag1b12');
if (AmmoFloat < 0.15)
SetBoneScale(13, 0.0, 'mag1b13');
if (AmmoFloat < 0.2)
SetBoneScale(14, 0.0, 'mag1b14');
if (AmmoFloat < 0.25)
SetBoneScale(15, 0.0, 'mag1b15');
if (AmmoFloat < 0.3)
SetBoneScale(16, 0.0, 'mag1b16');
if (AmmoFloat < 0.35)
SetBoneScale(17, 0.0, 'mag1b17');
if (AmmoFloat < 0.40)
SetBoneScale(18, 0.0, 'mag1b18');
if (AmmoFloat < 0.45)
SetBoneScale(19, 0.0, 'mag1b19');
if (AmmoFloat < 0.50)
SetBoneScale(20, 0.0, 'mag1b20');
if (AmmoFloat < 0.55)
SetBoneScale(21, 0.0, 'mag1b21');
if (AmmoFloat < 0.60)
SetBoneScale(22, 0.0, 'mag1b22');
if (AmmoFloat < 0.65)
SetBoneScale(23, 0.0, 'mag1b23');
if (AmmoFloat < 0.70)
SetBoneScale(24, 0.0, 'mag1b24');
if (AmmoFloat < 0.75)
SetBoneScale(25, 0.0, 'mag1b25');
if (AmmoFloat < 0.80)
SetBoneScale(26, 0.0, 'mag1b26');
if (AmmoFloat < 0.85)
SetBoneScale(27, 0.0, 'mag1b27');
if (AmmoFloat < 0.90)
SetBoneScale(28, 0.0, 'mag1b28');
if (AmmoFloat < 0.95)
SetBoneScale(29, 0.0, 'mag1b29');
if (AmmoFloat < 1.00)
SetBoneScale(30, 0.0, 'mag1b30');
}
//this function is called somewhere in the reload and on select when mag2 is offscreen, this is needed so subsequent reloads may get full bullets again and just unhides all Mag2 Bullets
simulated function Notify_ShowMag2Bullets()
{
if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) )
return;
SetBoneScale(31, 1.0, 'mag2b1');
SetBoneScale(32, 1.0, 'mag2b2');
SetBoneScale(33, 1.0, 'mag2b3');
SetBoneScale(34, 1.0, 'mag2b4');
SetBoneScale(35, 1.0, 'mag2b5');
SetBoneScale(36, 1.0, 'mag2b6');
SetBoneScale(37, 1.0, 'mag2b7');
SetBoneScale(38, 1.0, 'mag2b8');
SetBoneScale(39, 1.0, 'mag2b9');
SetBoneScale(40, 1.0, 'mag2b10');
SetBoneScale(41, 1.0, 'mag2b11');
SetBoneScale(42, 1.0, 'mag2b12');
SetBoneScale(43, 1.0, 'mag2b13');
SetBoneScale(44, 1.0, 'mag2b14');
SetBoneScale(45, 1.0, 'mag2b15');
SetBoneScale(46, 1.0, 'mag2b16');
SetBoneScale(47, 1.0, 'mag2b17');
SetBoneScale(48, 1.0, 'mag2b18');
SetBoneScale(49, 1.0, 'mag2b19');
SetBoneScale(50, 1.0, 'mag2b20');
SetBoneScale(51, 1.0, 'mag2b21');
SetBoneScale(52, 1.0, 'mag2b22');
SetBoneScale(53, 1.0, 'mag2b23');
SetBoneScale(54, 1.0, 'mag2b24');
SetBoneScale(55, 1.0, 'mag2b25');
SetBoneScale(56, 1.0, 'mag2b26');
SetBoneScale(57, 1.0, 'mag2b27');
SetBoneScale(58, 1.0, 'mag2b28');
SetBoneScale(59, 1.0, 'mag2b29');
SetBoneScale(60, 1.0, 'mag2b30');
}
exec function ReloadMeNow()
{
local float ReloadMulti;
if(!AllowReload())
return;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
ReloadTimer = Level.TimeSeconds;
bShortReload = MagAmmoRemaining > 0;
if ( bShortReload )
ReloadRate = Default.ReloadShortRate / ReloadMulti;
else
ReloadRate = Default.ReloadRate / ReloadMulti;
if( bHoldToReload )
{
NumLoadedThisReload = 0;
}
ClientReload();
Instigator.SetAnimAction(WeaponReloadAnim);
if ( Level.Game.NumPlayers > 1 && KFGameType(Level.Game).bWaveInProgress && KFPlayerController(Instigator.Controller) != none &&
Level.TimeSeconds - KFPlayerController(Instigator.Controller).LastReloadMessageTime > KFPlayerController(Instigator.Controller).ReloadMessageDelay )
{
KFPlayerController(Instigator.Controller).Speech('AUTO', 2, "");
KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds;
}
}
simulated function ClientReload()
{
local float ReloadMulti;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
if (MagAmmoRemaining <= 0)
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
else if (MagAmmoRemaining >= 1)
{
PlayAnim(ReloadShortAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
}
function AddReloadedAmmo()
{
local int a;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
a = MagCapacity;
if ( bShortReload )
a++; // 1 bullet already bolted
if ( AmmoAmount(0) >= a )
MagAmmoRemaining = a;
else
MagAmmoRemaining = AmmoAmount(0);
// this seems redudant -- PooSH
// if( !bHoldToReload )
// {
// ClientForceKFAmmoUpdate(MagAmmoRemaining,AmmoAmount(0));
// }
if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none )
{
KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded();
}
}
simulated function float ChargeBar()
{
return FClamp(float(HealAmmoCharge)/float(MaxAmmoCount),0,9.99);
}
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 Tick(float dt)
{
super(KFWeapon).Tick(dt);
if ( Level.NetMode!=NM_Client && HealAmmoCharge < MaxHealAmmo && RegenTimer<Level.TimeSeconds ) {
RegenTimer = Level.TimeSeconds + AmmoRegenRate;
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
HealAmmoCharge += 10 * KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetSyringeChargeRate(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo));
else
HealAmmoCharge += 10;
if ( HealAmmoCharge > MaxHealAmmo )
HealAmmoCharge = MaxHealAmmo;
}
}
defaultproperties
{
MaxHealAmmo=625
ReloadShortAnim="Reload"
ReloadShortRate=1.830000
MagCapacity=30
ReloadRate=3.250000
WeaponReloadAnim="Reload_AK47"
Weight=6.000000
StandardDisplayFOV=60.000000
TraderInfoTexture=Texture'ScrnWeaponPack_T.cz805.TraderCZ805'
MeshRef="ScrnWeaponPack_A.CZ805_Mesh"
SkinRefs(0)="ScrnWeaponPack_T.cz805.cz805_cmb"
SkinRefs(1)="ScrnWeaponPack_T.cz805.Grip_cmb"
SkinRefs(2)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb"
SkinRefs(3)="KF_Weapons_Trip_T.Rifles.reflex_sight_A_unlit"
SkinRefs(4)="ScrnWeaponPack_T.cz805.eotech_cmb"
SkinRefs(5)="ScrnWeaponPack_T.cz805.Magint_cmb"
SkinRefs(6)="ScrnWeaponPack_T.cz805.Magazine_alpha"
SelectSoundRef="ScrnWeaponPack_SND.cz805.foldback"
HudImageRef="ScrnWeaponPack_T.cz805.UnselectCZ805"
SelectedHudImageRef="ScrnWeaponPack_T.cz805.SelectCZ805"
ZoomedDisplayFOV=32.000000
FireModeClass(0)=Class'ScrnWeaponPack.CZ805MFire'
FireModeClass(1)=Class'ScrnWeaponPack.CZ805MAltFire'
PutDownAnim="Put_Down"
Description="Horzine's modification of CZ-805 BREN rifle with attached healing dart launcher. Usefull for both Medic and Commando perks."
DisplayFOV=60.000000
Priority=95
CustomCrosshair=11
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
GroupOffset=7
PickupClass=Class'ScrnWeaponPack.CZ805MPickup'
PlayerViewOffset=(X=10.000000,Y=12.000000,Z=-3.500000)
BobDamping=5.000000
AttachmentClass=Class'ScrnWeaponPack.CZ805MAttachment'
ItemName="CZ-805M Medic/Assault Rifle SE"
}

View file

@ -0,0 +1,9 @@
class CZ805MAltFire extends MP7MAltFire;
defaultproperties
{
FireRate=0.250000
AmmoPerFire=125
ProjectileClass=Class'ScrnWeaponPack.CZ805MHealingProjectile'
FlashEmitterClass=Class'ScrnWeaponPack.CZ805MMuzzleFlash'
}

View file

@ -0,0 +1,12 @@
class CZ805MAmmo extends KFAmmunition;
defaultproperties
{
AmmoPickupAmount=30
MaxAmmo=360
InitialAmount=180
PickupClass=Class'ScrnWeaponPack.CZ805MAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=336,Y1=82,X2=382,Y2=125)
ItemName="5.56mm bullets"
}

View file

@ -0,0 +1,9 @@
class CZ805MAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=30
InventoryType=Class'ScrnWeaponPack.CZ805MAmmo'
PickupMessage="Rounds 5.56mm"
StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo'
}

View file

@ -0,0 +1,57 @@
class CZ805MAttachment extends KFWeaponAttachment;
defaultproperties
{
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP'
mTracerClass=Class'KFMod.KFNewTracer'
mShellCaseEmitterClass=Class'KFMod.KFShellSpewer'
MovementAnims(0)="JogF_SCAR"
MovementAnims(1)="JogB_SCAR"
MovementAnims(2)="JogL_SCAR"
MovementAnims(3)="JogR_SCAR"
TurnLeftAnim="TurnL_SCAR"
TurnRightAnim="TurnR_SCAR"
CrouchAnims(0)="CHWalkF_SCAR"
CrouchAnims(1)="CHWalkB_SCAR"
CrouchAnims(2)="CHWalkL_SCAR"
CrouchAnims(3)="CHWalkR_SCAR"
WalkAnims(0)="WalkF_SCAR"
WalkAnims(1)="WalkB_SCAR"
WalkAnims(2)="WalkL_SCAR"
WalkAnims(3)="WalkR_SCAR"
CrouchTurnRightAnim="CH_TurnR_SCAR"
CrouchTurnLeftAnim="CH_TurnL_SCAR"
IdleCrouchAnim="CHIdle_SCAR"
IdleWeaponAnim="Idle_SCAR"
IdleRestAnim="Idle_SCAR"
IdleChatAnim="Idle_SCAR"
IdleHeavyAnim="Idle_SCAR"
IdleRifleAnim="Idle_SCAR"
FireAnims(0)="Fire_SCAR"
FireAnims(1)="Fire_SCAR"
FireAnims(2)="Fire_SCAR"
FireAnims(3)="Fire_SCAR"
FireAltAnims(0)="Fire_SCAR"
FireAltAnims(1)="Fire_SCAR"
FireAltAnims(2)="Fire_SCAR"
FireAltAnims(3)="Fire_SCAR"
FireCrouchAnims(0)="CHFire_SCAR"
FireCrouchAnims(1)="CHFire_SCAR"
FireCrouchAnims(2)="CHFire_SCAR"
FireCrouchAnims(3)="CHFire_SCAR"
FireCrouchAltAnims(0)="CHFire_SCAR"
FireCrouchAltAnims(1)="CHFire_SCAR"
FireCrouchAltAnims(2)="CHFire_SCAR"
FireCrouchAltAnims(3)="CHFire_SCAR"
HitAnims(0)="HitF_SCAR"
HitAnims(1)="HitB_SCAR"
HitAnims(2)="HitL_SCAR"
HitAnims(3)="HitR_SCAR"
PostFireBlendStandAnim="Blend_SCAR"
PostFireBlendCrouchAnim="CHBlend_SCAR"
MeshRef="ScrnWeaponPack_A.CZ805Bren_3rd"
bRapidFire=True
bAltRapidFire=True
SplashEffect=Class'ROEffects.BulletSplashEmitter'
CullDistance=5000.000000
}

View file

@ -0,0 +1,36 @@
class CZ805MFire extends KFFire;
defaultproperties
{
FireAimedAnim="Fire_Iron"
RecoilRate=0.060000
maxVerticalRecoilAngle=150
maxHorizontalRecoilAngle=75
ShellEjectClass=Class'ScrnWeaponPack.CZ805MShellEject'
ShellEjectBoneName="Shell_eject"
bAccuracyBonusForSemiAuto=True
FireSoundRef="ScrnWeaponPack_SND.cz805.Firecz805b"
NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire"
DamageType=Class'ScrnWeaponPack.DamTypeCZ805M'
DamageMax=41
Momentum=12500.000000
bPawnRapidFireAnim=True
TransientSoundVolume=1.800000
FireLoopAnim="Fire"
TweenTime=0.025000
FireForce="AssaultRifleFire"
FireRate=0.090000
AmmoClass=Class'ScrnWeaponPack.CZ805MAmmo'
AmmoPerFire=1
ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000)
ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000)
ShakeRotTime=0.650000
ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=1.150000
BotRefireRate=0.990000
FlashEmitterClass=Class'ScrnWeaponPack.CZ805MMuzzleFlash'
aimerror=42.000000
Spread=0.007500
SpreadStyle=SS_Random
}

View file

@ -0,0 +1,6 @@
class CZ805MHealingProjectile extends ScrnHealingProjectile;
defaultproperties
{
HealBoostAmount=10
}

View file

@ -0,0 +1,44 @@
class CZ805MMuzzleFlash extends MuzzleFlash1stSTG;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseSubdivisionScale=True
UseRandomSubdivision=True
Opacity=0.500000
CoordinateSystem=PTCS_Relative
UseRotationFrom=PTRS_Actor
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=2.000000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=7.000000,Max=7.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.STGmuzzleflash_4frame'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.CZ805MMuzzleFlash.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
Opacity=0.100000
MaxParticles=1
StartSizeRange=(X=(Min=35.000000,Max=35.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.CZ805MMuzzleFlash.SpriteEmitter1'
}

View file

@ -0,0 +1,25 @@
class CZ805MPickup extends KFWeaponPickup;
defaultproperties
{
Weight=6.000000
cost=3000
AmmoCost=14
BuyClipSize=31
PowerValue=45
SpeedValue=85
RangeValue=70
Description="Horzine's modification of CZ-805 BREN rifle with attached healing dart launcher. Usefull for both Medic and Commando perks."
ItemName="CZ-805M SE"
ItemShortName="CZ-805M SE"
AmmoItemName="5.56mm Ammo"
AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo'
EquipmentCategoryID=3
InventoryType=Class'ScrnWeaponPack.CZ805M'
PickupMessage="You got the CZ-805M"
PickupSound=Sound'KF_SCARSnd.SCAR_Pickup'
PickupForce="ScrnWeaponPack.cz805bPickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.CZ805Bren_P'
CollisionRadius=25.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,65 @@
class CZ805MShellEject extends KFShellEject;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(1);
Emitters[1].SpawnParticle(1);
}
defaultproperties
{
Begin Object Class=MeshEmitter Name=MeshEmitter0
StaticMesh=StaticMesh'kf_generic_sm.Bullet_Shells.winchester_shell'
RespawnDeadParticles=False
ZTest=False
SpinParticles=True
AutomaticInitialSpawning=False
Acceleration=(Z=-500.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
MaxParticles=50
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000))
StartSizeRange=(X=(Min=1.750000,Max=1.750000),Y=(Min=1.750000,Max=1.750000),Z=(Min=1.750000,Max=1.750000))
LifetimeRange=(Min=5.000000,Max=5.000000)
StartVelocityRange=(X=(Min=75.000000,Max=100.000000),Y=(Min=-20.000000,Max=-40.000000),Z=(Min=50.000000,Max=75.000000))
End Object
Emitters(0)=MeshEmitter'ScrnWeaponPack.CZ805MShellEject.MeshEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseDirectionAs=PTDU_Up
UseCollision=True
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
ScaleSizeXByVelocity=True
AutomaticInitialSpawning=False
Acceleration=(Z=-210.000000)
DampingFactorRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000))
ColorScale(0)=(Color=(B=255,G=255,R=187))
ColorScale(1)=(RelativeTime=0.214286,Color=(G=103,R=206,A=255))
ColorScale(2)=(RelativeTime=0.439286,Color=(B=100,G=177,R=255,A=255))
ColorScale(3)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255))
ColorScale(4)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255))
ColorScale(5)=(RelativeTime=1.000000,Color=(R=128,A=255))
ColorScale(6)=(RelativeTime=1.000000)
ColorScale(7)=(RelativeTime=1.000000)
FadeOutStartTime=0.336000
FadeInEndTime=0.064000
MaxParticles=50
UseRotationFrom=PTRS_Actor
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=0.350000,Max=0.350000),Y=(Min=0.350000,Max=0.350000),Z=(Min=0.350000,Max=0.350000))
ScaleSizeByVelocityMultiplier=(X=0.010000,Y=0.010000)
Texture=Texture'KFX.KFSparkHead'
LifetimeRange=(Min=1.500000,Max=1.500000)
StartVelocityRange=(X=(Min=-100.000000,Max=100.000000),Y=(Min=50.000000,Max=100.000000),Z=(Min=50.000000,Max=100.000000))
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.CZ805MShellEject.SpriteEmitter0'
}

View file

@ -0,0 +1,475 @@
//==================================================
//==================================================
// Whisky's Colt Python
// Balance job by PooSH
//==================================================
class Colt extends KFWeapon;
var float ReloadMulti;
var float BulletUnloadRate; // how long does it takes to unload empty bullets
var float BulletLoadRate; // how long does it takes to load a single bullet
var transient bool bInterruptedReload;
var transient float NextBulletLoadTime;
// Implemented revolver-specific reloading
// Reload State 1 (uninterruptable): opening drum and unloading empty bullets. Lasts BulletUnloadRate seconds.
// Reload State 2: loading bullets. Each bullet load takes BulletLoadRate seconds.
// Reload State 3: closing drum.
simulated function WeaponTick(float dt)
{
local float LastSeenSeconds;
if( bHasAimingMode ) {
if( bForceLeaveIronsights ) {
if( bAimingRifle ) {
ZoomOut(true);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
bForceLeaveIronsights = false;
}
if( ForceZoomOutTime > 0 ) {
if( bAimingRifle ) {
if( Level.TimeSeconds - ForceZoomOutTime > 0 ) {
ForceZoomOutTime = 0;
ZoomOut(true);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
}
else {
ForceZoomOutTime = 0;
}
}
}
if ( Role < ROLE_Authority )
return;
if ( bIsReloading ) {
if (AmmoAmount(0) <= MagAmmoRemaining )
InterruptReload(); //force interrupt if loaded last bullet
if( Level.TimeSeconds >= ReloadTimer ) {
ActuallyFinishReloading();
}
else if ( !bInterruptedReload && Level.TimeSeconds >= NextBulletLoadTime ) {
if ( MagAmmoRemaining >= MagCapacity || MagAmmoRemaining >= AmmoAmount(0) )
NextBulletLoadTime += 1000; // don't load bullets anymore
else {
MagAmmoRemaining++;
NextBulletLoadTime += BulletLoadRate;
}
}
}
else if( !Instigator.IsHumanControlled() ) { // bot
LastSeenSeconds = Level.TimeSeconds - Instigator.Controller.LastSeenTime;
if(MagAmmoRemaining == 0 || ((LastSeenSeconds >= 5 || LastSeenSeconds > MagAmmoRemaining) && MagAmmoRemaining < MagCapacity))
ReloadMeNow();
}
// Turn it off on death / battery expenditure
if (FlashLight != none)
{
// Keep the 1Pweapon client beam up to date.
AdjustLightGraphic();
if (FlashLight.bHasLight)
{
if (Instigator.Health <= 0 || KFHumanPawn(Instigator).TorchBatteryLife <= 0 || Instigator.PendingWeapon != none )
{
//Log("Killing Light...you're out of batteries, or switched / dropped weapons");
KFHumanPawn(Instigator).bTorchOn = false;
ServerSpawnLight();
}
}
}
}
simulated function bool AllowReload()
{
if ( bIsReloading || MagAmmoRemaining >= AmmoAmount(0) )
return false;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
if ( MagAmmoRemaining >= MagCapacity )
return false;
if( KFInvasionBot(Instigator.Controller) != none || KFFriendlyAI(Instigator.Controller) != none )
return true;
return !FireMode[0].IsFiring() && !FireMode[1].IsFiring()
&& Level.TimeSeconds > (FireMode[0].NextFireTime - 0.1);
}
// Since vanilla reloading replication is totally fucked, I moved base code into separate,
// replication-free function, which is executed on both server and client side
// -- PooSH
simulated function DoReload()
{
if ( bHasAimingMode && bAimingRifle ) {
FireMode[1].bIsFiring = False;
ZoomOut(false);
// ZoomOut() just a moment ago was executed on server side - why to force it again? -- PooSH
// if( Role < ROLE_Authority)
// ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
bInterruptedReload = false;
BulletUnloadRate = default.BulletUnloadRate / ReloadMulti;
BulletLoadRate = default.BulletLoadRate / ReloadMulti;
NextBulletLoadTime = Level.TimeSeconds + BulletUnloadRate + BulletLoadRate;
// more bullets left = less time to reload
ReloadRate = default.ReloadRate / ReloadMulti;
ReloadRate -= MagAmmoRemaining * BulletLoadRate;
ReloadTimer = Level.TimeSeconds + ReloadRate;
Instigator.SetAnimAction(WeaponReloadAnim);
}
// This function is triggered by client, replicated to server and NOT EXECUTED on client,
// even if marked as simulated
exec function ReloadMeNow()
{
local KFPlayerController PC;
if ( !AllowReload() )
return;
DoReload();
ClientReload();
PC = KFPlayerController(Instigator.Controller);
if ( PC != none && Level.Game.NumPlayers > 1 && KFGameType(Level.Game).bWaveInProgress
&& Level.TimeSeconds - PC.LastReloadMessageTime > PC.ReloadMessageDelay )
{
KFPlayerController(Instigator.Controller).Speech('AUTO', 2, "");
KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds;
}
}
function ServerRequestAutoReload()
{
ReloadMeNow();
}
// This function now is triggered by ReloadMeNow() and executed on local side only
simulated function ClientReload()
{
DoReload();
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
function AddReloadedAmmo() {} // magazine is filled in WeaponTick now
simulated function bool StartFire(int Mode)
{
if ( MagAmmoRemaining <= 0 )
return false;
if ( bIsReloading ) {
InterruptReload();
return false;
}
return super(Weapon).StartFire(Mode);
}
simulated function AltFire(float F)
{
InterruptReload();
}
// another fucked up replication...
// By the looks if it, InterruptReload() is called only on client, which triggers ServerInterruptReload().
// Anyway, why server would want to interrupt reload by its own?..
simulated function bool InterruptReload()
{
if( bIsReloading && !bInterruptedReload && (ReloadTimer - Level.TimeSeconds)*ReloadMulti > 0.7/ReloadMulti )
{
// that's very lame how to do stuff like that - don't repeat it at home ;)
// in theory client should send server a request to interrupt the reload,
// and the server send back accept to client.
// But in such case we have a double chance of screwing the shit up, so let's just
// do it lazy way.
ServerInterruptReload();
ClientInterruptReload();
return true;
}
return false;
}
function ServerInterruptReload()
{
if ( Role == ROLE_Authority ) {
ReloadTimer = Level.TimeSeconds + 0.5/ReloadMulti;
bInterruptedReload = true;
SetAnimFrame(112, 0 , 1); // go to closing drum stage
}
}
simulated function ClientInterruptReload()
{
if ( Role < ROLE_Authority ) {
bInterruptedReload = true;
SetAnimFrame(112, 0 , 1); // go to closing drum stage
ShowAllBullets();
}
}
simulated exec function ToggleIronSights()
{
if( bHasAimingMode ) {
if( bAimingRifle )
PerformZoom(false);
else
IronSightZoomIn();
}
}
simulated exec function IronSightZoomIn()
{
if( bHasAimingMode ) {
if( Owner != none && Owner.Physics == PHYS_Falling
&& Owner.PhysicsVolume.Gravity.Z <= class'PhysicsVolume'.default.Gravity.Z )
return;
if( bIsReloading )
InterruptReload(); // finish reloading while zooming in -- PooSH
PerformZoom(True);
}
}
simulated function bool PutDown()
{
local int Mode;
// continue here, because there is nothing to stop us from interrupting the reload -- PooSH
if ( bIsReloading )
InterruptReload();
if( bAimingRifle )
ZoomOut(False);
// From Weapon.uc
if (ClientState == WS_BringUp || ClientState == WS_ReadyToFire)
{
if ( (Instigator.PendingWeapon != None) && !Instigator.PendingWeapon.bForceSwitch )
{
for (Mode = 0; Mode < NUM_FIRE_MODES; Mode++)
{
// if _RO_
if( FireMode[Mode] == none )
continue;
// End _RO_
if ( FireMode[Mode].bFireOnRelease && FireMode[Mode].bIsFiring )
return false;
if ( FireMode[Mode].NextFireTime > Level.TimeSeconds + FireMode[Mode].FireRate*(1.f - MinReloadPct))
DownDelay = FMax(DownDelay, FireMode[Mode].NextFireTime - Level.TimeSeconds - FireMode[Mode].FireRate*(1.f - MinReloadPct));
}
}
if (Instigator.IsLocallyControlled())
{
for (Mode = 0; Mode < NUM_FIRE_MODES; Mode++)
{
// if _RO_
if( FireMode[Mode] == none )
continue;
// End _RO_
if ( FireMode[Mode].bIsFiring )
ClientStopFire(Mode);
}
if ( DownDelay <= 0 || KFPawn(Instigator).bIsQuickHealing > 0)
{
if ( ClientState == WS_BringUp || KFPawn(Instigator).bIsQuickHealing > 0 )
TweenAnim(SelectAnim,PutDownTime);
else if ( HasAnim(PutDownAnim) )
{
if( ClientGrenadeState == GN_TempDown || KFPawn(Instigator).bIsQuickHealing > 0)
{
PlayAnim(PutDownAnim, PutDownAnimRate * (PutDownTime/QuickPutDownTime), 0.0);
}
else
{
PlayAnim(PutDownAnim, PutDownAnimRate, 0.0);
}
}
}
}
ClientState = WS_PutDown;
if ( Level.GRI.bFastWeaponSwitching )
DownDelay = 0;
if ( DownDelay > 0 )
{
SetTimer(DownDelay, false);
}
else
{
if( ClientGrenadeState == GN_TempDown )
{
SetTimer(QuickPutDownTime, false);
}
else
{
SetTimer(PutDownTime, false);
}
}
}
for (Mode = 0; Mode < NUM_FIRE_MODES; Mode++)
{
// if _RO_
if( FireMode[Mode] == none )
continue;
// End _RO_
FireMode[Mode].bServerDelayStartFire = false;
FireMode[Mode].bServerDelayStopFire = false;
}
Instigator.AmbientSound = None;
OldWeapon = None;
return true; // return false if preventing weapon switch
}
simulated function Notify_DropBullets()
{
if ( !Instigator.IsLocallyControlled() )
return ;
// bullets are reloaded in this order: 2,1,5,4,6,3
switch ( MagAmmoRemaining ) {
case 5:
SetBoneScale(1, 0.0, 'b1');
SetBoneScale(2, 0.0, 'b2');
SetBoneScale(3, 1.0, 'b3');
SetBoneScale(4, 0.0, 'b4');
SetBoneScale(5, 0.0, 'b5');
SetBoneScale(6, 0.0, 'b6');
break;
case 4:
SetBoneScale(1, 0.0, 'b1');
SetBoneScale(2, 0.0, 'b2');
SetBoneScale(3, 1.0, 'b3');
SetBoneScale(4, 0.0, 'b4');
SetBoneScale(5, 0.0, 'b5');
SetBoneScale(6, 1.0, 'b6');
break;
case 3:
SetBoneScale(1, 0.0, 'b1');
SetBoneScale(2, 0.0, 'b2');
SetBoneScale(3, 1.0, 'b3');
SetBoneScale(4, 1.0, 'b4');
SetBoneScale(5, 0.0, 'b5');
SetBoneScale(6, 1.0, 'b6');
break;
case 2:
SetBoneScale(1, 0.0, 'b1');
SetBoneScale(2, 0.0, 'b2');
SetBoneScale(3, 1.0, 'b3');
SetBoneScale(4, 1.0, 'b4');
SetBoneScale(5, 1.0, 'b5');
SetBoneScale(6, 1.0, 'b6');
break;
case 1:
SetBoneScale(1, 1.0, 'b1');
SetBoneScale(2, 0.0, 'b2');
SetBoneScale(3, 1.0, 'b3');
SetBoneScale(4, 1.0, 'b4');
SetBoneScale(5, 1.0, 'b5');
SetBoneScale(6, 1.0, 'b6');
break;
default:
SetBoneScale(1, 1.0, 'b1');
SetBoneScale(2, 1.0, 'b2');
SetBoneScale(3, 1.0, 'b3');
SetBoneScale(4, 1.0, 'b4');
SetBoneScale(5, 1.0, 'b5');
SetBoneScale(6, 1.0, 'b6');
}
}
simulated function Notify_InsertBullets()
{
ShowAllBullets();
switch ( MagAmmoRemaining ) {
case 5: SetAnimFrame(82, 0 , 1); break;
case 4: SetAnimFrame(71.5, 0 , 1); break;
case 3: SetAnimFrame(61, 0 , 1); break;
case 2: SetAnimFrame(50.5, 0 , 1); break;
case 1: SetAnimFrame(38.5, 0 , 1); break;
}
}
simulated function ShowAllBullets()
{
if ( !Instigator.IsLocallyControlled() )
return ;
// restore bones
// bullets are reloaded in this order: 2,1,5,4,6,3
SetBoneScale(1, 1.0, 'b1');
SetBoneScale(2, 1.0, 'b2');
SetBoneScale(3, 1.0, 'b3');
SetBoneScale(4, 1.0, 'b4');
SetBoneScale(5, 1.0, 'b5');
SetBoneScale(6, 1.0, 'b6');
}
defaultproperties
{
BulletUnloadRate=1.000000
BulletLoadRate=0.475000
FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000)
MagCapacity=6
ReloadRate=5.500000
ReloadAnim="Reload"
ReloadAnimRate=1.200000
bHoldToReload=True
WeaponReloadAnim="Reload_Revolver"
Weight=5.000000
bHasAimingMode=True
IdleAimAnim="IronIdle"
StandardDisplayFOV=70.000000
bModeZeroCanDryFire=True
SleeveNum=0
TraderInfoTexture=Texture'ScrnWeaponPack_T.Colt.Trader_WColt'
MeshRef="ScrnWeaponPack_A.colt_weapon"
SkinRefs(1)="ScrnWeaponPack_T.Colt.ColtV2_T"
HudImageRef="ScrnWeaponPack_T.Colt.WColt_Unselected"
SelectedHudImageRef="ScrnWeaponPack_T.Colt.WColt"
ZoomedDisplayFOV=65.000000
FireModeClass(0)=Class'ScrnWeaponPack.ColtFire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectSound=Sound'KF_9MMSnd.9mm_Select'
AIRating=0.250000
CurrentRating=0.250000
bShowChargingBar=True
Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up."
DisplayFOV=70.000000
Priority=110
InventoryGroup=2
GroupOffset=1
PickupClass=Class'ScrnWeaponPack.ColtPickup'
PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000)
BobDamping=6.000000
AttachmentClass=Class'ScrnWeaponPack.ColtAttachment'
IconCoords=(X1=434,Y1=253,X2=506,Y2=292)
ItemName="Colt Python SE"
}

View file

@ -0,0 +1,17 @@
//=============================================================================
// ColtAmmo
//=============================================================================
class ColtAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=InterfaceContent.utx
defaultproperties
{
AmmoPickupAmount=6
MaxAmmo=60
InitialAmount=30
PickupClass=Class'KFMod.SingleAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=413,Y1=82,X2=457,Y2=125)
ItemName=".357 bullets"
}

View file

@ -0,0 +1,10 @@
class ColtAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=6
InventoryType=Class'ScrnWeaponPack.ColtAmmo'
RespawnTime=0.000000
PickupMessage=".357 Ammo"
StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo'
}

View file

@ -0,0 +1,51 @@
class ColtAttachment extends KFWeaponAttachment;
defaultproperties
{
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol'
mTracerClass=Class'KFMod.KFLargeTracer'
MovementAnims(0)="JogF_Single9mm"
MovementAnims(1)="JogB_Single9mm"
MovementAnims(2)="JogL_Single9mm"
MovementAnims(3)="JogR_Single9mm"
TurnLeftAnim="TurnL_Single9mm"
TurnRightAnim="TurnR_Single9mm"
CrouchAnims(0)="CHwalkF_Single9mm"
CrouchAnims(1)="CHwalkB_Single9mm"
CrouchAnims(2)="CHwalkL_Single9mm"
CrouchAnims(3)="CHwalkR_Single9mm"
CrouchTurnRightAnim="CH_TurnR_Single9mm"
CrouchTurnLeftAnim="CH_TurnL_Single9mm"
IdleCrouchAnim="CHIdle_Single9mm"
IdleWeaponAnim="Idle_Single9mm"
IdleRestAnim="Idle_Single9mm"
IdleChatAnim="Idle_Single9mm"
IdleHeavyAnim="Idle_Single9mm"
IdleRifleAnim="Idle_Single9mm"
FireAnims(0)="Fire_Single9mm"
FireAnims(1)="Fire_Single9mm"
FireAnims(2)="Fire_Single9mm"
FireAnims(3)="Fire_Single9mm"
FireAltAnims(0)="Fire_Single9mm"
FireAltAnims(1)="Fire_Single9mm"
FireAltAnims(2)="Fire_Single9mm"
FireAltAnims(3)="Fire_Single9mm"
FireCrouchAnims(0)="CHFire_Single9mm"
FireCrouchAnims(1)="CHFire_Single9mm"
FireCrouchAnims(2)="CHFire_Single9mm"
FireCrouchAnims(3)="CHFire_Single9mm"
FireCrouchAltAnims(0)="CHFire_Single9mm"
FireCrouchAltAnims(1)="CHFire_Single9mm"
FireCrouchAltAnims(2)="CHFire_Single9mm"
FireCrouchAltAnims(3)="CHFire_Single9mm"
HitAnims(0)="HitF_Single9mm"
HitAnims(1)="HitB_Single9mm"
HitAnims(2)="HitL_Single9mm"
HitAnims(3)="HitR_Single9mm"
PostFireBlendStandAnim="Blend_Single9mm"
PostFireBlendCrouchAnim="CHBlend_Single9mm"
MeshRef="ScrnWeaponPack_A.W_Colt_Python_3rd"
bHeavy=True
SplashEffect=Class'ROEffects.BulletSplashEmitter'
CullDistance=5000.000000
}

View file

@ -0,0 +1,181 @@
//=============================================================================
// Colt Fire
//=============================================================================
class ColtFire extends KFFire;
var float PenDmgReduction; //penetration damage reduction. 1.0 - no reduction, 25% reduction
var byte MaxPenetrations; //how many enemies can penetrate a single bullet
function DoTrace(Vector Start, Rotator Dir)
{
local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd;
local Actor Other;
local byte HitCount, PenCounter, KillCount;
local float HitDamage;
local array<int> HitPoints;
local KFPawn HitPawn;
local array<Actor> IgnoreActors;
local Pawn DamagePawn;
local int i;
local KFMonster Monster;
local bool bWasDecapitated;
//local int OldHealth;
MaxRange();
Weapon.GetViewAxes(X, Y, Z);
if ( Weapon.WeaponCentered() )
{
ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z);
}
else
{
ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X +
Weapon.Hand * Weapon.EffectOffset.Y * Y + Weapon.EffectOffset.Z * Z);
}
X = Vector(Dir);
End = Start + TraceRange * X;
HitDamage = DamageMax;
// HitCount isn't a number of max penetration. It is just to be sure we won't stuck in infinite loop
While( ++HitCount < 127 )
{
DamagePawn = none;
Monster = none;
Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1);
if( Other==None )
{
Break;
}
else if( Other==Instigator || Other.Base == Instigator )
{
IgnoreActors[IgnoreActors.Length] = Other;
Other.SetCollision(false);
Start = HitLocation;
Continue;
}
if( ExtendedZCollision(Other)!=None && Other.Owner!=None )
{
IgnoreActors[IgnoreActors.Length] = Other;
IgnoreActors[IgnoreActors.Length] = Other.Owner;
Other.SetCollision(false);
Other.Owner.SetCollision(false);
DamagePawn = Pawn(Other.Owner);
Monster = KFMonster(Other.Owner);
}
if ( !Other.bWorldGeometry && Other!=Level )
{
HitPawn = KFPawn(Other);
if ( HitPawn != none )
{
// Hit detection debugging
/*log("PreLaunchTrace hit "$HitPawn.PlayerReplicationInfo.PlayerName);
HitPawn.HitStart = Start;
HitPawn.HitEnd = End;*/
if(!HitPawn.bDeleteMe)
HitPawn.ProcessLocationalDamage(int(HitDamage), Instigator, HitLocation, Momentum*X,DamageType,HitPoints);
// Hit detection debugging
/*if( Level.NetMode == NM_Standalone)
HitPawn.DrawBoneLocation();*/
IgnoreActors[IgnoreActors.Length] = Other;
IgnoreActors[IgnoreActors.Length] = HitPawn.AuxCollisionCylinder;
Other.SetCollision(false);
HitPawn.AuxCollisionCylinder.SetCollision(false);
DamagePawn = HitPawn;
}
else
{
if( DamagePawn == none )
DamagePawn = Pawn(Other);
if( KFMonster(Other)!=None )
{
IgnoreActors[IgnoreActors.Length] = Other;
Other.SetCollision(false);
Monster = KFMonster(Other);
//OldHealth = KFMonster(Other).Health;
}
bWasDecapitated = Monster != none && Monster.bDecapitated;
Other.TakeDamage(int(HitDamage), Instigator, HitLocation, Momentum*X, DamageType);
if ( DamagePawn != none && (DamagePawn.Health <= 0 || (Monster != none
&& !bWasDecapitated && Monster.bDecapitated)) )
{
KillCount++;
}
// debug info
// if ( KFMonster(Other) != none )
// log(String(class) $ ": Damage("$PenCounter$") = "
// $ int(HitDamage) $"/"$ (OldHealth-KFMonster(Other).Health)
// @ KFMonster(Other).MenuName , class.outer.name);
}
if( ++PenCounter > MaxPenetrations || DamagePawn==None )
{
Break;
}
HitDamage *= PenDmgReduction;
Start = HitLocation;
}
else if ( HitScanBlockingVolume(Other)==None )
{
if( KFWeaponAttachment(Weapon.ThirdPersonActor)!=None )
KFWeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal);
Break;
}
}
// Turn the collision back on for any actors we turned it off
if ( IgnoreActors.Length > 0 )
{
for (i=0; i<IgnoreActors.Length; i++)
{
if ( IgnoreActors[i] != none )
IgnoreActors[i].SetCollision(true);
}
}
}
defaultproperties
{
PenDmgReduction=0.500000
MaxPenetrations=2
RecoilRate=0.400000
maxVerticalRecoilAngle=3000
maxHorizontalRecoilAngle=500
FireSoundRef="ScrnWeaponPack_SND.Colt.357_fire3"
StereoFireSoundRef="ScrnWeaponPack_SND.Colt.ScrnWeaponPack.357_fire3_ST"
NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire"
DamageType=Class'ScrnWeaponPack.DamTypeColt'
DamageMin=350
DamageMax=350
Momentum=10000.000000
bWaitForRelease=True
bAttachSmokeEmitter=True
TransientSoundVolume=2.000000
TransientSoundRadius=150.000000
FireAnimRate=1.500000
TweenTime=0.025000
FireForce="AssaultRifleFire"
FireRate=0.900000
AmmoClass=Class'ScrnWeaponPack.ColtAmmo'
AmmoPerFire=1
ShakeRotMag=(X=75.000000,Y=75.000000,Z=400.000000)
ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=10000.000000)
ShakeRotTime=3.500000
ShakeOffsetMag=(X=6.000000,Y=1.000000,Z=8.000000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=2.500000
BotRefireRate=0.350000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=30.000000
Spread=0.015000
SpreadStyle=SS_Random
}

View file

@ -0,0 +1,27 @@
//==================================================
// Colt Python Pickup.
//==================================================
class ColtPickup extends KFWeaponPickup;
defaultproperties
{
Weight=5.000000
cost=1250
AmmoCost=30
BuyClipSize=6
PowerValue=85
SpeedValue=20
RangeValue=35
Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up."
ItemName="Colt Python SE"
ItemShortName="Colt SE"
AmmoItemName=".357"
CorrespondingPerkIndex=8
EquipmentCategoryID=1
InventoryType=Class'ScrnWeaponPack.Colt'
PickupMessage="You got the Colt Python handgun"
PickupSound=Sound'KF_9MMSnd.9mm_Pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.WColt_Pickup'
CollisionHeight=5.000000
}

View file

@ -0,0 +1,152 @@
//=============================================================================
// DGVEmitter.
//
// Directional/Gravitational Velocity Emitter.
// X Velocity makes particles move forward according to emitter rotation
// Y Velocity makes particles move Left/Right
// Z Is Up/Down no matter what angle the emitter is rotated
// Unfortunately this is only for the StartVelocityRange
// bAutoAlignVelocity can be used to automatically realign the StartVelocity
// if the emitter is rotated.
//
// by Nolan "Dark Carnivour" Richert.
// Copyright(c) 2005 RuneStorm. All Rights Reserved.
//=============================================================================
class DGVEmitter extends BallisticEmitter
placeable;
var() bool bAutoAlignVelocity; //If true, StartVelocityRange is automatically realigned when emitter rotates
var Rotator OldRotation; //Last different rotation. Used to check if emitter rotated
var Range SVX[8], SVY[8], SVZ[8]; //Arrays used to store initial StartVelocityRange values
var() Array<int> DisableDGV; //Disable DVG for individual emitter by entering a value
var() bool bAutoInit; //Disable to prevent InitDGV from being run from PostBeginPlay()
var() bool bAlignOnTrigger; //Align velocity when triggered
var() bool bVerticalZ; //Velocity Z is not relative, it moves particles along world Z axis (useful for simulating gravity)
var() bool bYIsSpread; //Y velocity applied to Z axis as emmiter aims up. Only works with bVerticalZ (removes flat looking spread)
var() bool bModifyLossRange; //Allow messing with VelocityLossRange...
simulated event PostBeginPlay ()
{
Super.PostBeginPlay();
if (bAutoInit)
InitDGV();
}
simulated function InitDGV()
{
local int i;
for (i=0;i<Emitters.Length;i++)
{
if (DisableDGV.Length > i && DisableDGV[i] != 0)
continue;
//Remember some stuff...
SVX[i] = Emitters[i].StartVelocityRange.X;
SVY[i] = Emitters[i].StartVelocityRange.Y;
SVZ[i] = Emitters[i].StartVelocityRange.Z;
}
//Set up for auto align
if (bAutoAlignVelocity)
{
OldRotation = Rotation;
SetTimer (0.1, True);
}
//Initial alignment
AlignVelocity();
}
event Trigger( Actor Other, Pawn EventInstigator )
{
if (bAlignOnTrigger)
AlignVelocity();
Super.Trigger (Other, EventInstigator);
}
// Calculate the StartVelocityRange according to rotation
simulated function AlignVelocity ()
{
// local Range SV0;
local int i;
local vector X, Y, Z, VMax, VMin;
GetAxes(Rotation,X,Y,Z);
for (i=0;i<Emitters.Length;i++)
{
if (DisableDGV.Length > i && DisableDGV[i] != 0)
continue;
// if (SVX[i] == SV0 && SVY[i] == SV0 && SVZ[i] == SV0)
// continue;
//Adjust StartVelocityRange
if (bVerticalZ)
{
VMax = X * SVX[i].Max + Y * SVY[i].Max + Vect(0,0,1) * SVZ[i].Max;
VMin = X * SVX[i].Min + Y * SVY[i].Min + Vect(0,0,1) * SVZ[i].Min;
if (bYIsSpread)
{
VMax = VMax + Z * SVY[i].Max * Abs(X.Z);
VMin = VMin + Z * SVY[i].Min * Abs(X.Z);
}
}
else
{
VMax = X * SVX[i].Max + Y * SVY[i].Max + Z * SVZ[i].Max;
VMin = X * SVX[i].Min + Y * SVY[i].Min + Z * SVZ[i].Min;
}
Emitters[i].StartVelocityRange = VtoRV(VMax, VMin);
//Adjust StartLocationRange
VMax = X * default.Emitters[i].StartLocationRange.X.Max + Y * default.Emitters[i].StartLocationRange.Y.Max + Z * default.Emitters[i].StartLocationRange.Z.Max;
VMin = X * default.Emitters[i].StartLocationRange.X.Min + Y * default.Emitters[i].StartLocationRange.Y.Min + Z * default.Emitters[i].StartLocationRange.Z.Min;
Emitters[i].StartLocationRange = VtoRV(VMax, VMin);
//Adjust StartLocationOffset
Emitters[i].StartLocationOffset = X * default.Emitters[i].StartLocationOffset.X + Y * default.Emitters[i].StartLocationOffset.Y + Z * default.Emitters[i].StartLocationOffset.Z;
if (SpriteEmitter(Emitters[i])!=None)
{
// Adjust ProjectionNormal
SpriteEmitter(Emitters[i]).ProjectionNormal = X * SpriteEmitter(default.Emitters[i]).ProjectionNormal.X + Y * SpriteEmitter(default.Emitters[i]).ProjectionNormal.Y + Z * SpriteEmitter(default.Emitters[i]).ProjectionNormal.Z;
}
//Adjust VelocityLossRange
if (bModifyLossRange)
{
// VMax = Abs(X * default.Emitters[i].VelocityLossRange.X.Max) + Abs(Y * default.Emitters[i].VelocityLossRange.Y.Max) + Abs(Z * default.Emitters[i].VelocityLossRange.Z.Max);
// VMin = Abs(X * default.Emitters[i].VelocityLossRange.X.Min) + Abs(Y * default.Emitters[i].VelocityLossRange.Y.Min) + Abs(Z * default.Emitters[i].VelocityLossRange.Z.Min);
VMax.X = Abs(X.X * default.Emitters[i].VelocityLossRange.X.Max) + Abs(X.Y * default.Emitters[i].VelocityLossRange.X.Max) + Abs(X.Z * default.Emitters[i].VelocityLossRange.X.Max);
VMax.Y = Abs(Y.X * default.Emitters[i].VelocityLossRange.Y.Max) + Abs(Y.Y * default.Emitters[i].VelocityLossRange.Y.Max) + Abs(Y.Z * default.Emitters[i].VelocityLossRange.Y.Max);
VMax.Z = Abs(Z.X * default.Emitters[i].VelocityLossRange.Z.Max) + Abs(Z.Y * default.Emitters[i].VelocityLossRange.Z.Max) + Abs(Z.Z * default.Emitters[i].VelocityLossRange.Z.Max);
VMin.X = Abs(X.X * default.Emitters[i].VelocityLossRange.X.Min) + Abs(X.Y * default.Emitters[i].VelocityLossRange.X.Min) + Abs(X.Z * default.Emitters[i].VelocityLossRange.X.Min);
VMin.Y = Abs(Y.X * default.Emitters[i].VelocityLossRange.Y.Min) + Abs(Y.Y * default.Emitters[i].VelocityLossRange.Y.Min) + Abs(Y.Z * default.Emitters[i].VelocityLossRange.Y.Min);
VMin.Z = Abs(Z.X * default.Emitters[i].VelocityLossRange.Z.Min) + Abs(Z.Y * default.Emitters[i].VelocityLossRange.Z.Min) + Abs(Z.Z * default.Emitters[i].VelocityLossRange.Z.Min);
Emitters[i].VelocityLossRange = VtoRV(VMax, VMin);
}
}
}
// Check to see if we should realign StartVelocityRange every 0.1 seconds
simulated event timer ()
{
if (!bAutoAlignVelocity)
return;
if (Rotation != OldRotation)
{
OldRotation = Rotation;
AlignVelocity();
}
}
defaultproperties
{
bAutoInit=True
bAlignOnTrigger=True
bVerticalZ=True
bYIsSpread=True
bModifyLossRange=True
bNoDelete=False
bDirectional=True
}

View file

@ -0,0 +1,28 @@
class DamTypeAK12AssaultRifle extends KFProjectileWeaponDamageType
abstract;
// Award also Shiver kills with 2x Stalker progress
// Count only 1 kill from now on, because new version of Shiver.se calls
// AwardKill() twice: for the decapitator and for the killer
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
if( Killed.IsA('ZombieStalker') || Killed.IsA('ZombieShiver') )
KFStatsAndAchievements.AddStalkerKill();
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
{
KFStatsAndAchievements.AddBullpupDamage(Amount);
}
defaultproperties
{
HeadShotDamageMult=1.300000
WeaponClass=Class'ScrnWeaponPack.AK12AssaultRifle'
DeathString="%k killed %o (AK-12)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
KDeathVel=400.000000
KDeathUpKick=120.000000
}

View file

@ -0,0 +1,29 @@
class DamTypeAK74AssaultRifle extends KFProjectileWeaponDamageType
abstract;
// Award also Shiver kills with 2x Stalker progress
// Count only 1 kill from now on, because new version of Shiver.se calls
// AwardKill() twice: for the decapitator and for the killer
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
if( Killed.IsA('ZombieStalker') || Killed.IsA('ZombieShiver') )
KFStatsAndAchievements.AddStalkerKill();
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
{
KFStatsAndAchievements.AddBullpupDamage(Amount);
}
defaultproperties
{
WeaponClass=Class'ScrnWeaponPack.AKC74AssaultRifle'
DeathString="%k killed %o (AK-74)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
KDamageImpulse=6500.000000
KDeathVel=250.000000
KDeathUpKick=80.000000
}

View file

@ -0,0 +1,26 @@
class DamTypeCZ805M extends ScrnDamTypeMedic
abstract;
// Award also Shiver kills with 2x Stalker progress
// Count only 1 kill from now on, because new version of Shiver.se calls
// AwardKill() twice: for the decapitator and for the killer
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
if( Killed.IsA('ZombieStalker') || Killed.IsA('ZombieShiver') )
KFStatsAndAchievements.AddStalkerKill();
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
{
KFStatsAndAchievements.AddBullpupDamage(Amount);
}
defaultproperties
{
HeadShotDamageMult=1.200000
WeaponClass=Class'ScrnWeaponPack.CZ805M'
DeathString="%k killed %o (CZ 805)."
KDamageImpulse=5500.000000
KDeathVel=175.000000
KDeathUpKick=20.000000
}

View file

@ -0,0 +1,55 @@
class DamTypeColt extends KFProjectileWeaponDamageType
abstract;
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
local SRStatsBase stats;
// do not count kills of decapitated specimens - those are counted in ScoredHeadshot()
if ( Killed != none && Killed.bDecapitated )
return;
stats = SRStatsBase(KFStatsAndAchievements);
if( stats !=None && stats.Rep!=None )
stats.Rep.ProgressCustomValue(Class'ScrnBalanceSrv.ScrnPistolKillProgress',1);
}
static function ScoredHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class<KFMonster> MonsterClass, bool bLaserSightedM14EBRKill)
{
local SRStatsBase stats;
if ( KFStatsAndAchievements != none ) {
if ( Default.bSniperWeapon )
KFStatsAndAchievements.AddHeadshotKill(bLaserSightedM14EBRKill);
stats = SRStatsBase(KFStatsAndAchievements);
if( stats !=None && stats.Rep!=None )
stats.Rep.ProgressCustomValue(Class'ScrnBalanceSrv.ScrnPistolKillProgress',1);
}
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
{
local SRStatsBase stats;
stats = SRStatsBase(KFStatsAndAchievements);
if( stats !=None && stats.Rep!=None )
stats.Rep.ProgressCustomValue(Class'ScrnBalanceSrv.ScrnPistolDamageProgress',Amount);
}
defaultproperties
{
HeadShotDamageMult=1.150000
bSniperWeapon=True
WeaponClass=Class'ScrnWeaponPack.Colt'
DeathString="%k 'colted' %o."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
bBulletHit=True
FlashFog=(X=600.000000)
KDamageImpulse=1000.000000
KDeathVel=500.000000
KDeathUpKick=150.000000
VehicleDamageScaling=0.700000
}

View file

@ -0,0 +1,29 @@
class DamTypeHK417AR extends KFProjectileWeaponDamageType;
// Award also Shiver kills with 2x Stalker progress
// Count only 1 kill from now on, because new version of Shiver.se calls
// AwardKill() twice: for the decapitator and for the killer
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
if( Killed.IsA('ZombieStalker') || Killed.IsA('ZombieShiver') )
KFStatsAndAchievements.AddStalkerKill();
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
{
KFStatsAndAchievements.AddBullpupDamage(Amount);
}
defaultproperties
{
HeadShotDamageMult=1.300000
WeaponClass=Class'ScrnWeaponPack.HK417AR'
DeathString="%k killed %o (HK-417)."
bRagdollBullet=True
bBulletHit=True
FlashFog=(X=600.000000)
KDamageImpulse=4500.000000
KDeathVel=200.000000
KDeathUpKick=20.000000
VehicleDamageScaling=0.800000
}

View file

@ -0,0 +1,14 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class DamTypeHuntingRifle extends DamTypeKFSnipe
abstract;
defaultproperties
{
HeadShotDamageMult=2.100000
WeaponClass=Class'ScrnWeaponPack.HuntingRifle'
DeathString="%k killed %o (Hunting Rifle)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
}

View file

@ -0,0 +1,14 @@
class DamTypeMedicOvercharge extends ScrnDamTypeMedicBase
abstract;
defaultproperties
{
bCheckForHeadShots=False
DeathString="%o took overdose from by %k."
FemaleSuicide="%o took overdose."
MaleSuicide="%o took overdose."
bArmorStops=False
bAlwaysGibs=True
bLocationalHit=False
GibPerterbation=1.000000
}

View file

@ -0,0 +1,17 @@
class DamTypeMedicPistol extends ScrnDamTypeMedicBase
abstract;
defaultproperties
{
HeadShotDamageMult=4.000000
bSniperWeapon=True
WeaponClass=Class'ScrnWeaponPack.MedicPistol'
DeathString="%k killed %o (healing darts)."
FemaleSuicide="%o overdosed healing injections."
MaleSuicide="%o overdosed healing injections."
bBulletHit=True
FlashFog=(X=600.000000)
KDamageImpulse=750.000000
KDeathVel=100.000000
VehicleDamageScaling=0.700000
}

View file

@ -0,0 +1,11 @@
class DamTypeSVD extends DamTypeKFSnipe;
defaultproperties
{
HeadShotDamageMult=1.000000
WeaponClass=Class'ScrnWeaponPack.SVDS'
DeathString="%k killed %o (SVD)."
KDamageImpulse=4000.000000
KDeathVel=170.000000
KDeathUpKick=10.000000
}

View file

@ -0,0 +1,15 @@
class DamTypeSVDm extends KFWeaponDamageType
abstract;
defaultproperties
{
HeadShotDamageMult=1.000000
bIsMeleeDamage=True
WeaponClass=Class'ScrnWeaponPack.SVD'
DeathString="%k killed %o (SVD)."
PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh'
KDamageImpulse=1500.000000
KDeathVel=110.000000
KDeathUpKick=1.000000
VehicleDamageScaling=0.700000
}

Binary file not shown.

View file

@ -0,0 +1,18 @@
class DamTypeSpas extends KFProjectileWeaponDamageType
abstract;
defaultproperties
{
bIsPowerWeapon=True
WeaponClass=Class'ScrnWeaponPack.Spas'
DeathString="%k killed %o (SPAS-12)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
bBulletHit=True
FlashFog=(X=600.000000)
KDamageImpulse=10000.000000
KDeathVel=300.000000
KDeathUpKick=100.000000
VehicleDamageScaling=0.700000
}

View file

@ -0,0 +1,30 @@
class DamTypeVALDT extends KFProjectileWeaponDamageType
abstract;
// Award also Shiver kills with 2x Stalker progress
// Count only 1 kill from now on, because new version of Shiver.se calls
// AwardKill() twice: for the decapitator and for the killer
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
if( Killed.IsA('ZombieStalker') || Killed.IsA('ZombieShiver') )
KFStatsAndAchievements.AddStalkerKill();
}
static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount)
{
KFStatsAndAchievements.AddBullpupDamage(Amount);
}
defaultproperties
{
HeadShotDamageMult=1.000000
WeaponClass=Class'ScrnWeaponPack.VALDTAssaultRifle'
DeathString="%k killed %o (VAL)."
FemaleSuicide="%o shot herself in the foot."
MaleSuicide="%o shot himself in the foot."
bRagdollBullet=True
KDamageImpulse=6500.000000
KDeathVel=150.000000
KDeathUpKick=40.000000
}

View file

@ -0,0 +1,11 @@
class DamTypeVSSDT extends DamTypeKFSnipe;
defaultproperties
{
HeadShotDamageMult=1.000000
WeaponClass=Class'ScrnWeaponPack.VSSDT'
DeathString="%k killed %o (Vintorez)."
KDamageImpulse=3000.000000
KDeathVel=110.000000
KDeathUpKick=10.000000
}

View file

@ -0,0 +1,13 @@
Class FakedHopMine extends Actor;
defaultproperties
{
DrawType=DT_Mesh
bAlwaysRelevant=True
bReplicateMovement=False
bSkipActorPropertyReplication=True
RemoteRole=ROLE_None
Mesh=SkeletalMesh'ScrnWeaponPack_A.HopMineM'
DrawScale=0.600000
bBlockHitPointTraces=False
}

View file

@ -0,0 +1,217 @@
class HK417AR extends ScopedWeapon;
var bool bChangedViewOffset; //stores if vieweoffset has been changed
//overidden to add PlayerViewOffset change
simulated event OnZoomInFinished()
{
local name anim;
local float frame, rate;
GetAnimParams(0, anim, frame, rate);
if ( !bChangedViewOffset) {
PlayerViewOffset.X += 1.00; //move the viewmodel further from the camera
bChangedViewOffset = True;
}
if (ClientState == WS_ReadyToFire)
{
// Play the iron idle anim when we're finished zooming in
if (anim == IdleAnim)
{
PlayIdle();
}
}
Super.OnZoomInFinished(); //needed to draw textured scope
}
//overridden to reset bool without having to wait for zoom out to finish, to fix if player spams ironsight toggle
simulated exec function ToggleIronSights()
{
if( bHasAimingMode )
{
bChangedViewOffset = False; //reset my bool var
if( bAimingRifle )
{
PerformZoom(false);
TweenAnim(IdleAnim,ZoomTime/2); //fix zoom out
}
else
{
if( Owner != none && Owner.Physics == PHYS_Falling &&
Owner.PhysicsVolume.Gravity.Z <= class'PhysicsVolume'.default.Gravity.Z )
{
return;
}
InterruptReload();
if( bIsReloading || !CanZoomNow() )
return;
PerformZoom(True);
TweenAnim(IdleAimAnim,ZoomTime/2); //fix zoom in
}
}
}
exec function ReloadMeNow()
{
local float ReloadMulti;
if(!AllowReload())
return;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
ReloadTimer = Level.TimeSeconds;
bShortReload = MagAmmoRemaining > 0;
if ( bShortReload )
ReloadRate = Default.ReloadShortRate / ReloadMulti;
else
ReloadRate = Default.ReloadRate / ReloadMulti;
if( bHoldToReload )
{
NumLoadedThisReload = 0;
}
ClientReload();
Instigator.SetAnimAction(WeaponReloadAnim);
if ( Level.Game.NumPlayers > 1 && KFGameType(Level.Game).bWaveInProgress && KFPlayerController(Instigator.Controller) != none &&
Level.TimeSeconds - KFPlayerController(Instigator.Controller).LastReloadMessageTime > KFPlayerController(Instigator.Controller).ReloadMessageDelay )
{
KFPlayerController(Instigator.Controller).Speech('AUTO', 2, "");
KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds;
}
}
simulated function ClientReload()
{
local float ReloadMulti;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
if (MagAmmoRemaining <= 0)
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
else if (MagAmmoRemaining >= 1)
{
PlayAnim(ReloadShortAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
}
function AddReloadedAmmo()
{
local int a;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
a = MagCapacity;
if ( bShortReload )
a++; // 1 bullet already bolted
if ( AmmoAmount(0) >= a )
MagAmmoRemaining = a;
else
MagAmmoRemaining = AmmoAmount(0);
// this seems redudant -- PooSH
// if( !bHoldToReload )
// {
// ClientForceKFAmmoUpdate(MagAmmoRemaining,AmmoAmount(0));
// }
if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none )
{
KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded();
}
}
defaultproperties
{
lenseMaterialID=8
scopePortalFOVHigh=40.000000
scopePortalFOV=40.000000
ZoomMatRef="ScrnWeaponPack_T.HK417AR.HK417Scope_FB"
ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb"
CrosshairTexRef="ScrnWeaponPack_T.HK417AR.HK417Scope"
ReloadShortAnim="Reload"
ReloadShortRate=2.570000
bHasScope=True
ZoomedDisplayFOVHigh=60.000000
MagCapacity=15
ReloadRate=3.150000
ReloadAnim="Reload"
ReloadAnimRate=1.000000
WeaponReloadAnim="Reload_M4"
Weight=8.000000
bHasAimingMode=True
IdleAimAnim="Iron_Idle"
StandardDisplayFOV=65.000000
bModeZeroCanDryFire=True
SleeveNum=0
TraderInfoTexture=Texture'ScrnWeaponPack_T.HK417AR.HK417_Trader'
MeshRef="ScrnWeaponPack_A.HK417_mesh"
SkinRefs(0)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P"
SkinRefs(1)="ScrnWeaponPack_T.HK417AR.hk417_sk1_d2"
SkinRefs(2)="ScrnWeaponPack_T.HK417AR.mueller"
SkinRefs(3)="ScrnWeaponPack_T.HK417AR.body"
SkinRefs(4)="ScrnWeaponPack_T.HK417AR.body2"
SkinRefs(5)="ScrnWeaponPack_T.HK417AR.hk416_5"
SkinRefs(6)="ScrnWeaponPack_T.HK417AR.clip_hk417"
SkinRefs(7)="ScrnWeaponPack_T.HK417AR.hk416_8"
SkinRefs(8)="KF_Weapons_Trip_T.Rifles.CBLens_cmb"
SelectSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_select"
HudImageRef="ScrnWeaponPack_T.HK417AR.HK417_Unselected"
SelectedHudImageRef="ScrnWeaponPack_T.HK417AR.HK417_selected"
PlayerIronSightFOV=32.000000
ZoomedDisplayFOV=60.000000
FireModeClass(0)=Class'ScrnWeaponPack.HK417Fire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectAnimRate=1.000000
BringUpTime=1.000000
SelectForce="SwitchToAssaultRifle"
AIRating=0.650000
CurrentRating=0.650000
Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required."
DisplayFOV=65.000000
Priority=100
CustomCrosshair=11
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
InventoryGroup=4
GroupOffset=3
PickupClass=Class'ScrnWeaponPack.HK417Pickup'
PlayerViewOffset=(X=14.000000,Y=7.000000,Z=-4.000000)
BobDamping=6.000000
AttachmentClass=Class'ScrnWeaponPack.HK417Attachment'
IconCoords=(X1=253,Y1=146,X2=333,Y2=181)
ItemName="HK-417 SE"
}

View file

@ -0,0 +1,14 @@
class HK417Ammo extends KFAmmunition;
#EXEC OBJ LOAD FILE=InterfaceContent.utx
defaultproperties
{
AmmoPickupAmount=20
MaxAmmo=160
InitialAmount=80
PickupClass=Class'ScrnWeaponPack.HK417AmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=338,Y1=40,X2=393,Y2=79)
ItemName="7.62x51mm NATO"
}

View file

@ -0,0 +1,8 @@
class HK417AmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=20
InventoryType=Class'ScrnWeaponPack.HK417Ammo'
PickupMessage="7.62x51mm NATO"
}

View file

@ -0,0 +1,59 @@
class HK417Attachment extends KFWeaponAttachment;
defaultproperties
{
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP'
mTracerClass=Class'KFMod.KFNewTracer'
mShellCaseEmitterClass=Class'KFMod.KFShellSpewer'
ShellEjectBoneName="Shell_eject"
MovementAnims(0)="JogF_SCAR"
MovementAnims(1)="JogB_SCAR"
MovementAnims(2)="JogL_SCAR"
MovementAnims(3)="JogR_SCAR"
TurnLeftAnim="TurnL_SCAR"
TurnRightAnim="TurnR_SCAR"
CrouchAnims(0)="CHWalkF_SCAR"
CrouchAnims(1)="CHWalkB_SCAR"
CrouchAnims(2)="CHWalkL_SCAR"
CrouchAnims(3)="CHWalkR_SCAR"
WalkAnims(0)="WalkF_SCAR"
WalkAnims(1)="WalkB_SCAR"
WalkAnims(2)="WalkL_SCAR"
WalkAnims(3)="WalkR_SCAR"
CrouchTurnRightAnim="CH_TurnR_SCAR"
CrouchTurnLeftAnim="CH_TurnL_SCAR"
IdleCrouchAnim="CHIdle_SCAR"
IdleWeaponAnim="Idle_SCAR"
IdleRestAnim="Idle_SCAR"
IdleChatAnim="Idle_SCAR"
IdleHeavyAnim="Idle_SCAR"
IdleRifleAnim="Idle_SCAR"
FireAnims(0)="Fire_SCAR"
FireAnims(1)="Fire_SCAR"
FireAnims(2)="Fire_SCAR"
FireAnims(3)="Fire_SCAR"
FireAltAnims(0)="Fire_SCAR"
FireAltAnims(1)="Fire_SCAR"
FireAltAnims(2)="Fire_SCAR"
FireAltAnims(3)="Fire_SCAR"
FireCrouchAnims(0)="CHFire_SCAR"
FireCrouchAnims(1)="CHFire_SCAR"
FireCrouchAnims(2)="CHFire_SCAR"
FireCrouchAnims(3)="CHFire_SCAR"
FireCrouchAltAnims(0)="CHFire_SCAR"
FireCrouchAltAnims(1)="CHFire_SCAR"
FireCrouchAltAnims(2)="CHFire_SCAR"
FireCrouchAltAnims(3)="CHFire_SCAR"
HitAnims(0)="HitF_SCAR"
HitAnims(1)="HitB_SCAR"
HitAnims(2)="HitL_SCAR"
HitAnims(3)="HitR_SCAR"
PostFireBlendStandAnim="Blend_SCAR"
PostFireBlendCrouchAnim="CHBlend_SCAR"
MeshRef="ScrnWeaponPack_A.HK417_3rd"
WeaponAmbientScale=2.000000
bRapidFire=True
bAltRapidFire=True
SplashEffect=Class'ROEffects.BulletSplashEmitter'
DrawScale=0.600000
}

View file

@ -0,0 +1,62 @@
class HK417Fire extends KFFire;
var vector ScopedShakeOffsetMag; //Shake offset mag used for 3d scopes
var vector ScopedShakeOffsetRate; //Shake offset rate used for 3d scopes
//adds faked recoil to 3d scope zoom
event ModeDoFire()
{
if( KFWeapon(Weapon).bAimingRifle )
{
if ( KFWeapon(Weapon).KFScopeDetail != KF_TextureScope)
{
ShakeOffsetMag=default.ScopedShakeOffsetMag;
ShakeOffsetRate=default.ScopedShakeOffsetRate;
}
}
else
{
ShakeOffsetMag=default.ShakeOffsetMag;
ShakeOffsetRate=default.ShakeOffsetRate;
}
Super.ModeDoFire();
}
defaultproperties
{
ScopedShakeOffsetMag=(X=3.000000)
ScopedShakeOffsetRate=(X=50.000000,Y=50.000000,Z=50.000000)
FireAimedAnim="Iron_Idle"
RecoilRate=0.070000
maxVerticalRecoilAngle=500
maxHorizontalRecoilAngle=250
ShellEjectClass=Class'ROEffects.KFShellEjectAK'
ShellEjectBoneName="Shell_eject"
FireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot"
StereoFireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot"
NoAmmoSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_empty"
DamageType=Class'ScrnWeaponPack.DamTypeHK417AR'
DamageMin=75
DamageMax=85
Momentum=20000.000000
bPawnRapidFireAnim=True
bWaitForRelease=True
TransientSoundVolume=1.800000
FireLoopAnim="Fire"
TweenTime=0.025000
FireForce="AssaultRifleFire"
FireRate=0.230000
AmmoClass=Class'ScrnWeaponPack.HK417Ammo'
AmmoPerFire=1
ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000)
ShakeRotRate=(X=9500.000000,Y=9500.000000,Z=9500.000000)
ShakeRotTime=0.650000
ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=1.250000
BotRefireRate=0.990000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG'
aimerror=60.000000
Spread=0.002000
SpreadStyle=SS_Random
}

View file

@ -0,0 +1,33 @@
class HK417Pickup extends KFWeaponPickup;
/*
function ShowDeagleInfo(Canvas C)
{
C.SetPos((C.SizeX - C.SizeY) / 2,0);
C.DrawTile( Texture'KillingfloorHUD.ClassMenu.Deagle', C.SizeY, C.SizeY, 0.0, 0.0, 256, 256);
}
*/
defaultproperties
{
Weight=8.000000
cost=3000
BuyClipSize=10
PowerValue=60
SpeedValue=30
RangeValue=95
Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required."
ItemName="HK-417 SE"
ItemShortName="HK-417 SE"
AmmoItemName="7.62x51mm NATO"
CorrespondingPerkIndex=3
EquipmentCategoryID=2
InventoryType=Class'ScrnWeaponPack.HK417AR'
PickupMessage="You've got a HK-417"
PickupSound=Sound'ScrnWeaponPack_SND.HK417AR.HK417_pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.HK417_st'
DrawScale=0.800000
CollisionRadius=30.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,115 @@
class HRL extends LAW;
var float ForceIdleTime; //time at which weapon will play idle anim
var float ForceIdleOnFireTime; //time after firing for weapon to play idle anim
//added this to make the HRL rocket draw smaller
simulated function PostBeginPlay()
{
if ( default.mesh == none )
{
PreloadAssets(self, true);
}
// Weapon will handle FireMode instantiation
Super.PostBeginPlay();
if ( Level.NetMode == NM_DedicatedServer )
return;
SetBoneScale(1, 0.70, 'Rocket'); //make the LAW rocket smoler by 30%
if( !bHasScope )
{
KFScopeDetail = KF_None;
}
InitFOV();
}
//added to support tweening from new idle position to ironsights
simulated function ZoomIn(bool bAnimateTransition)
{
if( Level.TimeSeconds < FireMode[0].NextFireTime )
{
return;
}
super.ZoomIn(bAnimateTransition);
if( bAnimateTransition )
{
if( bZoomOutInterrupted )
{
TweenAnim(IdleAimAnim,ZoomTime/2);
}
else
{
TweenAnim(IdleAimAnim,ZoomTime/2);
}
}
}
//overwriting to add ForceIdleTime
simulated function bool StartFire(int Mode)
{
local bool RetVal;
RetVal = super.StartFire(Mode);
if( RetVal )
{
if( Mode == 0 && ForceZoomOutOnFireTime > 0 )
{
ForceZoomOutTime = Level.TimeSeconds + ForceZoomOutOnFireTime;
}
else if( Mode == 1 && ForceZoomOutOnAltFireTime > 0 )
{
ForceZoomOutTime = Level.TimeSeconds + ForceZoomOutOnAltFireTime;
}
if( Mode == 0 && ForceIdleOnFireTime > 0 )
{
ForceIdleTime = Level.TimeSeconds + ForceIdleOnFireTime;
}
NumClicks=0;
InterruptReload();
}
return RetVal;
}
//adds a force idle time
simulated function WeaponTick(float dt)
{
Super.WeaponTick(dt);
if( ForceIdleTime > 0 )
{
if( Level.TimeSeconds - ForceIdleTime > 0 )
{
ForceIdleTime = 0;
PlayIdle();
}
}
}
defaultproperties
{
ForceIdleOnFireTime=2.250000
bHoldToReload=False
MinimumFireRange=250
Weight=10.000000
TraderInfoTexture=Texture'ScrnWeaponPack_T.HRL.Trader_HRL'
SkinRefs(0)="ScrnWeaponPack_T.HRL.hrl_cmb"
PlayerIronSightFOV=70.000000
ZoomedDisplayFOV=40.000000
FireModeClass(0)=Class'ScrnWeaponPack.HRLFire'
IdleAnim="AimIdle"
Description="Horzine's modification of L.A.W. Smaller and lighter rockets not only allowing to carry more of them, but also are much easier to reload."
Priority=190
PickupClass=Class'ScrnWeaponPack.HRLPickup'
PlayerViewOffset=(X=20.000000,Y=15.000000,Z=-17.000000)
BobDamping=4.500000
AttachmentClass=Class'ScrnWeaponPack.HRLAttachment'
ItemName="HRL-1 Rocket Launcher SE"
}

View file

@ -0,0 +1,13 @@
class HRLAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx
defaultproperties
{
AmmoPickupAmount=5
MaxAmmo=20
PickupClass=Class'ScrnWeaponPack.HRLAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=458,Y1=34,X2=511,Y2=78)
ItemName="HRL-1 Rockets"
}

View file

@ -0,0 +1,11 @@
class HRLAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=6
InventoryType=Class'ScrnWeaponPack.HRLAmmo'
PickupMessage="HRL-1 Rockets"
StaticMesh=StaticMesh'KillingFloorStatics.LAWAmmo'
DrawScale=0.500000
CollisionRadius=40.000000
}

View file

@ -0,0 +1,6 @@
class HRLAttachment extends ScrnLAWAttachment;
defaultproperties
{
MeshRef="ScrnWeaponPack_A.HRL_3rd"
}

View file

@ -0,0 +1,7 @@
class HRLExplosion extends ScrnLAWExplosion;
//HRL is a Scrn LAW Explosion with a slightly smaller light radius
defaultproperties
{
LightRadius=10.000000
}

View file

@ -0,0 +1,15 @@
class HRLFire extends LAWFire;
function bool AllowFire()
{
// allow fire without zooming
return ( Weapon.AmmoAmount(ThisModeNum) >= AmmoPerFire);
}
defaultproperties
{
FireAnimRate=1.600000
FireRate=2.031250
AmmoClass=Class'ScrnWeaponPack.HRLAmmo'
ProjectileClass=Class'ScrnWeaponPack.HRLProj'
}

View file

@ -0,0 +1,16 @@
class HRLPickup extends LAWPickup;
defaultproperties
{
Weight=10.000000
AmmoCost=20
PowerValue=90
SpeedValue=32
Description="Horzine's modification of L.A.W. Smaller and lighter rockets not only allowing to carry them more, but also are much easier to reload."
ItemName="HRL-1 Rocket Launcher SE"
ItemShortName="HRL-1 SE"
AmmoItemName="HRL-1 Rockets"
InventoryType=Class'ScrnWeaponPack.HRL'
PickupMessage="You got the HRL-1 Rocket Launcher"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.HRL_Pickup'
}

View file

@ -0,0 +1,12 @@
class HRLProj extends ScrnLAWProj;
defaultproperties
{
ExplosionClass=Class'ScrnWeaponPack.HRLExplosion'
ImpactDamage=275
Speed=3900.000000
MaxSpeed=4500.000000
Damage=625.000000
DamageRadius=450.000000
DrawScale=0.350000
}

View file

@ -0,0 +1,12 @@
class HopMineAmmo extends KFAmmunition;
defaultproperties
{
AmmoPickupAmount=2
MaxAmmo=16
InitialAmount=8
PickupClass=Class'ScrnWeaponPack.HopMineAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=4,Y1=350,X2=110,Y2=395)
ItemName="HopMines"
}

View file

@ -0,0 +1,10 @@
class HopMineAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=2
InventoryType=Class'ScrnWeaponPack.HopMineAmmo'
PickupMessage="HopMines"
StaticMesh=StaticMesh'KillingFloorStatics.FragPickup'
CollisionRadius=25.000000
}

View file

@ -0,0 +1,17 @@
class HopMineFire extends CrossbuzzsawFire;
function Projectile SpawnProjectile(Vector Start, Rotator Dir)
{
local HopMineProj P;
P = HopMineProj(Super.SpawnProjectile(Start,Dir));
if( P!=None && !P.bNeedsDetonate )
HopMineLchr(Weapon).AddMine(P);
return P;
}
defaultproperties
{
AmmoClass=Class'ScrnWeaponPack.HopMineAmmo'
ProjectileClass=Class'ScrnWeaponPack.HopMineProj'
}

View file

@ -0,0 +1,17 @@
class HopMineLPickup extends CrossbuzzsawPickup;
defaultproperties
{
Weight=6.000000
cost=2500
AmmoCost=30
PowerValue=100
RangeValue=90
Description="The prototype of Hopmine launcher. Alpha version. Have some serious bugs like mines are detonated by each other. But still can be very useful."
ItemName="HopMine Launcher SE"
ItemShortName="HopMine SE"
AmmoItemName="HopMines"
CorrespondingPerkIndex=6
InventoryType=Class'ScrnWeaponPack.HopMineLchr'
PickupMessage="You got the HopMine Launcher."
}

View file

@ -0,0 +1,130 @@
//=============================================================================
// HopMineLchr
//=============================================================================
class HopMineLchr extends Crossbuzzsaw;
var byte NumMinesOut;
var() byte MaximumMines;
var() localized string MinesText;
var FakedHopMine FakedHopMine;
var vector FakedHopMineOffset;
replication
{
// Variables the server should send to the client.
reliable if( Role==ROLE_Authority && bNetOwner )
NumMinesOut;
}
simulated function PostBeginPlay()
{
super.PostBeginPlay();
if ( Level.NetMode != NM_DedicatedServer ) {
FakedHopMine = spawn(class'FakedHopMine',self);
if ( FakedHopMine != none ) {
SetBoneLocation('Blade', FakedHopMineOffset );
// bone must have a size to properly adjust rotation
SetBoneScale (55, 0.0001, 'Blade');
AttachToBone(FakedHopMine, 'Blade');
}
}
}
simulated function Destroyed()
{
local HopMineProj P;
if ( FakedHopMine != None )
FakedHopMine.Destroy();
// blow up all mines on weapon destroy (drop) -- PooSH
foreach DynamicActors(Class'HopMineProj',P)
{
if( !P.bDeleteMe && P.WeaponOwner==self && !P.bNeedsDetonate )
{
if ( P.IsInState('OnWall') ) {
P.RepLaunchPos = P.Location;
P.bCriticalTarget = true;
P.GoToState('LaunchMine');
P.NetUpdateTime = Level.TimeSeconds-1;
}
else {
P.Disintegrate(P.Location, vect(0,0,1));
}
}
}
super.Destroyed();
}
// simulated function AltFire(float F)
// {
// FakedHopMineOffset.Z += 0.1;
// SetBoneLocation('Blade', FakedHopMineOffset );
// PlayerController(Instigator.Controller).ClientMessage("FakedHopMineOffset = "$ FakedHopMineOffset);
// }
final function AddMine( HopMineProj M )
{
++NumMinesOut;
M.WeaponOwner = Self;
if ( Instigator != none && Instigator.PlayerReplicationInfo != none
&& Instigator.PlayerReplicationInfo.Team != none )
{
M.PlacedTeam = Instigator.PlayerReplicationInfo.Team.TeamIndex;
}
NetUpdateTime = Level.TimeSeconds-1;
}
final function RemoveMine( HopMineProj M )
{
--NumMinesOut;
M.WeaponOwner = None;
NetUpdateTime = Level.TimeSeconds-1;
}
// simulated function RenderOverlays( Canvas Canvas )
// {
// Super.RenderOverlays(Canvas);
// Canvas.SetDrawColor(255,255,255,255);
// Canvas.Font = Canvas.MedFont;
// Canvas.SetPos(25,Canvas.ClipY*0.5);
// Canvas.DrawText(MinesText$NumMinesOut$"/"$MaximumMines,false);
// }
/*
function GiveTo(Pawn Other, optional Pickup Pickup)
{
local HopMineProj P;
Super.GiveTo(Other,Pickup);
NumMinesOut = 0;
foreach DynamicActors(Class'HopMineProj',P)
{
if( P.InstigatorController==Other.Controller && !P.bNeedsDetonate )
{
P.Instigator = Other;
P.WeaponOwner = Self;
++NumMinesOut;
}
else if( P.WeaponOwner==Self )
P.WeaponOwner = None;
}
}
*/
defaultproperties
{
MaximumMines=254
MinesText="Mines: "
FakedHopMineOffset=(Z=0.320000)
RotateRate=500.000000
Weight=6.000000
AppID=0
FireModeClass(0)=Class'ScrnWeaponPack.HopMineFire'
Description="The prototype of Hopmine launcher. Alpha version. Have some serious bugs like mines are detonated by each other. But still can be very useful."
PickupClass=Class'ScrnWeaponPack.HopMineLPickup'
ItemName="HopMine Launcher SE"
}

View file

@ -0,0 +1,42 @@
Class HopMineLight extends Effects
transient;
var byte ModeIndex;
var() Material Dots[3];
simulated final function SetMode( bool bA, bool bB )
{
local byte i;
if( bB )
i = 2;
else if( bA )
i = 1;
else i = 0;
if( i==ModeIndex )
return;
Texture = Dots[i];
ModeIndex = i;
if( ModeIndex==0 )
{
PlaySound(Sound'ScrnWeaponPack_SND.mine.combine_mine_deactivate1');
AmbientSound = None;
}
else AmbientSound = Sound'ScrnWeaponPack_SND.mine.combine_mine_active_loop1';
}
defaultproperties
{
Dots(0)=FinalBlend'ScrnWeaponPack_T.mine.FBBlueDot'
Dots(1)=FinalBlend'ScrnWeaponPack_T.mine.FBGreenDot'
Dots(2)=FinalBlend'ScrnWeaponPack_T.mine.FBRedDot'
Texture=FinalBlend'ScrnWeaponPack_T.mine.FBBlueDot'
DrawScale=0.035000
bFullVolume=True
bHardAttach=True
SoundVolume=255
SoundRadius=200.000000
TransientSoundVolume=2.000000
TransientSoundRadius=350.000000
}

View file

@ -0,0 +1,443 @@
Class HopMineProj extends Projectile;
#exec obj load file="KF_GrenadeSnd.uax"
#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx
#exec OBJ LOAD FILE=ScrnWeaponPack_SND.uax
#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx
var PanzerfaustTrail SmokeTrail;
var vector RepAttachPos,RepAttachDir,RepLaunchPos;
var HopMineLight DotLight;
var HopMineLchr WeaponOwner;
var bool bDisintegrated; // This nade has been disintegrated by a siren scream.
var() sound DisintegrateSound;// The sound of this projectile disintegrating
var bool bWarningTarget,bCriticalTarget,bPreLaunched,bNeedsDetonate;
var float MinSpread; // min distance between placed mines. If placed closer, they will trigger each other
var int PlacedTeam; // TeamIndex of the team that placed this projectile
replication
{
// Variables the server should send to the client.
reliable if( Role==ROLE_Authority )
RepAttachPos,RepAttachDir,bWarningTarget,bCriticalTarget,RepLaunchPos;
}
simulated function AddSmoke()
{
if( SmokeTrail==None )
SmokeTrail = Spawn(class'PanzerfaustTrail',self);
SmokeTrail.SetBase(self);
SmokeTrail.SetRelativeRotation(rot(32768,0,0));
}
simulated function PostBeginPlay()
{
Velocity = speed * vector(Rotation);
Super.PostBeginPlay();
}
simulated function Destroyed()
{
if( WeaponOwner!=None )
WeaponOwner.RemoveMine(Self);
if ( SmokeTrail != None )
SmokeTrail.HandleOwnerDestroyed();
if( DotLight!=None )
DotLight.Destroy();
if( Level.NetMode==NM_Client )
BlowUp(Location);
Super.Destroyed();
}
simulated function Landed( vector HitNormal )
{
HitWall(HitNormal,Base);
}
simulated function HitWall(vector HitNormal, actor Wall)
{
if( Level.NetMode==NM_Client )
{
SetPhysics(PHYS_None);
return;
}
AttachTo(Location,HitNormal,Wall);
}
simulated final function AttachTo( vector Pos, vector Dir, Actor Wall )
{
SetPhysics(PHYS_None);
SetLocation(Pos + Dir*2);
SetRotation(rotator(Dir)-rot(16384,0,0));
RepAttachPos = Location;
RepAttachDir = Dir*1000.f;
if( Wall!=None && !Wall.bStatic )
SetBase(Wall);
GoToState('OnWall');
}
simulated function PostNetBeginPlay()
{
bNetNotify = true;
if( Physics==PHYS_None )
GoToState('OnWall');
else if( Physics==PHYS_Projectile || RepLaunchPos!=vect(0,0,0) )
GoToState('LaunchMine');
else if ( Level.NetMode!=NM_DedicatedServer )
{
AddSmoke();
TweenAnim('Up',0.01f);
PlaySound(Sound'ScrnWeaponPack_SND.mine.blade_in');
RandSpin(65000.f);
}
}
simulated function PostNetReceive()
{
if( RepAttachPos!=vect(0,0,0) )
{
ClientAttachProj();
RepAttachPos = vect(0,0,0);
}
if( bHidden && !bDisintegrated )
{
Disintegrate(Location, vect(0,0,1));
}
}
simulated final function ClientAttachProj()
{
local vector HL,HN,D;
local Actor A;
D = Normal(RepAttachDir);
A = Trace(HL,HN,RepAttachPos-D*10.f,RepAttachPos+D,false);
if( A==None )
{
HN = D;
HL = RepAttachPos;
}
AttachTo(HL,HN,A);
}
simulated function BlowUp(vector HitLocation)
{
if( Level.NetMode!=NM_DedicatedServer )
{
PlaySound(ImpactSound,,2.0);
if ( EffectIsRelevant(Location,false) )
Spawn(class'KFNadeLExplosion',,,HitLocation, rot(16384,0,0));
}
HurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
if ( Role == ROLE_Authority )
MakeNoise(1.0);
}
simulated function Touch(Actor Other);
simulated function ClientSideTouch(Actor Other, Vector HitLocation);
simulated function ProcessTouch(Actor Other, Vector HitLocation);
state OnWall
{
simulated function BeginState()
{
local HopMineProj Other;
if ( SmokeTrail != None )
{
SmokeTrail.HandleOwnerDestroyed();
SmokeTrail = None;
}
bCollideWorld = False;
bFixedRotationDir = false;
RotationRate = rot(0,0,0);
if( Level.NetMode!=NM_DedicatedServer )
{
TweenAnim('Down',0.05f);
PlaySound(Sound'ScrnWeaponPack_SND.mine.blade_cut');
DotLight = Spawn(Class'HopMineLight',,,Location + (vect(0,0,5) << Rotation));
if( DotLight!=None )
{
DotLight.SetBase(Self);
DotLight.SetRelativeLocation(vect(0,0,5));
}
}
if( Level.NetMode!=NM_Client )
{
NetUpdateFrequency = 1.f;
SetTimer(0.25+FRand()*0.25,true);
}
// destroy other mines around -- PooSH
foreach VisibleCollidingActors( class'HopMineProj', Other, MinSpread, Location ) {
if ( Other != self && !Other.bDeleteMe && Other.IsInState('OnWall') ) {
Other.RepLaunchPos = Location;
Other.bCriticalTarget = true;
Other.GoToState('LaunchMine');
Other.NetUpdateTime = Level.TimeSeconds-1;
}
}
}
simulated function EndState()
{
if( Level.NetMode!=NM_Client )
{
SetTimer(0,false);
NetUpdateFrequency = Default.NetUpdateFrequency;
NetUpdateTime = Level.TimeSeconds-1;
}
}
function Timer()
{
local Controller C;
local vector X,Y,Z;
local float DotP;
local int ThreatLevel;
local bool bA,bB;
GetAxes(Rotation,X,Y,Z);
for( C=Level.ControllerList; C!=None; C=C.nextController )
if( C.Pawn!=None && C.Pawn.Health>0 && VSizeSquared(C.Pawn.Location-Location)<1000000.f )
{
X = C.Pawn.Location-Location;
DotP = (X Dot Z);
if( DotP<0 )
continue;
DotP = VSizeSquared(X - (Z * DotP));
if( DotP>90000.f || !FastTrace(C.Pawn.Location,Location) )
continue;
if( Monster(C.Pawn)!=None )
{
bB = true;
if( DotP<35500.f )
{
Y = C.Pawn.Location;
ThreatLevel+=C.Pawn.HealthMax;
}
}
else bA = true;
}
if( bA!=bWarningTarget || bB!=bCriticalTarget )
{
bWarningTarget = bA;
bCriticalTarget = bB;
if( DotLight!=None )
DotLight.SetMode(bA,bB);
NetUpdateTime = Level.TimeSeconds-1;
}
if( bB && ThreatLevel>400 )
{
bWarningTarget = false;
bCriticalTarget = false;
RepLaunchPos = Y;
GoToState('LaunchMine');
}
else if( InstigatorController==None || bNeedsDetonate || (WeaponOwner!=None && WeaponOwner.NumMinesOut>WeaponOwner.MaximumMines) )
{
bWarningTarget = false;
bCriticalTarget = false;
RepLaunchPos = Location + Z*(150.f+FRand()*250.f);
GoToState('LaunchMine');
}
}
simulated function PostNetReceive()
{
if( RepLaunchPos!=vect(0,0,0) )
GoToState('LaunchMine');
else if( DotLight!=None )
DotLight.SetMode(bWarningTarget,bCriticalTarget);
}
}
state LaunchMine
{
simulated function BeginState()
{
if( WeaponOwner!=None )
WeaponOwner.RemoveMine(Self);
bNeedsDetonate = true;
if( DotLight!=None )
DotLight.SetMode(true,true);
if( Physics!=PHYS_Projectile )
{
bFixedRotationDir = false;
RotationRate = rot(0,0,0);
if( Level.NetMode!=NM_DedicatedServer )
{
TweenAnim('Up',0.1f);
PlaySound(Sound'ScrnWeaponPack_SND.mine.blade_in');
PlaySound(Sound'ScrnWeaponPack_SND.mine.combine_mine_deploy1',SLOT_Talk);
}
SetTimer(0.6,false);
}
bNetNotify = false;
}
function HitWall(vector HitNormal, actor Wall)
{
BlowUp(Location);
Destroy();
}
simulated function Timer()
{
if( !bPreLaunched )
{
bPreLaunched = true;
if( Level.NetMode!=NM_DedicatedServer )
PlaySound(Sound'ScrnWeaponPack_SND.mine.rmine_blip3',SLOT_Misc);
SetTimer(0.2,false);
}
else if( Level.NetMode!=NM_Client && Physics==PHYS_Projectile )
{
BlowUp(Location);
Destroy();
}
else
{
if( DotLight!=None )
DotLight.Destroy();
if ( Level.NetMode != NM_DedicatedServer)
{
AddSmoke();
bFixedRotationDir = true;
RandSpin(45000.f);
}
bCollideWorld = true;
SetPhysics(PHYS_Projectile);
Velocity = (RepLaunchPos-Location)*2.f;
if( Level.NetMode!=NM_Client )
SetTimer(0.5,false);
}
}
}
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation )
{
local actor Victims;
local float damageScale, dist;
local vector dir;
if ( bHurtEntry )
return;
bHurtEntry = true;
foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation )
{
// don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==None )
{
if( Pawn(Victims)!=None && Monster(Victims)==None && Pawn(Victims).Controller!=InstigatorController )
continue;
dir = Victims.Location - HitLocation;
dist = FMax(1,VSize(dir));
dir = dir/dist;
damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius);
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController( InstigatorController );
if( Monster(Victims)==None )
damageScale*=0.15; // Make it a lot less lethal to player self inflicted damage.
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
(damageScale * Momentum * dir),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
}
}
bHurtEntry = false;
}
function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
{
local Class<KFWeaponDamageType> KFDamType;
if ( InstigatedBy == none )
return;
if ( damageType == class'SirenScreamDamage' ) {
Disintegrate(HitLocation, vect(0,0,1));
return;
}
else if ( Monster(InstigatedBy) != none ) {
if ( Damage >= 5 )
Explode(HitLocation, vect(0,0,1));
return;
}
if ( Damage < 30 )
return;
KFDamType = Class<KFWeaponDamageType>(damageType);
if ( KFDamType != none && (KFDamType.default.bIsExplosive || KFDamType.default.bIsMeleeDamage) )
return;
// check same team
if ( InstigatorController != InstigatedBy.Controller ) {
if ( InstigatedBy.PlayerReplicationInfo != none
&& InstigatedBy.PlayerReplicationInfo.Team != none
&& InstigatedBy.PlayerReplicationInfo.Team.TeamIndex == PlacedTeam )
{
return;
}
}
Explode(HitLocation, vect(0,0,1));
}
state Destroying
{
simulated function BeginState()
{
SetTimer(0.1, true);
}
simulated function Timer()
{
Destroy();
}
}
// Make the projectile distintegrate, instead of explode
simulated function Disintegrate(vector HitLocation, vector HitNormal)
{
bDisintegrated = true;
bHidden = true;
if( Role == ROLE_Authority )
{
GotoState('Destroying');
NetUpdateTime = Level.TimeSeconds - 1;
}
PlaySound(DisintegrateSound,,2.0);
if ( EffectIsRelevant(Location,false) )
{
Spawn(Class'KFMod.SirenNadeDeflect',,, HitLocation, rotator(vect(0,0,1)));
}
}
defaultproperties
{
DisintegrateSound=Sound'Inf_Weapons.panzerfaust60.faust_explode_distant02'
MinSpread=150.000000
Speed=5000.000000
MaxSpeed=8000.000000
Damage=450.000000
DamageRadius=400.000000
MomentumTransfer=75000.000000
MyDamageType=Class'KFMod.DamTypePipeBomb'
ImpactSound=SoundGroup'KF_GrenadeSnd.Nade_Explode_1'
bNetTemporary=False
bAlwaysRelevant=True
bSkipActorPropertyReplication=True
Physics=PHYS_Falling
LifeSpan=0.000000
Mesh=SkeletalMesh'ScrnWeaponPack_A.HopMineM'
DrawScale=0.600000
AmbientGlow=25
bUnlit=False
TransientSoundVolume=2.000000
TransientSoundRadius=350.000000
bBounce=True
bFixedRotationDir=True
}

View file

@ -0,0 +1,54 @@
class HuntingRifle extends ScopedWeapon;
defaultproperties
{
lenseMaterialID=2
scopePortalFOVHigh=22.000000
scopePortalFOV=12.000000
ZoomMatRef="ScrnWeaponPack_T.BDHR.RifleCrossFinal"
ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb"
CrosshairTexRef="ScrnWeaponPack_T.BDHR.BDHR.HRCross"
ReloadShortAnim="Reload"
ReloadShortRate=2.780000
bHasScope=True
ZoomedDisplayFOVHigh=45.000000
MagCapacity=5
ReloadRate=4.000000
ReloadAnim="Reload"
ReloadAnimRate=1.150000
WeaponReloadAnim="Reload_M14"
Weight=7.000000
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=65.000000
bModeZeroCanDryFire=True
TraderInfoTexture=Texture'ScrnWeaponPack_T.BDHR.huntingrifle_Trader'
MeshRef="ScrnWeaponPack_A.hunt_rifle"
SkinRefs(0)="ScrnWeaponPack_T.BDHR.HR_Final"
SkinRefs(1)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P"
SkinRefs(2)="KF_Weapons_Trip_T.Rifles.CBLens_cmb"
SelectSoundRef="KF_PumpSGSnd.SG_Select"
HudImageRef="ScrnWeaponPack_T.BDHR.HR_Unselected"
SelectedHudImageRef="ScrnWeaponPack_T.BDHR.HR_selected"
PlayerIronSightFOV=32.000000
ZoomedDisplayFOV=60.000000
FireModeClass(0)=Class'ScrnWeaponPack.HuntingRifleFire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectForce="SwitchToAssaultRifle"
AIRating=0.650000
CurrentRating=0.650000
Description="A recreational hunting weapon, featuring a firing trigger and a powerful integrated scope. "
DisplayFOV=65.000000
Priority=10
CustomCrosshair=11
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
InventoryGroup=4
GroupOffset=3
PickupClass=Class'ScrnWeaponPack.HuntingRiflePickup'
PlayerViewOffset=(X=15.000000,Y=16.000000,Z=-4.000000)
BobDamping=6.000000
AttachmentClass=Class'ScrnWeaponPack.HuntingRifleAttachment'
IconCoords=(X1=253,Y1=146,X2=333,Y2=181)
ItemName="Hunting Rifle SE"
}

View file

@ -0,0 +1,17 @@
//=============================================================================
// HuntingRifle Rifle Ammo.
//=============================================================================
class HuntingRifleAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=InterfaceContent.utx
defaultproperties
{
AmmoPickupAmount=10
MaxAmmo=50
InitialAmount=25
PickupClass=Class'ScrnWeaponPack.HuntingRifleAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=338,Y1=40,X2=393,Y2=79)
ItemName="Rifle bullets"
}

View file

@ -0,0 +1,12 @@
//=============================================================================
// HuntingRifle Ammo Pickup.
//=============================================================================
class HuntingRifleAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=10
InventoryType=Class'ScrnWeaponPack.HuntingRifleAmmo'
PickupMessage=".308 rounds"
StaticMesh=None
}

View file

@ -0,0 +1,55 @@
class HuntingRifleAttachment extends KFWeaponAttachment;
defaultproperties
{
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSTG'
mTracerClass=Class'KFMod.KFNewTracer'
MovementAnims(0)="WalkF_Winchester"
MovementAnims(1)="WalkB_Winchester"
MovementAnims(2)="WalkL_Winchester"
MovementAnims(3)="WalkL_Winchester"
TurnLeftAnim="TurnL_Winchester"
TurnRightAnim="TurnR_Winchester"
CrouchAnims(0)="CHwalkF_Winchester"
CrouchAnims(1)="CHwalkB_Winchester"
CrouchAnims(2)="CHwalkL_Winchester"
CrouchAnims(3)="CHwalkR_Winchester"
WalkAnims(0)="WalkF_Winchester"
WalkAnims(1)="WalkB_Winchester"
WalkAnims(2)="WalkL_Winchester"
WalkAnims(3)="WalkL_Winchester"
CrouchTurnRightAnim="CH_TurnR_Winchester"
CrouchTurnLeftAnim="CH_TurnL_Winchester"
IdleCrouchAnim="CHIdle_Winchester"
IdleWeaponAnim="IS_Idle_Winchester"
IdleRestAnim="IS_Idle_Winchester"
IdleChatAnim="IS_Idle_Winchester"
IdleHeavyAnim="IS_Idle_Winchester"
IdleRifleAnim="IS_Idle_Winchester"
FireAnims(0)="IS_Fire_spSinper"
FireAnims(1)="IS_Fire_spSinper"
FireAnims(2)="IS_Fire_spSinper"
FireAnims(3)="IS_Fire_spSinper"
FireAltAnims(0)="IS_Fire_spSinper"
FireAltAnims(1)="IS_Fire_spSinper"
FireAltAnims(2)="IS_Fire_spSinper"
FireAltAnims(3)="IS_Fire_spSinper"
FireCrouchAnims(0)="CHFire_spSinper"
FireCrouchAnims(1)="CHFire_spSinper"
FireCrouchAnims(2)="CHFire_spSinper"
FireCrouchAnims(3)="CHFire_spSinper"
FireCrouchAltAnims(0)="CHFire_spSinper"
FireCrouchAltAnims(1)="CHFire_spSinper"
FireCrouchAltAnims(2)="CHFire_spSinper"
FireCrouchAltAnims(3)="CHFire_spSinper"
HitAnims(0)="HitF_Winchester"
HitAnims(1)="HitB_Winchester"
HitAnims(2)="HitL_Winchester"
HitAnims(3)="HitR_Winchester"
PostFireBlendStandAnim="Blend_Winchester"
PostFireBlendCrouchAnim="CHBlend_Winchester"
MeshRef="ScrnWeaponPack_A.HuntingRifle3rd"
bHeavy=True
SplashEffect=Class'ROEffects.BulletSplashEmitter'
CullDistance=5000.000000
}

View file

@ -0,0 +1,175 @@
//=============================================================================
// HuntingRifleFire
//=============================================================================
class HuntingRifleFire extends KFFire;
var vector ScopedShakeOffsetMag; //Shake offset mag used for 3d scopes
var vector ScopedShakeOffsetRate; //Shake offset rate used for 3d scopes
//adds limited shot penetration
function DoTrace(Vector Start, Rotator Dir)
{
local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd;
local Actor Other;
local byte HitCount,HCounter;
local float HitDamage;
local array<int> HitPoints;
local KFPawn HitPawn;
local array<Actor> IgnoreActors;
local Actor DamageActor;
local int i;
MaxRange();
Weapon.GetViewAxes(X, Y, Z);
if ( Weapon.WeaponCentered() )
{
ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z);
}
else
{
ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X +
Weapon.Hand * Weapon.EffectOffset.Y * Y + Weapon.EffectOffset.Z * Z);
}
X = Vector(Dir);
End = Start + TraceRange * X;
HitDamage = DamageMax;
While( (HitCount++)<10 )
{
DamageActor = none;
Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1);
if( Other==None )
{
Break;
}
else if( Other==Instigator || Other.Base == Instigator )
{
IgnoreActors[IgnoreActors.Length] = Other;
Other.SetCollision(false);
Start = HitLocation;
Continue;
}
if( ExtendedZCollision(Other)!=None && Other.Owner!=None )
{
IgnoreActors[IgnoreActors.Length] = Other;
IgnoreActors[IgnoreActors.Length] = Other.Owner;
Other.SetCollision(false);
Other.Owner.SetCollision(false);
DamageActor = Pawn(Other.Owner);
}
if ( !Other.bWorldGeometry && Other!=Level )
{
HitPawn = KFPawn(Other);
if ( HitPawn != none )
{
// Hit detection debugging
/*log("PreLaunchTrace hit "$HitPawn.PlayerReplicationInfo.PlayerName);
HitPawn.HitStart = Start;
HitPawn.HitEnd = End;*/
if(!HitPawn.bDeleteMe)
HitPawn.ProcessLocationalDamage(int(HitDamage), Instigator, HitLocation, Momentum*X,DamageType,HitPoints);
// Hit detection debugging
/*if( Level.NetMode == NM_Standalone)
HitPawn.DrawBoneLocation();*/
IgnoreActors[IgnoreActors.Length] = Other;
IgnoreActors[IgnoreActors.Length] = HitPawn.AuxCollisionCylinder;
Other.SetCollision(false);
HitPawn.AuxCollisionCylinder.SetCollision(false);
DamageActor = Other;
}
else
{
if( KFMonster(Other)!=None )
{
IgnoreActors[IgnoreActors.Length] = Other;
Other.SetCollision(false);
DamageActor = Other;
}
else if( DamageActor == none )
{
DamageActor = Other;
}
Other.TakeDamage(int(HitDamage), Instigator, HitLocation, Momentum*X, DamageType);
}
if( (HCounter++)>=5 || Pawn(DamageActor)==None )
{
Break;
}
HitDamage*=0.75;
Start = HitLocation;
}
else if ( HitScanBlockingVolume(Other)==None )
{
if( KFWeaponAttachment(Weapon.ThirdPersonActor)!=None )
KFWeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal);
Break;
}
}
// Turn the collision back on for any actors we turned it off
for (i=0; i<IgnoreActors.Length; i++)
if ( IgnoreActors[i] != none )
IgnoreActors[i].SetCollision(true);
}
//adds faked recoil to 3d scope zoom
event ModeDoFire()
{
if( KFWeapon(Weapon).bAimingRifle )
{
if ( KFWeapon(Weapon).KFScopeDetail != KF_TextureScope)
{
ShakeOffsetMag=default.ScopedShakeOffsetMag;
ShakeOffsetRate=default.ScopedShakeOffsetRate;
}
}
else
{
ShakeOffsetMag=default.ShakeOffsetMag;
ShakeOffsetRate=default.ShakeOffsetRate;
}
Super.ModeDoFire();
}
defaultproperties
{
ScopedShakeOffsetMag=(X=3.000000)
ScopedShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
FireAimedAnim="Fire_Iron"
RecoilRate=0.100000
maxVerticalRecoilAngle=800
maxHorizontalRecoilAngle=250
FireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_mono"
StereoFireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_stereo"
NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire"
DamageType=Class'ScrnWeaponPack.DamTypeHuntingRifle'
DamageMin=190
DamageMax=220
Momentum=18000.000000
bWaitForRelease=True
bModeExclusive=False
bAttachSmokeEmitter=True
TransientSoundVolume=1.800000
FireLoopAnim=
FireEndAnim=
FireForce="ShockRifleFire"
FireRate=1.900000
AmmoClass=Class'ScrnWeaponPack.HuntingRifleAmmo'
AmmoPerFire=1
ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000)
ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
ShakeRotTime=2.000000
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=2.000000
BotRefireRate=0.650000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=0.000000
Spread=0.007000
}

View file

@ -0,0 +1,35 @@
//=============================================================================
// HuntingRifle Pickup.
//=============================================================================
class HuntingRiflePickup extends KFWeaponPickup;
/*
function ShowDeagleInfo(Canvas C)
{
C.SetPos((C.SizeX - C.SizeY) / 2,0);
C.DrawTile( Texture'KillingfloorHUD.ClassMenu.Deagle', C.SizeY, C.SizeY, 0.0, 0.0, 256, 256);
}
*/
defaultproperties
{
Weight=7.000000
cost=650
BuyClipSize=10
PowerValue=55
SpeedValue=42
RangeValue=95
Description="A rugged and reliable scoped rifle."
ItemName="Hunting Rifle SE"
ItemShortName="Hunter R.SE"
AmmoItemName="Rifle bullets"
CorrespondingPerkIndex=2
EquipmentCategoryID=2
InventoryType=Class'ScrnWeaponPack.HuntingRifle'
PickupMessage="You got the Hunting Rifle"
PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.HR_Pickup'
CollisionRadius=30.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,97 @@
class KFShellEjectAK12AR extends KFShellEject;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(1);
Emitters[1].SpawnParticle(1);
Emitters[2].SpawnParticle(5);
}
defaultproperties
{
Begin Object Class=MeshEmitter Name=MeshEmitter0
StaticMesh=StaticMesh'ScrnWeaponPack_SM.AK12_shell'
RespawnDeadParticles=False
ZTest=False
SpinParticles=True
AutomaticInitialSpawning=False
Acceleration=(Z=-500.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
MaxParticles=50
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000))
StartSizeRange=(X=(Min=2.500000,Max=2.500000),Y=(Min=2.500000,Max=2.500000),Z=(Min=2.500000,Max=2.500000))
LifetimeRange=(Min=5.000000,Max=5.000000)
StartVelocityRange=(X=(Min=100.000000,Max=100.000000),Z=(Min=100.000000,Max=150.000000))
End Object
Emitters(0)=MeshEmitter'ScrnWeaponPack.KFShellEjectAK12AR.MeshEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseDirectionAs=PTDU_Up
UseCollision=True
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
ZTest=False
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
ScaleSizeXByVelocity=True
AutomaticInitialSpawning=False
Acceleration=(Z=-210.000000)
DampingFactorRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000))
ColorScale(0)=(Color=(B=255,G=255,R=187))
ColorScale(1)=(RelativeTime=0.214286,Color=(G=103,R=206,A=255))
ColorScale(2)=(RelativeTime=0.439286,Color=(B=100,G=177,R=255,A=255))
ColorScale(3)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255))
ColorScale(4)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255))
ColorScale(5)=(RelativeTime=1.000000,Color=(R=128,A=255))
ColorScale(6)=(RelativeTime=1.000000)
ColorScale(7)=(RelativeTime=1.000000)
FadeOutStartTime=0.336000
FadeInEndTime=0.064000
MaxParticles=50
UseRotationFrom=PTRS_Actor
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000))
ScaleSizeByVelocityMultiplier=(X=0.010000,Y=0.010000)
Texture=Texture'KFX.KFSparkHead'
LifetimeRange=(Min=1.500000,Max=1.500000)
StartVelocityRange=(X=(Min=-100.000000,Max=100.000000),Y=(Min=50.000000,Max=100.000000),Z=(Min=50.000000,Max=100.000000))
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.KFShellEjectAK12AR.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.200000
MaxParticles=50
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.500000)
StartSizeRange=(X=(Min=5.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.200000,Max=1.200000)
StartVelocityRange=(X=(Max=40.000000),Z=(Min=10.000000,Max=30.000000))
VelocityLossRange=(X=(Max=2.000000))
End Object
Emitters(2)=SpriteEmitter'ScrnWeaponPack.KFShellEjectAK12AR.SpriteEmitter4'
}

View file

@ -0,0 +1,97 @@
class KFShellEjectSVD extends KFShellEject;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(1);
Emitters[1].SpawnParticle(1);
Emitters[2].SpawnParticle(5);
}
defaultproperties
{
Begin Object Class=MeshEmitter Name=MeshEmitter0
StaticMesh=StaticMesh'ScrnWeaponPack_SM.SVD_shell'
RespawnDeadParticles=False
ZTest=False
SpinParticles=True
AutomaticInitialSpawning=False
Acceleration=(Z=-500.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
MaxParticles=50
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000))
StartSizeRange=(X=(Min=2.500000,Max=2.500000),Y=(Min=2.500000,Max=2.500000),Z=(Min=2.500000,Max=2.500000))
LifetimeRange=(Min=5.000000,Max=5.000000)
StartVelocityRange=(X=(Min=100.000000,Max=100.000000),Z=(Min=100.000000,Max=150.000000))
End Object
Emitters(0)=MeshEmitter'ScrnWeaponPack.KFShellEjectSVD.MeshEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseDirectionAs=PTDU_Up
UseCollision=True
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
ZTest=False
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
ScaleSizeXByVelocity=True
AutomaticInitialSpawning=False
Acceleration=(Z=-210.000000)
DampingFactorRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000))
ColorScale(0)=(Color=(B=255,G=255,R=187))
ColorScale(1)=(RelativeTime=0.214286,Color=(G=103,R=206,A=255))
ColorScale(2)=(RelativeTime=0.439286,Color=(B=100,G=177,R=255,A=255))
ColorScale(3)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255))
ColorScale(4)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255))
ColorScale(5)=(RelativeTime=1.000000,Color=(R=128,A=255))
ColorScale(6)=(RelativeTime=1.000000)
ColorScale(7)=(RelativeTime=1.000000)
FadeOutStartTime=0.336000
FadeInEndTime=0.064000
MaxParticles=50
UseRotationFrom=PTRS_Actor
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000))
ScaleSizeByVelocityMultiplier=(X=0.010000,Y=0.010000)
Texture=Texture'KFX.KFSparkHead'
LifetimeRange=(Min=1.500000,Max=1.500000)
StartVelocityRange=(X=(Min=-100.000000,Max=100.000000),Y=(Min=50.000000,Max=100.000000),Z=(Min=50.000000,Max=100.000000))
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.KFShellEjectSVD.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.700000
MaxParticles=50
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.500000)
StartSizeRange=(X=(Min=5.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.200000,Max=1.200000)
StartVelocityRange=(Y=(Min=-30.000000,Max=30.000000))
VelocityLossRange=(X=(Max=2.000000))
End Object
Emitters(2)=SpriteEmitter'ScrnWeaponPack.KFShellEjectSVD.SpriteEmitter4'
}

View file

@ -0,0 +1,35 @@
class KFShellSpewerSVD extends xEmitter;
var() Sound ShellImpactSnd;
function CollisionSound()
{
PlaySound(ShellImpactSnd);
}
defaultproperties
{
ShellImpactSnd=SoundGroup'Inf_Weapons.shells.ShellRifleDirt'
mParticleType=PT_Mesh
mStartParticles=0
mMaxParticles=150
mLifeRange(0)=0.500000
mLifeRange(1)=1.000000
mRegenRange(0)=0.000000
mRegenRange(1)=0.000000
mDirDev=(X=1.500000,Y=0.200000,Z=0.600000)
mSpeedRange(0)=200.000000
mSpeedRange(1)=250.000000
mMassRange(0)=2.000000
mMassRange(1)=2.000000
mSpinRange(0)=-600.000000
mSpinRange(1)=600.000000
mAttenFunc=ATF_None
mMeshNodes(0)=StaticMesh'PatchStatics.NormalCasing'
mColMakeSound=True
bHighDetail=True
bNetTemporary=False
DrawScale=0.100000
Skins(0)=Texture'PatchTex.NormalCasing'
bUnlit=False
}

View file

@ -0,0 +1,12 @@
class MTS255Ammo extends KFAmmunition;
defaultproperties
{
AmmoPickupAmount=10
MaxAmmo=35
InitialAmount=15
PickupClass=Class'ScrnWeaponPack.MTS255AmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=4,Y1=350,X2=110,Y2=395)
ItemName="Explosive 12-gauge Shells"
}

View file

@ -0,0 +1,8 @@
class MTS255AmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=10
InventoryType=Class'ScrnWeaponPack.MTS255Ammo'
PickupMessage="Explosive 12-gauge Shells"
}

View file

@ -0,0 +1,52 @@
class MTS255Attachment extends KFWeaponAttachment;
defaultproperties
{
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar'
mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer'
MovementAnims(0)="JogF_Shotgun"
MovementAnims(1)="JogB_Shotgun"
MovementAnims(2)="JogL_Shotgun"
MovementAnims(3)="JogR_Shotgun"
TurnLeftAnim="TurnL_Shotgun"
TurnRightAnim="TurnR_Shotgun"
CrouchAnims(0)="CHwalkF_Shotgun"
CrouchAnims(1)="CHwalkB_Shotgun"
CrouchAnims(2)="CHwalkL_Shotgun"
CrouchAnims(3)="CHwalkR_Shotgun"
WalkAnims(0)="WalkF_Shotgun"
WalkAnims(1)="WalkB_Shotgun"
WalkAnims(2)="WalkL_Shotgun"
WalkAnims(3)="WalkR_Shotgun"
CrouchTurnRightAnim="CH_TurnR_Shotgun"
CrouchTurnLeftAnim="CH_TurnL_Shotgun"
IdleCrouchAnim="CHIdle_Shotgun"
IdleWeaponAnim="Idle_Shotgun"
IdleRestAnim="Idle_Shotgun"
IdleChatAnim="Idle_Shotgun"
IdleHeavyAnim="Idle_Shotgun"
IdleRifleAnim="Idle_Shotgun"
FireAnims(0)="Fire_Benelli"
FireAnims(1)="Fire_Benelli"
FireAnims(2)="Fire_Benelli"
FireAnims(3)="Fire_Benelli"
FireAltAnims(0)="Fire_Benelli"
FireAltAnims(1)="Fire_Benelli"
FireAltAnims(2)="Fire_Benelli"
FireAltAnims(3)="Fire_Benelli"
FireCrouchAnims(0)="CHFire_Benelli"
FireCrouchAnims(1)="CHFire_Benelli"
FireCrouchAnims(2)="CHFire_Benelli"
FireCrouchAnims(3)="CHFire_Benelli"
FireCrouchAltAnims(0)="CHFire_Benelli"
FireCrouchAltAnims(1)="CHFire_Benelli"
FireCrouchAltAnims(2)="CHFire_Benelli"
FireCrouchAltAnims(3)="CHFire_Benelli"
HitAnims(0)="HitF_Shotgun"
HitAnims(1)="HitB_Shotgun"
HitAnims(2)="HitL_Shotgun"
HitAnims(3)="HitR_Shotgun"
PostFireBlendStandAnim="Blend_Shotgun"
PostFireBlendCrouchAnim="CHBlend_Shotgun"
MeshRef="ScrnWeaponPack_A.MTS255_3rd"
}

View file

@ -0,0 +1,99 @@
class MTS255Fire extends KFShotgunFire;
var() class<Emitter> ShellEjectClass;
var() Emitter ShellEjectEmitter;
var() name ShellEjectBoneName;
simulated function InitEffects()
{
super.InitEffects();
if ( (Level.NetMode == NM_DedicatedServer) || (AIController(Instigator.Controller) != None) )
return;
if ( (ShellEjectClass != None) && ((ShellEjectEmitter == None) || ShellEjectEmitter.bDeleteMe) )
{
ShellEjectEmitter = Weapon.Spawn(ShellEjectClass);
Weapon.AttachToBone(ShellEjectEmitter, ShellEjectBoneName);
}
}
function DrawMuzzleFlash(Canvas Canvas)
{
super.DrawMuzzleFlash(Canvas);
if (ShellEjectEmitter != None )
{
Canvas.DrawActor( ShellEjectEmitter, false, false, Weapon.DisplayFOV );
}
}
function FlashMuzzleFlash()
{
super.FlashMuzzleFlash();
if (ShellEjectEmitter != None)
{
ShellEjectEmitter.Trigger(Weapon, Instigator);
}
}
simulated function DestroyEffects()
{
super.DestroyEffects();
if (ShellEjectEmitter != None)
ShellEjectEmitter.Destroy();
}
// Overridden to support interrupting the reload
simulated function bool AllowFire()
{
if( KFWeapon(Weapon).bIsReloading )
return false;
if(KFPawn(Instigator).SecondaryItem!=none)
return false;
if( KFPawn(Instigator).bThrowingNade )
return false;
if( Level.TimeSeconds - LastClickTime>FireRate )
{
LastClickTime = Level.TimeSeconds;
}
if( KFWeapon(Weapon).MagAmmoRemaining<1 )
{
return false;
}
return super(WeaponFire).AllowFire();
}
defaultproperties
{
KickMomentum=(X=-45.000000,Z=10.000000)
maxVerticalRecoilAngle=1500
maxHorizontalRecoilAngle=900
FireAimedAnim="Fire_Iron"
bRandomPitchFireSound=False
FireSoundRef="KF_PumpSGSnd.SG_Fire"
StereoFireSoundRef="KF_PumpSGSnd.SG_FireST"
NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire"
ProjPerFire=1
bWaitForRelease=True
bAttachSmokeEmitter=True
TransientSoundVolume=2.000000
TransientSoundRadius=500.000000
FireRate=0.400000
AmmoClass=Class'ScrnWeaponPack.MTS255Ammo'
ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000)
ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000)
ShakeRotTime=5.000000
ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=10.000000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=3.000000
ProjectileClass=Class'ScrnWeaponPack.MTS255Rocket'
BotRefireRate=0.200000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=1.000000
Spread=0.010000
}

View file

@ -0,0 +1,25 @@
class MTS255Pickup extends KFWeaponPickup;
defaultproperties
{
Weight=7.000000
cost=2250
AmmoCost=35
BuyClipSize=5
PowerValue=70
SpeedValue=60
RangeValue=15
Description="The MTs-255 is a 12-gauge shotgun fed by a 5-round internal revolving cylinder. Holds up to 5 explosive slugs."
ItemName="MTs-255 Shotgun SE"
ItemShortName="MTs-255 SE"
AmmoItemName="12-gauge explosive shells"
CorrespondingPerkIndex=6
EquipmentCategoryID=2
InventoryType=Class'ScrnWeaponPack.MTS255Shotgun'
PickupMessage="You got the MTs-255 Explosive Shotgun"
PickupSound=Sound'KF_M4ShotgunSnd.foley.WEP_Benelli_Foley_Pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.MTS255_Pickup'
CollisionRadius=35.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,125 @@
class MTS255Rocket extends SPGrenadeProjectile;
var() float StraightFlightTime; // How long the projectile and flies straight
var bool bOutOfPropellant; // Projectile is out of propellant
var bool bDud;
replication
{
reliable if(Role == ROLE_Authority)
bDud;
}
simulated function Tick( float DeltaTime )
{
SetRotation(Rotator(Normal(Velocity)));
if( !bOutOfPropellant ){
if ( StraightFlightTime > 0 )
StraightFlightTime -= DeltaTime;
else
bOutOfPropellant = true;
}
if( bOutOfPropellant && Physics != PHYS_Falling )
SetPhysics(PHYS_Falling);
}
simulated function HitWall( vector HitNormal, actor Wall )
{
if( Instigator != none )
{
OrigLoc = Instigator.Location;
}
if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) )
{
bDud = true;
LifeSpan=1.0;
Velocity = vect(0,0,0);
SetPhysics(PHYS_Falling);
}
if( !bDud )
{
super(Projectile).HitWall(HitNormal,Wall);
}
}
simulated function Explode(vector HitLocation, vector HitNormal)
{
bHasExploded = True;
// Don't explode if this is a dud
if( bDud )
{
Velocity = vect(0,0,0);
LifeSpan=1.0;
SetPhysics(PHYS_Falling);
return;
}
super.Explode(HitLocation, HitNormal);
}
simulated function ProcessTouch(Actor Other, Vector HitLocation)
{
// Don't let it hit this player, or blow up on another player
if ( Other == none || Other == Instigator || Other.Base == Instigator )
return;
// Don't collide with bullet whip attachments
if( KFBulletWhipAttachment(Other) != none )
{
return;
}
// Don't allow hits on poeple on the same team
if( KFHumanPawn(Other) != none && Instigator != none
&& KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex )
{
return;
}
// Use the instigator's location if it exists. This fixes issues with
// the original location of the projectile being really far away from
// the real Origloc due to it taking a couple of milliseconds to
// replicate the location to the client and the first replicated location has
// already moved quite a bit.
if( Instigator != none )
{
OrigLoc = Instigator.Location;
}
if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) )
{
if( Role == ROLE_Authority )
{
AmbientSound=none;
PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0);
Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType );
}
bDud = true;
Velocity = vect(0,0,0);
LifeSpan=1.0;
SetPhysics(PHYS_Falling);
}
if( !bDud )
{
Explode(HitLocation,Normal(HitLocation-Other.Location));
}
}
defaultproperties
{
StraightFlightTime=0.500000
ArmDistSquared=62500.000000
Speed=5000.000000
MaxSpeed=7500.000000
TossZ=0.000000
Damage=260.000000
DamageRadius=300.000000
Physics=PHYS_Projectile
DrawScale=0.500000
bBounce=False
}

View file

@ -0,0 +1,52 @@
class MTS255Shotgun extends KFWeapon;
#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx
#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx
#exec OBJ LOAD FILE=ScrnWeaponPack_SM.usx
defaultproperties
{
MagCapacity=5
ReloadRate=2.200000
ReloadAnim="Reload"
ReloadAnimRate=1.000000
WeaponReloadAnim="Reload_Winchester"
Weight=7.000000
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=65.000000
bModeZeroCanDryFire=True
SleeveNum=0
TraderInfoTexture=Texture'ScrnWeaponPack_T.MTS.MTS255_Trader'
MeshRef="ScrnWeaponPack_A.MTS255_1st"
SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb"
SkinRefs(1)="ScrnWeaponPack_T.MTS.Osnova_cmb"
SkinRefs(2)="ScrnWeaponPack_T.MTS.Pricel_cmb"
SkinRefs(3)="ScrnWeaponPack_T.MTS.Zaryadka_cmb"
SkinRefs(4)="ScrnWeaponPack_T.MTS.Patron_cmb"
SelectSoundRef="KF_M4ShotgunSnd.foley.WEP_Benelli_Foley_Select"
HudImageRef="ScrnWeaponPack_T.MTS.MTS255_unselected"
SelectedHudImageRef="ScrnWeaponPack_T.MTS.MTS255_selected"
PlayerIronSightFOV=80.000000
ZoomedDisplayFOV=45.000000
FireModeClass(0)=Class'ScrnWeaponPack.MTS255Fire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectForce="SwitchToAssaultRifle"
AIRating=0.550000
CurrentRating=0.550000
bShowChargingBar=True
Description="The MTs-255 is a 12-gauge shotgun fed by a 5-round internal revolving cylinder. Holds up to 5 explosive slugs."
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
DisplayFOV=65.000000
Priority=200
InventoryGroup=3
GroupOffset=10
PickupClass=Class'ScrnWeaponPack.MTS255Pickup'
PlayerViewOffset=(X=19.700001,Y=18.750000,Z=-7.500000)
BobDamping=6.000000
AttachmentClass=Class'ScrnWeaponPack.MTS255Attachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="MTs-255 Shotgun SE"
TransientSoundVolume=1.250000
}

View file

@ -0,0 +1,6 @@
class MedicDartAttachment extends ScrnFakedProjectile;
defaultproperties
{
StaticMesh=StaticMesh'ScrnWeaponPack_SM.MedicDartAttachment'
}

View file

@ -0,0 +1,503 @@
class MedicPistol extends KFWeapon
config(user);
var const class<ScrnLocalLaserDot> LaserDotClass;
var ScrnLocalLaserDot LaserDot; // The first person laser site dot
var() class<InventoryAttachment> LaserAttachmentClass; // First person laser attachment class
var Actor LaserAttachment; // First person laser attachment
var byte LaserType;
var transient Vector HealLocation, ClientHealLocation;
var transient Rotator HealRotation;
var Sound HealSound;
var string HealSoundRef;
var name ReloadShortAnim;
var float ReloadShortRate;
var transient bool bShortReload;
var bool bFiringLastRound;
replication
{
reliable if(Role < ROLE_Authority)
ServerSetLaserType;
reliable if( Role == ROLE_Authority )
ClientSuccessfulHeal;
reliable if( bNetDirty && Role == ROLE_Authority )
HealRotation, HealLocation;
}
//=============================================================================
// Dynamic Asset Load
//=============================================================================
static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount)
{
local MedicPistol W;
super.PreloadAssets(Inv, bSkipRefCount);
default.HealSound = sound(DynamicLoadObject(default.HealSoundRef, class'Sound', true));
if ( W != none ) {
W.HealSound = default.HealSound;
}
}
static function bool UnloadAssets()
{
if ( super.UnloadAssets() )
{
default.HealSound = none;
}
return true;
}
//=============================================================================
// Functions
//=============================================================================
simulated function PostNetReceive()
{
if ( Role < ROLE_Authority && ClientHealLocation != HealLocation ) {
ClientHealLocation = HealLocation;
HitHealTarget(HealLocation, HealRotation);
}
}
simulated function Fire(float f)
{
if ( f == 0)
bFiringLastRound = MagAmmoRemaining == 1;
super.Fire(f);
}
simulated function Destroyed()
{
if (LaserDot != None)
LaserDot.Destroy();
if (LaserAttachment != None)
LaserAttachment.Destroy();
super.Destroyed();
}
simulated function bool AllowReload()
{
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
if(KFInvasionBot(Instigator.Controller) != none && !bIsReloading &&
MagAmmoRemaining <= MagCapacity && AmmoAmount(0) > MagAmmoRemaining)
return true;
if(KFFriendlyAI(Instigator.Controller) != none && !bIsReloading &&
MagAmmoRemaining <= MagCapacity && AmmoAmount(0) > MagAmmoRemaining)
return true;
if(FireMode[0].IsFiring() || FireMode[1].IsFiring() ||
bIsReloading || MagAmmoRemaining > MagCapacity ||
ClientState == WS_BringUp ||
AmmoAmount(0) <= MagAmmoRemaining ||
(FireMode[0].NextFireTime - Level.TimeSeconds) > 0.1 )
return false;
return true;
}
exec function ReloadMeNow()
{
local float ReloadMulti;
if(!AllowReload())
return;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
ReloadTimer = Level.TimeSeconds;
bShortReload = MagAmmoRemaining > 0 && ReloadShortAnim != '';
if ( bShortReload )
ReloadRate = Default.ReloadShortRate / ReloadMulti;
else
ReloadRate = Default.ReloadRate / ReloadMulti;
if( bHoldToReload )
{
NumLoadedThisReload = 0;
}
ClientReload();
Instigator.SetAnimAction(WeaponReloadAnim);
if ( Level.Game.NumPlayers > 1 && KFGameType(Level.Game).bWaveInProgress && KFPlayerController(Instigator.Controller) != none &&
Level.TimeSeconds - KFPlayerController(Instigator.Controller).LastReloadMessageTime > KFPlayerController(Instigator.Controller).ReloadMessageDelay )
{
KFPlayerController(Instigator.Controller).Speech('AUTO', 2, "");
KFPlayerController(Instigator.Controller).LastReloadMessageTime = Level.TimeSeconds;
}
}
simulated function ClientReload()
{
local float ReloadMulti;
if ( bHasAimingMode && bAimingRifle )
{
FireMode[1].bIsFiring = False;
ZoomOut(false);
if( Role < ROLE_Authority)
ServerZoomOut(false);
}
if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none )
ReloadMulti = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetReloadSpeedModifier(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self);
else
ReloadMulti = 1.0;
bIsReloading = true;
if ( MagAmmoRemaining <= 0 || ReloadShortAnim == '' )
{
PlayAnim(ReloadAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
else if ( MagAmmoRemaining >= 1 )
{
PlayAnim(ReloadShortAnim, ReloadAnimRate*ReloadMulti, 0.1);
}
}
function AddReloadedAmmo()
{
local int a;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
a = MagCapacity;
if ( bShortReload )
a++; // 1 bullet already bolted
if ( AmmoAmount(0) >= a )
MagAmmoRemaining = a;
else
MagAmmoRemaining = AmmoAmount(0);
// this seems redudant -- PooSH
// if( !bHoldToReload )
// {
// ClientForceKFAmmoUpdate(MagAmmoRemaining,AmmoAmount(0));
// }
if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none )
{
KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded();
}
}
simulated function WeaponTick(float dt)
{
//Change the various animations depending on whether the last round was fired
if (Level.NetMode != NM_DedicatedServer)
{
if (MagAmmoRemaining >= 1 || bIsReloading)
{
//ReloadAnim = 'ReloadChambered';
IdleAnim = default.IdleAnim;
IdleAimAnim = default.IdleAimAnim;
SelectAnim = default.SelectAnim;
PutDownAnim = default.PutDownAnim;
ModeSwitchAnim = default.ModeSwitchAnim;
}
else if (MagAmmoRemaining == 0)
{
//ReloadAnim = default.ReloadAnim;
IdleAnim = 'IdleEmpty';
IdleAimAnim = 'IdleEmpty_Iron';
SelectAnim = 'SelectEmpty';
PutDownAnim = 'PutDownEmpty';
ModeSwitchAnim = 'LightOnEmpty';
}
}
//End animation-swapping stuff
super.WeaponTick(dt);
if ( (FlashLight != none && FlashLight.bHasLight ) == (LaserType > 0) )
ToggleLaser(); // automatically turn on laser if flashlight is off
}
//bring Laser to current state, which is indicating by LaserType
simulated function ApplyLaserState()
{
if( Role < ROLE_Authority )
ServerSetLaserType(LaserType);
if ( ThirdPersonActor != none )
ScrnLaserWeaponAttachment(ThirdPersonActor).SetLaserType(LaserType);
if ( !Instigator.IsLocallyControlled() )
return;
if(LaserType > 0 ) {
if ( LaserDot == none )
LaserDot = Spawn(LaserDotClass, self);
LaserDot.SetLaserType(LaserType);
//spawn 1-st person laser attachment for weapon owner
if ( LaserAttachment == none ) {
LaserAttachment = Spawn(LaserAttachmentClass,,,,);
AttachToBone(LaserAttachment, FlashBoneName);
}
ConstantColor'ScrnTex.Laser.LaserColor'.Color =
LaserDot.GetLaserColor(); // LaserAttachment's color
LaserAttachment.bHidden = false;
}
else {
if ( LaserAttachment != none )
LaserAttachment.bHidden = true;
if ( LaserDot != none )
LaserDot.Destroy(); //bHidden = true;
}
}
// Toggle laser on or off
simulated function ToggleLaser()
{
if( !Instigator.IsLocallyControlled() )
return;
if ( LaserType == 0 )
LaserType = 3; // Blue
else
LaserType = 0;
ApplyLaserState();
}
simulated function BringUp(optional Weapon PrevWeapon)
{
ApplyLaserState();
Super.BringUp(PrevWeapon);
}
simulated function bool PutDown()
{
TurnOffLaser();
return super.PutDown();
}
simulated function DetachFromPawn(Pawn P)
{
TurnOffLaser();
Super.DetachFromPawn(P);
}
simulated function TurnOffLaser()
{
if( !Instigator.IsLocallyControlled() )
return;
if( Role < ROLE_Authority )
ServerSetLaserType(0);
//don't change Laser type here, because we need to restore it state
//when next time weapon will be bringed up
if ( LaserAttachment != none )
LaserAttachment.bHidden = true;
if (LaserDot != None)
LaserDot.Destroy();
}
// Set the new fire mode on the server
function ServerSetLaserType(byte NewLaserType)
{
LaserType = NewLaserType;
ScrnLaserWeaponAttachment(ThirdPersonActor).SetLaserType(LaserType);
}
simulated function RenderOverlays( Canvas Canvas )
{
local int i;
local Vector StartTrace, EndTrace;
local Vector HitLocation, HitNormal;
local Actor Other;
local vector X,Y,Z;
local coords C;
local KFFire KFM;
local array<Actor> HitActors;
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 ( i = 0; i < NUM_FIRE_MODES; ++i ) {
if (FireMode[i] != None)
FireMode[i].DrawMuzzleFlash(Canvas);
}
SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) );
SetRotation( Instigator.GetViewRotation() + ZoomRotInterp);
KFM = KFFire(FireMode[0]);
// Handle drawing the laser dot
if ( LaserDot != None )
{
//move LaserDot during fire animation too -- PooSH
if( bIsReloading )
{
C = GetBoneCoords(FlashBoneName);
X = C.XAxis;
Y = C.YAxis;
Z = C.ZAxis;
}
else
GetViewAxes(X, Y, Z);
StartTrace = Instigator.Location + Instigator.EyePosition();
EndTrace = StartTrace + 65535 * X;
while (true) {
Other = Trace(HitLocation, HitNormal, EndTrace, StartTrace, true);
if ( ROBulletWhipAttachment(Other) != none ) {
HitActors[HitActors.Length] = Other;
Other.SetCollision(false);
StartTrace = HitLocation + X;
}
else {
if (Other != None && Other != Instigator && Other.Base != Instigator )
EndBeamEffect = HitLocation;
else
EndBeamEffect = EndTrace;
break;
}
}
// restore collision
for ( i=0; i<HitActors.Length; ++i )
HitActors[i].SetCollision(true);
LaserDot.SetLocation(EndBeamEffect - X*LaserDot.ProjectorPullback);
if( Pawn(Other) != none ) {
LaserDot.SetRotation(Rotator(X));
LaserDot.SetDrawScale(LaserDot.default.DrawScale * 0.5);
}
else if( HitNormal == vect(0,0,0) ) {
LaserDot.SetRotation(Rotator(-X));
LaserDot.SetDrawScale(LaserDot.default.DrawScale);
}
else {
LaserDot.SetRotation(Rotator(-HitNormal));
LaserDot.SetDrawScale(LaserDot.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;
}
exec function SwitchModes()
{
DoToggle();
}
simulated function ClientSuccessfulHeal(PlayerReplicationInfo HealedPRI)
{
if( PlayerController(Instigator.Controller) != none )
PlayerController(Instigator.controller).ClientMessage(class'KFMod.MP7MMedicGun'.default.SuccessfulHealMessage $ HealedPRI.PlayerName, 'CriticalEvent');
}
simulated function HitHealTarget(vector HitLocation, rotator HitRotation)
{
HealLocation = HitLocation;
HealRotation = HitRotation;
if( Role == ROLE_Authority ) {
NetUpdateTime = Level.TimeSeconds - 1;
}
PlaySound(HealSound,,2.0);
if ( EffectIsRelevant(Location,false) )
{
Spawn(Class'KFMod.HealingFX',,, HitLocation, HitRotation);
}
}
defaultproperties
{
LaserDotClass=Class'ScrnBalanceSrv.ScrnLocalLaserDot'
LaserAttachmentClass=Class'ScrnBalanceSrv.ScrnLaserAttachmentFirstPerson'
HealSoundRef="KF_MP7Snd.MP7_DartImpact"
ReloadShortAnim="ReloadChambered"
ReloadShortRate=1.500000
MagCapacity=7
ReloadRate=2.000000
ReloadAnim="Reload"
ReloadAnimRate=1.000000
FlashBoneName="LightBone"
WeaponReloadAnim="Reload_Single9mm"
ModeSwitchAnim="LightOn"
Weight=2.000000
bTorchEnabled=True
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=70.000000
bModeZeroCanDryFire=True
SleeveNum=0
TraderInfoTexture=Texture'ScrnWeaponPack_T.MedicPistol.HUD_Single_UnSelected'
MeshRef="ScrnWeaponPack_A.MedicPistol_1st"
SkinRefs(1)="ScrnWeaponPack_T.MedicPistol.Slide_cmb"
SkinRefs(2)="ScrnWeaponPack_T.MedicPistol.Frame_cmb"
SkinRefs(3)="ScrnWeaponPack_T.MedicPistol.Slide_cmb"
SkinRefs(4)="ScrnWeaponPack_T.MedicPistol.Slide_shd"
SelectSoundRef="KF_9MMSnd.9mm_Select"
HudImageRef="ScrnWeaponPack_T.MedicPistol.HUD_Single_UnSelected"
SelectedHudImageRef="ScrnWeaponPack_T.MedicPistol.HUD_Single_Selected"
ZoomedDisplayFOV=65.000000
FireModeClass(0)=Class'ScrnWeaponPack.MedicPistolFire'
FireModeClass(1)=Class'ScrnWeaponPack.MedicPistolLightFire'
PutDownAnim="PutDown"
AIRating=0.250000
CurrentRating=0.250000
bShowChargingBar=True
Description="Primary fire shoots healing darts. Darts heal zeds too, but it doesn't help them much, if titanium needle breaks their skulls first. Shooting multiple dart into the same zed may cause overdose. Alternate fire switch between laser and flashlight."
DisplayFOV=70.000000
Priority=60
InventoryGroup=2
GroupOffset=1
PickupClass=Class'ScrnWeaponPack.MedicPistolPickup'
PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000)
BobDamping=6.000000
AttachmentClass=Class'ScrnWeaponPack.MedicPistolAttachment'
IconCoords=(X1=434,Y1=253,X2=506,Y2=292)
ItemName="KF2 Medic Pistol SE"
}

View file

@ -0,0 +1,17 @@
//=============================================================================
// 9mm Ammo.
//=============================================================================
class MedicPistolAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=InterfaceContent.utx
defaultproperties
{
AmmoPickupAmount=14
MaxAmmo=98
InitialAmount=21
PickupClass=Class'ScrnWeaponPack.MedicPistolAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=413,Y1=82,X2=457,Y2=125)
ItemName="Healing Darts"
}

View file

@ -0,0 +1,10 @@
class MedicPistolAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=7
InventoryType=Class'ScrnWeaponPack.MedicPistolAmmo'
RespawnTime=0.000000
PickupMessage="Healing Darts"
StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo'
}

View file

@ -0,0 +1,121 @@
class MedicPistolAttachment extends ScrnLaserWeaponAttachment;
var Actor TacShine;
var Effects TacShineCorona;
var bool bBeamEnabled;
replication
{
reliable if ( Role==ROLE_Authority )
bBeamEnabled;
}
// Prevents tracers from spawning if player is using the flashlight function of the 9mm
simulated event ThirdPersonEffects()
{
if( FiringMode==1 )
return;
Super.ThirdPersonEffects();
}
simulated function Destroyed()
{
if ( TacShineCorona != None )
TacShineCorona.Destroy();
if ( TacShine != None )
TacShine.Destroy();
Super.Destroyed();
}
simulated function UpdateTacBeam( float Dist )
{
local vector Sc;
if( !bBeamEnabled )
{
if (TacShine == none )
{
TacShine = Spawn(Class'MedicPistol'.Default.TacShineClass,Owner,,,);
AttachToBone(TacShine, LaserAttachmentBone);
TacShine.RemoteRole = ROLE_None;
}
else TacShine.bHidden = False;
if (TacShineCorona == none )
{
TacShineCorona = Spawn(class 'KFTacLightCorona',Owner,,,);
AttachToBone(TacShineCorona,LaserAttachmentBone);
TacShineCorona.RemoteRole = ROLE_None;
}
TacShineCorona.bHidden = False;
bBeamEnabled = True;
}
Sc = TacShine.DrawScale3D;
Sc.Y = FClamp(Dist/90.f,0.02,1.f);
if( TacShine.DrawScale3D!=Sc )
TacShine.SetDrawScale3D(Sc);
}
simulated function TacBeamGone()
{
if( bBeamEnabled )
{
if (TacShine!=none )
TacShine.bHidden = True;
if (TacShineCorona!=none )
TacShineCorona.bHidden = True;
bBeamEnabled = False;
}
}
defaultproperties
{
LaserAttachmentBone="FlashLight"
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol'
mTracerClass=Class'KFMod.KFNewTracer'
mShellCaseEmitterClass=Class'KFMod.KFShellSpewer'
MovementAnims(0)="JogF_Single9mm"
MovementAnims(1)="JogB_Single9mm"
MovementAnims(2)="JogL_Single9mm"
MovementAnims(3)="JogR_Single9mm"
TurnLeftAnim="TurnL_Single9mm"
TurnRightAnim="TurnR_Single9mm"
CrouchAnims(0)="CHwalkF_Single9mm"
CrouchAnims(1)="CHwalkB_Single9mm"
CrouchAnims(2)="CHwalkL_Single9mm"
CrouchAnims(3)="CHwalkR_Single9mm"
CrouchTurnRightAnim="CH_TurnR_Single9mm"
CrouchTurnLeftAnim="CH_TurnL_Single9mm"
IdleCrouchAnim="CHIdle_Single9mm"
IdleWeaponAnim="Idle_Single9mm"
IdleRestAnim="Idle_Single9mm"
IdleChatAnim="Idle_Single9mm"
IdleHeavyAnim="Idle_Single9mm"
IdleRifleAnim="Idle_Single9mm"
FireAnims(0)="Fire_Single9mm"
FireAnims(1)="Fire_Single9mm"
FireAnims(2)="Fire_Single9mm"
FireAnims(3)="Fire_Single9mm"
FireAltAnims(0)="Fire_Single9mm"
FireAltAnims(1)="Fire_Single9mm"
FireAltAnims(2)="Fire_Single9mm"
FireAltAnims(3)="Fire_Single9mm"
FireCrouchAnims(0)="CHFire_Single9mm"
FireCrouchAnims(1)="CHFire_Single9mm"
FireCrouchAnims(2)="CHFire_Single9mm"
FireCrouchAnims(3)="CHFire_Single9mm"
FireCrouchAltAnims(0)="CHFire_Single9mm"
FireCrouchAltAnims(1)="CHFire_Single9mm"
FireCrouchAltAnims(2)="CHFire_Single9mm"
FireCrouchAltAnims(3)="CHFire_Single9mm"
HitAnims(0)="HitF_Single9mm"
HitAnims(1)="HitB_Single9mm"
HitAnims(2)="HitL_Single9mm"
HitAnims(3)="HitR_Single9mm"
PostFireBlendStandAnim="Blend_Single9mm"
PostFireBlendCrouchAnim="CHBlend_Single9mm"
MeshRef="ScrnWeaponPack_A.MedicPistol_3rd"
SplashEffect=Class'ROEffects.BulletSplashEmitter'
LightType=LT_Pulse
LightRadius=0.000000
CullDistance=5000.000000
}

View file

@ -0,0 +1,261 @@
class MedicPistolFire extends KFFire;
var MedicPistol ScrnWeap; // avoid typecasting
var float PenDmgReduction; //penetration damage reduction. 1.0 - no reduction, 0 - no penetration, 0.75 - 25% reduction
var byte MaxPenetrations; //how many enemies can penetrate a single bullet
var int HealAmount, HealBoost;
function PostBeginPlay()
{
super.PostBeginPlay();
ScrnWeap = MedicPistol(Weapon);
}
simulated event ModeDoFire()
{
if ( ScrnWeap.bFiringLastRound ) {
FireAnim = 'FireLast';
FireAimedAnim = 'FireLast_Iron';
}
else {
FireAnim = default.FireAnim;
FireAimedAnim = default.FireAimedAnim;
}
Super.ModeDoFire();
}
function DoTrace(Vector Start, Rotator Dir)
{
local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd;
local Actor Other;
local byte HitCount, PenCounter;
local float HitDamage;
local array<int> HitPoints;
local KFPawn HitPawn;
local array<Actor> IgnoreActors;
local Pawn DamagePawn;
local int i;
local KFMonster Monster;
local bool bWasDecapitated;
//local int OldHealth;
MaxRange();
Weapon.GetViewAxes(X, Y, Z);
if ( Weapon.WeaponCentered() )
{
ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z);
}
else
{
ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X +
Weapon.Hand * Weapon.EffectOffset.Y * Y + Weapon.EffectOffset.Z * Z);
}
X = Vector(Dir);
End = Start + TraceRange * X;
HitDamage = DamageMax;
// HitCount isn't a number of max penetration. It is just to be sure we won't stuck in infinite loop
While( ++HitCount < 127 )
{
DamagePawn = none;
Monster = none;
Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1);
if( Other==None )
Break;
else if( Other==Instigator || Other.Base == Instigator ) {
IgnoreActors[IgnoreActors.Length] = Other;
Other.SetCollision(false);
Start = HitLocation;
Continue;
}
else if ( ROBulletWhipAttachment(Other) != none ) {
IgnoreActors[IgnoreActors.Length] = Other;
Start = HitLocation;
continue;
}
if( ExtendedZCollision(Other)!=None && Other.Owner!=None )
{
IgnoreActors[IgnoreActors.Length] = Other;
IgnoreActors[IgnoreActors.Length] = Other.Owner;
Other.SetCollision(false);
Other.Owner.SetCollision(false);
DamagePawn = Pawn(Other.Owner);
Monster = KFMonster(Other.Owner);
}
if ( !Other.bWorldGeometry && Other!=Level )
{
HitPawn = KFPawn(Other);
if ( HitPawn != none )
{
if ( HitPawn.Health > 0 ) {
MedicPistol(Instigator.Weapon).HitHealTarget(HitLocation, Rotator(-HitNormal));
HealPawn(HitPawn);
break;
}
// Hit detection debugging
/*log("PreLaunchTrace hit "$HitPawn.PlayerReplicationInfo.PlayerName);
HitPawn.HitStart = Start;
HitPawn.HitEnd = End;*/
// Hit detection debugging
/*if( Level.NetMode == NM_Standalone)
HitPawn.DrawBoneLocation();*/
IgnoreActors[IgnoreActors.Length] = Other;
IgnoreActors[IgnoreActors.Length] = HitPawn.AuxCollisionCylinder;
Other.SetCollision(false);
HitPawn.AuxCollisionCylinder.SetCollision(false);
DamagePawn = HitPawn;
}
else
{
if( DamagePawn == none )
DamagePawn = Pawn(Other);
if( KFMonster(Other)!=None )
{
IgnoreActors[IgnoreActors.Length] = Other;
Other.SetCollision(false);
Monster = KFMonster(Other);
//OldHealth = KFMonster(Other).Health;
}
bWasDecapitated = Monster != none && Monster.bDecapitated;
// DAMAGE & HEAL
Other.TakeDamage(int(HitDamage), Instigator, HitLocation, Momentum*X, DamageType);
if ( Monster != none && !Monster.bDecapitated && Monster.Health > 0 ) {
MedicPistol(Instigator.Weapon).HitHealTarget(HitLocation, Rotator(-HitNormal));
Monster.Health += int(HitDamage * class<KFWeaponDamageType>(DamageType).default.HeadShotDamageMult);
if ( Monster.Health > 2 * Monster.HealthMax ) {
Monster.TakeDamage(Monster.Health * 10, Instigator, Monster.Location, vect(0,0,1), class'DamTypeMedicOvercharge' );
}
}
}
if( ++PenCounter > MaxPenetrations || DamagePawn==None )
{
Break;
}
HitDamage *= PenDmgReduction;
Start = HitLocation;
}
else if ( HitScanBlockingVolume(Other)==None )
{
if( KFWeaponAttachment(Weapon.ThirdPersonActor)!=None )
KFWeaponAttachment(Weapon.ThirdPersonActor).UpdateHit(Other,HitLocation,HitNormal);
Break;
}
}
// Turn the collision back on for any actors we turned it off
if ( IgnoreActors.Length > 0 )
{
for (i=0; i<IgnoreActors.Length; i++)
{
if ( IgnoreActors[i] != none )
IgnoreActors[i].SetCollision(true);
}
}
}
function HealPawn(KFPawn Healed)
{
local KFPlayerReplicationInfo PRI;
local SRStatsBase Stats;
local int MedicReward;
local float HealPotency, HealSum;
if ( Healed.Health <= 0 )
return;
//if( Instigator != none && Healed.Health > 0 && Healed.Health < Healed.HealthMax ) {
PRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo);
if ( PRI != none )
Stats = SRStatsBase(PRI.SteamStatsAndAchievements);
HealPotency = 1.0;
if ( PRI != none && PRI.ClientVeteranSkill != none )
HealPotency = PRI.ClientVeteranSkill.Static.GetHealPotency(PRI);
MedicReward = HealAmount * HealPotency;
HealSum = MedicReward;
if ( (Healed.Health + Healed.healthToGive + MedicReward) > Healed.HealthMax ) {
MedicReward = max(0, Healed.HealthMax - (Healed.Health + Healed.healthToGive));
}
if ( Healed.Controller != none )
Healed.Controller.ShakeView(ShakeRotMag, ShakeRotRate, ShakeRotTime, ShakeOffsetMag, ShakeOffsetRate, ShakeOffsetTime);
if ( ScrnHumanPawn(Healed) != none )
ScrnHumanPawn(Healed).TakeHealing(ScrnHumanPawn(Instigator), HealSum, HealPotency, KFWeapon(Instigator.Weapon));
else
Healed.GiveHealth(HealSum, Healed.HealthMax);
// instantly raise player health
Healed.Health += int(HealBoost * HealPotency);
if ( Healed.Health > 250 && Stats != none )
class'ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'MedicPistol_250', 1);
if ( PRI != None && Stats != none ) {
Stats.AddDamageHealed(MedicReward + int(HealBoost * HealPotency), false, false);
// Give the medic reward money as a percentage of how much of the person's health they healed
MedicReward *= 0.6;
if ( class'ScrnBalance'.default.Mut.bMedicRewardFromTeam && Healed.PlayerReplicationInfo != none && Healed.PlayerReplicationInfo.Team != none ) {
// give money from team budget
if ( Healed.PlayerReplicationInfo.Team.Score >= MedicReward ) {
Healed.PlayerReplicationInfo.Team.Score -= MedicReward;
PRI.Score += MedicReward;
}
}
else
PRI.Score += MedicReward;
if ( KFHumanPawn(Instigator) != none )
KFHumanPawn(Instigator).AlphaAmount = 255;
MedicPistol(Instigator.Weapon).ClientSuccessfulHeal(Healed.PlayerReplicationInfo);
}
}
defaultproperties
{
PenDmgReduction=0.500000
HealAmount=20
HealBoost=3
FireAimedAnim="Fire_Iron"
maxVerticalRecoilAngle=250
maxHorizontalRecoilAngle=50
FireSoundRef="KF_MP7Snd.Medicgun_Fire"
StereoFireSoundRef="KF_MP7Snd.Medicgun_FireST"
NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire"
DamageType=Class'ScrnWeaponPack.DamTypeMedicPistol'
DamageMax=23
bWaitForRelease=True
TransientSoundVolume=2.000000
TransientSoundRadius=500.000000
FireRate=0.250000
AmmoClass=Class'ScrnWeaponPack.MedicPistolAmmo'
AmmoPerFire=1
ShakeRotMag=(X=75.000000,Y=75.000000,Z=290.000000)
ShakeRotRate=(X=10080.000000,Y=10080.000000,Z=10000.000000)
ShakeRotTime=3.500000
ShakeOffsetMag=(X=6.000000,Y=1.000000,Z=8.000000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=2.500000
BotRefireRate=0.400000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar'
aimerror=1.000000
Spread=0.010000
SpreadStyle=SS_Random
}

View file

@ -0,0 +1,19 @@
class MedicPistolLightFire extends SingleALTFire;
/*
simulated function ModeDoFire()
{
local MedicPistol W;
Super.ModeDoFire();
W = MedicPistol(Weapon);
if ( W != none ) {
W.ToggleLaser();
}
}
*/
defaultproperties
{
}

View file

@ -0,0 +1,25 @@
class MedicPistolPickup extends KFWeaponPickup;
defaultproperties
{
Weight=2.000000
cost=900
AmmoCost=42
BuyClipSize=7
PowerValue=20
SpeedValue=50
RangeValue=35
Description="Primary fire shoots healing darts. Darts heal zeds too, but it doesn't help them much, if titanium needle breaks their skulls first. Shooting multiple dart into the same zed may cause overdose. Alternate fire switch between laser and flashlight."
ItemName="KF2 Medic Pistol SE"
ItemShortName="KF2 Medic Pistol SE"
AmmoItemName="Healing Darts"
AmmoMesh=StaticMesh'KillingFloorStatics.DualiesAmmo'
EquipmentCategoryID=1
InventoryType=Class'ScrnWeaponPack.MedicPistol'
PickupMessage="You got the Medic Pistol"
PickupSound=Sound'KF_9MMSnd.9mm_Pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'ScrnWeaponPack_SM.MedicPistol_Pickup'
DrawScale=0.100000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,74 @@
class MuzzleFlash1rdSVD extends ROMuzzleFlash3rd;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(10);
Emitters[1].SpawnParticle(10);
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.500000
MaxParticles=50
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.500000)
StartSizeRange=(X=(Min=5.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.200000,Max=1.200000)
StartVelocityRange=(Y=(Min=-30.000000,Max=30.000000))
VelocityLossRange=(X=(Max=2.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash1rdSVD.SpriteEmitter4'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
UseVelocityScale=True
Acceleration=(X=200.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.400000
MaxParticles=50
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=25.000000,Max=50.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.500000,Max=3.000000)
StartVelocityRange=(X=(Min=50.000000,Max=175.000000),Y=(Min=-30.000000,Max=30.000000),Z=(Min=20.000000,Max=50.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.500000,RelativeVelocity=(X=0.200000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash1rdSVD.SpriteEmitter5'
}

View file

@ -0,0 +1,23 @@
class MuzzleFlash1stSVDS extends ROMuzzleFlash1st;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(1);
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
Opacity=0.100000
MaxParticles=1
StartSizeRange=(X=(Min=50.000000,Max=50.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash1stSVDS.SpriteEmitter0'
}

View file

@ -0,0 +1,78 @@
class MuzzleFlash3rdSVD extends ROMuzzleFlash3rd;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(10);
Emitters[1].SpawnParticle(10);
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
UseVelocityScale=True
Acceleration=(Z=-700.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
FadeOutStartTime=0.500000
MaxParticles=3
StartLocationRange=(X=(Min=-10.000000,Max=10.000000))
UseRotationFrom=PTRS_Actor
StartSpinRange=(X=(Min=0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=2.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=3.000000)
StartSizeRange=(X=(Min=3.000000,Max=5.000000))
InitialParticlesPerSecond=500.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.watersplashcloud'
LifetimeRange=(Min=1.500000,Max=1.500000)
StartVelocityRange=(X=(Min=250.000000,Max=300.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-10.000000,Max=10.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.205000,RelativeVelocity=(X=0.100000,Y=0.500000,Z=0.500000))
VelocityScale(2)=(RelativeTime=1.000000,RelativeVelocity=(X=0.150000,Y=0.100000,Z=0.100000))
End Object
Emitters(0)=SpriteEmitter'ROEffects.WaterSplashEmitter.SpriteEmitter4'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
UseVelocityScale=True
Acceleration=(X=200.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.600000
MaxParticles=50
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=25.000000,Max=50.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.500000,Max=3.000000)
StartVelocityRange=(X=(Min=50.000000,Max=175.000000),Y=(Min=-30.000000,Max=30.000000),Z=(Min=20.000000,Max=50.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.500000,RelativeVelocity=(X=0.200000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdSVD.SpriteEmitter5'
}

View file

@ -0,0 +1,187 @@
class MuzzleFlash3rdSVDS extends ROMuzzleFlash3rd;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(2);
Emitters[1].SpawnParticle(2);
Emitters[2].SpawnParticle(2);
Emitters[3].SpawnParticle(2);
Emitters[4].SpawnParticle(2);
Emitters[5].SpawnParticle(1);
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.750000
FadeOutStartTime=0.080000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.500000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
StartVelocityRange=(X=(Min=10.000000,Max=30.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdSVDS.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.600000
FadeOutStartTime=0.094000
FadeInEndTime=0.092000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=15.000000)
StartLocationRange=(X=(Max=5.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=0.500000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
InitialDelayRange=(Min=0.050000,Max=0.050000)
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdSVDS.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.750000
FadeOutStartTime=0.040000
FadeInEndTime=0.040000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
End Object
Emitters(2)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdSVDS.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
Opacity=0.200000
MaxParticles=1
StartSizeRange=(X=(Min=50.000000,Max=50.000000))
Texture=Texture'Effects_Tex.BulletHits.glowfinal'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(3)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdSVDS.SpriteEmitter3'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.200000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.500000)
StartSizeRange=(X=(Min=5.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.200000,Max=1.200000)
StartVelocityRange=(X=(Max=40.000000),Z=(Min=10.000000,Max=20.000000))
VelocityLossRange=(X=(Max=2.000000))
End Object
Emitters(4)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdSVDS.SpriteEmitter4'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
UseVelocityScale=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.200000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=25.000000,Max=50.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.500000,Max=3.000000)
StartVelocityRange=(X=(Min=50.000000,Max=75.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.500000,RelativeVelocity=(X=0.200000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(5)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdSVDS.SpriteEmitter5'
}

View file

@ -0,0 +1,187 @@
class MuzzleFlash3rdVALDT extends ROMuzzleFlash3rd;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(2);
Emitters[1].SpawnParticle(2);
Emitters[2].SpawnParticle(2);
Emitters[3].SpawnParticle(2);
Emitters[4].SpawnParticle(2);
Emitters[5].SpawnParticle(1);
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.750000
FadeOutStartTime=0.080000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.500000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
StartVelocityRange=(X=(Min=10.000000,Max=30.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVALDT.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.600000
FadeOutStartTime=0.094000
FadeInEndTime=0.092000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=15.000000)
StartLocationRange=(X=(Max=5.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=0.500000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
InitialDelayRange=(Min=0.050000,Max=0.050000)
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVALDT.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.750000
FadeOutStartTime=0.040000
FadeInEndTime=0.040000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
End Object
Emitters(2)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVALDT.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
Opacity=0.200000
MaxParticles=1
StartSizeRange=(X=(Min=50.000000,Max=50.000000))
Texture=Texture'Effects_Tex.BulletHits.glowfinal'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(3)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVALDT.SpriteEmitter3'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.200000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.500000)
StartSizeRange=(X=(Min=5.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.200000,Max=1.200000)
StartVelocityRange=(X=(Max=40.000000),Z=(Min=10.000000,Max=20.000000))
VelocityLossRange=(X=(Max=2.000000))
End Object
Emitters(4)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVALDT.SpriteEmitter4'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
UseVelocityScale=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.200000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=25.000000,Max=50.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.500000,Max=3.000000)
StartVelocityRange=(X=(Min=50.000000,Max=75.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.500000,RelativeVelocity=(X=0.200000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(5)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVALDT.SpriteEmitter5'
}

View file

@ -0,0 +1,187 @@
class MuzzleFlash3rdVSSDT extends ROMuzzleFlash3rd;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(2);
Emitters[1].SpawnParticle(2);
Emitters[2].SpawnParticle(2);
Emitters[3].SpawnParticle(2);
Emitters[4].SpawnParticle(2);
Emitters[5].SpawnParticle(1);
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.750000
FadeOutStartTime=0.080000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.500000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
StartVelocityRange=(X=(Min=10.000000,Max=30.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVSSDT.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.600000
FadeOutStartTime=0.094000
FadeInEndTime=0.092000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=15.000000)
StartLocationRange=(X=(Max=5.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=0.500000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
InitialDelayRange=(Min=0.050000,Max=0.050000)
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVSSDT.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.750000
FadeOutStartTime=0.040000
FadeInEndTime=0.040000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
End Object
Emitters(2)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVSSDT.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
Opacity=0.200000
MaxParticles=1
StartSizeRange=(X=(Min=50.000000,Max=50.000000))
Texture=Texture'Effects_Tex.BulletHits.glowfinal'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(3)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVSSDT.SpriteEmitter3'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.200000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.500000)
StartSizeRange=(X=(Min=5.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.200000,Max=1.200000)
StartVelocityRange=(X=(Max=40.000000),Z=(Min=10.000000,Max=20.000000))
VelocityLossRange=(X=(Max=2.000000))
End Object
Emitters(4)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVSSDT.SpriteEmitter4'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
UseVelocityScale=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.200000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=25.000000,Max=50.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.500000,Max=3.000000)
StartVelocityRange=(X=(Min=50.000000,Max=75.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.500000,RelativeVelocity=(X=0.200000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(5)=SpriteEmitter'ScrnWeaponPack.MuzzleFlash3rdVSSDT.SpriteEmitter5'
}

View file

@ -0,0 +1,187 @@
class MuzzleFlashAK12AR extends ROMuzzleFlash3rd;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(2);
Emitters[1].SpawnParticle(2);
Emitters[2].SpawnParticle(2);
Emitters[3].SpawnParticle(2);
Emitters[4].SpawnParticle(2);
Emitters[5].SpawnParticle(1);
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.350000
FadeOutStartTime=0.080000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.500000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
StartVelocityRange=(X=(Min=10.000000,Max=30.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.MuzzleFlashAK12AR.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.300000
FadeOutStartTime=0.094000
FadeInEndTime=0.092000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=15.000000)
StartLocationRange=(X=(Max=5.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=0.500000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
InitialDelayRange=(Min=0.050000,Max=0.050000)
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.MuzzleFlashAK12AR.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.350000
FadeOutStartTime=0.040000
FadeInEndTime=0.040000
CoordinateSystem=PTCS_Relative
MaxParticles=3
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Normal
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000)
StartSizeRange=(X=(Min=10.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
SubdivisionScale(0)=0.500000
LifetimeRange=(Min=0.200000,Max=0.200000)
End Object
Emitters(2)=SpriteEmitter'ScrnWeaponPack.MuzzleFlashAK12AR.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
Opacity=0.100000
MaxParticles=1
StartSizeRange=(X=(Min=50.000000,Max=50.000000))
Texture=Texture'Effects_Tex.BulletHits.glowfinal'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(3)=SpriteEmitter'ScrnWeaponPack.MuzzleFlashAK12AR.SpriteEmitter3'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.100000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=2.500000)
StartSizeRange=(X=(Min=5.000000,Max=10.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.200000,Max=1.200000)
StartVelocityRange=(X=(Max=40.000000),Z=(Min=10.000000,Max=20.000000))
VelocityLossRange=(X=(Max=2.000000))
End Object
Emitters(4)=SpriteEmitter'ScrnWeaponPack.MuzzleFlashAK12AR.SpriteEmitter4'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
UseVelocityScale=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.100000
MaxParticles=30
StartLocationOffset=(X=5.000000)
StartLocationRange=(X=(Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.500000,Max=0.500000),Y=(Min=-0.500000,Max=0.500000),Z=(Min=-0.500000,Max=0.500000))
StartSpinRange=(X=(Max=1.000000))
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=25.000000,Max=50.000000))
DrawStyle=PTDS_Brighten
Texture=Texture'Effects_Tex.Weapons.MP3rdPmuzzle_smoke1frame'
LifetimeRange=(Min=1.500000,Max=3.000000)
StartVelocityRange=(X=(Min=50.000000,Max=75.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.500000,RelativeVelocity=(X=0.200000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(5)=SpriteEmitter'ScrnWeaponPack.MuzzleFlashAK12AR.SpriteEmitter5'
}

View file

@ -0,0 +1,73 @@
class PanzerfaustTrail_BackBurnTrail extends PanzerfaustTrail;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
FadeOut=True
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseVelocityScale=True
Acceleration=(X=70.000000,Z=20.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
FadeOutStartTime=0.950000
MaxParticles=200
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.075000,Max=0.075000))
SizeScale(0)=(RelativeSize=0.500000)
SizeScale(1)=(RelativeTime=0.070000,RelativeSize=0.500000)
SizeScale(2)=(RelativeTime=0.370000,RelativeSize=1.100000)
SizeScale(3)=(RelativeTime=1.000000,RelativeSize=2.000000)
StartSizeRange=(X=(Min=15.000000,Max=30.000000))
ParticlesPerSecond=25.000000
InitialParticlesPerSecond=25.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
LifetimeRange=(Max=8.000000)
StartVelocityRange=(X=(Min=45.000000,Max=45.000000),Y=(Min=-45.000000,Max=45.000000),Z=(Min=-45.000000,Max=45.000000))
VelocityLossRange=(X=(Min=1.000000,Max=1.000000),Y=(Min=1.000000,Max=1.000000),Z=(Min=1.000000,Max=1.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.300000,RelativeVelocity=(X=0.200000,Y=1.000000,Z=1.000000))
VelocityScale(2)=(RelativeTime=1.000000,RelativeVelocity=(Y=0.400000,Z=0.400000))
End Object
Emitters(0)=SpriteEmitter'ScrnWeaponPack.PanzerfaustTrail_BackBurnTrail.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
UseColorScale=True
FadeOut=True
AutoReset=True
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseVelocityScale=True
Acceleration=(X=70.000000,Z=20.000000)
ColorScale(0)=(Color=(B=60,G=60,R=60,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=117,G=117,R=117,A=255))
FadeOutStartTime=1.200000
MaxParticles=200
AutoResetTimeRange=(Min=5.000000,Max=10.000000)
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.075000,Max=0.075000))
SizeScale(0)=(RelativeSize=0.500000)
SizeScale(1)=(RelativeTime=0.070000,RelativeSize=0.500000)
SizeScale(2)=(RelativeTime=0.370000,RelativeSize=1.100000)
SizeScale(3)=(RelativeTime=1.000000,RelativeSize=1.500000)
StartSizeRange=(X=(Min=11.000000,Max=21.000000))
ParticlesPerSecond=25.000000
InitialParticlesPerSecond=25.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
StartVelocityRange=(X=(Min=40.000000,Max=80.000000),Y=(Min=-45.000000,Max=45.000000),Z=(Min=-45.000000,Max=45.000000))
VelocityLossRange=(X=(Min=2.000000,Max=2.000000),Y=(Min=2.000000,Max=2.000000),Z=(Min=2.000000,Max=2.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.400000,RelativeVelocity=(X=0.150000,Y=1.000000,Z=1.000000))
VelocityScale(2)=(RelativeTime=1.000000,RelativeVelocity=(Y=0.400000,Z=0.400000))
End Object
Emitters(1)=SpriteEmitter'ScrnWeaponPack.PanzerfaustTrail_BackBurnTrail.SpriteEmitter1'
}

View file

@ -0,0 +1,61 @@
class Protecta extends KFWeaponShotgun;
// Use alt fire to switch fire modes
simulated function AltFire(float F)
{
if(ReadyToFire(0))
{
DoToggle();
}
}
exec function SwitchModes()
{
DoToggle();
}
defaultproperties
{
MagCapacity=12
ReloadRate=0.455000
ReloadAnim="Reload"
ReloadAnimRate=2.000000
WeaponReloadAnim="Reload_Shotgun"
Weight=8.000000
bHasAimingMode=True
IdleAimAnim="Iron_Idle"
StandardDisplayFOV=65.000000
bModeZeroCanDryFire=True
SleeveNum=3
TraderInfoTexture=Texture'ScrnWeaponPack_T.Protecta.Protecta_Trader'
MeshRef="ScrnWeaponPack_A.Protecta_mesh"
SkinRefs(0)="ScrnWeaponPack_T.Protecta.Protecta_tex_1_cmb"
SkinRefs(1)="ScrnWeaponPack_T.Protecta.Protecta_tex_2_cmb"
SkinRefs(2)="ScrnWeaponPack_T.Protecta.Protecta_tex_3_cmb"
SkinRefs(3)="ScrnWeaponPack_T.Effects.RedColor"
SkinRefs(4)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr"
SelectSoundRef="ScrnWeaponPack_SND.Protecta.striker_select"
HudImageRef="ScrnWeaponPack_T.Protecta.Protecta_Unselected"
SelectedHudImageRef="ScrnWeaponPack_T.Protecta.Protecta_selected"
PlayerIronSightFOV=70.000000
ZoomedDisplayFOV=40.000000
FireModeClass(0)=Class'ScrnWeaponPack.ProtectaFire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
AIRating=0.600000
CurrentRating=0.600000
bShowChargingBar=True
Description="Protecta Automatic Shotgun was outshined by AA12 in every aspect until Horzine technicians managed to load it with flares..."
DisplayFOV=65.000000
Priority=199
InventoryGroup=4
GroupOffset=9
PickupClass=Class'ScrnWeaponPack.ProtectaPickup'
PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-7.000000)
PlayerViewPivot=(Pitch=20,Yaw=20)
BobDamping=5.000000
AttachmentClass=Class'ScrnWeaponPack.ProtectaAttachment'
IconCoords=(X1=169,Y1=172,X2=245,Y2=208)
ItemName="Flare Shotgun 'Protecta' SE"
TransientSoundVolume=1.250000
}

View file

@ -0,0 +1,10 @@
class ProtectaAmmo extends FlareRevolverAmmo;
defaultproperties
{
AmmoPickupAmount=24
MaxAmmo=120
InitialAmount=36
PickupClass=Class'ScrnWeaponPack.ProtectaAmmoPickup'
ItemName="Liquid-Gas Shells"
}

View file

@ -0,0 +1,8 @@
class ProtectaAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=12
InventoryType=Class'ScrnWeaponPack.ProtectaAmmo'
PickupMessage="Liquid-Gas Shells"
}

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