| Home Page | Recent Changes

MinigunAttachment

UT2003 :: Actor >> InventoryAttachment >> WeaponAttachment >> xWeaponAttachment? >> MinigunAttachment (Package: xWeapons)

This is the WeaponAttachment for the Minigun, a gatling-style machine gun.

Properties

Main

Emitter mTracer (editinline)
The Tracer emitter
float mTracerIntervalPrimary
float mTracerIntervalSecondary
float mTracerPullback
float mTracerMinDistance
float mTracerSpeed
vector mShellEmitterOffset

Hidden

class<Emitter> mMuzFlashClass
Muzzle flash class
Emitter mMuzFlash3rd
The muzzle flash emitter
class<Emitter> mTracerClass
Class of the tracer emitter
float mTracerInterval
The frequency of tracers
float mLastTracerTime
byte OldSpawnHitCount
float mCurrentRoll
float mRollInc
float mRollUpdateTime
class<xEmitter> mShellCaseEmitterClass
xEmitter mShellCaseEmitter
vector mOldHitLocation
Where the tracer last hit

Functions

(incomplete)

UpdateRoll( float dt ) (simulated)
Updates the roll for the flash emitter attachment.
vector GetTracerStart() (simulated)
Starts the tracer code.
UpdateTracer() (simulated)
Updates the position for the tracer emitter.
UpdateHit( Actor HitActor, vector HitLocation, vector HitNormal )
Used to update properties so hit effect can be spawn client side.

Events

ThirdPersonEffects() (simulated)
What someone else sees of the emitters.

States

TickTracer

Functions

Tick( float deltaTime) (simulated)
Calls UpdateRoll( deltaTime ).

Source Code

class MinigunAttachment extends xWeaponAttachment;

var class<Emitter>      mMuzFlashClass;
var Emitter             mMuzFlash3rd;

var class<Emitter>      mTracerClass;
var() editinline Emitter mTracer;
var float               mTracerInterval;
var() float             mTracerIntervalPrimary;
var() float             mTracerIntervalSecondary;
var() float             mTracerPullback;
var() float             mTracerMinDistance;
var() float             mTracerSpeed;
var float               mLastTracerTime;
var byte                OldSpawnHitCount;

var float               mCurrentRoll;
var float               mRollInc;
var float               mRollUpdateTime;

var class<xEmitter>     mShellCaseEmitterClass;
var xEmitter            mShellCaseEmitter;
var() vector            mShellEmitterOffset;

var vector  mOldHitLocation;

function Destroyed()
{
    if (mTracer != None)
        mTracer.Destroy();

    if (mMuzFlash3rd != None)
        mMuzFlash3rd.Destroy();

    if (mShellCaseEmitter != None)
        mShellCaseEmitter.Destroy();

    Super.Destroyed();
}

simulated function UpdateRoll(float dt)
{
    local rotator r;

    UpdateRollTime(false);

    if (mRollInc <= 0.f)
        return;

    mCurrentRoll += dt*mRollInc;
    mCurrentRoll = mCurrentRoll % 65536.f;
    r.Roll = int(mCurrentRoll);

    SetBoneRotation('Bone Barrels', r, 0, 1.f);
}

simulated function UpdateRollTime(bool bUpdate)
{
    local float diff;

    diff = Level.TimeSeconds - mRollUpdateTime;

    if (bUpdate)
        mRollUpdateTime = Level.TimeSeconds;

    // TODO: clean up!
    if (diff > 0.2)
    {
        mRollInc = 0.f;
    }
}

simulated function vector GetTracerStart()
{
    local Pawn p;

    p = Pawn(Owner);

    if ( (p != None) && p.IsFirstPerson() && p.Weapon != None )
    {
        // 1st person
        return p.Weapon.GetEffectStart();
    }

    // 3rd person
    if ( mMuzFlash3rd != None )
        return mMuzFlash3rd.Location;
    else
        return Location;
}

simulated function UpdateTracer()
{
    local vector SpawnLoc, SpawnDir, SpawnVel;
    local float hitDist;

    if (Level.NetMode == NM_DedicatedServer)
        return;

    if (mTracer == None)
    {
        mTracer = Spawn(mTracerClass);
        //AttachToBone(mTracer, 'tip');
    }

    if (mTracer != None && Level.TimeSeconds > mLastTracerTime + mTracerInterval)
    {
        SpawnLoc = GetTracerStart();
        mTracer.SetLocation(SpawnLoc);

        hitDist = VSize(mHitLocation - SpawnLoc) - mTracerPullback;

        // If we have a hit but the hit location has not changed
        if(mHitLocation == mOldHitLocation)
            SpawnDir = vector( Instigator.GetViewRotation() );
        else
            SpawnDir = Normal(mHitLocation - SpawnLoc);

        if(hitDist > mTracerMinDistance)
        {
            SpawnVel = SpawnDir * mTracerSpeed;
            
            mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X;
            mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X;
            mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y;
            mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y;
            mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z;
            mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z;

            mTracer.Emitters[0].LifetimeRange.Min = hitDist / mTracerSpeed;
            mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min;

            mTracer.SpawnParticle(1);
        }

        mLastTracerTime = Level.TimeSeconds;

        GotoState('TickTracer');
    }

    mOldHitLocation = mHitLocation;
}

/* UpdateHit
- used to update properties so hit effect can be spawn client side
*/
function UpdateHit(Actor HitActor, vector HitLocation, vector HitNormal)
{
    NetUpdateTime = Level.TimeSeconds - 1;
    SpawnHitCount++;
    mHitLocation = HitLocation;
    mHitActor = HitActor;
    mHitNormal = HitNormal;
}

simulated event ThirdPersonEffects()
{
    local PlayerController PC;
    
    if ( (Level.NetMode == NM_DedicatedServer) || (Instigator == None) )
        return; 

    if ( FlashCount > 0 )
    {
        PC = Level.GetLocalPlayerController();
        if ( OldSpawnHitCount != SpawnHitCount )
        {
            OldSpawnHitCount = SpawnHitCount;
            GetHitInfo();
            PC = Level.GetLocalPlayerController();
            if ( (Instigator.Controller == PC) || (VSize(PC.ViewTarget.Location - mHitLocation) < 2000) )
            {
                if ( FiringMode == 0 )
                    Spawn(class'HitEffect'.static.GetHitEffect(mHitActor, mHitLocation, mHitNormal),,, mHitLocation, Rotator(mHitNormal));
                else
                    Spawn(class'XEffects.ExploWallHit',,, mHitLocation, Rotator(mHitNormal));
                CheckForSplash();
            }
        }
        if ( (Level.TimeSeconds - LastRenderTime > 0.2) && (Instigator.Controller != PC) )
            return;

        WeaponLight();

        if (FiringMode == 0)
        {
            mTracerInterval = mTracerIntervalPrimary;
            mRollInc = 65536.f*3.f;
        }
        else
        {
            mTracerInterval = mTracerIntervalSecondary;
            mRollInc = 65536.f;
        } 

        if ( Level.bDropDetail || Level.DetailMode == DM_Low )
            mTracerInterval *= 2.0;

        UpdateRollTime(true);
        
        UpdateTracer();

        if (mMuzFlash3rd == None)
        {
            mMuzFlash3rd = Spawn(mMuzFlashClass);
            AttachToBone(mMuzFlash3rd, 'tip');
        }
        if (mMuzFlash3rd != None)
        {
            mMuzFlash3rd.SpawnParticle(1);
        }

        if ( (mShellCaseEmitter == None) && (Level.DetailMode != DM_Low) && !Level.bDropDetail )
        {
            mShellCaseEmitter = Spawn(mShellCaseEmitterClass);
            if ( mShellCaseEmitter != None )
                AttachToBone(mShellCaseEmitter, 'shell');
        }
        if (mShellCaseEmitter != None)
            mShellCaseEmitter.mStartParticles++;
    }
    else
    {
        GotoState('');
    }

    Super.ThirdPersonEffects();
}

state TickTracer
{
    simulated function Tick(float deltaTime)
    {
        UpdateRoll(deltaTime);
    }
}

Related Topics

Discussion

Unknown: (author) Adding to this is always appreciated.

SuperApe: Marked up. Keeping Source Code section as reference for UnrealWiki To Do.


Category Class (UT2003)

Category Class (UT2004)

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