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

Сборник полезных функций

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

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

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

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

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

Re: Сборник полезных функций

Сообщение defa » 04 авг 2011, 21:01

Функция ловит событие, когда игрок выстрелил из оружия:

Код: Выделить всё
#define OFFSET_WEAPON 4
#define OFFSET_CLIPAMMO 51
#define OFFSET_ACTIVEITEM 373 [/pawn]

[pawn]stock bool:get_user_shoot(index)
{
    
    static Params
[33][2];
    
    new weaponid 
= get_pdata_cbase(index, OFFSET_ACTIVEITEM);
    new clipammo = get_pdata_int(weaponid, OFFSET_CLIPAMMO, OFFSET_WEAPON);
    
    if
((Params[index][0] > clipammo) && (clipammo >= 0) && (Params[index][1] == weaponid))
    {
        Params[index][0] = clipammo;
        return true;
    }
    
    else
    
{
        Params[index][0] = clipammo;
        Params[index][1] = weaponid;
    }
    
    return false
;
}
Аватара пользователя
defa
 
Сообщения: 870
Зарегистрирован: 26 авг 2010, 18:22
Забанен
Благодарил (а): 34 раз.
Поблагодарили: 399 раз.

Re: Сборник полезных функций

Сообщение Ser_UFL » 05 авг 2011, 03:51

Fedcomp, может стоки или инклуды целые под спойлеры загонять в первом посте?
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 975
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 380 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.

Re: Сборник полезных функций

Сообщение defa » 07 авг 2011, 23:15

Если entity является игроком:
Код: Выделить всё
stock bool:is_player(entity)
{
    new string[32];
    pev(entity, pev_classname, string, sizeof string - 1);
    
    if
(strcmp(string, "player") != 0)
        return false;
    
    return true
;
}


Даёт игроку возможность иметь бесконечные патроны в любых огнестрельных оружиях:
Код: Выделить всё
#define OFFSET_PLAYER 5
#define OFFSET_WEAPON 4

#define OFFSET_ACTIVEITEM 373
#define OFFSET_CLIPAMMO 51  


Код: Выделить всё
public give_unlimited_ammo(index)
{
    static Params[33][2], weaponid, clipammo;
    
    if
(!is_user_alive(index))
        return 0;
    
    weaponid 
= get_pdata_cbase(index, OFFSET_ACTIVEITEM, OFFSET_PLAYER);
    clipammo = get_pdata_int(weaponid, OFFSET_CLIPAMMO, OFFSET_WEAPON);
    
    if
(Params[index][0] != weaponid)
    {
        Params[index][0] = weaponid;
        Params[index][1] = clipammo;
    }
    
    if
(Params[index][1] - (Params[index][1] - 1) > clipammo)
        set_pdata_int(weaponid, OFFSET_CLIPAMMO, Params[index][1], OFFSET_WEAPON);
    
    set_task
(0.1, "give_unlimited_ammo", index);
    
    return 1
;
}
Аватара пользователя
defa
 
Сообщения: 870
Зарегистрирован: 26 авг 2010, 18:22
Забанен
Благодарил (а): 34 раз.
Поблагодарили: 399 раз.

Re: Сборник полезных функций

Сообщение Fedcomp » 08 авг 2011, 01:00

Мне все же кажется выдача бесконечных патронов это работа конкретного плагина. Нужны более общие функции. Вот проверка игрока на энтитю очень даже.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Сборник полезных функций

Сообщение KORD_12.7 » 08 авг 2011, 12:16

Сделал стоки для weaponbox-ов в HLDM.
Credits: HLSDK :-)

Код: Выделить всё
//*********************************************************
// weaponbox code:
//*********************************************************
 
#include <engine>
#include <fakemeta>
#include <hamsandwich>
 
#define MAX_ITEM_TYPES  6       // hud item selection slots
#define MAX_AMMO_SLOTS  32      // not really slots
 
// CBasePlayerItem offsets
new const m_pPlayer 28
const m_pNext 29;
const 
m_iId 30;
 
// CWeaponBox offsets
new const m_rgpPlayerItems[MAX_ITEM_TYPES] = {212223242526}// one slot for each 
const m_rgiszAmmo_slot0 28;// ammo names
const m_rgAmmo_slot0 60;// ammo quantities
 
// WeaponBox extraoffset
const XTRA_OFS_WEAPONBOX 4
 
//=========================================================
// WeaponBox - Spawn 
//=========================================================
stock WeaponBox_Spawn()
{
        new pWeaponBox create_entity("weaponbox");
        if (!pev_valid(pWeaponBox))
                return FM_NULLENT;
        
        set_pev
(pWeaponBoxpev_movetypeMOVETYPE_TOSS);
        set_pev(pWeaponBoxpev_solidSOLID_TRIGGER);
        
        engfunc
(EngFunc_SetSizepWeaponBoxFloat:{0.00.00.0} , Float:{0.00.00.0});
        engfunc(EngFunc_SetModelpWeaponBox"models/w_weaponbox.mdl");
        
        ExecuteHamB
(Ham_SpawnpWeaponBox)
        
        
return pWeaponBox;
}
 
//=========================================================
// WeaponBox_Kill - the function that removes the
// box from the world.
//=========================================================
stock WeaponBox_Kill(const pWeaponBox)
{
        new pWeaponi;
        
        
// destroy the weapons
        for (MAX_ITEM_TYPES i++)
        {
                pWeapon get_pdata_cbase(pWeaponBoxm_rgpPlayerItems[i], XTRA_OFS_WEAPONBOX)
 
                
while (pev_valid(pWeapon))
                {
                        set_pev(pWeaponpev_flagsFL_KILLME)
                        
                        pWeapon 
get_pdata_cbase(pWeaponm_pNextXTRA_OFS_WEAPONBOX)
                }
        }
 
        
// remove the box
        set_pev(pWeaponBoxpev_flagsFL_KILLME);
}
 
//=========================================================
// PackWeapon: Add this weapon to the box
//=========================================================
stock WeaponBox_PackWeapon(const pWeaponBox, const pWeapon)
{
        // is one of these weapons already packed in this box?
        if (WeaponBox_HasWeapon(pWeaponBoxpWeapon))
        {
                return 0;// box can only hold one of each weapon type
        }
        
        
new pPlayer get_pdata_cbase(pWeaponm_pPlayerXTRA_OFS_WEAPONBOX);
        new iWeaponSlot ExecuteHamB(Ham_Item_ItemSlotpWeapon);
        new rgpPlayerItem get_pdata_cbase(pWeaponBoxm_rgpPlayerItems[iWeaponSlot], XTRA_OFS_WEAPONBOX);
        
        
if (pev_valid(pPlayer))
        {
                if (!ExecuteHamB(Ham_RemovePlayerItempPlayerpWeapon))
                {
                        // failed to unhook the weapon from the player!
                        return 0;
                }
        }
        
        
if (pev_valid(rgpPlayerItem))
        {
                // there's already one weapon in this slot, so link this into the slot's column
                set_pdata_cbase(pWeaponm_pNextrgpPlayerItemXTRA_OFS_WEAPONBOX);
                set_pdata_cbase(pWeaponBoxm_rgpPlayerItems[iWeaponSlot], pWeaponXTRA_OFS_WEAPONBOX);
        }
        else
        {
                // first weapon we have for this slot
                set_pdata_cbase(pWeaponBoxm_rgpPlayerItems[iWeaponSlot], pWeaponXTRA_OFS_WEAPONBOX);
                set_pdata_cbase(pWeaponm_pNextFM_NULLENTXTRA_OFS_WEAPONBOX);
        }
        
        set_pev
(pWeaponpev_spawnflagspev(pWeaponpev_spawnflags) | SF_NORESPAWN);// never respawn
        set_pev(pWeaponpev_movetypeMOVETYPE_NONE);
        set_pev(pWeaponpev_solidSOLID_NOT);
        set_pev(pWeaponpev_effectsEF_NODRAW);
        set_pev(pWeaponpev_modelindex0);
        set_pev(pWeaponpev_model0);
        set_pev(pWeaponpev_ownerpWeaponBox);
        set_pdata_cbase(pWeaponm_pPlayerFM_NULLENTXTRA_OFS_WEAPONBOX);
 
        
return 1;
}
 
//=========================================================
// WeaponBox - GiveAmmo
//=========================================================
stock WeaponBox_GiveAmmo(const pWeaponBox, const iCount, const szName[], const iMax)
{
        new i
        
        
for (new m_rgiszAmmoszAmmo[24], 0MAX_AMMO_SLOTS && (m_rgiszAmmo get_pdata_int(pWeaponBoxm_rgiszAmmo_slot0 iXTRA_OFS_WEAPONBOX)); i++)
        {
                global_get(glb_pStringBasem_rgiszAmmoszAmmocharsmax(szAmmo))
                
                
if (strcmp(szNameszAmmo) == 0)
                {
                        new m_rgAmmo get_pdata_int(pWeaponBoxm_rgAmmo_slot0 iXTRA_OFS_WEAPONBOX)
                        new iAdd min(iCountiMax m_rgAmmo)
                        
                        
if (iCount == || iAdd 0)
                        {
                                set_pdata_int(pWeaponBoxm_rgAmmo_slot0 im_rgAmmo iAddXTRA_OFS_WEAPONBOX)
 
                                
return i;
                        }
                        return -1;
                }
        }
        if (MAX_AMMO_SLOTS)
        {
                set_pdata_int(pWeaponBoxm_rgiszAmmo_slot0 iengfunc(EngFunc_AllocStringszName), XTRA_OFS_WEAPONBOX)
                set_pdata_int(pWeaponBoxm_rgAmmo_slot0 iiCountXTRA_OFS_WEAPONBOX)
                
                
return i;
        }
        // out of named ammo slots
        return i;
}
 
//=========================================================
// HasWeapon - is a weapon of this type already
// packed in this box?
//=========================================================
stock WeaponBox_HasWeapon(const pWeaponBox, const pCheckItem)
{
        new pItem get_pdata_cbase(pWeaponBoxm_rgpPlayerItems[ExecuteHamB(Ham_Item_ItemSlotpCheckItem)], XTRA_OFS_WEAPONBOX)
 
        
while (pev_valid(pItem))
        {
                if (get_pdata_int(pItemm_iIdXTRA_OFS_WEAPONBOX) == get_pdata_int(pCheckItemm_iIdXTRA_OFS_WEAPONBOX))
                {
                        return 1;
                }
                pItem get_pdata_cbase(pItemm_pNextXTRA_OFS_WEAPONBOX)
        }
 
        
return 0;
}
 
//=========================================================
// WeaponBox_IsEmpty - is there anything in this box?
//=========================================================
stock boolWeaponBox_IsEmpty(const pWeaponBox)
{
        new i;
 
        
for (MAX_ITEM_TYPES i++)
        {
                if (pev_valid(get_pdata_cbase(pWeaponBoxm_rgpPlayerItems[i], XTRA_OFS_WEAPONBOX)))
                {
                        return false;
                }
        }
 
        
for (MAX_AMMO_SLOTS i++)
        {
                if (get_pdata_int(pWeaponBoxm_rgiszAmmo_slot0 iXTRA_OFS_WEAPONBOX))
                {
                        // still have a bit of this type of ammo
                        return false;
                }
        }
 
        
return true;
Последний раз редактировалось KORD_12.7 12 авг 2011, 15:08, всего редактировалось 1 раз.

_http://aghl.ru/ - Half-Life и Adrenaline Gamer: за пределами возможного
Аватара пользователя
KORD_12.7
Скриптер
 
Сообщения: 298
Зарегистрирован: 28 сен 2009, 10:14
Откуда: Владивосток
Благодарил (а): 142 раз.
Поблагодарили: 257 раз.
Опыт программирования: Больше трех лет
Языки программирования: Half-Life
Opposing Force
Adrenaline Gamer
Counter-Strike

Re: Сборник полезных функций

Сообщение defa » 09 авг 2011, 12:40

Функция возвращает количество повторений символа в строке:

Код: Выделить всё
stock count_char(const string[], const ch)
{
    new index, count;

    for(index = 0; string[index]; index++)
    {
        if(string[index] != ch)
            continue;
        
        count
++;
    }
    
    return count
;
}
Аватара пользователя
defa
 
Сообщения: 870
Зарегистрирован: 26 авг 2010, 18:22
Забанен
Благодарил (а): 34 раз.
Поблагодарили: 399 раз.

Re: Сборник полезных функций

Сообщение Fedcomp » 09 авг 2011, 19:03

а для подстроки можешь написать? ;)
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Сборник полезных функций

Сообщение defa » 09 авг 2011, 19:58

Так это ж не трудно, просто начинать инициализацию в цикле с нужного нам числа, которое будет указывать на первый елемент строки :-) :
Код: Выделить всё
stock count_subchar(const string[], element, const ch)
{
    new index, count;
    
    for
(index = element; string[index]; index++)
    {
        if(string[index] != ch)
            continue;
        
        count
++;
    }
    
    return count
;
}
Аватара пользователя
defa
 
Сообщения: 870
Зарегистрирован: 26 авг 2010, 18:22
Забанен
Благодарил (а): 34 раз.
Поблагодарили: 399 раз.

Re: Сборник полезных функций

Сообщение Fedcomp » 09 авг 2011, 20:52

Я имел ввиду искать в строке 'lolwut'
Искать подстроку 'lwu'

И было бы хорошо:
  • Функцию для поиска первого совпадения в строке поданой подстроки которая возвращает число начиная с которого идет подстрока (искать в строке 'lolwut' подстроку 'lwut' equal выдает только true/false)
  • Функцию для поиска количества совпадений подстроки в строке (искать в строке 'lolwutxdwutnowut' количество 'wut')
  • Функция для получения подстроки имея начальное и конечное число, т.е 'lolhammerwut' нам нужно получить строку 'hammer' задав допустим substr(3 (начало), 8 (конец), строку_приемник, длину_строки_приемника)

И вообще будут ли целесообразны эти функции?
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Сборник полезных функций

Сообщение noo00oob » 09 авг 2011, 21:04

Fedcomp писал(а):И вообще будут ли целесообразны эти функции?


Для чего? Искать в имень игрока подстроку "ggf", и если такая нашлась давать ему безсмертие? :thumbs_up
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 394 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Пред.След.

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

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

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