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