Русское сообщество по скриптингу

csdm lite из за него не выдаются гранаты

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

csdm lite из за него не выдаются гранаты

Сообщение Don Corleone » 26 авг 2017, 19:07

Здравствуйте, нужна ваша помощь, из за csdm lite, другим плагином гранаты выдаются, но их нельзя взять, в коде искал и что то не нашел из за чего нельзя взять гранаты, помогите, благодарю)

Код: Выделить всё
#define SPAWN_WAIT_TIME 4.0    //in sec
#define PROTECTION_TIME 2.0    //in sec
new g_active = true     // "true|false" enabled|disabled 
//======================= CONFIG END ========================//


#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
 
#define SetFlagConnected(%1)    g_bConnected |= 1<<(%1 & 31)
#define ClearFlagConnected(%1)    g_bConnected &= ~( 1<<(%1 & 31))
#define IsUserConnected(%1)        (g_bConnected &  1<<(%1 & 31))

#define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
#define get_user_active_weapon(%1)    get_pdata_cbase(%1, m_pActiveItem, XO_PLAYER)

#define IsPlayer(%1)    ( 1 <= %1 <= g_iMaxPlayers )
#define TASK_RESPAWN 6488
#define MAX_PLAYERS    32
#define MAX_SPAWNS    128

// offsets
#if cellbits == 32
    const m_iAccount = 115
#else
    const m_iAccount = 140
#endif
const m_iHideHUD = 361
const m_pActiveItem 
= 373 
const XO_PLAYER 
= 5

const HIDE_TIMER 
= 1<<4
const HIDE_MONEY 
= 1<<5
const PDATA_SAFE 
= 2

new g_Protected
[MAX_PLAYERS+1]
new g_bSave[MAX_PLAYERS+1]
new g_ipPreviousWeapons[MAX_PLAYERS+1]
new g_isPreviousWeapons[MAX_PLAYERS+1]
new bool:g_isBot[MAX_PLAYERS+1]
new bool:g_bAlive[MAX_PLAYERS+1]
new Float:spawns[MAX_SPAWNS][9]
new Array:g_PrimaryWeapons, Array:g_SecondaryWeapons
new g_bConnected
, g_iMaxPlayers, roundEnded
new g_spawn_random
, spawnCount, csdmSpawnCount
new g_SpawnMenu
, g_pWeaponMenu, g_sWeaponMenu
new g_iFMSetModel
, HamHook:g_iFwdPlayerSpawn
new g_msgMoney
, g_msgCorpse, g_msgDeath

const NOCLIP_WPN_BS 
= ((1<<CSW_HEGRENADE)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_KNIFE)|(1<<CSW_C4)) 

const PRIMARY_WEAPONS_BIT_SUM 
= 1<<CSW_SCOUT|1<<CSW_XM1014|1<<CSW_MAC10|1<<CSW_AUG|1<<CSW_UMP45
    
|1<<CSW_SG550|1<<CSW_GALIL|1<<CSW_FAMAS|1<<CSW_AWP|1<<CSW_MP5NAVY|1<<CSW_M249|1<<CSW_M3
    
|1<<CSW_M4A1|1<<CSW_TMP|1<<CSW_G3SG1|1<<CSW_SG552|1<<CSW_AK47|1<<CSW_P90

const SECONDARY_WEAPONS_BIT_SUM 
= 1<<CSW_P228|1<<CSW_ELITE|1<<CSW_FIVESEVEN|1<<CSW_USP|1<<CSW_GLOCK18|1<<CSW_DEAGLE

new const g_iMaxClip
[CSW_P90+1] = { -1, 13, -1, 10, 1, 7, 1, 30, 30, 1, 30, 20, 25, 30,
    35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50
}

new g_WeaponSlots[] = { 0, 2, 0, 1, 4, 1, 5, 1, 1, 4, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 3, 1
}

enum _:CHOICES {
    OPTION_NONE, 
    OPTION_NEW
, 
    OPTION_OLD
, 
    OPTION_SAVE
}

new const g_szOptions[CHOICES][] =
{
    "None", "Выбрать оружие", "Пред. выбор", "2 + Не показывать меню больше"
}


public plugin_init()
{
    register_plugin("CSDM Lite", "0.0.1b", "Vaqtincha")

    init_spawns()
    CreateWeaponsArray()
    g_iMaxPlayers = get_maxplayers()

    g_spawn_random = register_cvar("spawn_random", "1")
    register_concmd("csdm_enable", "cmdset", ADMIN_CFG)
    
    register_clcmd
("joinclass", "cmd_JoinClass")
    register_clcmd("buyequip", "block_buy")
    register_clcmd("buy", "block_buy")
    register_clcmd("say /guns", "cmdGuns")
    register_clcmd("say guns", "cmdGuns")
    register_clcmd("say_team /guns", "cmdGuns")
    register_clcmd("say_team guns", "cmdGuns")
    
    register_menucmd
(register_menuid("Terrorist_Select",1),511,"cmd_JoinClass") // old menus
    register_menucmd(register_menuid("CT_Select",1),511,"cmd_JoinClass") // old menus
    
    register_event
("ResetHUD", "onResetHUD", "b")
    register_event("HLTV","Event_NewRound","a","1=0","2=0")
    register_event("TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing" )
    register_event("StatusIcon", "event_buyzone_icon", "b", "2=buyzone")
    register_logevent("logevent_round_end",2,"1=Round_End")
    
    g_msgCorpse 
= register_message(get_user_msgid("ClCorpse"),"message_clcorpse")
    g_msgMoney = register_message(get_user_msgid("Money"),"message_money")
    g_msgDeath = register_message(get_user_msgid("DeathMsg"),"message_death")
    
    g_SpawnMenu 
= menu_create("Меню оружия", "HandleSpawnMenu")
    new szNum[3]

    for(new i = 1; i < sizeof(g_szOptions); i++)
    {
        num_to_str(i, szNum, charsmax(szNum));
        menu_additem(g_SpawnMenu, g_szOptions[i], szNum, 0)
    }
    menu_setprop(g_SpawnMenu , MPROP_EXIT , MEXIT_NEVER)
    
    EnableHamForward
(g_iFwdPlayerSpawn = RegisterHam(Ham_Spawn, "player", "Player_Spawn_Post", 1))
    g_iFMSetModel = register_forward(FM_SetModel, "SetModelPre", 0 )
}

public cmdset(id, level)
{
    if(!(get_user_flags(id) & level))
    {
        return PLUGIN_HANDLED
    
}
    
    new arg
[8]
    read_argv(1, arg, charsmax(arg))
    
    if
((equali(arg, "on")) || (equali(arg, "1")))
    {
        if(g_active)
        {
            PrintChat(id, "^4[CSDM] ^1DeathMatch Mode Already ENABLED.")
            return PLUGIN_HANDLED
        
}
        g_active = true
        g_iFMSetModel 
= register_forward(FM_SetModel, "SetModelPre", 0 )
        g_msgMoney = register_message(get_user_msgid("Money"), "message_money")
        g_msgCorpse = register_message(get_user_msgid("ClCorpse"),"message_clcorpse")
        g_msgDeath = register_message(get_user_msgid("DeathMsg"),"message_death")
        EnableHamForward(g_iFwdPlayerSpawn)
        PrintChat(id, "^4[CSDM] ^1DeathMatch Mode ENABLED.")
        server_cmd("sv_restartround 1")
    }
    if((equali(arg, "off")) || (equali(arg, "0")))
    {
        if(!g_active)
        {
            PrintChat(id, "^4[CSDM] ^1DeathMatch Mode Not ENABLED.")
            return PLUGIN_HANDLED
        
}
        g_active = false
        unregister_forward
(FM_SetModel, g_iFMSetModel, 0)
        unregister_message(get_user_msgid("Money"), g_msgMoney)
        unregister_message(get_user_msgid("ClCorpse"), g_msgCorpse)
        unregister_message(get_user_msgid("DeathMsg"), g_msgDeath)
        DisableHamForward(g_iFwdPlayerSpawn)
        PrintChat(id, "^4[CSDM] ^1DeathMatch Mode DISABLED.")
        server_cmd("sv_restartround 1")
    }
    return PLUGIN_HANDLED
}

public client_putinserver(id)
{
    g_ipPreviousWeapons[id] = 0
    g_isPreviousWeapons
[id] = 0
    g_Protected
[id] = 0
    g_bSave
[id] = false
    g_bAlive
[id] = false
    
    if
(is_user_bot(id))
    {
        respawn(id)
        g_isBot[id] = true
    
}
    
    if
(!is_user_hltv(id))
        SetFlagConnected(id)
    
    if
( pev_valid(id) == PDATA_SAFE && g_active)
    {
        set_pdata_int( id, m_iHideHUD, get_pdata_int(id, m_iHideHUD ) |HIDE_MONEY|HIDE_TIMER)
    }
}

public client_disconnect(id)
{
    if(g_Protected[id])
    {
        remove_task(g_Protected[id])
        g_Protected[id] = 0
    
}
    if(task_exists(TASK_RESPAWN+id))
    {
        remove_task(TASK_RESPAWN+id)
    }
    g_isBot[id] = false
    ClearFlagConnected
(id)
}

public logevent_round_end() roundEnded = 1
public Event_NewRound
() roundEnded = 0
public Event_NewGame
()
{
    new iPlayers[32], iNum, id
    get_players
(iPlayers, iNum )
    for ( --iNum; iNum >= 0; --iNum )
    {
        id = iPlayers[iNum]
        if(g_Protected[id])
        {
            remove_task(g_Protected[id])
            g_Protected[id] = 0
            fm_set_rendering
(id)
        }
        if(task_exists(TASK_RESPAWN+id))
        {
            remove_task(TASK_RESPAWN+id)
        }
    }
}

public onResetHUD(id)
{
    if(g_active)
    {
        set_pdata_int(id, m_iHideHUD, get_pdata_int(id, m_iHideHUD ) |HIDE_MONEY|HIDE_TIMER)
    }
}

public Player_Spawn_Post(id)
{
    if(g_active)
    {
        set_task(0.1, "spawn_showmenu", id)
    }
    g_bAlive[id] = bool:is_user_alive(id)
}

public message_death(msg_id, msg_dest, msg_entity) 
{
    if(!g_active || roundEnded)
        return
    
    new killer 
= get_msg_arg_int(1)
    new victim = get_msg_arg_int(2)
    
    g_bAlive
[victim] = false
    set_task
(0.1, "delayrespawn", victim)
    
    if
(IsPlayer(killer) && victim != killer 
    
&& g_bAlive[killer] && !g_isBot[killer])
    {
        new iActiveWeapon = get_user_active_weapon(killer)
        if(iActiveWeapon > 0)
        {
            new iId = cs_get_weapon_id(iActiveWeapon)
            if(!(NOCLIP_WPN_BS & (1<<iId)))
            {
                cs_set_weapon_ammo(iActiveWeapon, g_iMaxClip[iId])
                client_cmd(killer, "spk ^"items/9mmclip1.wav^"")
            }
        }
    }
}

public spawn_showmenu(id)
{
    if(g_bAlive[id] && g_active)
    {
        strip_weapons(id, 0)
        ham_give_weapon(id, "weapon_knife")
        if(!g_isBot[id])
        {
            if(g_bSave[id])
            {
                PreviousWeapons(id)
            }else{
                menu_display(id, g_SpawnMenu)
                }
        }else{
            new iPrimaryWeapon = random_num(0, ArraySize(g_PrimaryWeapons)-1);
            new iSecondaryWeapon = random_num(0, ArraySize(g_SecondaryWeapons)-1);                
            for
(new i=0; i< 2; i++)
            {
                new WeaponName[32], szArrayData[32]
                if(== 0)
                {
                    ArrayGetString(g_PrimaryWeapons, iPrimaryWeapon, szArrayData, charsmax(szArrayData))
                }else{
                    ArrayGetString(g_SecondaryWeapons, iSecondaryWeapon, szArrayData, charsmax(szArrayData))
                }
                replace_all(szArrayData, charsmax(szArrayData), " ", "")
                format(WeaponName, charsmax(WeaponName), "weapon_%s", szArrayData)
                strtolower(WeaponName)
                ham_give_weapon(id, WeaponName)
            }
        }
    }
}

public CreateWeaponsArray()
{
    new g_szWepFile[256], g_FilePointer
    get_localinfo
("amxx_configsdir", g_szWepFile, charsmax(g_szWepFile))
    
    format
(g_szWepFile, charsmax(g_szWepFile), "%s/csdm_weapons.ini", g_szWepFile); //formats the file name for the Weapons order INI
    g_FilePointer = fopen(g_szWepFile, "r")
    
    g_PrimaryWeapons 
= ArrayCreate(15)
    g_SecondaryWeapons = ArrayCreate(15)
    
    g_pWeaponMenu 
= menu_create("Основное оружие", "HandlePrimaryWeapons"); //Creates the Primary Weapon Menu
    g_sWeaponMenu = menu_create("Вспомогательное оружие", "HandleSecondaryWeapons"); //Creates the Secondary Weapon Menu
    
    new szData
[32], szWeaponName[32], szpNum[3], szsNum[3];
    new pCounter, sCounter
    if
(g_FilePointer)
    {
        while(!feof(g_FilePointer))
        {
            fgets(g_FilePointer, szData, charsmax(szData))
            trim(szData)
            if(containi(szData, ";") != -1)
                continue

            copy
(szWeaponName, charsmax(szWeaponName), szData)
            replace_all(szWeaponName, charsmax(szWeaponName), " ", "")
            format(szWeaponName, charsmax(szWeaponName), "weapon_%s", szWeaponName)
            strtolower(szWeaponName)
            new iWeaponID = get_weaponid(szWeaponName)
            
            switch
(g_WeaponSlots[iWeaponID])
            {
                case 1: 
                
{
                    ArrayPushString(g_PrimaryWeapons, szData)
                    num_to_str(pCounter, szpNum, charsmax(szpNum))
                    menu_additem(g_pWeaponMenu, szData, szpNum, 0)
                    ++pCounter
                
}
                case 2:
                {
                    ArrayPushString(g_SecondaryWeapons, szData)
                    num_to_str(sCounter, szsNum, charsmax(szsNum))
                    menu_additem(g_sWeaponMenu, szData, szsNum, 0)
                    ++sCounter
                
}
            }
        }
    }
    else
    
{
        set_fail_state("Failed to Open Weapons List")
    }
    
    menu_setprop
(g_pWeaponMenu , MPROP_EXIT , MEXIT_NEVER)
    menu_setprop(g_sWeaponMenu , MPROP_EXIT , MEXIT_NEVER)
    
    fclose
(g_FilePointer)
}

public HandleSpawnMenu(id, iMenu, iItem)
{
    new szKey[3], Dummy
    menu_item_getinfo
(iMenu, iItem, Dummy, szKey, 2, "", 0, Dummy)
    
    switch
(str_to_num(szKey))
    {
        case OPTION_NEW:
        {
            menu_display(id, g_pWeaponMenu)
        }
        case OPTION_OLD:
        {    
            PreviousWeapons
(id)
        }
        case OPTION_SAVE:
        {
            PreviousWeapons(id)
            g_bSave[id] = true
            PrintChat
(id, "^4[CSDM] ^1say /guns to re-enable the gun menu.")
        }
    }
    return PLUGIN_CONTINUE
}

public HandlePrimaryWeapons(id, iMenu, iItem)
{
    if(!g_bAlive[id] || !g_active)
        return
    
    new szKey
[3], iSelectedWeapon, Dummy
    menu_item_getinfo
(iMenu, iItem, Dummy, szKey, 2, "", 0, Dummy)
    
    iSelectedWeapon 
= str_to_num(szKey)
    g_ipPreviousWeapons[id] = iSelectedWeapon
    
    new WeaponName
[32], szArrayData[32]
    ArrayGetString(g_PrimaryWeapons, iSelectedWeapon, szArrayData, charsmax(szArrayData))
    replace_all(szArrayData, charsmax(szArrayData), " ", "")
    format(WeaponName, charsmax(WeaponName), "weapon_%s", szArrayData)
    strtolower(WeaponName)
    strip_weapons(id, 1)
    ham_give_weapon(id, WeaponName)
    menu_display(id, g_sWeaponMenu)
}

public HandleSecondaryWeapons(id, iMenu, iItem)
{
    if(!g_bAlive[id] || !g_active)
        return
    
    new szKey
[3], iSelectedWeapon, Dummy
    menu_item_getinfo
(iMenu, iItem, Dummy, szKey, 2, "", 0, Dummy)
    
    iSelectedWeapon 
= str_to_num(szKey)
    g_isPreviousWeapons[id] = iSelectedWeapon
    
    new WeaponName
[32], szArrayData[32]
    ArrayGetString(g_SecondaryWeapons, iSelectedWeapon, szArrayData, charsmax(szArrayData))
    replace_all(szArrayData, charsmax(szArrayData), " ", "")
    format(WeaponName, charsmax(WeaponName), "weapon_%s", szArrayData)
    strtolower(WeaponName)
    strip_weapons(id, 2)
    ham_give_weapon(id, WeaponName)
}

public PreviousWeapons(id)
{
    if(!g_bAlive[id] || !g_active)
        return
    
    new szpData
[32], szsData[32];
    ArrayGetString(g_PrimaryWeapons, g_ipPreviousWeapons[id], szpData, charsmax(szpData))
    ArrayGetString(g_SecondaryWeapons, g_isPreviousWeapons[id], szsData, charsmax(szsData))
    strtolower(szpData)
    strtolower(szsData)
    replace_all(szsData, charsmax(szsData), " ", "")
    replace_all(szpData, charsmax(szpData), " ", "")
    format(szsData, charsmax(szsData), "weapon_%s", szsData)
    format(szpData, charsmax(szpData), "weapon_%s", szpData)
    strip_weapons(id, 1)
    ham_give_weapon(id, szpData)
    strip_weapons(id, 2)
    ham_give_weapon(id, szsData)
}

public SetModelPre( const ent, const model[]) 
{
    if(!pev_valid(ent) || !g_active)
        return FMRES_IGNORED

    static const szWpnboxClass
[] = "weaponbox"
    static szClassName[10]
    
    pev
(ent, pev_classname, szClassName, charsmax(szClassName))
    
    if
( !strcmp( szClassName, szWpnboxClass ))
    {
        set_pev(ent, pev_flags, FL_KILLME)
    }
    
    return FMRES_IGNORED
}

public message_clcorpse(msg_id, msg_dest, msg_entity)
{
    return g_active ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public message_money(msg_id, msg_dest, msg_entity)
{
    if(!g_active || !IsUserConnected(msg_entity))
        return PLUGIN_CONTINUE

    set_msg_arg_int
(1,ARG_LONG,0) // money
    set_msg_arg_int(2,ARG_BYTE,0) // flash
    
    set_pdata_int
(msg_entity, m_iAccount, 0, XO_PLAYER)
    
    return PLUGIN_CONTINUE
}

public event_buyzone_icon(id)
{
    if(g_active)
    {
        message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id)
        write_byte(0)
        write_string("buyzone")
        write_byte(0)
        write_byte(255)
        write_byte(0)
        message_end()
    }
}

public block_buy(id)
{
    return g_active ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public cmd_JoinClass(id)
{
    if(g_active)
        delayrespawn(id)
}

public cmdGuns(id)
{
    if(g_active && g_bSave[id])
    {
        g_bSave[id] = false
        PrintChat
(id, "^4[CSDM] ^1Gun menu will be re-enabled next spawn.")
    }
}

//*******************************************************************

public delayrespawn(id)
{
    if(!g_active || !on_valid_team(id) 
    
|| roundEnded || task_exists(TASK_RESPAWN+id))
        return
    
    set_task
(SPAWN_WAIT_TIME, "respawn", TASK_RESPAWN+id)
}

public respawn(taskid)
{
    new id = taskid-TASK_RESPAWN
    
    if
(!g_active || !IsUserConnected(id) || roundEnded || g_bAlive[id])
        return

    ExecuteHamB
(Ham_CS_RoundRespawn, id)
    if(get_pcvar_num(g_spawn_random))
    {
        do_random_spawn(id)
    }
    SetProtection(id)
}

SetProtection(id)
{
    if(g_Protected[id] || !IsUserConnected(id))
        remove_task(g_Protected[id])

    set_task(PROTECTION_TIME, "ProtectionOver", id)
    g_Protected[id] = id
    
    switch
( get_user_team(id))
    {
        case 1: fm_set_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 1)
        case 2: fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 1)
    }
    set_pev(id, pev_takedamage, 0.0)
}

public ProtectionOver(id)
{
    g_Protected[id] = 0
    
    if 
(!IsUserConnected(id))
        return
    
    fm_set_rendering
(id)
    set_pev(id, pev_takedamage, 2.0)
}

// place a user at a random spawn
do_random_spawn(id)
{
    // not even alive, don't bother
    if(!g_bAlive[id]) return

    
// no spawns???
    if(spawnCount <= 0 || !csdmSpawnCount) return

    static Float
:vecHolder[3]
    new sp_index = random_num(0,spawnCount-1)

    // get origin for comparisons
    vecHolder[0] = spawns[sp_index][0];
    vecHolder[1] = spawns[sp_index][1];
    vecHolder[2] = spawns[sp_index][2];

    // this one is taken
    if(!is_hull_vacant(vecHolder,HULL_HUMAN) && spawnCount > 1)
    {
        // attempt to pick another random one up to three times
        new i;
        for(i=0;i<3;i++)
        {
            sp_index = random_num(0,spawnCount-1);

            vecHolder[0] = spawns[sp_index][0];
            vecHolder[1] = spawns[sp_index][1];
            vecHolder[2] = spawns[sp_index][2];
            
            if
(is_hull_vacant(vecHolder,HULL_HUMAN)) break;
        }

        // we made it through the entire loop, no free spaces
        if(== 3)
        {
            // just find the first available
            for(i=sp_index+1;i!=sp_index;i++)
            {
                // start over when we reach the end
                if(>= spawnCount) i = 0;

                vecHolder[0] = spawns[i][0];
                vecHolder[1] = spawns[i][1];
                vecHolder[2] = spawns[i][2];

                // free space! office space!
                if(is_hull_vacant(vecHolder,HULL_HUMAN))
                {
                    sp_index = i;
                    break;
                }
            }
        }
    }

    // origin
    vecHolder[0] = spawns[sp_index][0];
    vecHolder[1] = spawns[sp_index][1];
    vecHolder[2] = spawns[sp_index][2];
    engfunc(EngFunc_SetOrigin,id,vecHolder);

    // angles
    vecHolder[0] = spawns[sp_index][3];
    vecHolder[1] = spawns[sp_index][4];
    vecHolder[2] = spawns[sp_index][5];
    set_pev(id,pev_angles,vecHolder);

    // vangles
    vecHolder[0] = spawns[sp_index][6];
    vecHolder[1] = spawns[sp_index][7];
    vecHolder[2] = spawns[sp_index][8];
    set_pev(id,pev_v_angle,vecHolder);

    set_pev(id,pev_fixangle,1);
}

// get all of our spawns into their arrays
init_spawns()
{
    // grab CSDM file
    new mapName[32], csdmFile[64], lineData[64],cfgDir[32];

    get_localinfo("amxx_configsdir", cfgDir, charsmax(cfgDir))
    get_mapname(mapName,charsmax(mapName));
    formatex(csdmFile, charsmax(csdmFile),"%s/csdm/%s.spawns.cfg",cfgDir,mapName);

    // collect CSDM spawns
    if(file_exists(csdmFile))
    {
        new csdmData[10][6];

        new file = fopen(csdmFile,"rt");
        while(file && !feof(file))
        {
            fgets(file,lineData,charsmax(lineData));

            // invalid spawn
            if(!lineData[0] || str_count(lineData,' ') < 2)
                continue;

            // BREAK IT UP!
            parse(lineData,csdmData[0],5,csdmData[1],5,csdmData[2],5,csdmData[3],5,csdmData[4],5,csdmData[5],5,csdmData[6],5,csdmData[7],5,csdmData[8],5,csdmData[9],5);

            // origin
            spawns[spawnCount][0] = floatstr(csdmData[0]);
            spawns[spawnCount][1] = floatstr(csdmData[1]);
            spawns[spawnCount][2] = floatstr(csdmData[2]);

            // angles
            spawns[spawnCount][3] = floatstr(csdmData[3]);
            spawns[spawnCount][4] = floatstr(csdmData[4]);
            spawns[spawnCount][5] = floatstr(csdmData[5]);

            // team, csdmData[6], unused

            // vangles
            spawns[spawnCount][6] = floatstr(csdmData[7]);
            spawns[spawnCount][7] = floatstr(csdmData[8]);
            spawns[spawnCount][8] = floatstr(csdmData[9]);

            spawnCount++;
            csdmSpawnCount++;
            if(spawnCount >= MAX_SPAWNS) break;
        }
        if(file) fclose(file);
    }
    // collect regular, boring spawns
    else
    
{
        collect_spawns("info_player_deathmatch");
        collect_spawns("info_player_start");
    }
}

// collect boring spawns into our spawn data
collect_spawns(classname[])
{
    new ent = g_iMaxPlayers, Float:spawnData[3];
    while((ent = fm_find_ent_by_class(ent, classname)))
    {
        // origin
        pev(ent,pev_origin,spawnData);
        spawns[spawnCount][0] = spawnData[0];
        spawns[spawnCount][1] = spawnData[1];
        spawns[spawnCount][2] = spawnData[2];

        // angles
        pev(ent,pev_angles,spawnData);
        spawns[spawnCount][3] = spawnData[0];
        spawns[spawnCount][4] = spawnData[1];
        spawns[spawnCount][5] = spawnData[2];

        // vangles
        spawns[spawnCount][6] = spawnData[0];
        spawns[spawnCount][7] = spawnData[1];
        spawns[spawnCount][8] = spawnData[2];

        spawnCount++;
        if(spawnCount >= MAX_SPAWNS) break;
    }
}

stock str_count(str[], searchchar)
{
    new i = 0;
    new maxlen = strlen(str);
    new count = 0;
    
    for
(i=0;i<=maxlen;i++)
    {
        if(str[i] == searchchar)
            count++;
    }
    return count;
}

// checks if a space is vacant, by VEN
stock bool:is_hull_vacant(const Float:origin[3],hull)
{
    new tr = 0;
    engfunc(EngFunc_TraceHull,origin,origin,0,hull,0,tr);

    if(!get_tr2(tr,TR_StartSolid) && !get_tr2(tr,TR_AllSolid) && get_tr2(tr,TR_InOpen))
        return true;
    
    return false
;
}

stock ham_give_weapon(id, weapon[])
{
    if(!equal(weapon, "weapon_",7)) return 0
    
    new wEnt 
= engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
    if(!pev_valid(wEnt)) return 0
    
    set_pev
(wEnt,pev_spawnflags, SF_NORESPAWN)
    dllfunc(DLLFunc_Spawn, wEnt)
    
    if
(!ExecuteHamB(Ham_AddPlayerItem, id, any:wEnt))
    {
        if(pev_valid(wEnt)) set_pev(wEnt, pev_flags, pev(wEnt, pev_flags) | FL_KILLME)
        return 0;
    }
    ExecuteHamB(Ham_Item_AttachToPlayer, wEnt, any:id)
    if(!equal(weapon, "weapon_knife",12))
    {
        new iWeaponId = get_weaponid(weapon)
        cs_set_user_bpammo(id, iWeaponId, 200)
    }
    return wEnt
}

stock ham_strip_weapon(id,weapon[])
{
    if(!equal(weapon,"weapon_",7)) return 0
    
    new wId 
= get_weaponid(weapon)
    if(!wId) return 0
    
    new wEnt
    while
((wEnt = engfunc(EngFunc_FindEntityByString, wEnt, "classname", weapon)) && pev(wEnt, pev_owner) != id) {}
    if(!wEnt) return 0
    
    new iTmp
    if
(get_user_weapon(id, iTmp, iTmp) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon, wEnt)
    
    if
(!ExecuteHamB(Ham_RemovePlayerItem, id, any:wEnt)) return 0
    
    ExecuteHamB
(Ham_Item_Kill, wEnt)
    set_pev(id, pev_weapons, pev(id, pev_weapons) & ~(1<<wId))
    
    return 1
}

stock strip_weapons(id, slot)
{
    static weapons[32], num, i, weaponid
    num 
= 0
    get_user_weapons
(id, weapons, num)

    for (= 0; i < num; i++)
    {
        weaponid = weapons[i]
        static wname[32]
        get_weaponname(weaponid, wname, charsmax(wname))
        if(slot == 0) ham_strip_weapon(id, wname)
        else if((slot == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
        || (slot == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
        {
            ham_strip_weapon(id, wname)
        }
    }
}

on_valid_team(id)
{
    new CsTeams:team = cs_get_user_team(id);
    return (team == CS_TEAM_T || team == CS_TEAM_CT);
}

stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16) 
{
    new Float:RenderColor[3];
    RenderColor[0] = float(r);
    RenderColor[1] = float(g);
    RenderColor[2] = float(b);

    set_pev(entity, pev_renderfx, fx);
    set_pev(entity, pev_rendercolor, RenderColor);
    set_pev(entity, pev_rendermode, render);
    set_pev(entity, pev_renderamt, float(amount));

    return 1;
}

PrintChat(const iReceiver, const Msg[])
{
    if(IsUserConnected(iReceiver))
    {
        message_begin(MSG_ONE, 76, .player=iReceiver)
        write_byte(iReceiver)
        write_string(Msg)
        message_end()
    }
Аватара пользователя
Don Corleone
 
Сообщения: 79
Зарегистрирован: 23 окт 2016, 16:13
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], sb123 и гости: 11