Announcement

Collapse
No announcement yet.

I am Legend (The Code Chronicles)

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

  • #16
    Originally posted by Legend View Post
    It would be nice to get around the starting with no ammo when using impulse 9 since that is how I test it. Not a biggie though.
    Ok. Well if you want the weapon to start with a loaded clip we can "hack" that in real quick my borrowing a bit of code from the reload function. Go down to W_ChangeWeapon. Go to the part about the supershotgun and the Riotgun in impulse 3 and add this bit to it.

    Code:
    if(self.weapon == IT_SUPER_SHOTGUN)
    	   {
               [COLOR="Lime"] local .float shots_fired;
                self.shots_fired = 12 - self.rcdrum;
                self.ammo_shells = self.ammo_shells - self.shots_fired;
                if (self.ammo_shells > 12);			  
                self.rcdrum = 12;		[/COLOR]	
    	    fl = IT_RSHOT;
    	    if (self.ammo_shells < 1)
    		am = 1;
    	    }
    This little "mini" reload will simply do a downsized version of what the reload script does and loads a clip in your weapon when you switch to it Voila! Bon App�tit! Yes this is a hacked version (I use those a lot , LOL!)but for a real quick solution this will work a treat.

    EDIT: A better method is to place this is client.qc in PutClientinServer ()

    Code:
    self.classname = "player";
    	self.health = 100;
    	self.takedamage = DAMAGE_AIM;
    	self.solid = SOLID_SLIDEBOX;
    	self.movetype = MOVETYPE_WALK;
    	self.show_hostile = 0;
    	self.max_health = 100;
    	self.flags = FL_CLIENT;
    	self.air_finished = time + 12;
    	self.dmg = 2;   		// initial water damage
    	self.super_damage_finished = 0;
    	self.radsuit_finished = 0;
    	self.invisible_finished = 0;
    	self.invincible_finished = 0;
    	self.effects = 0;
    	self.invincible_time = 0;
    	[COLOR="Lime"]self.rcdrum = 12;[/COLOR]
    This will load a drum automatically when you load into a new map without needing to add it to ChangeWeapon which allows for a mini exploit of getting ammo without needing to wait for reload. This also takes care of the problem of changing levels. You should familiar yourself with this function. This determins everything that happens to the player when they initially spawn into the game.



    Now to make it auto reload after the clip is empty we can use a method you might remember from your last reload code.

    Go down to W_WeaponFrame.

    After this code:

    Code:
    SuperDamageSound ();
    		W_Attack ();
    Place something like this (Note the syntax you use depends on what code you already have after W_Attack. If you still have that autoreloader stuff for the grenade and shotgun then this will be slightly different, but if not this is what you would put):

    Code:
    // check for attack
    	if (self.button0)
    	{
    		SuperDamageSound ();
    		W_Attack ();
    	[COLOR="Lime"]}
           else if (self.weapon == IT_RSHOT)
    	    { // autoload 
    		if (self.currentammo < 1 && self.currentammo < self.ammo_shells)
    		{
    			reloadrc ();
    		}
                }[/COLOR]
    };
    This is a bit of a hack too (hehe) but basically if your current ammo is less than 1 go ahead and reload that puppy. This should provide you with a simple fix to your two problems.

    As far as wanting it to display what is in the clip, it already does this really. First it looks at the inventory (your total number of shells), determines the number of shells you currently have in your clip, then after you fire displays only what shell count your currently have in the clip, and then after you reload, it updates the display (HUD) with your current inventory of shells minus what you just used for the last clip and minus the now additional clip you have loaded and displays that number. Once you start firing it will begin to display the number of shells left in your clip until you run out again and the process starts over. I find this to be a more than optimal solution without trying to set up additional HUD features which requires quite a bit more coding. This is a pretty good solution for the basics. But if you really want it to display only the clip amount all the time you can do this simply by looking at the old reload code you were using. If you study it a bit you will see how it was done in that one and can easily apply it to this new code. The problem with doing it this is you simply won't know what your total amount of shells remaining using the old method unless you switch weapons. It seems strange to me but if you want it, eh. If you need help with that let me know. Cheers.
    Last edited by PrimalLove; 08-21-2014, 06:29 PM.

    Comment


    • #17
      I've done a bit of debugging and testing this code and it does have some problems. Sometimes the updates to the ammo amounts will not match up til it runs it's routines or you switch to that weapon so it's not perfect. Specifically this happens when switching from any of the shotguns to the riot, etc. Minor bug that needs some cleaning up. A few other things I noticed. When I get some time I'll look into it more closely. I'm heading to bed.

      Comment


      • #18
        Ok I did some debugging and decided to go through the steps again with you using some code example for a shotgun, explain a few more things, and show you a bug that I currently can't fix. :/ Oops! LOL! No one is perfect.

        Defs.qc

        Code:
        .float shotclip; //whatever your clip/drum is called
        Weapons.qc

        Reload Function: (Near the top of Weapon.qc)

        Code:
        /*
        ================
        Reload Code (Could use this one code to add multiple weapon reloads)
        ================
        */
        
        void() reload =
        {
          local .float shots_fired; 
          if (self.weapon == IT_SHOTGUN) //If weapon is a shotgun
          {
              self.shots_fired = 6 - self.shotclip;  //define how many shotsfired
              [COLOR="Lime"]if (self.ammo_shells > self.shots_fired)  //if your shell inventory is more than shots fired, move to next instructions
            {
             self.ammo_shells = self.ammo_shells - self.shots_fired;  //then update inventory to reflect this.
             self.shotclip = 6; //Then reload clip
            }
            else 
            {
            self.shotclip = self.shotclip + self.ammo_shells; //Combine your clip and remaining shells (already 0)
            self.ammo_shells = 0; //Set ammo inventory to 0
            }[/COLOR]
         }
        [COLOR="Red"] if (self.ammo_shells < self.shotclip)
         self.shotclip = self.ammo_shells;[/COLOR]
         self.currentammo = self.ammo_shells;  //Update HUD to reflect ammo change
         self.attack_finished = time + 2; 
        };
        Everything in green only happens if you have enough shell ammo left.

        EDIT: I fixed the problem I mention at the end of the post where I had a bug and it would add 6 to the clip even when you didn't have that much left in your inventory. The red code is the change/addition you need to fix the bug. Can't believe I missed that. LOL! Another reason it's important to stop and read through the code and talk it out to yourself. Anyway, this will fix that and I am still working on the rewrite.


        W_FireShotgun:

        You can do this two ways and I guess I might have been confusing before how I explained it so let me try again. If you have just this:

        Code:
        self.shotclip = self.shotclip - 1;
        It will remove shells from your clip as you fire, but will not update it on the screen for you to see. So it just happens in the background and then after it's done the reload code will update your current shell inventory in the HUD. However, the way I like to do it:

        Code:
        self.currentammo = self.shotclip = self.shotclip - 1;
        This will actually update the current visible ammo amount left in the clip as it takes them away so you can visually see this in game. If you don't want that then just simply leave out the first part.

        W_Attack:

        Code:
        else if (self.weapon == IT_SHOTGUN)
        	{
        	  if (self.shotclip > 0) // If shells in the clip continue normally
        	     {
        		player_shot1 ();
        		W_FireShotgun (); // Then shoot
        		self.attack_finished = time + 0.5;
        	     }
        	 if (self.shotclip == 0) // If the clip is empty RELOAD!
        	    {
        	     reload ();
        	    }
        	}
        This one is self explanatory


        So the last thing is Client.qc. I told you to put a mini reload in the changeweapon function, but this is not optimal and leads to problems. So instead lets go to Client.qc and in the PutClientinServer () and put this in it.

        Code:
        void() PutClientInServer =
        {
        	local	entity spot;
        
        	spot = SelectSpawnPoint ();
        
        	self.classname = "player";
        	self.health = 100;
        	self.takedamage = DAMAGE_AIM;
        	self.solid = SOLID_SLIDEBOX;
        	self.movetype = MOVETYPE_WALK;
        	self.show_hostile = 0;
        	self.max_health = 100;
        	self.flags = FL_CLIENT;
        	self.air_finished = time + 12;
        	self.dmg = 2;   		// initial water damage
        	self.super_damage_finished = 0;
        	self.radsuit_finished = 0;
        	self.invisible_finished = 0;
        	self.invincible_finished = 0;
        	self.effects = 0;
        	self.invincible_time = 0;		  
                [COLOR="lime"]self.shotclip = 6;[/COLOR]		
        
        	DecodeLevelParms ();
        	
        	W_SetCurrentAmmo ();
        Just add the green highlighted text and every map you spawn into or every time you die and spawn it will automatically load your clip with ammo.

        That is a hack fix too.. Eventually you'll probably want to incorporate it into this:

        Code:
        void() SetNewParms =
        {
           parm1 = IT_SHOTGUN | IT_AXE;
           parm2 = 100;
           parm3 = 0;
           parm4 = 25;
           parm5 = 0;
           parm6 = 0;
           parm7 = 0;
           parm8 = 1;
           parm9 = 0;
        };
        This determines paramaters of when you start. Here its says you start with shotgun and axe, you have 100 health, and 25 shells to start. Eventually once your mod gets going you'll probably start using additional parms here.


        The BUG I currently having trouble fixing for you in are almost out of ammo (on your last clip) and it is anything but 6, it will reload and give you 6 more ammo even tho your current inventory of shells is less than that. EDIT: FIXED

        So I am looking to fix this and even rewrite this thing to be more modular for adding additional weapons and not needing anything more than one reload function. I'll keep you updated on that. Hopefully the way this works is good enough for now until I get a fix done. Also, did you like the Axe solution and chance to gib zombies?

        Also if interested in how to add reload animations check out this forum thread at inside3d!

        Also don't forget if you want it to autoreload after you reach 0 on the clip just do this in W_WeaponFrame:

        Code:
        // check for attack
        	if (self.button0)
        	{
        		SuperDamageSound ();
        		W_Attack ();
        	}
              [COLOR="Lime"] else if (self.weapon == IT_SHOTGUN)
        	    { // auto reload after clip is empty. 
        		if (self.currentammo < 1 && self.currentammo < self.ammo_shells)
        		{
        			reload ();
        		}
                    }[/COLOR]
        };
        Cheers.
        Last edited by PrimalLove; 08-22-2014, 06:57 AM.

        Comment


        • #19
          @Primal

          Thanks yet again Primal. I did like the zombie axe code. The only thing was I was wondering about making it so the axe could only take life from the other enemies when they actually die and not on each hit from the axe. Though I think I might incorporate the random gib zombie code for the other enemies so that way instead of a random chance to gib, it will be a random chance to leach life for normal enemies instead. To balance to axe a bit more. I think I may be able to fenagle it the way I want. Won't have a chance to play with it till later tonight though.

          I think I understand the rest of what you were teaching so far. But if I put the "self.rcdrum = 12" in the client.qc, that will make it automatically fully loaded at the start of each level?is that the only way to do it? And also, wouldn't that just fill the drum and not take it out of the actual ammo count?

          I'm going to leave the reload functions for the regular shotgun and grenade launcher asd is since they already work the way I like. I'm only using this code cause it seems like it will work better for what I have in mind for the new gun. I only intend to add this one new gun anyway.

          One concern with the original reload code for the shotty and gl, is that you can kinda cheat by simply switching weapons and back while they are reloading and it will go back to a full mag. I would prefer if the player could only switch weapons when the clips are full for those two weapons. Since the riot gun is being kept track of in rcdrum, it won't matter as long as the player cannot switch during the actual reload function for that one.

          Not too clear on the parms or why it is relevant at the moment other than to set the starting equipment of the player.

          Thanks for the link for the animation info. I'll probably skip the reloading animations for now since I have zero experience with modeling and animation. Got my hands full enough just figuring the qc and bending everyones ears about it. I'll probably just have the weapon lower and raise back up for the time being while it is being reloaded.

          Comment


          • #20
            Originally posted by Legend View Post
            @Primal

            Thanks yet again Primal. I did like the zombie axe code. The only thing was I was wondering about making it so the axe could only take life from the other enemies when they actually die and not on each hit from the axe.
            Maybe elaborate on this?

            EDIT: I think i know what you mean. Ok, well if you want this to just happen with the axe then it is very simple. Towards the end of the W_FireAxe function you'll need to add this little gem.

            Code:
            else
            	{	// hit wall
            		sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
            		WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
            		WriteByte (MSG_BROADCAST, TE_GUNSHOT);
            		WriteCoord (MSG_BROADCAST, org_x);
            		WriteCoord (MSG_BROADCAST, org_y);
            		WriteCoord (MSG_BROADCAST, org_z);
            	}
            
            	[COLOR="Lime"]if(trace_ent.health < 1)
            	   {
                         if (self.health >= 100)
                                return;                         
                          else
            
            	   self.health = self.health + 100*random(); 
                          if (self.health > 100)
                          self.health = 100;[/COLOR]
                          
            			  }
            };
            The green highlighted code should look somewhat familiar. What we are doing here is simply saying if the enemy health (trace.ent.health) is less than 1 (he is dead) then go to next instructions. If our health is already full nothing happens. Otherwise we will receive a random amount of health from 1 to 100. Also don't let your health go over 100.
            Voila! Obviously you can tweak this to your liking. Could even make it specific to certain monsters. But this is just a simple one that works with any monster you kill. You could even make exceptions to monsters this would not work with. Like maybe you don't want zombies to give you health when they are dead/gibbed, etc. You can also add a sound effect to this and or use sprint to say a message to the player about the health received.


            Though I think I might incorporate the random gib zombie code for the other enemies so that way instead of a random chance to gib, it will be a random chance to leach life for normal enemies instead.
            If you need any help on it let me know but yeah that should be easy enough to do with the already provided code.


            I think I understand the rest of what you were teaching so far. But if I put the "self.rcdrum = 12" in the client.qc, that will make it automatically fully loaded at the start of each level?is that the only way to do it? And also, wouldn't that just fill the drum and not take it out of the actual ammo count?
            Yes this is true. I did hack it up hehe. But simple fix. Open up client.qc and right after the self.rcdrum = 12; put this:

            Code:
            self.ammo_shells = self.ammo_shells - self.rcdrum;
            That will update your shell ammo amount to reflect that you have a clip in. Voila! Bon App�tit!


            One concern with the original reload code for the shotty and gl, is that you can kinda cheat by simply switching weapons and back while they are reloading and it will go back to a full mag. I would prefer if the player could only switch weapons when the clips are full for those two weapons. Since the riot gun is being kept track of in rcdrum, it won't matter as long as the player cannot switch during the actual reload function for that one.
            My code already fixes this problem so that doesn't happen. If you switch weapons and come back your clip is right where it left off. When I get home I'll check the auto reloader code you use and see if there is a simple solution for that.

            Not too clear on the parms or why it is relevant at the moment other than to set the starting equipment of the player.
            This is related to setting up the clip ammo. It's sloppy/hack to use it where I told you and better to place it in the parms and create new parms for it. Using this here makes it so that even if you changelevels, everything will be as it is suppose to be in the next level or when you die and respawn. You'll have your clip ready to go. It should be noted that even if you pick the weapon up in the level or perhaps a map you make for it this will automatically have your clip setup. I was just suggesting you familiarize yourself with that code for future reference.
            Last edited by PrimalLove; 08-23-2014, 02:03 AM.

            Comment


            • #21
              back from the dead finally after a crashed and barely salvaged hard drive and utter lack of time.

              Anyway, still trying to perfect my little weapon mod and particularly the riot shotgun. Thanks to primal's lessons and tips, I have it almost perfect I think.

              I scrapped the idea of it jamming altogether and I still have make a reload sound.

              I have it so it now has a working drum that reloads when it is empty and fires with the recoil I want. And the drum updates on the hud.

              But... (as usual),

              When it fires, it takes 3 ammo from the drum instead of 2. I think I had this issue before and may even have been solved, but I can't find the post with the answer.

              The only other issue, is that after the drum is emptied to 0, it immediately displays 12 on the hud. I would like it so it does not display the 12 on the hud for the drum until the reload time (self.attack_finished = time + 4 has finished passing.

              Here's the code:
              reload rc
              Code:
              /*
              =====================
              Reload Riot Shotgun
              =====================
              */
              
              void() reloadrc
              {
              
              local .float shots_fired; // A float that will only be used in this function and cant be called by others
              
              if (self.weapon == IT_RSHOT) // Checks if the current weapon is the Riot Shotgun
              {
              self.shots_fired = 12 - self.rcdrum; // calculate the shots fired from drum
              if (self.ammo_shells > self.shots_fired) // If we have more shells in our inventory then those that need to be reload then its easy.)
              {
              self.ammo_shells = self.ammo_shells - self.shots_fired; // We take the shots fired and take that away from out inventory.
              self.rcdrum = 12; // refill the drum.
              }
              else
              {
              self.rcdrum = self.rcdrum + self.ammo_shells; // Since the ammo in ammo_shells is less than the shots fired we can add that to the drum
              self.ammo_shells = 0; // set the shells to zero because there are none left.
              }
              }
              if (self.ammo_shells < self.rcdrum)
              self.rcdrum = self.ammo_shells;
              self.currentammo = self.rcdrum; // Update the current ammo (shown on the Quake hud) to show how many bullets are left in the inventory
              self.attack_finished = time + 4; // Set the next attack four seconds from now, you cant shoot for four seconds.
              };
              rc
              Code:
              /*
              ================
              W_FireRC
              ================
              */
              
              //fire riot shotgun
              void() W_FireRC =
              {
              	local vector dir,kickback,dir2;
              
              	if (self.currentammo < 1)
              	{
              		sound (self, CHAN_WEAPON, "weapons/dryfire.wav", 1, ATTN_NORM);	
              		return;
              	}
              		
              	if (self.weaponframe < 2)
              		sound (self ,CHAN_WEAPON, "weapons/rshotgn.wav", 1, ATTN_NORM);	
              
              	self.punchangle_x = -4;
              	
              	var float kickback_push = 250;    // set to amount of kickback you want
              			dir2 = aim (self, 100);
              			traceline (self.origin, self.origin + dir2*kickback_push, FALSE, self);
              			kickback = (trace_endpos - self.origin); // + (normalize(dir2) * 80);
              			self.velocity = self.velocity - kickback;
              		
              	self.currentammo = self.rcdrum = self.rcdrum -1; // take away 1 from the drum count and show on hud
              	makevectors(self.v_angle);
              	dir = v_forward; //aim (self, 100000);
              	
              	FireBullets (20, dir, '0.20 0.15 0');
              	
              };
              w_weaponframe
              Code:
              	ImpulseCommands ();
              	
              // check for attack
              	if (self.button0)
              	{
              		SuperDamageSound ();
              		W_Attack ();
              	}
              	else if (self.weapon == IT_RSHOT)
              	{ // auto reload after clip is empty. 
              		if (self.currentammo < 1 && self.currentammo < self.ammo_shells)
              		{
              			reloadrc ();
              		}
                  }
              Thanks for any help again.

              Comment


              • #22
                you can basically dump self.shots_fired and either make it a non-entity field (no point in attaching a local var to the entity) or just use cnt.
                http://www.nextgenquake.com

                Comment


                • #23
                  your last "if" is totally borked.

                  1) it doesn't happen in the main "if" so it will always happen. But "always" will actually still only be when it's supposed to cause only the use of your gun will call this function, making the self.weapon check here useless.
                  2) if a < b then b = a? hunh? You just said if a < c then b = b + a and a = 0. Which means that any time your else is hit your final if will be hit and your drum (which has bullets in it) will be set to 0 and then your current ammo too.

                  in action:

                  else
                  rcdrum = 12
                  ammo = 0

                  if (0 < 12)
                  current = rcdrum = 0
                  think for time + 4 about how you threw away <13 bullets


                  see what I'm saying? Really, you might want to consider dumping these custom functions and putting the code where it goes for everything else. The best reason I can give you is, if you put the code where the other code is, you'll be using the flow that is already established, and you will make less mistakes. Also I'd be willing to bet that most of your code for this could be established by simply adding an (... || self.weapon == MY_WEAP) to some existing weapon condition and then nest a specific if for your weapon to handle anything that isn't already being done for you.

                  I don't know how declaring local affects an entity .field but declaring .fields makes that .field available to all entities and I believe creates more overhead (if I remember proper). You should try to reuse the existing vars where possible.

                  I think it's not obvious about your math error to the casual reader. Meaning, I wasn't reading this casually. I was trying to help you hunt down your 3/2 bullet problem and noticed other stuff. I still do not know why you are having the original problem.
                  Last edited by MadGypsy; 02-12-2015, 09:07 PM.
                  http://www.nextgenquake.com

                  Comment


                  • #24
                    I figured out the issue with the extra shell being spent. I had the issue before already and found the post where I stated I fixed the problem originally. It was on the first page of this thread. doh!

                    Still trying to figure out how to have the hud update the drum count after the reload time instead of right away though.

                    Thanks for the advice madgypsy. Afraid I don't understand most of it though unfortunately. I'm still really new to it all and had a period of a bit over have a year since last working with quake modding. So still trying to relearn the stuff I already have.

                    As far as the code being borked, it seems to all work as I intend at the moment other than the hud update. Not sure why I would change it if it works. Unless you mean mostly just to have cleaner and possibly more optimized code.

                    Comment


                    • #25
                      @Legend

                      This is not an elegant solution but one that could achieve your goal.

                      Code:
                      //Put this near the top of w_weaponframe()
                      
                      if (self.weapon == IT_RSHOT && self.attack_finished < time && !self.cnt)
                          {
                               [COLOR="lime"]// Update your currentammo display and reset cnt[/COLOR]
                      	self.currentammo = self.rcdrum;
                      	self.cnt = 1;
                          }
                      
                      
                      // And with your reload function...
                      
                      void() reloadrc
                      {
                      
                      local .float shots_fired; // A float that will only be used in this function and cant be called by others
                      
                      if (self.weapon == IT_RSHOT) // Checks if the current weapon is the Riot Shotgun
                      {
                      self.shots_fired = 12 - self.rcdrum; // calculate the shots fired from drum
                      if (self.ammo_shells > self.shots_fired) // If we have more shells in our inventory then those that need to be reload then its easy.)
                      {
                      self.ammo_shells = self.ammo_shells - self.shots_fired; // We take the shots fired and take that away from out inventory.
                      self.rcdrum = 12; // refill the drum.
                      }
                      else
                      {
                      self.rcdrum = self.rcdrum + self.ammo_shells; // Since the ammo in ammo_shells is less than the shots fired we can add that to the drum
                      self.ammo_shells = 0; // set the shells to zero because there are none left.
                      }
                      }
                      if (self.ammo_shells < self.rcdrum)
                      self.rcdrum = self.ammo_shells;
                      //self.currentammo = self.rcdrum; [COLOR="Yellow"] // Remove this...[/COLOR]
                      self.attack_finished = time + 4;
                      self.cnt = 0; [COLOR="Lime"]// Replace with this or something similar.[/COLOR]  
                      };
                      Not maybe the best way to do things...
                      Last edited by PrimalLove; 02-18-2015, 12:52 PM.

                      Comment


                      • #26
                        @Legend...I dont understand most of it

                        I empathize, I felt that way frequently when certain people here tried to help me with certain things. The only thing that matters is if you push yourself to try and understand, every time. It's like delivering a punch. You attempt to deliver your fist through a person, even though success is highly unlikely. That punch, regardless of ultimate success, is going to produce some results.

                        Punch mystery with your brain.
                        http://www.nextgenquake.com

                        Comment


                        • #27
                          Anyone know if there is an archived version of the quake monster pitching tutorial still floating around somewhere? I remember it used to be on inside3d but seems to be gone now. I was hoping to add this and z aware ogres into my mod. No luck with google so far. And the one for proportional fall damage.

                          Thanks if anyone knows where I could find it.
                          Last edited by Legend; 04-19-2015, 02:15 PM.

                          Comment


                          • #28
                            Originally posted by Legend View Post
                            Anyone know if there is an archived version of the quake monster pitching tutorial still floating around somewhere?
                            What exactly do you mean with "monster pitching"? Can you explain?

                            Comment


                            • #29
                              double tap trigger?

                              Is it possible to make the game recognize when the player double taps the trigger quickly instead of holding it down? I'm trying to create a gun with two fire modes. One which is rapid fire when you just hold down the fire button and a secondary fire mode that launches a charge shot when you double tap.

                              Comment


                              • #30
                                Hello Legend,

                                If you do not want to use a new .impulse for it, which is the usual way for things like this, you can always adjust the way a regular W_Attack() is triggered.
                                Add a new timer in it that you set for a specific short time when wearing that weapon.
                                It will work like this:
                                Each time you push the button a short timer is spawned, if the button is pushed during the time that the timer is still alive, it means you did a quick double-click. Something like 0.2 seconds or less. Experiment with it...
                                Be aware that W_WeaponFrame() is called every frame !

                                That way you can have a double-tap trigger without a new .impulse.

                                Good luck,
                                Seven

                                Comment

                                Working...
                                X