Announcement

Collapse
No announcement yet.

UT2004 - Need help w/vectors, rotators and vehicle weapons

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    UT2004 - Need help w/vectors, rotators and vehicle weapons

    Okay so here is what I am trying to do.

    I have modeled a Star Destroyer and given it 12 weapon bones. Essentially it has a bank of weapons consisting of a front, middle and rear gun on the top right, top left, bottom right and bottom left sides.

    I have been trying to get the weapons to fire intelligently, based on what direction you are aiming. The script calculates whether you are aiming forward, left, right, backward, up or down, then selects a weaponset to use based on that direction. The weaponset is just an array of 6 numbers that correspond to the weapons I want the vehicle to fire based on the direction you are currently aiming. This way, say you are aiming to the right, you would be firing the 3 weapons on the top right and the 3 on the bottom right. This keeps the vehicle from using all the weapons on the vehicle and having the lasers fire from the side that can't realistically hit the target and prevents them from firing through the geometry of the vehicle towards the target.

    So I have basically had this working but not to my satisfaction. Here are my problems.

    1. I would like to calculate which direction you are aiming from one position, then fire the weapons from another. It would really be helpful to just use the root bone, which I have made center of mass, as the center of rotation for checking your aiming. That way when you aim up, you are actually aiming up above the center of the ship. In the past I have had to rotate where you calculate your currentaim from as I cycle through the array of weapons. This ends up with wierd weapon selections at times when a target might possibly change aiming zones in relation to the weapon aiming, while not necessarily changing relation to the center of the vehicle as a whole.

    2. Currently I am having issues getting the Weapon[ActiveWeapon].Currentaim to update each tick, from the same weapon. I would think that the .CurrentAim (which is a rotator) changes as I change my aim, but it seems like this value is only getting updated if I exit and reenter the vehicle, or switch weapons and take its .currentaim.

    3. Will my rotations be determined by the local rotation axis of the joints as I set them up in Maya? I have Z up, X forward, and Y left. Does this make Z my Pitch and Y my Yaw? And where does each axis start at zero in terms of rotation? Basically what I am getting at is this, If I want to aim 45 degrees to the right and 45 degrees up is that going to be 8192 RUU in yaw to aim right, and 8192 RUU in pitch to aim up? If I wantedto align my weapon meshes to ship itself would I want the Z local rotation axis to be parallel to the surface normal(perpendicular to the surface) of the ship instead of up in Maya?

    4. How would I take the aim from one weapon's location and transform it to another weapon so they were both firing at the same spot?

    Here is basically what I have for the code, its currently not working, but might give you some insight into what I am trying to do:


    Code:
    simulated function Tick(float DeltaTime)
    {
        local float EnginePitch, DesiredOpacity, DeltaOpacity, MaxOpacityChange, ThrustAmount;
    	local TrailEmitter T;
    	local int i;
    	local vector RelVel;
    	local rotator Target;
    	local bool NewStreamerActive, bIsBehindView;
    	local PlayerController PC;
            local int TargetSet1[6], TargetSet2[6], TargetSet3[6], TargetSet4[6], TargetSet5[6], TargetSet6[6];
    
            TargetSet1[0]=0;
            TargetSet1[1]=10;
            TargetSet1[2]=3;
            TargetSet1[3]=6;
            TargetSet1[4]=1;
            TargetSet1[5]=9;
            TargetSet2[0]=5;
            TargetSet2[1]=2;
            TargetSet2[2]=11;
            TargetSet2[3]=8;
            TargetSet2[4]=5;
            TargetSet2[5]=8;
            TargetSet3[0]=0;
            TargetSet3[1]=7;
            TargetSet3[2]=2;
            TargetSet3[3]=6;
            TargetSet3[4]=1;
            TargetSet3[5]=8;
            TargetSet4[0]=3;
            TargetSet4[1]=10;
            TargetSet4[2]=5;
            TargetSet4[3]=9;
            TargetSet4[4]=4;
            TargetSet4[5]=11;
            TargetSet5[0]=0;
            TargetSet5[1]=4;
            TargetSet5[2]=2;
            TargetSet5[3]=3;
            TargetSet5[4]=1;
            TargetSet5[5]=5;
            TargetSet6[0]=9;
            TargetSet6[1]=7;
            TargetSet6[2]=11;
            TargetSet6[3]=6;
            TargetSet6[4]=10;
            TargetSet6[5]=8;
    
    
    
        Super.Tick(DeltaTime);
          //pitch=x roll=y yaw=z
    
        if ((time[(ActiveWeapon+5)%6] < Level.TimeSeconds) && (bWeaponIsFiring == True))
        {
            time[ActiveWeapon]=Level.TimeSeconds + 1;
            Weapons[WeaponSet[(ActiveWeapon+5)%6]].bActive = False;
    //    TargettingWeapon= 12+(ActiveWeapon%2);
    //     Weapons[TargettingWeapon].bActive = True;
            Target = Weapons[WeaponSet[ActiveWeapon]].CurrentAim;
    
            if     ((Target.Yaw<=8192 || Target.Yaw>=57344) && (Target.Pitch<8192 || Target.Pitch>57344))
            {
                    WeaponSet[ActiveWeapon]=TargetSet1[ActiveWeapon];
                    log("aiming forward " $Target.Yaw $" " $Target.Pitch);
                    log("ActiveWeapon being calculated is " $ActiveWeapon);
            }
            else if((Target.Yaw>=24576 && Target.Yaw<=40960) && (Target.Pitch<8192 || Target.Pitch>57344))
            {
                    WeaponSet[ActiveWeapon]=TargetSet2[ActiveWeapon];
                    log("aiming back " $Target.Yaw $" " $Target.Pitch);
                    log("ActiveWeapon being calculated is " $ActiveWeapon);
            }
            else if((Target.Yaw>8192 && Target.Yaw<24576) && (Target.Pitch<8192 || Target.Pitch>57344))
            {
                    WeaponSet[ActiveWeapon]=TargetSet3[ActiveWeapon];
                    log("aiming right " $Target.Yaw $" " $Target.Pitch);
                    log("ActiveWeapon being calculated is " $ActiveWeapon);
            }
            else if((Target.Yaw>40960 && Target.Yaw<57344) && (Target.Pitch<8192 || Target.Pitch>57344))
            {
                    WeaponSet[ActiveWeapon]=TargetSet4[ActiveWeapon];
                    log("aiming left " $Target.Yaw $" " $Target.Pitch);
                    log("ActiveWeapon being calculated is " $ActiveWeapon);
            }
            else if(Target.Pitch>=8192 && Target.Pitch<=24576)
            {
                    WeaponSet[ActiveWeapon]=TargetSet5[ActiveWeapon];
                    log("aiming up " $Target.Yaw $" " $Target.Pitch);
                    log("ActiveWeapon being calculated is " $ActiveWeapon);
            }
            else if(Target.Pitch>=40960 && Target.Pitch<=57344)
            {
                    WeaponSet[ActiveWeapon]=TargetSet6[ActiveWeapon];
                    log("aiming down " $Target.Yaw $" " $Target.Pitch);
                    log("ActiveWeapon being calculated is " $ActiveWeapon);
            }
            else
            {
                log("How did we get here?");
                log(Target.Yaw $" " $Target.Pitch);
                log("ActiveWeapon being calculated is " $ActiveWeapon);
            }
            for(i=0; i<6; i++)
            {
            log(WeaponSet[i]);
            }
            for(i=0; i<6; i++)
            {
            log(time[i]);
            }
    //        Weapons[TargettingWeapon].bActive = False;
            Weapons[WeaponSet[ActiveWeapon]].bActive = True;
            log("Weapon is Firing?" $bWeaponIsFiring);
            log("Firing " $WeaponSet[ActiveWeapon]);
            log("ActiveWeapon being fired is " $ActiveWeapon);
            ActiveWeapon = ++ActiveWeapon % 6;
        }
    }
    
    defaultproperties
    {
         MaxPitchSpeed=100.000000
         TrailEffectPositions(0)=(X=-185,Y=0,Z=0)
         TrailEffectPositions(1)=(X=-185,Y=-132,Z=0)
         TrailEffectPositions(2)=(X=-185,Y=132,Z=0)
         TrailEffectPositions(3)=(X=-175,Y=68,Z=20)
         TrailEffectPositions(4)=(X=-175,Y=68,Z=-25)
         TrailEffectPositions(5)=(X=-175,Y=-68,Z=20)
         TrailEffectPositions(6)=(X=-175,Y=-68,Z=-25)
         TrailEffectClass=ONSStarDestroyer.ONSStarDestroyerExhaust
         StreamerEffectOffset(0)=(X=-219.000000,Y=-35.000000,Z=57.000000)
         StreamerEffectOffset(1)=(X=-219.000000,Y=35.000000,Z=57.000000)
         StreamerEffectOffset(2)=(X=-52.000000,Y=-24.000000,Z=142.000000)
         StreamerEffectOffset(3)=(X=-52.000000,Y=24.000000,Z=142.000000)
         StreamerEffectClass=Onslaught.ONSAttackCraftStreamer
         StreamerOpacityRamp=(Min=1200.000000,Max=1600.000000)
         StreamerOpacityChangeRate=1.000000
         StreamerOpacityMax=0.700000
         UprightStiffness=500.000000
         UprightDamping=300.000000
         MaxThrustForce=10.000000
         LongDamping=0.5000
         MaxStrafeForce=10.000000
         LatDamping=0.5000
         MaxRiseForce=20.000000
         UpDamping=0.5000
         TurnTorqueFactor=0.000000       //30
         TurnTorqueMax=0.000000          //30
         TurnDamping=50.000000            //20
         MaxYawRate=.000000              //1.5
         PitchTorqueFactor=.5000000
         PitchTorqueMax=.5000000
         PitchDamping=5.000000
         RollTorqueTurnFactor=5.000000
         RollTorqueStrafeFactor=5.000000
         RollTorqueMax=5.000000
         RollDamping=.5000000
         StopThreshold=50.000000
         MaxRandForce=0.000000
         RandForceInterval=0.750000
         DriverWeapons(0)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachTopRightFront")
         DriverWeapons(1)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachTopRightMiddle")
         DriverWeapons(2)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachTopRightRear")
         DriverWeapons(3)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachTopLeftFront")
         DriverWeapons(4)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachTopLeftMiddle")
         DriverWeapons(5)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachTopLeftRear")
         DriverWeapons(6)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachBottomRightFront")
         DriverWeapons(7)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachBottomRightMiddle")
         DriverWeapons(8)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachBottomRightRear")
         DriverWeapons(9)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachBottomLeftFront")
         DriverWeapons(10)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachBottomLeftMiddle")
         DriverWeapons(11)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="GunAttachBottomLeftRear")
         DriverWeapons(12)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="root")
         DriverWeapons(13)=(WeaponClass=ONSStarDestroyer.ONSStarDestroyerGun,WeaponBone="root")
         RedSkin=Texture'ONSStarDestroyer.SD_texture'
         BlueSkin=Texture'ONSStarDestroyer.SD_texture'
         IdleSound=ONSSDSounds.SD-LP-1
         StartUpSound=ONSSDSounds.SD-LP-1
         ShutDownSound=ONSSDSounds.SD-LP-1
         StartUpForce="AttackCraftStartUp"
         ShutDownForce="AttackCraftShutDown"
         DestroyedVehicleMesh=ONSDeadVehicles-SM.AttackCraftDead
         DestructionEffectClass=Onslaught.ONSVehicleExplosionEffect
         DisintegrationEffectClass=Onslaught.ONSVehDeathAttackCraft
         DestructionLinearMomentum=(Min=50000.000000,Max=150000.000000)
         DestructionAngularMomentum=(Min=100.000000,Max=300.000000)
         DamagedEffectOffset=(X=-120.000000,Y=10.000000,Z=65.000000)
         ImpactDamageMult=0.001000
         VehicleMass=4.000000
         bTurnInPlace=False
         bShowDamageOverlay=True
         bDriverHoldsFlag=False
         bCanCarryFlag=False
         ExitPositions(0)=(Y=300.000000,Z=100.000000)
         ExitPositions(1)=(Y=-300.000000,Z=100.000000)
         ExitPositions(2)=(X=350.000000,Z=100.000000)
         ExitPositions(3)=(X=-350.000000,Z=100.000000)
         ExitPositions(4)=(X=-350.000000,Z=-100.000000)
         ExitPositions(5)=(X=350.000000,Z=-100.000000)
         ExitPositions(6)=(Y=300.000000,Z=-100.000000)
         ExitPositions(7)=(Y=-300.000000,Z=-100.000000)
         EntryPosition=(X=100.000000)
         EntryRadius=1000.000000
         TPCamDistance=500.000000
         TPCamLookat=(X=0.000000,Z=0.000000)
         TPCamWorldOffset=(Z=200.000000)
         DriverDamageMult=0.000000
         VehiclePositionString="in a Star Destroyer"
         VehicleNameString="Star Destroyer"
         RanOverDamageType=Onslaught.DamTypeAttackCraftRoadkill
         CrushedDamageType=Onslaught.DamTypeAttackCraftPancake
         FlagBone="root"
         FlagOffset=(Z=80.000000)
         FlagRotation=(Yaw=32768)
         GroundSpeed=5.000000
         HealthMax=1000.000000
         Health=1000
         Mesh=SkeletalMesh'ONSStarDestroyer.StarDestroyer'
         SoundVolume=160
         CollisionRadius=5.000000
         CollisionHeight=5.000000
         Begin Object Class=KarmaParamsRBFull Name=KParams0
             KInertiaTensor(0)=1.000000
             KInertiaTensor(3)=3.000000
             KInertiaTensor(5)=3.500000
             KCOMOffset=(X=-0.250000)
             KLinearDamping=0.000000
             KAngularDamping=0.000000
             KStartEnabled=True
             bKNonSphericalInertia=True
             KActorGravScale=0.000000
             bHighDetailOnly=False
             bClientOnly=False
             bKDoubleTickRate=True
             bKStayUpright=True
             bKAllowRotate=True
             bDestroyOnWorldPenetrate=True
             bDoSafetime=True
             KFriction=0.500000
             KImpactThreshold=300.000000
         End Object
         KParams=KarmaParamsRBFull'Onslaught.ONSAttackCraft.KParams0'
    
    }

    #2
    You can enable all weapons at once by looping through them like so:

    Code:
    simulated function Tick(float DeltaTime)
    {
        super.Tick(DeltaTime);
    
        Weapons[ActiveWeapon].bActive = false;
        ActiveWeapon = ActiveWeapon + 1;
    
        if(ActiveWeapon > Weapons.count)
        {
            ActiveWeapon = 0;
        }
    
        Weapons[ActiveWeapon].bActive = true;
    }
    While doing so, also filter out the weapons on the wrong side of the Star Destroyer. You could run traces from the weapon to the location under the crosshair to see if the weapon has a clear line of fire.

    Comment


      #3
      Wouldn't that code just cycle through all the weapons really fast?

      It seems to me that the activeweapon is just the one that is ready to fire, it doesn't necessarily make it fire. The game still checks to see if you are holding the button down first. I would like to make it so that if you stop firing and the target remains on the same side, the next weapon in order begins to fire, and not just start over, or have some random weapon in the array begin firing. (I am not asking you to tell me how to do that, just making a statement). I would like to keep the script from running constantly in Tick. So I am probably only going to let it activate when the vehicle is firing and then sort it out from there.

      Do you have any links on how to use the trace function? I looked through the parent classes for some trace functions while trying to find something I could use and wasn't sure I could it would give me what I needed. Is it just returning whether your aim vector/rotator hits an actor or what? If a trace can be used from a bone to the current location under the target then I could use it to help sort out which weapon sets to use. If it is a property of ONSweapon or a parent class of weapon I may not want to use it because then it is calculating the weaponset from each weapon and not from a centralized location, if that makes sense.

      Something else I don't understand is when the Weapon[ActiveWeapon].CurrentAim gets updated. Is it updated on firing, upon entering the vehicle or what? Is a trace being used to get the vector/rotator?

      Thanks for the help BTW, I will be posting more updates to this as I plan on messing with this a lot in the near future.

      Comment


        #4
        Originally posted by Invocent
        Wouldn't that code just cycle through all the weapons really fast?
        Try it and be amazed!

        Originally posted by Invocent
        I would like to keep the script from running constantly in Tick.
        That is an illusion. The performance loss would not be noticeable.

        Step 1: make stuff do what you want. Step 2: understand what you did. Step 3: optimize if needed.

        Originally posted by Invocent
        Do you have any links on how to use the trace function?
        Actor methods on Unreal Wiki

        Originally posted by Invocent
        Is it just returning whether your aim vector/rotator hits an actor or what?
        Trace returns the actor your trace hits (if any). FastTrace just returns true if the trace hits the world.

        Originally posted by Invocent
        If a trace can be used from a bone to the current location under the target then I could use it to help sort out which weapon sets to use.
        You can.

        Originally posted by Invocent
        If it is a property of ONSweapon or a parent class of weapon I may not want to use it because then it is calculating the weaponset from each weapon and not from a centralized location, if that makes sense.
        It doesn't make sense. You should not want to use a centralized location, since you want to check for every weapon.

        Originally posted by Invocent
        Something else I don't understand is when the Weapon[ActiveWeapon].CurrentAim gets updated.
        Native code does that, probably in some native equivalent of Tick.

        Comment


          #5
          Thank you for your comments! To clarfiy what I am trying to do further:

          I am not wanting to fire all the weapons simultaneously, I would like to fire them in a sequence with a slight delay between them. I want it to look like a random gun battery is firing at the target by rotating through a predefined set of 6 guns for each firing direction. Some of these guns are reused for multiple firing solutions. For instance Weapon[0] is the top-front-right gun. It is used when firing forward, right and up.

          I predefine each TargetSet, which is my array for which weapons fire for each firing direction and in what order, there are 6 TargetSet arrays. Then I use value in ActiveWeapon to pull that gun # from the TargetSet and store it in the WeaponSet Array. The WeaponSet array basically is there to help the guns looking random as you move from one firing arc/direction to another. Depending on the value in ActiveWeapon you will begin firing a different weapon each time you move from one arc to its adjacent arc. In other words, say you are in the middle of a barrage to the right of the ship and the target moves into the forward arc of firing. You wouldn't want Weapon[0] to be the first gun to fire every time something moved into the forward arc, or it would look less random and you would being to see a pattern.

          The reason I want to use a centralized location in determining which 6 weapons to fire is because there is a shift in the physical location of each weapon. This means that at times when you are aiming at a target that is clearly to the right of the star destroyer and out of the forward arc, the rearmost guns on the right side will report that TargetSet1 should now be firing(the front 6 weapons), when in fact those guns would report that I need to use TargetSet3(the right 6 weapons). The target might fall in the forward aiming TargetSet when determined from one or two of the 6 weapons in the right TargetSet and yet be calculated as being in the right TargetSet for the most or all the forward TargetSet. The result is that instead of getting the consistent use of the 6 weapons designated for the right side for targets on the right I occassionally get a weapon that is designated for the front arc, which may actually lie on the left side of the ship(depending on the value in ActiveWeapon) and would shoot through the star destroyer when fired at the target.

          As far as progress goes, I basically started from scratch again and recoded a 6 weapon version of the Star Destroyer, with one gun per side. I have managed to get it to dynamically fire whichever gun is on the side of the target pretty well. It still has the issues with overlap that the 6 gun version runs into. So at the edges of the arcs it will alternate firing one weapon, then the other until both weapons report that the target falls within the same arc.

          I took this code and have been trying to modify it to work with the 6 weapon version and the main problems I am running into right now are the problems I described above, where the weapons report that a different firing arc should be used when in fact they should not. I am also running into a problem getting the 6 weapons to fire at the correct interval. The interval should not change as the target moves around the ship, the only thing that should change is which weapon becomes active and firing. I have tried playing with the firing interval of the weaponclass itself, and also coding in a time check within my tick function that stores an offset time for each weapon. I have an array time[activeweapon] that stores the leveltime in seconds +1 as each weapon rotates through the cycle. I then check to see if one second has passed before allowing the gun to become active again. The problem is that is is skipping over weapons now or not firing at all. Its really hard to describe whats happening. I think what is happening is that the gun is not staying active long enough to actually spawn a fire effect. I have tried to fix this by setting the repeat speed on the weapon class to 0, so that I can see if it is actually firing all 6 weapons at least, but now it looks like it is not changing to use the correct TargetSet based on your aim. Certain weapons are getting stuck, where only they fire over and over regardless of direction, even when my logs tell me another weapon should be firing and that my WeaponSet is different. So I am not sure what is going on right now and am getting frustrated.

          If I make any break throughs I will post again. The thing that really ircs me is that I had all these timing issues worked out somehow before so that it worked great, except for the problem with guns reporting to use the wrong targetset. So in the process of trying to fix that I modified my code and saved over it and lost what I had working. Apparently I can't find it now. Of course I am trying to remember how I did this, when I started this over 2 years ago. :P

          Comment


            #6
            I'm just curious, wouldn't it be better to have those waepons as AI and one for the player? This seems to be a big task, having AI weapons would make it much easier.

            Being a Star Destroyer, I assume it's big, so AI weapons would be better.

            Comment


              #7
              Well, honestly I hadn't considered using AI weapons for other turrets. I had a couple reasons for doing it this way. I started this vehicle as a way to learn how to make vehicles so it has been an experiment in learning. I really had no intentions of making the star destroyer to scale. If that were the case I might have made each turret a new player position or ai controlled and made them in detail. The turrets are actually built of the weapon class for the plasmagun, and they have no geometry. I was hoping to keep the overall vehicle simple in design so I could learn some things coding and build upon them for future iterations of the star destroyer or other vehicles. I have the code working fairly well for one weapon per side, I am just running into issues trying to get it to rotate multiple weapons per side. Like I said before its frustrating because I know I had this code working well enough that it not only functioned fairly well, but also looked pretty cool apart from the random gun either misfiring or being unable to hit the target. In my quest to iron out the bugs I overwrote my working code and of course come back to it 2 years later trying to figure out how it worked and not remembering.

              If I could get the weapons to work the way I want them to I would move on to other weapon add ons for the SD and perhaps make some other capital ships. I just want to finish something for once and get it to work the way I want it to. Like Xyz said getting it working the way I want is first priority. Once I understand how to do that I can always go back and make the weapons AI if need be and I will have learned something that I can put to use in other areas.

              Comment


                #8
                Well I think I finally got it working to satisfaction. I can aim in any direction and it will fairly accurately calculate which weapon to use and rotate between the 6 weapons in each weaponset per side and continue to fire at a set rate so you don't get any burst firing. This probably ends up being less random looking but better for game play purposes.

                Things that I finally found out weren't working right...

                I was trying to set the weapons active like this:

                Weapons[WeaponSet[ActiveWeapon]].bActive

                What I finally figured out was that the value of ActiveWeapon was not getting passed into the WeaponSet array and then the value in WeaponSet getting passed on. Instead it was passing the value of ActiveWeapon. I tried this with extra parenthesis and it still didn't work. I finally had to use a variable other than ActiveWeapon to cycle through the arrays and I named it count. Then once I calculate which targetset to use I had to manually assaign the value returned to activeweapon, essentially like this:

                WeaponSet[count]=TargetSet1[count];
                ActiveWeapon = WeaponSet[count];
                Weapons[ActiveWeapon].bActive;

                Then I also finally realized that you can't add a value to Level.TimeSeconds as you store it so that now I store the Level.TimeSeconds per WeaponSet value and then add to the value in the array instead.

                Also of note...I have spent so much time trying to figure out how to keep the guns from firing out of order and jumping back and forth between sets. Basically what I have found is that once the weapons are cycling correctly through their sets it really isn't a problem.

                At any rate thanks for the help everyone, I am sure I will be back with more questions as I tackle new features. Woot!

                Comment

                Working...
                X