Snippet: CSDM Style Weapons Menu

For scripting examples for learning how to use AMXX.
User avatar
Archive-Poster
Posts: 1229
Gender:
United States of America

Snippet: CSDM Style Weapons Menu

Post by Archive-Poster »

  • Had to make this for my CTF mod as well which is now successfully released. This portion creates the menus that allow a player to select their weapon from the list and choose to be given that weapon every time they respawn. Now includes a "Random" button and automatically gives infinite ammo.

    You have to fill in the blanks:
  • WEAPON_CVAR
  • NADE_CVAR
  • hook weapon_method_menu(id) to when the player has fully spawned
  • AMXX commands amx_mod_addweap & amx_mod_removeweap are included in the code to allow your clients easy ability to remove weapons from the list.

Code: Select all

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>

//Remove the '//' on the next line for AMXX 1.76d compadability.
//#define amxx176d

//CVAR Names
#define WEAPON_CVAR "myplugin_weapons"
#define NADE_CVAR   "myplugin_nades"

//New CS Weapon Constants
#define MOD_SCOUT       1   //a
#define MOD_XM1014      2   //b
#define MOD_MAC10       4   //c
#define MOD_AUG         8   //d
#define MOD_UMP45       16  //e
#define MOD_SG550       32  //f
#define MOD_GALIL       64  //g
#define MOD_FAMAS       128 //h
#define MOD_AWP         256 //i
#define MOD_MP5NAVY     512 //j
#define MOD_M249        1024    //k
#define MOD_M3          2048    //l
#define MOD_M4A1        4096    //m
#define MOD_TMP         8192    //n
#define MOD_G3SG1       16384   //o
#define MOD_SG552       32768   //p
#define MOD_AK47        65536   //q
#define MOD_P90         131072  //r
#define MOD_P228        262144  //s
#define MOD_ELITE       524288  //t
#define MOD_FIVESEVEN       1048576 //u
#define MOD_USP         2097152 //v
#define MOD_GLOCK18     4194304 //w
#define MOD_DEAGLE      8388608 //x
#define MOD_VEST        16777216//y
#define MOD_VESTHELM        33554432//z

static const weapon_names[26][16] = 
{
    "Scout",
    "XM1014",
    "Mac10",
    "Aug",
    "UMP",
    "SG550",
    "Galil",
    "Famas",
    "AWP",
    "MP5Navy",
    "M249",
    "M3",
    "M4A1",
    "TMP",
    "G3SG1",
    "SG552",
    "AK47",
    "P90",
    "P228",
    "Elite",
    "Fiveseven",
    "USP",
    "Glock18",
    "Deagle",
    "VEST",
    "VESTHELM"
}

new allowableweapons, nades
new bool:firsttime[33]
new bool:ask[33]
new weapon_picked[2][33]
new cur_offset[33]
new options_on_menu[8][33]

public plugin_init()
{
    //


    register_clcmd("say guns","cmd_guns")
    register_clcmd("say_team guns","cmd_guns")
    register_concmd("amx_mod_addweap","cmd_addweap",ADMIN_BAN,"<Weapon> Un-Restricts a weapon from the weapons menu.")
    register_concmd("amx_mod_removeweap","cmd_delweap",ADMIN_BAN,"<Weapon> Restricts a weapon from the weapons menu.")
    register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
    register_menucmd(register_menuid("PrimaryWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9),"prim_weapons_pushed")
    register_menucmd(register_menuid("SecWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7),"sec_weapons_pushed")
#if defined amxx176d
    register_cvar(WEAPON_CVAR,"abcdefghijklmnopqrstuvwxyz")
#else
    allowableweapons = register_cvar(WEAPON_CVAR,"abcdefghijklmnopqrstuvwxyz")
#endif
#if defined amxx176d
    register_cvar(NADE_CVAR,"hhff")
#else
    nades = register_cvar(NADE_CVAR,"hhff")
#endif
}

//Call this on player spawn
public weapon_method_menu(id)
{
    if(is_user_bot(id))
    {
        weapon_picked[0][id] = 16
        weapon_picked[1][id] = 23
        give_weapons(id)
    }
    else if(firsttime[id])
    {
        firsttime[id] = false
        prim_weapons_menu(id,0)
    }
    else
    {
        cur_offset[id] = 0
        if(ask[id])
        {
            show_menu(id,(1<<0)|(1<<1)|(1<<2),"Weapon Selection Method^n^n1. Last Guns^n2. Last Guns + Save^n3. New Guns",-1,"WeaponMethodMenu")
        }
        else
        {
            give_weapons(id)
        }
    }
}

public weapon_method_pushed(id,key)
{
    switch(key)
    {
        case 0:
        {
            ask[id] = true
            give_weapons(id)
        }
        case 1:
        {
            client_print(id,print_chat,"[AMXX] Type guns to re-activate the gun menu.")
            ask[id] = false
            give_weapons(id)
        }
        case 2:
        {
            ask[id] = true
            prim_weapons_menu(id,0)
        }
    }

    return ;
}

public prim_weapons_menu(id,offset)
{
    if(offset<0) offset = 0

    new cvar_value[32]
#if defined amxx176d
    get_cvar_string(WEAPON_CVAR,cvar_value,31)
#else
    get_pcvar_string(allowableweapons,cvar_value,31)
#endif
    new flags = read_flags(cvar_value)

    new keys, curnum, menu[2048]
    for(new i=offset;i<19;i++)
    {
        if(i==18)
        {
            options_on_menu[curnum][id] = 24
            keys += (1<<curnum)
            curnum++
            format(menu,2047,"%s^n%d. Random",menu,curnum)
            break;
        }
        else if(flags & power(2,i))
        {
            options_on_menu[curnum][id] = i
            keys += (1<<curnum)

            curnum++
            format(menu,2047,"%s^n%d. %s",menu,curnum,weapon_names[i])

            if(curnum==8)
                break;
        }
    }

    format(menu,2047,"\ySelect Primary Weapon:\w^n^n%s^n",menu)
    if(curnum==8 && offset<12)
    {
        keys += (1<<8)
        format(menu,2047,"%s^n9. Next",menu)
    }
    if(offset)
    {
        keys += (1<<9)
        format(menu,2047,"%s^n0. Back",menu)
    }

    show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
}

public prim_weapons_pushed(id,key)
{
    if(key<8)
    {
        weapon_picked[0][id] = options_on_menu[key][id]
        cur_offset[id] = 0
        sec_weapons_menu(id,0)
    }
    else
    {
        if(key==8)
            cur_offset[id] += 8
        if(key==9)
            cur_offset[id] -= 8
        prim_weapons_menu(id,cur_offset[id])
    }

    return ;
}

public sec_weapons_menu(id,offset)
{
    if(offset<0) offset = 0

    new cvar_value[32]
#if defined amxx176d
    get_cvar_string(WEAPON_CVAR,cvar_value,31)
#else
    get_pcvar_string(allowableweapons,cvar_value,31)
#endif
    new flags = read_flags(cvar_value)

    new keys, curnum, menu[2048]
    for(new i=18;i<24;i++)
    {
        if(flags & power(2,i))
        {
            options_on_menu[curnum][id] = i
            keys += (1<<curnum)

            curnum++
            format(menu,2047,"%s^n%d. %s",menu,curnum,weapon_names[i])
        }
    }
    options_on_menu[curnum][id] = 25
    keys += (1<<curnum)
    curnum++
    format(menu,2047,"%s^n%d. Random",menu,curnum)

    format(menu,2047,"\ySelect Secondary Weapon:\w^n^n%s",menu)

    show_menu(id,keys,menu,-1,"SecWeaponSelect")
}

public sec_weapons_pushed(id,key)
{
    if(key<8)
    {
        weapon_picked[1][id] = options_on_menu[key][id]
    }

    give_weapons(id)

    return ;
}

public give_weapons(id)
{
    strip_user_weapons(id)

    give_item(id,"weapon_knife")

    new weapon[32]
    new csw = csw_contant(weapon_picked[0][id])
    get_weaponname(csw,weapon,31)
    give_item(id,weapon)
    cs_set_user_bpammo(id,csw,999)

    csw = csw_contant(weapon_picked[1][id])
    get_weaponname(csw,weapon,31)
    give_item(id,weapon)
    cs_set_user_bpammo(id,csw,999)

#if defined amxx176d
    get_cvar_string(NADE_CVAR,weapon,31)
#else
    get_pcvar_string(nades,weapon,31)
#endif
    new he, flash, smoke
    for(new i=0;i<strlen(weapon);i++)
    {
        switch(weapon[i])
        {
            case 'h': he++
            case 'f': flash++
            case 's': smoke++
        }
    }

    if(he) give_item(id,"weapon_hegrenade"), cs_set_user_bpammo(id,CSW_HEGRENADE,he)
    if(flash) give_item(id,"weapon_flashbang"), cs_set_user_bpammo(id,CSW_FLASHBANG,flash)
    if(smoke) give_item(id,"weapon_smokegrenade"), cs_set_user_bpammo(id,CSW_SMOKEGRENADE,smoke)

#if defined amxx176d
    get_cvar_string(WEAPON_CVAR,weapon,31)
#else
    get_pcvar_string(allowableweapons,weapon,31)
#endif
    new flags = read_flags(weapon)
    if(flags & MOD_VESTHELM) cs_set_user_armor(id,100,CS_ARMOR_VESTHELM)
    else if(flags & MOD_VEST) cs_set_user_armor(id,100,CS_ARMOR_KEVLAR)
}

public csw_contant(weapon)
{
    new num = 29
    switch(weapon)
    {
        case 0: num = 3
        case 1: num = 5
        case 2: num = 7
        case 3: num = 8
        case 4: num = 12
        case 5: num = 13
        case 6: num = 14
        case 7: num = 15
        case 8: num = 18
        case 9: num = 19
        case 10: num = 20
        case 11: num = 21
        case 12: num = 22
        case 13: num = 23
        case 14: num = 24
        case 15: num = 27
        case 16: num = 28
        case 17: num = 30
        case 18: num = 1
        case 19: num = 10
        case 20: num = 11
        case 21: num = 16
        case 22: num = 17
        case 23: num = 26
        case 24:
        {
            new s_weapon[32]
#if defined amxx176d
            get_cvar_string(WEAPON_CVAR,s_weapon,31)
#else
            get_pcvar_string(allowableweapons,s_weapon,31)
#endif
            new flags = read_flags(s_weapon)
            do
            {
                num = random_num(0,18)
                if(!(num & flags))
                {
                    num = -1
                }
            }
            while(num==-1)
            num = csw_contant(num)
        }
        case 25:
        {
            new s_weapon[32]
#if defined amxx176d
            get_cvar_string(WEAPON_CVAR,s_weapon,31)
#else
            get_pcvar_string(allowableweapons,s_weapon,31)
#endif
            new flags = read_flags(s_weapon)
            do
            {
                num = random_num(18,23)
                if(!(num & flags))
                {
                    num = -1
                }
            }
            while(num==-1)
            num = csw_contant(num)
        }
    }
    return num;
}

public cmd_guns(id)
{
    ask[id] = true
    weapon_method_menu(id)
}


public cmd_delweap(id,level,cid)
{
    if(!cmd_access(id,level,cid,2))
    {
        return PLUGIN_HANDLED
    }

    new arg[32]
    read_argv(1,arg,31)

    new cvar_value[32]
#if defined amxx176d
    get_cvar_string(WEAPON_CVAR,cvar_value,31)
#else
    get_pcvar_string(allowableweapons,cvar_value,31)
#endif

    new flags = read_flags(cvar_value)
    for(new i=0;i<26;i++)
    {
        if(equali(arg,weapon_names[i]))
        {
            new remove_flag = power(2,i)
            if(flags & remove_flag)
            {
                console_print(id,"[AMXX] Removing weapon %s from the choice list.",weapon_names[i])
                flags -= remove_flag
                get_flags(flags,cvar_value,31)
                set_cvar_string(WEAPON_CVAR,cvar_value)
            }
            else
            {
                console_print(id,"[AMXX] Weapon %s is already off choice list.",weapon_names[i])
                
            }

            break;
        }
    }

    return PLUGIN_HANDLED
}

public cmd_addweap(id,level,cid)
{
    if(!cmd_access(id,level,cid,2))
    {
        return PLUGIN_HANDLED
    }

    new arg[32]
    read_argv(1,arg,31)

    new cvar_value[32]
#if defined amxx176d
    get_cvar_string(WEAPON_CVAR,cvar_value,31)
#else
    get_pcvar_string(allowableweapons,cvar_value,31)
#endif

    for(new i=0;i<26;i++)
    {
        if(equali(arg,weapon_names[i]))
        {
            new flags = read_flags(cvar_value)
            new add_flag = power(2,i)
            if(!(flags & add_flag))
            {
                console_print(id,"[AMXX] Adding weapon %s to the choice list.",weapon_names[i])
                flags += add_flag
                get_flags(flags,cvar_value,31)
                set_cvar_string(WEAPON_CVAR,cvar_value)
            }
            else
            {
                console_print(id,"[AMXX] Weapon %s is already on choice list.",weapon_names[i])
                
            }

            break;
        }
    }

    return PLUGIN_HANDLED
}
User avatar
Archive-Poster
Posts: 1229
Gender:
United States of America

Re: Snippet: CSDM Style Weapons Menu

Post by Archive-Poster »

maybe better do

Code: Select all

#if defined amxx176d
    register_cvar(WEAPON_CVAR,"abcdefghijklmnopqrstuvwxyz")
#else
    allowableweapons = register_cvar(WEAPON_CVAR,"abcdefghijklmnopqrstuvwxyz")
#endif
#if defined amxx176d
    register_cvar(NADE_CVAR,"hhff")
#else
    nades = register_cvar(NADE_CVAR,"hhff")
#endif 
-->

Code: Select all

#if defined amxx176d
    register_cvar(WEAPON_CVAR,"abcdefghijklmnopqrstuvwxyz")
    register_cvar(NADE_CVAR,"hhff")
#else
    allowableweapons = register_cvar(WEAPON_CVAR,"abcdefghijklmnopqrstuvwxyz")
    nades = register_cvar(NADE_CVAR,"hhff")
#endif
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest