| Home Page | Recent Changes

Minigun/Script

UT2003 :: Actor >> Pickup >> Weapon >> Minigun (commented UnrealScript code)

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
}

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

FAQs

Help Desk

Mapping Topics

Mapping Lessons

UnrealEd Interface

UnrealScript Topics

UnrealScript Lessons

Making Mods

Class Tree

Modeling Topics

Chongqing Page

Log In