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

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

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

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

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

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

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

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

Сообщение prefed801 » 09 июн 2017, 13:16

Dart_Begep, проверили?
Аватара пользователя
prefed801
 
Сообщения: 680
Зарегистрирован: 24 янв 2013, 22:09
Забанен
Благодарил (а): 0 раз.
Поблагодарили: 147 раз.

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

Сообщение RevCrew » 09 июн 2017, 13:21

prefed801, чего тут проверять, если она не работает. Вам на ошибки указали, может пора обновить пост?
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

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

Сообщение fl0wer » 29 июн 2017, 13:03

Функция проверяет пересечение 2-х коробок по 3-м координатам. Например, застрял ли игрок в другом игроке (можно не только игрока, работает со всеми размерами энтить).
Почему-то через ТрейсХулл не удалось отловить игрок в игроке, поэтому пришлось сделать такую проверку.
offset - это смещение для того чтобы если стоишь вплотную, то не реагировало (уменьшает коробку со всех сторон).

Код: Выделить всё
bool: bTestAABBAABB( iPlayer, iOther )
{
    #define offset 1.0

    new Float: vecAbsMinA[ 3 ];
    new Float: vecAbsMaxA[ 3 ];
    new Float: vecAbsMinB[ 3 ];
    new Float: vecAbsMaxB[ 3 ];

    get_entvar( iPlayer, var_absmin, vecAbsMinA );
    get_entvar( iPlayer, var_absmax, vecAbsMaxA );

    get_entvar( iOther, var_absmin, vecAbsMinB );
    get_entvar( iOther, var_absmax, vecAbsMaxB );

    if( vecAbsMaxA[ 0 ] - offset < vecAbsMinB[ 0 ] + offset || vecAbsMinA[ 0 ] + offset > vecAbsMaxB[ 0 ] - offset )
        return false;

    if( vecAbsMaxA[ 1 ] - offset < vecAbsMinB[ 1 ] + offset || vecAbsMinA[ 1 ] + offset > vecAbsMaxB[ 1 ] - offset )
        return false;

    if( vecAbsMaxA[ 2 ] - offset < vecAbsMinB[ 2 ] + offset || vecAbsMinA[ 2 ] + offset > vecAbsMaxB[ 2 ] - offset )
        return false;

    return true;
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

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

Сообщение NEoMASTERR » 29 июн 2017, 14:19

Вы должны зарегистрироваться, чтобы видеть ссылки.
Вы должны зарегистрироваться, чтобы видеть ссылки.
Код: Выделить всё
#if AMXX_VERSION_NUM < 183
stock entity_intersects(entityother)
{
    static 
Float:minsa[3], Float:maxsa[3]
    static 
Float:minsb[3], Float:maxsb[3]

    
entity_get_vector(entityEV_VEC_absminminsa)
    
entity_get_vector(entity,EV_VEC_absmaxmaxsa)
    
entity_get_vector(other,EV_VEC_absminminsb)
    
entity_get_vector(other,EV_VEC_absmaxmaxsb)

    if(
minsb[0] > maxsa[0] ||
        
minsb[1] > maxsa[1] ||
        
minsb[2] > maxsa[2] ||
        
maxsb[0] < minsa[0] ||
        
maxsb[1] < minsa[1] ||
        
maxsb[2] < minsa[2])
        return 
0
    
return 1
}
#endif 
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

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

Сообщение fl0wer » 29 июн 2017, 14:55

Ты чо, у меня ж оптимизация, после каждой оси ретурн.
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

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

Сообщение Mistrick » 29 июн 2017, 16:37

fl0wer, а разница, почти во всех ЯП уже есть неявная оптимизация условий.
if(a || b) - если а не ноль, то второе условие не проверяется.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

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

Сообщение Subb98 » 29 июн 2017, 16:47

Mistrick, тем не менее, перед проверкой каждое выражение внутри оператора if будет приведено к true / false. Следовательно, чем больше выражений внутри одного if, тем дольше будет выполняться такое условие. Но на более низком уровне (модуля) это не должно быть критично и предпочтительней, чем делать то же самое плагином, пусть и в несколько if'ов.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

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

Сообщение fl0wer » 29 июн 2017, 22:38

Плюс у меня: если игроки стоят вплотную друг к другу, то не считается, что они застряли.
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

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

Сообщение артист666 » 01 авг 2017, 20:29

Функция проверяет, находится ли точка в угле обзора другой.

Код: Выделить всё
public is_angle_visible(Float:origin[3], Float:angles[3], Float:point[3], Float:x, Float:y)
{
    static i; i = -// Если углы не игрока, т.е. от 0 до 360.
    
    while
(++< sizeof(angles))
    {
        if(angles[i] > 180.0) angles[i] -= 360.0
    
}
    static Float:vec[3]
    vec[0] = point[0] - origin[0]
    vec[1] = point[1] - origin[1]
    vec[2] = point[2] - origin[2]
    
    vector_to_angle
(vec, vec)

    vec[0] = floatabs(vec[0] - angles[0])
    vec[1] = floatabs(vec[1] - angles[1])
    
    if
(vec[0] > 180.0) vec[0] = floatabs(360.0 - vec[0])
    if(vec[1] > 180.0) vec[1] = floatabs(360.0 - vec[1])

    if(vec[0] > y || vec[1] > x) return 0
    return 1
}

origin - координаты первой точки(которая смотрит)
angles - направление из этой точки(или угол обзора)
point - проверяемая точка
x - угол по горизонтали
y - угол по вертикали
Углы максимально 180, т.е. когда точка сзади.

Пример использования, выводит список всех игроков, которых видно:
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>

new g_maxplayers

public plugin_init
()
{
    register_clcmd("say y", "functions")
    
    g_maxplayers 
= get_maxplayers() + 1
}
public functions(id)
{
    new text[256], len = formatex(text, charsmax(text), "You see:^n") 
    static Float
:origin[3]; pev(id, pev_origin, origin)
    static Float:view_ofs[3]; pev(id, pev_view_ofs, view_ofs)
    
    origin
[0] += view_ofs[0]
    origin[1] += view_ofs[1]
    origin[2] += view_ofs[2]
    
    static Float
:angles[3]; pev(id, pev_v_angle, angles)
    
    static Float
:porigin[3], i; i = -1
    
    while
(++< g_maxplayers)
    {
        if(== id) continue
        if
(!is_user_alive(i)) continue
        
        pev
(i, pev_origin, porigin)
        
        engfunc
(EngFunc_TraceLine, origin, porigin, DONT_IGNORE_MONSTERS, id, 0)
        
        if
(get_tr2(0, TR_pHit) != i) continue
        if
(!is_angle_visible(origin, angles, porigin, 46.0, 50.0)) continue
        
        text
[len++] = '^n'
        len += get_user_name(i, text[len], charsmax(text) - len)
    }
    set_hudmessage(0, 255, 0, -1.0, 0.2, 0, 0.0, 10.0)
    
    if
(len > 10) show_hudmessage(id, text)
    else show_hudmessage(id, "")
}
public is_angle_visible(Float:origin[3], Float:angles[3], Float:point[3], Float:x, Float:y)
{
    static i; i = -// Если углы не игрока, т.е. от 0 до 360.
    
    while
(++< sizeof(angles))
    {
        if(angles[i] > 180.0) angles[i] -= 360.0
    
}
    static Float:vec[3]
    vec[0] = point[0] - origin[0]
    vec[1] = point[1] - origin[1]
    vec[2] = point[2] - origin[2]
    
    vector_to_angle
(vec, vec)

    vec[0] = floatabs(vec[0] - angles[0])
    vec[1] = floatabs(vec[1] - angles[1])
    
    if
(vec[0] > 180.0) vec[0] = floatabs(360.0 - vec[0])
    if(vec[1] > 180.0) vec[1] = floatabs(360.0 - vec[1])

    if(vec[0] > y || vec[1] > x) return 0
    return 1
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

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

Сообщение Xelson » 02 авг 2017, 22:38

Сток, позволяющий выполнить импульсную команду клиента. Таким образом можно включать/отключать фонарик за игрока, рисовать лого, исполнять читерские команды по типу рисования кровью (ExecuteImpulse(id, 202)) при включенном sv_cheats.
Код: Выделить всё
stock ExecuteImpulse(id, iImpulse)
{
    set_pev(id, pev_impulse, iImpulse)
    ExecuteHam(Ham_Player_ImpulseCommands, id)
}
Аватара пользователя
Xelson
 
Сообщения: 365
Зарегистрирован: 06 мар 2016, 14:41
Откуда: Беларусь
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Опыт программирования: Больше трех лет

Пред.След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19