Tutorial: Hexing Weapons for GMOD

Discussion in 'Garry's Mod 9' started by Uragan, Aug 7, 2009.

  1. Uragan Veteran Stalker

    Joined:
    Aug 7, 2009
    Messages:
    1,143
    Likes Received:
    39
    Trophy Points:
    48
    Location:
    United States
    Hello everyone.

    First and foremost I would like to state that this will work in both GMod 9 and Gmod 10.


    Alright down to business.

    Tools:

    Hex Editor: This is the main tool of this tutorial.
    Download it from here https://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm
    Note Pad or other writing program.
    And last but not least a source.


    Step 1: Find your weapon of choice.
    Now you can find lots of weapons from many skin websites. For the sake of this tutorial though will be using this skin https://www.fpsbanana.com/skins/55110 A HK416 Masterkey. Note you can do this with any skin.

    Step 2: The Renaming and Hexing
    Now that we've got the skin unpack it. You'll end up with a material folder a model folder and a couple of other folders. Right now you only need the material and model folders.

    Now open up the model folder. You should find a bunch of files relating to the model. (An example of this would be: v_rif_m4a1.mdl)

    Now first off we need to rename these. Edit the bold part
    v_rif_m4a1.mdl
    Change m4a1 to hk16 on all files. Change nothing else.

    Now open these files up in the hex editor(one at a time of course)
    v_rif_hk16.mdl
    w_rif_hk16.mdl

    Now the part we need to change is the part where it says v_rif_m4a1.mdl
    and w_rif_m4a1.mdl. Yet again change m4a1 to hk16. Save the files and you're done.

    Now all you need to do is put the folders in your gmod9 directory and code up the swep. I'll show that later. Anyway I hope this helps you all.:)
     
  2. Uragan Veteran Stalker

    Joined:
    Aug 7, 2009
    Messages:
    1,143
    Likes Received:
    39
    Trophy Points:
    48
    Location:
    United States
    Now Onto Part 2: The Code.

    Now that we've hexed the weapon were going to code it up into a whole new weapon with working shotgun.

    Now what I like to do is go into lua/weapons/counter_strike in the gmod 9 directory and pick a current lua and edit that. Seeing as how it was originally a M4 replacement we're going to copy the M4. So copy that file and rename it to hk416_masterkey or something similiar.

    Alright so now were stuck with this.

    Code:
    -- Called when the weapon is created.
    
        function onInit( )
    
    
        
        _SWEPSetSound( MyIndex, "single_shot", "Weapon_m4a1.Single" );
    
        end
    
    
    
        
    
    -- Called every frame
    
        function onThink( )
    
        end
    
        
    
        
    
    -- When the player presses left mouse button
    
        function onPrimaryAttack( )    
    
        end
    
        
    
    -- When the player presses right mouse button
    
        function onSecondaryAttack( )        
      
        end
    
    
    
        function Deploy( )
        end
        
        function Holster( )
        end
        
    
    -- When player presses reload. Returning false means DONT RELOAD. Although this will hitch on the client.
    
        function onReload( )
    
            return true;
    
        end
    
        
    
    
    
    -- These are only accessed once when setting up the weapon
    
        
    
        function getWeaponSwapHands()
    
            return true;    
    
        end
    
        
    
        function getWeaponFOV()
    
            return 70;    
    
        end
    
        
    
        function getWeaponSlot()
    
            return 3;    
    
        end
    
        
    
        function getWeaponSlotPos()
    
            return 5;    
    
        end
    
        
    
        function getFiresUnderwater()
    
            return false;
    
        end
    
        
    
        function getReloadsSingly()
    
            return false;
    
        end
    
        
    
    
    
        
    
        -- Primary Attack
    
        
    
        function getDamage()
    
            return 18;
    
        end
    
        
    
        function getPrimaryShotDelay()
    
            return 0.09;
    
        end
    
            
    
        function getPrimaryIsAutomatic()
    
            return true;
    
        end
    
                
    
        function getBulletSpread()
    
            return vector3( 0.01, 0.01, 0.01 );
    
        end
    
        
    
        function getViewKick()
    
            return vector3( 0.5, 0.0, 0.0);
    
        end
    
        
    
        function getViewKickRandom()
    
            return vector3( 0.5, 0.5, 0.2 );
    
        end
    
            
    
        function getNumShotsPrimary()
    
            return 1;
    
        end
    
        
    
        function getPrimaryAmmoType()
    
            return "pistol";
    
        end
    
        
    
        -- Secondary attack
    
        
    
        function getDamageSecondary()
    
            return 150;
    
        end
    
        
    
        function getSecondaryShotDelay()
    
            return 0.001;
    
        end
    
        
    
        function getSecondaryIsAutomatic()
    
            return true;
    
        end
    
        
    
        function getBulletSpreadSecondary()
    
            return vector3( 0.001, 0.001, 0.001 );
    
        end
    
        
    
        function getViewKickSecondary()
    
            return vector3( 0.5, 0.0, 0.0);
    
        end
    
        
    
        function getViewKickRandomSecondary()
    
            return vector3( 0.5, 0.5, 0.2 );
    
        end
    
        
    
        function getNumShotsSecondary()
    
            return 15;
    
        end
    
        
    
        function getSecondaryAmmoType()
    
            return "buckshot";
    
        end
    
        
    
        
    
    
    
        function getViewModel( )
    
            return "models/weapons/v_rif_m4a1.mdl";
    
        end
    
        
    
        function getWorldModel( )
    
            return "models/weapons/w_rif_m4a1.mdl";
    
        end
    
        
    
        function getClassName()
    
            return "weapon_scripted";
    
        end
    
    
    
        function getHUDMaterial( )
    
            return "gmod/SWEP/default";
    
        end
    
    
    
    
    
            
    
    
    
        
    
        function getMaxClipPrimary() -- return -1 if it doesn't use clips
    
            return 30;
    
        end
    
        
    
        function getMaxClipSecondary() -- return -1 if it doesn't use clips
    
            return 5;
    
        end
    
        
    
        function getDefClipPrimary() -- ammo in gun by default
    
            return 128;
    
        end
    
        
    
        function getDefClipSecondary()
    
            return 1;
    
        end
    
    
    
        
    
        function getAnimPrefix() -- How the player holds the weapon: pistol, smg, ar2, shotgun, rpg, phys, crossbow, melee, slam, grenade
    
            return "smg";
    
        end
    
    
    
        function getPrintName()
    
            return "M4A1";
    
        end
    
        
    
        
    
        -- 0 = Don't override, shoot bullets, make sound and flash
    
        -- 1 = Don't shoot bullets but do make flash/sounds
    
        -- 2 = Only play animations
    
        -- 3 = Don't do anything
    
        
    
        function getPrimaryScriptOverride()
    
            return 0;
    
        end
    
    
    
        function getSecondaryScriptOverride()
    
            return 3;
    
        end
    
    
        function getDeathIcon( )
            return "d_m4a1";
        end
    Alright now we have a lot to change. First off we begin with sounds. We're going to need a new sound for our shotgun that's attached to the rifle. So we're going to go to FPSBanana yet again for a sound. For the tutorial will be using this one though: https://www.fpsbanana.com/sounds/1674 Now take this sound and rename it. Then put it into sound/weapons and make a new folder called HK416 or something similar and place the sound in there.

    Now head down to the part of code where it says
    Code:
    -- When the player presses right mouse button
    
        function onSecondaryAttack( )        
      
        end
    
    Now add this line in between the end and the function on secondary attack.

    Code:
    _EntEmitSound(Owner,"weapons/hk416/enter sound name here.wav");
    (Please note change enter sound name here" with whatever you named the shotgun sound to.)

    Now we should have something like this

    Code:
    function onSecondaryAttack( )
    _EntEmitSound(Owner,"weapons/hk416/enter sound name here.wav");
    end
    We're done with the sound so lets mess with the rest of the code.

    Move down to these lines.

    Code:
    function getWeaponSlot()
    
            return 3;   
    
        end
    
       
    
        function getWeaponSlotPos()
    
            return 5;   
    
        end
    
    Now these define where are weapon is in our inventory. You could leave this the same but then you won't be able to use the m4a1 so we're going to change 5 to 12. This way we can use both the m4a1 and our 416.

    So now we should have this:
    Code:
    function getWeaponSlot()
    
            return 3;   
    
        end
    
       
    
        function getWeaponSlotPos()
    
            return 12;   
    
        end
    
    Now let's move down a little more to this line:

    Code:
    function getSecondaryShotDelay()
    
            return 0.001;
    
        end
    
    Now we want to change this so the player can't just click every two seconds and fire the swep. So open up the m3 lua file.(In the same folder we found the m4a1 lua.)

    Now go down to this line in the m3 lua.

    Code:
    function getPrimaryShotDelay()
    
            return 0.9;
    
        end
    As you can see the delay for the shotgun is 0.9. So we are going to transfer this over to our hk416 and change this
    Code:
    function getSecondaryShotDelay()
    
            return 0.001;
    
        end
    
    to this
    Code:
    function getSecondaryShotDelay()
    
            return 0.9;
    
        end
    
    Now it will have a proper delay time.


    Now just below is this

    Code:
    function getSecondaryIsAutomatic()
    
            return true;
    
        end
    This is a simple change. We're just going to change true to false.

    If you go down another couple of lines you'll find this bit of code:

    Code:
    function getBulletSpreadSecondary()
    
            return vector3( 0.001, 0.001, 0.001 );
    
        end
    We are going to change this to so it acts more like a shotgun.

    Change it to this:

    Code:
    function getBulletSpreadSecondary()
    
            return vector3( 0.1, 0.1, 0.1 );
    
        end
    Now we have our shotgun effect completed.

    Now we're going to change the model and the class so head down to these lines:
    Code:
    function getViewModel( )
    
            return "models/weapons/v_rif_m4a1.mdl";
    
        end
    
       
    
        function getWorldModel( )
    
            return "models/weapons/w_rif_m4a1.mdl";
    
        end
    
       
    
        function getClassName()
    
            return "weapon_scripted";
    
        end
    
    
    
    
    
    And change it to this

    Code:
    function getViewModel( )
    
            return "models/weapons/v_rif_hk16.mdl";
    
        end
    
       
    
        function getWorldModel( )
    
            return "models/weapons/w_rif_hk16.mdl";
    
        end
    
       
    
        function getClassName()
    
            return "weapon_hk416";
    
        end
    
    
    
    
    
    This will make sure we have the new model. The class part also makes sure we can use both the m4a1 and the 416 together. If it was left the same you would just be able to pick one up and use the other for ammo.

    Now head down to this line:
    Code:
    function getPrintName()
    
            return "M4A1";
    
        end
    This tells us the name of the weapon and the name that will show up in our inventory. Change it to this
    Code:
    function getPrintName()
    
            return "HK416_Masterkey";
    
        end
    Now we're almost done. Head down to the last lines and find this:
    Code:
    function getSecondaryScriptOverride()
    
            return 3;
    
        end
    Change the 3 to 0. This will make sure our shotgun fires.

    Now save your file. Go to your lua/weapons/ folder and create a new folder called "My Weapons" Put your lua in there. Now you're done. Start up gmod and mess around with your new swep.
     
  3. XxobrianxX Member

    Joined:
    Jan 18, 2009
    Messages:
    64
    Likes Received:
    0
    Trophy Points:
    6
    This should be very helpful for people who want to be a lua coder.