Legacy:Minigun/Script

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to navigation Jump to search
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.

<uscript> //============================================================================= // 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.

  1. 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

} </uscript>