| Home Page | Recent Changes | Preferences

# Minigun/Script

UT2003, Build 2225

This is a reference to the Minigun code in case you can't understand the code. All the remarks you see in the code will be done by me. It's a good reference for various guns that fire rapidly and have charge-up times.

    //=============================================================================
    // Minigun  // This is the name of the weapon.
    //=============================================================================
    class Minigun extends Weapon  //The class is the type of weapon, while the extends is used to refer the code to a specific type of actor
        config(user);  // This says that there are variables here that get their values from the user.ini file.

    // The InterfaceContent.utx file contains all the icons for all the weapons. The following line loads the file so we can get to the icon for our minigun.
    #EXEC OBJ LOAD FILE=InterfaceContent.utx

    var     float           CurrentRoll;
    var     float           RollSpeed;
    //var     float           FireTime;
    var() xEmitter          ShellCaseEmitter;
    var() vector            AttachLoc;
    var() rotator           AttachRot;
    var   int               CurrentMode;
    var() float             GearRatio;
    var() float             GearOffset;
    var() float             Blend;
    //These are the variables used in the code

    simulated function PostBeginPlay()  //Says to start code after play begins
    {
        Super.PostBeginPlay();

        if ( Level.NetMode == NM_DedicatedServer )
            return;

        ShellCaseEmitter = spawn(class'ShellSpewer');
        if ( ShellCaseEmitter != None )
        {
            ShellCaseEmitter.Trigger(Self, Instigator);
            AttachToBone(ShellCaseEmitter, 'shell');
        } //This says if the ShellCaseEmitter variable is not zero then the minigun will create an emitter to expel the shells when you fire
    }

    function DropFrom(vector StartLocation)
    {
        local Ammunition AssaultAmmo; // This creates a local instance of Assault Rifle ammunition.
        local Weapon AssaultRifle;    // This creates a local instance of an Assault Rifle.
                                          // Both of these will be used in the following lines, but will be "destroyed" when the function ends.

        Super.DropFrom(StartLocation);
        if ( (Instigator != None) && (Instigator.Health > 0) )
        {

            AssaultAmmo = Ammunition(Instigator.FindInventoryType(class'MinigunAmmo'));
            if ( AssaultAmmo == None )
            {
                AssaultAmmo = spawn(class'MinigunAmmo',Instigator);
                AssaultAmmo.GiveTo( Instigator, None );
            } //This is the code to cause the ammo to be shared with the Assualt Rifle
            AssaultAmmo.AmmoAmount = 0;
            AssaultRifle = Weapon(Instigator.FindInventoryType(class'AssaultRifle'));
            if ( AssaultRifle != None )
                AssaultRifle.Ammo[0] = AssaultAmmo;
        }
    }

    simulated function OutOfAmmo()
    {
        if ( !Instigator.IsLocallyControlled() || HasAmmo() )
            return;

        Instigator.AmbientSound = None;
        DoAutoSwitch();
    } //This says if a minigun runs out of ammo the weapon will autoswitch

    simulated function Destroyed()
    {
        if (ShellCaseEmitter != None)
        {
            ShellCaseEmitter.Destroy();
            ShellCaseEmitter = None;
        }

        Super.Destroyed();
    }

    BotFire() //Initiates this section of code when a bot fires.
    function bool BotFire(bool bFinished, optional name FiringMode)
    {
        local int newmode;
        local Controller C;

        C = Instigator.Controller;
        newMode = BestMode();

        if ( newMode == 0 )
        {
            C.bFire = 1;
            C.bAltFire = 0;
        }
        else
        {
            C.bFire = 0;
            C.bAltFire = 1;
        }

        if ( bFinished )
            return true;

        if ( FireMode[BotMode].bIsFiring && (NewMode != BotMode) )
            StopFire(BotMode);

        if ( !ReadyToFire(newMode) || ClientState != WS_ReadyToFire )
            return false;

        BotMode = NewMode;
        StartFire(NewMode);
        return true;
    } //Allows the bots to change firing mode when using the minigun

    //This is the AI Interface
    function float GetAIRating()
    {
        return AIRating * FMin(Pawn(Owner).DamageScaling, 1.5);
    }

    BestMode()
    function byte BestMode()
    {
        local float EnemyDist;
        local bot B;

        B = Bot(Instigator.Controller);
        if ( (B == None) || (B.Enemy == None) )
            return 0;

        if ( FireMode[0].bIsFiring )
            return 0;
        else if ( FireMode[1].bIsFiring )
            return 1;
        EnemyDist = VSize(B.Enemy.Location - Instigator.Location);
        if ( EnemyDist < 2000 )
            return 0;
        return 1;
    } //This section is used to choose the best firing mode for the bots

    simulated function SpawnShells(float amountPerSec)
    {
        if(ShellCaseEmitter == None || !FirstPersonView())
            return;
        if ( Bot(Instigator.Controller) != None )
        {
            ShellCaseEmitter.Destroy();
            return;
        }

        ShellCaseEmitter.mRegenRange[0] = amountPerSec;
        ShellCaseEmitter.mRegenRange[1] = amountPerSec;
        ShellCaseEmitter.Trigger(self, Instigator);
    } //This is the code for the amount of shells spawned per sec

    simulated function bool FirstPersonView()
    {
        return (Instigator.IsLocallyControlled() && (PlayerController(Instigator.Controller) != None) && !PlayerController(Instigator.Controller).bBehindView);
    }

    //This next section prevents the wrong animations from playing
    simulated function AnimEnd(int channel)
    {
    }

    // This is client side only: It updates the first person barrel rotation
    simulated function UpdateRoll(float dt, float speed, int mode)
    {
        local rotator r;

        if (Level.NetMode == NM_DedicatedServer)
            return;

        if (mode == CurrentMode) // to limit to one mode
        {
           // log(self$" updateroll (mode="$mode$") speed="$speed);

            RollSpeed = speed;
            CurrentRoll += dt*RollSpeed;
            CurrentRoll = CurrentRoll % 65536.f;
            r.Roll = int(CurrentRoll);
            SetBoneRotation('Bone Barrels', r, 0, Blend);

            r.Roll = GearOffset + r.Roll*GearRatio;
            SetBoneRotation('Bone gear', r, 0, Blend);
        }
    }

    simulated function bool StartFire(int mode)
    {
        local bool bStart;

        if ( !MinigunFire(FireMode[0]).IsIdle() || !MinigunFire(FireMode[1]).IsIdle() )
            return false;

        bStart = Super.StartFire(mode);
        if (bStart)
            FireMode[mode].StartFiring();

        return bStart;
    } // If this function returns True, the weapon will start firing, if it returns False, it won't.

    // This section allows fire modes to return to idle on weapon switch
    (simulated function DetachFromPawn(Pawn P)
    {
        ReturnToIdle();

        Super.DetachFromPawn(P);
    }

    simulated function bool PutDown()
    {
        ReturnToIdle();

        return Super.PutDown();
    }

    simulated function ReturnToIdle()
    {
        local int mode;

        for (mode=0; mode<NUM_FIRE_MODES; mode++)
        {
            if (FireMode[mode] != None)
            {
                FireMode[mode].GotoState('Idle');
            }
        }
    }

    defaultproperties // These are the default properties of each variable. Some were created at the top of this file, others are inherited from the weapon's parent class.
    {
         AttachLoc=(X=-77.000000,Y=6.000000,Z=4.000000) // Where the model attachs
         AttachRot=(Pitch=22000,Yaw=-16384) // The rotation it is at
         GearRatio=-2.370000
         Blend=1.000000
         FireModeClass(0)=Class'XWeapons.MinigunFire'    // Firing mode 1 (Primary)
         FireModeClass(1)=Class'XWeapons.MinigunAltFire' // Firing mode 2 (Alt/Secondary)
         PutDownAnim="PutDown"
         SelectSound=Sound'WeaponSounds.Minigun.SwitchToMiniGun' // The Sound that is played when you switch to this weapon.
         SelectForce="SwitchToMiniGun"
         AIRating=0.710000
         CurrentRating=0.710000
         EffectOffset=(X=100.000000,Y=18.000000,Z=-16.000000)
         DisplayFOV=60.000000
         Priority=7
         DefaultPriority=7
         HudColor=(B=255)
         SmallViewOffset=(X=8.000000,Y=1.000000,Z=-2.000000)
         CenteredOffsetY=-6.000000
         CenteredRoll=0
         CenteredYaw=-500
         InventoryGroup=6 // The inventory group used (i.e. the number you press to reach the gun)
         PickupClass=Class'XWeapons.MinigunPickup' // The MinigunPickup class defines the weapon the way it sits on the ground.
         PlayerViewOffset=(X=2.000000,Y=-1.000000)
         PlayerViewPivot=(Yaw=500)
         BobDamping=2.250000
         AttachmentClass=Class'XWeapons.MinigunAttachment'
         IconMaterial=Texture'InterfaceContent.HUD.SkinA'
         IconCoords=(X1=200,Y1=372,X2=321,Y2=462)
         ItemName="Minigun" // The name!

         LightType=LT_Pulse             // Any of the excellent lighting tutorials
         LightEffect=LE_NonIncidence    // at the Wiki and around the web can
         LightBrightness=150.000000     // detail what these light properties
         LightRadius=4.000000           // are. They are the same properties that
         LightHue=30                    // you would set on a light on your map.
         LightSaturation=150            // If you look closely on a dark map you'll
         LightPeriod=3                  // notice that all the weapons actually give off a pulse light.

         Mesh=SkeletalMesh'Weapons.Minigun_1st' // The skeletal mesh of the model
         DrawScale=0.400000
         UV2Texture=Shader'XGameShaders.WeaponShaders.WeaponEnvShader'
         SoundRadius=400.000000 // The radius of the minigun sounds
    }

## Related Topics

MinigunAmmo

MinigunPickup

MinigunAmmoPickup

MinigunFire

MinigunAltFire

MinigunAttachment

Weapon

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