| 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