Tutorial: Add a new simple weapon (straightforward way) Last edited 1 year ago2022-09-29 12:27:18 UTC

This is not a proper way of adding new weapons because it does not use client side network prediction and stuff, but it is still reliable for single player only mods. For a more complete guide, refer to Weapons Programming - Standard Weapons.
Are you programming for a single-player Half-Life mod and looking for an easy way to add new, normal hitscan, shooting weapons? You are at the right place. In this tutorial, we will look into a way to add AK-47 from Counter-Strike 1.6 to Half-Life.

Before we start

This tutorial requires you to use:

Get the files

Get the models, sound and sprites from Counter-Strike 1.6 and put in the respective folders in your mod folder. Assets to be taken:

Files to edit

As a bare minimum, these are the files needed to be edited to get a working weapon (minus client side prediction). They are: As a matter of fact, ak47.cpp needs to be manually created by right clicking dlls folder in hldll/Source Files, click "Add, New Item", select "C/C++ source file", set the name to ak47.cpp and make sure it's created inside the dlls folder (not inside projects). This file needs to be added to hl_cdll as well by finding its location (alongside other weapons, search for mp5.cpp for example). Right click on the folder, click "Add" and click "Existing Items" and find the ak47.cpp in the dlls folder.


Scroll down and paste this code
// Enumeration of AK-47 animations in the view model file (v_ak47.mdl)
// Must match the same order as the model itself (look through a model viewer)
enum ak47_e

// Main weapon class
class CAK47 : public CBasePlayerWeapon
    void Spawn() override;
    void Precache() override;
    // Which "slot" (column) in the HUD this weapon is located
    int iItemSlot() override { return 2; }
    bool GetItemInfo(ItemInfo* p) override;
    void PrimaryAttack() override;
    void Reload() override;
    bool Deploy() override;
    void WeaponIdle() override;
    bool UseDecrement() override
#if defined(CLIENT_WEAPONS)
        return true;
        return false;

    int m_iShell;


Paste this code
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "player.h"
#include "soundent.h"
#include "gamerules.h"
#include "UserMessages.h"

LINK_ENTITY_TO_CLASS(weapon_ak47, CAK47);

void CAK47::Spawn()
    SET_MODEL(ENT(pev), "models/w_ak47.mdl");
    m_iId = WEAPON_AK47;
    m_iDefaultAmmo = 30; // How much ammo this weapon has on spawn
    FallInit(); // get ready to fall down.

void CAK47::Precache()

    m_iShell = PRECACHE_MODEL("models/shell.mdl"); // brass shell


bool CAK47::GetItemInfo(ItemInfo* p)
    p->pszName = STRING(pev->classname);
    p->pszAmmo1 = "762"; // Which ammo type this weapon use
    p->iMaxAmmo1 = 90; // What's the max ammo quantity for that kind of ammo
    p->pszAmmo2 = NULL;
    p->iMaxAmmo2 = NULL;
    p->iMaxClip = 30; // How many ammo this weapon's clip or magazine has
    p->iSlot = 2; // Which "slot" (column) in the HUD this weapon is located (2 = same slot as HL1 MP5, shotgun, crossbow)
    p->iPosition = 3; // Which "position" (row) in the HUD this weapon is located (3 = after HL1 crossbow)
    p->iFlags = 0; // Special flags this weapon has
    p->iId = m_iId = WEAPON_AK47;
    p->iWeight = MP5_WEIGHT; // How much "priority" this weapon has when auto-switch is triggered

    return true;

bool CAK47::Deploy()
    //  The last parameter is the animation set for the player model in thirdperson to use
    return DefaultDeploy("models/v_ak47.mdl", "models/p_ak47.mdl", AK47_DRAW, "mp5");

void CAK47::PrimaryAttack()
    // don't fire underwater
    if (m_pPlayer->pev->waterlevel == 3)
        m_flNextPrimaryAttack = 0.15;

    // Don't fire if empty
    if (m_iClip <= 0)
        m_flNextPrimaryAttack = 0.15;

    // Size of the muzzle flash and how much volume in the world the firing sound produces
    m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
    m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
    m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;

    // player "shoot" animation

    Vector vecSrc = m_pPlayer->GetGunPosition();
    Vector vecAiming = m_pPlayer->GetAutoaimVector(AUTOAIM_5DEGREES);
    Vector vecDir = m_pPlayer->FireBulletsPlayer(1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, 8192, BULLET_PLAYER_MP5,
        1, 30, m_pPlayer->pev, m_pPlayer->random_seed);

    // Play view model animation and firing sound
    SendWeaponAnim(AK47_SHOOT1 + RANDOM_LONG(0, 2));
    EMIT_SOUND(edict(), CHAN_AUTO, "weapons/ak47-1.wav", 1, ATTN_NORM);

    // Eject the brass
    Vector vecShellVelocity = m_pPlayer->pev->velocity + gpGlobals->v_right * RANDOM_FLOAT(100, 200) +
        gpGlobals->v_up * RANDOM_FLOAT(100, 150) + gpGlobals->v_forward * 25;
    EjectBrass(pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_up * -12 + gpGlobals->v_forward * 20 +
        gpGlobals->v_right * -8, vecShellVelocity, pev->angles.y, m_iShell, TE_BOUNCE_SHELL);

    // Punch the camera to simulate recoil
    m_pPlayer->pev->punchangle.x -= 2;
    // Remove a bullet
    // Next time for attack and weapon idling
    m_flNextPrimaryAttack = 0.1;
    m_flTimeWeaponIdle = 0.85;

void CAK47::Reload()
    // Reload 30 bullets, play the AK47_RELOAD animation, reload duration is 2.5 seconds
    DefaultReload(30, AK47_RELOAD, 2.5);

void CAK47::WeaponIdle()

    // Not the time to idle
    if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase())

    // Play idle animation


Add WEAPON_AK47 in the same WeaponID enum.


        pWeapon = &g_Snark;
and paste
case WEAPON_AK47:
    pWeapon = &g_AK47;
below it.


Find UTIL_PrecacheOtherWeapon("weapon_hornetgun"); and paste UTIL_PrecacheOtherWeapon("weapon_ak47"); below it.

player.cpp (Optional)

This is to add ak47 to the impulse 101 cheat command. Find GiveNamedItem("weapon_hornetgun"); and paste GiveNamedItem("weapon_ak47"); below it.


Save and compile your code. It should give you a working AK-47 under the Crossbow slot.


If you want to edit some of the attributes, you can do as below.


You now have a working AK-47!


Commented 5 months ago2023-06-25 12:29:38 UTC Comment #105376
Works 100%. Thx. but my I ask you question, how can I use desert eagle sprites? I already have code for it but I can't bcz of sprites
Commented 4 months ago2023-07-16 04:08:33 UTC Comment #105403
@Draxler: What sprites? Do you mean the laser?

You must log in to post a comment. You can login or register a new account.