| Home Page | Recent Changes | Preferences

MinigunFire

UT2003, Build 2225

Once again another reference of code, but this time for the Primary Fire of the minigun. Oh, and please correct me if I'm wrong. I won't get too pissed off ;)

class MinigunFire extends InstantFire; //This is the class and the parent that it inherits some functionality from.

// These are declarations of variables used in the code.
var() float MaxRollSpeed; 
var() float RollSpeed; 
var() float BarrelRotationsPerSec; //Amount of rotations of the barrel per sec
var() int   RoundsPerRotation;     //Rounds fired per rotation
var() float FireTime;
var() Sound WindingSound;          //The sound you hear when the minigun is getting ready to shoot.
var() Sound FiringSound;           //The sound you hear when the minigun is actually shooting.
var MiniGun Gun;
var() float WindUpTime;            //Amount of time it takes to wind up

var() String FiringForce;          //Amount of recoil
var() String WindingForce;

//What happens when you beserk (adrenaline combo) with this firing mode
function StartBerserk() 
{
    DamageMin = default.DamageMin * 1.33;
    DamageMax = default.DamageMax * 1.33;
}

//What happens when you stop beserking
function StopBerserk() 
{
    DamageMin = default.DamageMin;
    DamageMax = default.DamageMax;
}

//Initiate this code after game begins
function PostBeginPlay() 
{
    Super.PostBeginPlay();

    //Set the firing rate
    FireRate = 1.f / (RoundsPerRotation * BarrelRotationsPerSec);

    //Set the maximum barrel rotation speed
    MaxRollSpeed = 65536.f*BarrelRotationsPerSec; 
    Gun = Minigun(Owner);
}

//DoTrace is a function common to all weapons that handles the movement of projectiles and the determination 
//of the point of impact for instant-hit weapons.
function DoTrace(Vector Start, Rotator Dir)
{
    if ( FRand() < DeathMatch(Level.Game).MinigunLockDownFactor )
        Momentum = FMax(1.0,DeathMatch(Level.Game).MinigunLockDownFactor) * Default.Momentum;
    else
        Momentum = 0;
    Super.DoTrace(Start,Dir);
} 

//Set muzzle flash to proper location on the gun
function FlashMuzzleFlash() 
{
    local rotator r;
    r.Roll = Rand(65536);
    Weapon.SetBoneRotation('Bone_Flash', r, 0, 1.f);
    Super.FlashMuzzleFlash();
}

//Set effects of the gun
function InitEffects() 
{
    Super.InitEffects();
    if ( FlashEmitter != None )
        Weapon.AttachToBone(FlashEmitter, 'flash');
}

//Set ambient sounds
function PlayAmbientSound(Sound aSound) 
{
    if ( (Minigun(Weapon) == None) || (Instigator == None) || (aSound == None && ThisModeNum != Gun.CurrentMode) )
        return;

    Instigator.AmbientSound = aSound;
    Gun.CurrentMode = ThisModeNum;
}

//Stop the barrel roll
//When this function is called, it does an error check to make sure it's a valid call, then it simply sets
//the rollspeed to 0.0 -- stopping the roll.
function StopRolling()
{
    if (Gun == None || ThisModeNum != Gun.CurrentMode)
        return;

    RollSpeed = 0.f;
    Gun.RollSpeed = 0.f;
} 

function PlayPreFire() {}
function PlayStartHold() {}
function PlayFiring() {}
function PlayFireEnd() {}
function StartFiring();
function StopFiring();
function bool IsIdle()
{
    return false;
}

auto state Idle
{
    function bool IsIdle()
    {
        return true;
    }

    function BeginState()
    {
        PlayAmbientSound(None);
        StopRolling();
    }

    function EndState()
    {
        PlayAmbientSound(WindingSound);
    }

    function StartFiring() //Says once you start to fire it winds up first
    {
        RollSpeed = 0;
    FireTime = (RollSpeed/MaxRollSpeed) * WindUpTime;
        GotoState('WindUp');
    }
}

state WindUp
{
    function BeginState() //Starts the wind-up Procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState() //Says when wind-up ends the firing begins
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }        
    }

    function ModeTick(float dt)
    {
        FireTime += dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;

        if ( !bIsFiring )
        {
        GotoState('WindDown');
        return;
    }
        
        if (RollSpeed >= MaxRollSpeed)
        {
            RollSpeed = MaxRollSpeed;
            FireTime = WindUpTime;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
        GotoState('FireLoop');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StopFiring() //Says if you stop firing it winds down
    {
        GotoState('WindDown');
    }
}

state FireLoop //A loop that continues only if the boolean variable bIsFiring is true
{
    function BeginState()
    {
        NextFireTime = Level.TimeSeconds - 0.1; //fire now!
        PlayAmbientSound(FiringSound);
        ClientPlayForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(FireLoopAnim, FireLoopAnimRate, TweenTime);
        Gun.SpawnShells(RoundsPerRotation*BarrelRotationsPerSec);
    }

    function StopFiring()
    {
        GotoState('WindDown');
    }

    function EndState() //What happens after you stop firing
    {
        PlayAmbientSound(WindingSound);
        StopForceFeedback(FiringForce);  // jdf
        Gun.LoopAnim(Gun.IdleAnim, Gun.IdleAnimRate, TweenTime);
        Gun.SpawnShells(0.f);
     }

    function ModeTick(float dt)
    {
        Super.ModeTick(dt);
        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
        if ( !bIsFiring )
        {
        GotoState('WindDown');
        return;
    }
    }
}

state WindDown
{
    function BeginState() //Begins the wind-down procedure
    {
        ClientPlayForceFeedback(WindingForce);  // jdf
    }

    function EndState()
    {
        if (ThisModeNum == 0)
        {
            if ( (Weapon == None) || !Weapon.FireMode[1].bIsFiring )
                StopForceFeedback(WindingForce);
        }
        else
        {
            if ( (Weapon == None) || !Weapon.FireMode[0].bIsFiring )
                StopForceFeedback(WindingForce);
        }//This checks to see what mode is firing, and stops the force feedback if any is occuring.
    }

    function ModeTick(float dt)
    {
        FireTime -= dt;
        RollSpeed = (FireTime/WindUpTime) * MaxRollSpeed;
         
        if (RollSpeed <= 0.f)
        {
            RollSpeed = 0.f;
            FireTime = 0.f;
            Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
            GotoState('Idle');
            return;
        }

        Gun.UpdateRoll(dt, RollSpeed, ThisModeNum);
    }

    function StartFiring() //Says in order to fire the gun must wind-up
    {
        GotoState('WindUp');
    }
}

defaultproperties //Default variable settings. Some were declared at the top of the file, others were declared in the parent class.
{
     BarrelRotationsPerSec=3.000000                              // How many times the barrel rotates every second.
     RoundsPerRotation=5                                         // How many rounds (shots) it fires every rotation.
     WindingSound=Sound'WeaponSounds.Minigun.miniempty'          // The sound it plays when the gun is winding up.
     FiringSound=Sound'WeaponSounds.Minigun.minifireb'           // The sound it plays when the gun is firing.
     WindUpTime=0.270000                                         // The default windup time.
     FiringForce="minifireb"
     WindingForce="miniempty"
     DamageType=Class'XWeapons.DamTypeMinigunBullet'
     DamageMin=6                                                 // The minimum amount of damage each bullet does.
     DamageMax=7                                                 // The maximum amount of damage each bullet does.
     Momentum=1200.000000
     FireLoopAnimRate=9.000000
     PreFireTime=0.270000
     AmmoClass=Class'XWeapons.MinigunAmmo'                       // Which class of ammunition this weapon uses.
     AmmoPerFire=1                                               // How much of that ammuntion is used per shot. This might
                                                                 // seem pointless, but recall how the alt-fire on the Flak
                                                                 // Cannon uses more than one piece of ammo.
     ShakeRotMag=(X=50.000000,Y=50.000000,Z=50.000000)
     ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
     ShakeRotTime=2.000000
     ShakeOffsetMag=(X=1.000000,Y=1.000000,Z=1.000000)
     ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
     ShakeOffsetTime=2.000000
     BotRefireRate=0.990000
     bPawnRapidFireAnim=True
     FlashEmitterClass=Class'XEffects.MinigunMuzFlash1st'       // Which class the weapon will use for its muzzle flash emitter.
     SmokeEmitterClass=Class'XEffects.MinigunMuzzleSmoke'       // Which class the weapon will use for its muzzle smoke emitter.
     aimerror=900.000000

     Spread=0.080000        // How much variation there is between shots. This keeps the bullets going in slightly different directions.           
     SpreadStyle=SS_Random  // This makes sure that the Spread is truly random, so that the bullets going in slightly different directions looks pretty realistic.
}

Once again I would like anyone to correct or add to any of this.

Related Topics

MinigunAmmo

MinigunPickup

MinigunAmmoPickup

InstantFire

MinigunAltFire

MinigunAttachment

Code References

Category Class (UT2003)

Comments

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Image Uploads

Random Page

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

Mapping Topics

Mapping Lessons

UnrealEd Interface

Questions&Answers

Scripting Topics

Scripting Lessons

Making Mods

Class Tree

Questions&Answers

Modeling Topics

Questions&Answers

Log In