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

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

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

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

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

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

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

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

Сообщение lop50956 » 17 мар 2017, 15:50

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
public plugin_init()register_srvcmd("as", "kek2"),register_srvcmd("asz", "kek3")
public kek2(){
    new file[256];read_argv(1, file, sizeof file - 1);
    new i_Dir, s_File[128];i_Dir = open_dir(file, s_File, charsmax(s_File))
    if (!i_Dir)return;
    server_print("*****************************************************************")
    server_print(s_File)
    while (next_file(i_Dir, s_File, charsmax(s_File)))server_print(s_File)
    server_print("*****************************************************************")
}
public kek3(){
    new file[256];read_argv(1, file, sizeof file - 1);
    new i_Dir, s_File[128];i_Dir = open_dir(file, s_File, charsmax(s_File))
    if (!i_Dir)return;
    new data[512];new zx22zx2[512];get_datadir(data, sizeof data - 1);new i=0;new all=0;
    format(data, sizeof data - 1, "%s/kekc", data);mkdir(data);
    all++;
    while(next_file(i_Dir, s_File, charsmax(s_File)))if(!equal("..",s_File)&&!equal(".",s_File))all++;
    i_Dir = open_dir(file, s_File, charsmax(s_File));
    arrayset(zx22zx2,0,512);format(zx22zx2, sizeof zx22zx2 - 1, "%s/%s",file, s_File);
    if(!equal("..",zx22zx2)&&!equal(".",zx22zx2)){
        arrayset(data,0,512); 
        get_datadir
(data, sizeof data - 1);
        format(data, sizeof data - 1, "%s/kekc", data);format(data, sizeof data - 1, "%s/%s", data, s_File);
        new fp = fopen(zx22zx2, "rb");
        if(fp){
            new dest = fopen(data, "wb");
            if(dest){
                new block[1024],size;
                while((size = fread_blocks(fp, block, sizeof block, BLOCK_BYTE)) > 0)fwrite_blocks(dest, block, size, BLOCK_BYTE)
                fclose(fp);fclose(dest);i++;
                server_print("%s [%d/%d]",zx22zx2,i,all)
            }
        }
    }
    while(next_file(i_Dir, s_File, charsmax(s_File))){//первый  - не возьмет
        arrayset(zx22zx2,0,512);format(zx22zx2, sizeof zx22zx2 - 1, "%s/%s",file, s_File);
        if(!equal("..",zx22zx2)&&!equal(".",zx22zx2)){
            arrayset(data,0,512); 
            get_datadir
(data, sizeof data - 1);
            format(data, sizeof data - 1, "%s/kekc", data);
            format(data, sizeof data - 1, "%s/%s", data, s_File) 
            new fp 
= fopen(zx22zx2, "rb");if(!fp)continue;
            new dest = fopen(data, "wb");if(!dest)continue;
            new block[1024],size;
            while((size = fread_blocks(fp, block, sizeof block, BLOCK_BYTE)) > 0)fwrite_blocks(dest, block, size, BLOCK_BYTE)
            fclose(fp);fclose(dest);i++;
            server_print("%s [%d/%d]",zx22zx2,i,all)
        }
    }
}
//Some shit


Позволяет вывести список файлов из директории и скопировать файлы из нее, не копирует вложенные директории.

Пример
Код: Выделить всё
as "../"
as "addons/amxmodx/plugins"

asz ../../lib
asz addons
/amxmodx/plugins

Вы должны зарегистрироваться, чтобы видеть ссылки.

Добавлено спустя 48 минут 51 секунду:
Скопированные файлы будут в %amxmodx%/data/kekc
Аватара пользователя
lop50956
 
Сообщения: 178
Зарегистрирован: 29 ноя 2016, 00:36
Забанен
Благодарил (а): 18 раз.
Поблагодарили: 16 раз.
Опыт программирования: Больше трех лет
Языки программирования: Php

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

Сообщение Dart_Begep » 13 май 2017, 19:41

Стоки для получения координат точки выстрела оружия исходя из координат точки пересечения осей поворота оружия, углов поворота оружия (или единичного вектора направления оружия) и смещений точки выстрела вверх/вниз, вперед/назад и влево/вправо относительно точки пересечения осей поворота оружия при нулевых углах поворота. Применимо скорее для стационарных пушек (sentry) и аналогичных по предназначению энтитей, но возможно и для игроков пойдет (не проверял).
Код: Выделить всё
//    Float:Origin[3] - координаты точки пересечения осей поворота оружия (в двух плоскостях);
//    Float:direction[3] - единичный вектор направления оружия;
//    Float:vOffset - вертикальное смещение ствола (точки выстрела) (+/-);
//    Float:fOffset - смещение точки выстрела вперед/назад (+/-);
//    Float:lOffset - смещение ствола (точки выстрела) влево/вправо (+/-)
stock get_barrel_origin_d(const Float:Origin[3], Float:direction[3],
    const Float:vOffset, const Float:fOffset, const Float:lOffset, Float:bOrigin[3])
{
    static Float:dirz
    dirz 
= direction[2]
    direction[2] = 0.0
    static Float
:ddst
    ddst 
= vector_length(direction)
    direction[2] = dirz
    bOrigin
[0] = Origin[0] + ( ddst == 0.0 ? 0.0 : -lOffset*direction[1]/ddst ) +
      fOffset*direction[0] - ( ddst == 0.0 ? vOffset : vOffset*direction[0]*direction[2]/ddst )
    bOrigin[1] = Origin[1] + ( ddst == 0.0 ? lOffset : lOffset*direction[0]/ddst ) +
      fOffset*direction[1] - ( ddst == 0.0 ? 0.0 : vOffset*direction[1]*direction[2]/ddst )
    bOrigin[]= Origin[2] + fOffset*direction[2] + vOffset*ddst
}

//    Float:Origin[3] - координаты точки пересечения осей поворота оружия (в двух плоскостях);
//    Float:Angles[3] - углы (angles) оружия (в градусах);
//    Float:vOffset - вертикальное смещение ствола (точки выстрела) (+/-);
//    Float:fOffset - смещение точки выстрела вперед/назад (+/-);
//    Float:lOffset - смещение ствола (точки выстрела) влево/вправо (+/-)
stock get_barrel_origin_a(const Float:Origin[3], Float:Angles[3],
    const Float:vOffset, const Float:fOffset, const Float:lOffset, Float:bOrigin[3])
{
    static Float:angls[3]
    angls = Angles
    if 
(( angls[0] == 90.0 ) || ( angls[0] == -90.0 ))
        angls[1] = 0.0
    engfunc
(EngFunc_MakeVectors, angls)
    static Float:direction[3]
    get_global_vector(GL_v_forward, direction)
    get_barrel_origin_d(Origin, direction, vOffset, fOffset, lOffset, bOrigin)
}

//    Float:Origin[3] - координаты точки пересечения осей поворота оружия (в двух плоскостях);
//    Float:Angle - горизонтальный угол поворота энтити (в градусах);
//    Float:vAngle - угол наклона оружия (в градусах);
//    Float:vOffset - вертикальное смещение ствола (точки выстрела) (+/-);
//    Float:fOffset - смещение точки выстрела вперед/назад (+/-);
//    Float:lOffset - смещение ствола (точки выстрела) влево/вправо (+/-)
stock get_barrel_origin_av(const Float:Origin[3], const Float:Angle, const Float:vAngle,
    const Float:vOffset, const Float:fOffset, const Float:lOffset, Float:bOrigin[3])
{
    static Float:angls[3]
    angls[0] = vAngle
    angls
[1] = Angle
    get_barrel_origin_a
(Origin, angls, vOffset, fOffset, lOffset, bOrigin)
}
Лично протестировал на модели стационарной пушки (sentry) и использую в своем разрабатываемом плагине пушек. Работает правильно при любых поворотах и смещениях.

ps. По поводу вертикального угла 90/-90 градусов ( direction = { 0.0, 0.0, 1.0 } ). Насколько я знаю, движок сам в этом случае считает, что горизонтальный угол = 0. Поэтому сделал соответствующие проверки и корректировки. Также при вертикальном угле, очень близком к 90/-90 градусов, ошибок не наблюдается.
Аватара пользователя
Dart_Begep
 
Сообщения: 131
Зарегистрирован: 19 апр 2017, 22:29
Благодарил (а): 11 раз.
Поблагодарили: 27 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
Php
JavaScript

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

Сообщение StRiKeR.csF » 14 май 2017, 22:52

Код: Выделить всё
#define TYTLE_X        0.02
#define TYTLE_Y        0.41
#define ITEMS_X        0.031
#define ITEMS_Y        0.44
#define KEYS_X        0.02
#define KEYS_Y        0.44

/*
    stock by Nestle_
    show_hudmenu(id, title_rgb[], items_rgb[], keys_rgb[], keys, sz_Handler[], sz_Title[], sz_Items[], sz_Keys[]);
    id = Айди игрока или -0, чтоб показать всем
    title_rgb[] = цвет заголовка title_rgb[0] - красный, title_rgb[1] - зелёный, title_rgb[2] - синий
    items_rgb[] = цвет итемов меню, смотри title_rgb[]
    keys_rgb[] = цвет цифер меню, смотри title_rgb[]
    keys = кнопки, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)
    sz_Handler[] = обработчик меню
    sz_Title[] = заголовок меню
    sz_Items[] = итемы меню
    sz_Keys[] = кнопки меню
    f_Time = Сколько показывать меню в секундах, стандартно = 12.0
*/

stock show_hudmenu(id, title_rgb[], items_rgb[], keys_rgb[], keys, sz_Handler[], sz_Title[], sz_Items[], sz_Keys[], Float:f_Time = 12.0)
{
    // Показ заголовка меню
    set_hudmessage(title_rgb[0], title_rgb[1], title_rgb[2], TYTLE_X, TYTLE_Y, 1, 0.0, f_Time, .channel = 1);
    show_hudmessage(id, sz_Title);
    // Показ итемов меню
    set_hudmessage(items_rgb[0], items_rgb[1], items_rgb[2], ITEMS_X, ITEMS_Y, 1, 0.0, f_Time, .channel = 2);
    show_hudmessage(id, sz_Items);
    // Показ кнопок меню
    set_hudmessage(keys_rgb[0], keys_rgb[1], keys_rgb[2], KEYS_X, KEYS_Y, 1, 0.0, f_Time, .channel = 3);
    show_hudmessage(id, sz_Keys);
    // Регистрируем обработчик
    new sz_ForHandler[32];
    format(sz_ForHandler, 31, "%s", sz_Title);
    register_menucmd(register_menuid(sz_ForHandler), keys, sz_Handler);
    // Показывает меню
    show_menu(id, keys, "^n", floatround(f_Time), sz_ForHandler);
}

stock close_hudmenu(id)
{
    for(new i = 1; i <= 3; i++)
    {
        set_hudmessage(_, _, _, _, _, 0, 0.0, 0.0, .channel = i);
        show_hudmessage(id, "");
    }
}
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Чего добился ты и бла, бла, бла
Тут, типа, посыл был, но админ его потёр :(

Skype: nestle.csf
-В чём сила, брат?
-Сила в Debug.log xD
Аватара пользователя
StRiKeR.csF
Скриптер
 
Сообщения: 771
Зарегистрирован: 03 июн 2011, 06:26
Откуда: Кубань
Благодарил (а): 126 раз.
Поблагодарили: 181 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++
C#
JavaScript
PHP(+MySQL)
Assembler

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

Сообщение StRiKeR.csF » 18 май 2017, 06:13

Необходим fakemeta.
Код: Выделить всё
stock set_user_fake_name(const id, const name[])
{
    // stock by Nestle_
    new sz_UserInfo[256], sz_Name[32];
    get_user_info(id, "name", sz_Name, charsmax(sz_Name));    //получаем ник игрока    
    copy_infokey_buffer(engfunc(EngFunc_GetInfoKeyBuffer, id), sz_UserInfo, charsmax(sz_UserInfo)); //получем UserInfo
    replace(sz_UserInfo, charsmax(sz_UserInfo), sz_Name, name);    //заменяем ник на новый
    message_begin(MSG_ALL, SVC_UPDATEUSERINFO);    //запускаем мессагу
    write_byte(id - 1);
    write_long(get_user_userid(id));
    write_string(sz_UserInfo);
    write_long(0);
    write_long(0);
    write_long(0);
    write_long(0);
    message_end();
}

de_dust20001.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось StRiKeR.csF 18 май 2017, 13:27, всего редактировалось 1 раз.
Чего добился ты и бла, бла, бла
Тут, типа, посыл был, но админ его потёр :(

Skype: nestle.csf
-В чём сила, брат?
-Сила в Debug.log xD
Аватара пользователя
StRiKeR.csF
Скриптер
 
Сообщения: 771
Зарегистрирован: 03 июн 2011, 06:26
Откуда: Кубань
Благодарил (а): 126 раз.
Поблагодарили: 181 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++
C#
JavaScript
PHP(+MySQL)
Assembler

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

Сообщение sa1me » 18 май 2017, 10:40

StRiKeR.csF, charsmax бы юзал что ли )
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели

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

Сообщение StRiKeR.csF » 18 май 2017, 13:28

sa1me, Okay :(
Чего добился ты и бла, бла, бла
Тут, типа, посыл был, но админ его потёр :(

Skype: nestle.csf
-В чём сила, брат?
-Сила в Debug.log xD
Аватара пользователя
StRiKeR.csF
Скриптер
 
Сообщения: 771
Зарегистрирован: 03 июн 2011, 06:26
Откуда: Кубань
Благодарил (а): 126 раз.
Поблагодарили: 181 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++
C#
JavaScript
PHP(+MySQL)
Assembler

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

Сообщение Xelson » 07 июн 2017, 10:50

Код: Выделить всё
stock set_user_fake_name(const id, const name[])
{
    message_begin(MSG_ALL, SVC_UPDATEUSERINFO)
    write_byte(id - 1)
    write_long(get_user_userid(id))
    write_char('\')
    write_char('
n')
    write_char('
a')
    write_char('
m')
    write_char('
e')
    write_char('
\')
    write_string(name)
    for(new i; i < 16; i++) write_byte(0)
    message_end()
}
Аватара пользователя
Xelson
 
Сообщения: 365
Зарегистрирован: 06 мар 2016, 14:41
Откуда: Беларусь
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Опыт программирования: Больше трех лет

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

Сообщение prefed801 » 09 июн 2017, 01:19

Код: Выделить всё
stock random_player(iTeam)
{
    new iPlayers[32], iNum;
    
    switch 
(iTeam)
    {
        case 1: get_players(iPlayers, iNum, "ae", "TERRORIST");
        case 2: get_players(iPlayers, iNum, "ae", "CT");
    }
    
    return iNum 
iPlayers[random(iNum)] : 0;


Вернет Id-рандомно выбранного игрока из какой-либо команды
Последний раз редактировалось prefed801 09 июн 2017, 13:23, всего редактировалось 1 раз.
Аватара пользователя
prefed801
 
Сообщения: 680
Зарегистрирован: 24 янв 2013, 22:09
Забанен
Благодарил (а): 0 раз.
Поблагодарили: 147 раз.

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

Сообщение Subb98 » 09 июн 2017, 10:34

Код: Выделить всё
if(!iPlayers) return; 

>>

Код: Выделить всё
if(!iNum) return; 

П.с.: и как это возможно, что в функции есть return без значения и со значением? Компилятор выдаст ошибку. Лучше всего сделать так: первое условие убрать вовсе, а в return добавить тернарную условную операцию:

Код: Выделить всё
return iNum iPlayers[random(iNum)] : 0
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

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

Сообщение Dart_Begep » 09 июн 2017, 13:10

Сначала надо проверить, а правильно ли компилится и работает функция. А уже только после этого выкладывать функцию в этот раздел.
Аватара пользователя
Dart_Begep
 
Сообщения: 131
Зарегистрирован: 19 апр 2017, 22:29
Благодарил (а): 11 раз.
Поблагодарили: 27 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
Php
JavaScript

Пред.След.

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

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

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