Написание плагинов

7pElllHuK

Участник
Сообщения
1,454
Реакции
483
Добрый день. У кого-то есть готовая функция получения слота оружия по его классу?
Если юзаешь ArrayList в ArrayList, то нужно очишать не только первый ArrayList, но и все внутренние closehandle.
Например в EntWatch есть список итемов, хранится в ArrayList(назовём его Main), у каждого итема, есть имя, класс, массив кнопок(ArrayList)(назовём его Child) и др. Список итемов обновляется каждый раунд, поэтому его надо очищать, но сначала мы очищаем Child, а только потом Main. Если что вот пример EntWatch_DZ/addons/sourcemod/scripting/entwatch_dz.sp at ee8ddbedd5a37f00ca0b36967257e6f26366fc3e · darkerz7/EntWatch_DZ
Большое спасибо
 

DarkerZ

Участник
Сообщения
405
Реакции
183

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@DarkerZ, я бы через switch() всё это написал
Сообщения автоматически склеены:

Да и использовать в сравнении первые 7 символов имени класса у оружия смысла нет (максимум первый символ проверить, чтобы там «w» была).
 

Vit_ amin

Добрая душа
Сообщения
1,525
Реакции
688
@Grey83
Я бы вообще вызвал через SDKCall

P. S. Мне лень писать код, который VALVe уже написали за меня
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Вот как-то так:
C-подобный:
// cstrike.inc:
//#define CS_SLOT_PRIMARY        0   /**< Primary weapon slot. */
//#define CS_SLOT_SECONDARY    1   /**< Secondary weapon slot. */
//#define CS_SLOT_KNIFE        2   /**< Knife slot. */
//#define CS_SLOT_GRENADE        3   /**< Grenade slot (will only return one grenade). */
//#define CS_SLOT_C4            4   /**< C4 slot. */
//#define CS_SLOT_BOOST        11  /**< Slot for healthshot and shield (will only return one weapon/item). */
//#define CS_SLOT_UTILITY        12  /**< Slot for tablet. */

int GetSlotByClassname(char[] cls)
{
    if(cls[0] != 'w')
        return -1;

    switch(cls[7])
    {
        case 'a':    // ak47, aug, awp, axe
            return cls[8] == 'x' ? CS_SLOT_KNIFE : CS_SLOT_PRIMARY;            // проверить слот
        case 'b':
        {
            switch(cls[8])
            {
                case 'a': return CS_SLOT_KNIFE;        // bayonet
                case 'i': return CS_SLOT_PRIMARY;    // bizon
                case 'r': return CS_SLOT_;            // breachcharge            // проверить слот
                case 'u': return CS_SLOT_;            // bumpmine                // проверить слот
            }
        }
        case 'c':    // c4, cz75a
            return cls[8] == '4' ? CS_SLOT_C4 : CS_SLOT_SECONDARY;
        case 'd':    // deagle, decoy
            return cls[9] == 'a' ? CS_SLOT_SECONDARY : CS_SLOT_GRENADE;
        case 'e':    // elite
            return CS_SLOT_SECONDARY;
        case 'f':
        {
            switch(cls[9])
            {
                case 'm': return CS_SLOT_PRIMARY;    // famas
                case 's': return CS_SLOT_KNIFE;        // fists                // проверить слот
                case 'v': return CS_SLOT_SECONDARY;    // fiveseven
                case 'a': return CS_SLOT_GRENADE;    // flashbang
            }
        }
        case 'g':    // g3sg1, galil, galilar, glock
            return cls[8] == 'l' ? CS_SLOT_SECONDARY : CS_SLOT_PRIMARY;
        {
        }
        case 'h':
        {
            switch(cls[9])
            {
                case 'm': return CS_SLOT_KNIFE;        // hammer                // проверить слот
                case 'a': return CS_SLOT_BOOST;        // healthshot
                case 'g': return CS_SLOT_GRENADE;    // hegrenade
                case 'p': return CS_SLOT_SECONDARY;    // hkp2000
            }
        }
        case 'i':    // incgrenade
            return CS_SLOT_GRENADE;
        case 'k':    // knife*
            return CS_SLOT_KNIFE;
        case 'm':
        {
            switch(cls[8])
            {
                case 'e': return CS_SLOT_KNIFE;        // melee                // проверить слот
                case 'o': return CS_SLOT_GRENADE;    // molotov
                default:  return CS_SLOT_PRIMARY;    // m249, m3, m4a1, m4a1_silencer, mac10, mag7, mp5navy, mp5sd, mp7, mp9
            }
        }
        case 'n':    // negev, nova
            return CS_SLOT_PRIMARY;
        case 'p':    // p228, p250, p90
            return cls[8] == '2' ? CS_SLOT_SECONDARY : CS_SLOT_PRIMARY;
        case 'r':    // revolver
            return CS_SLOT_SECONDARY;
        case 's':
        {
            switch(cls[8])
            {
                case 'h': return CS_SLOT_BOOST;        // shield
                case 'm': return CS_SLOT_GRENADE;        // smokegrenade
                case 'n': return CS_SLOT_;            // snowball                // проверить слот
                case 'p': return CS_SLOT_;            // spanner                // проверить слот
                default:  return CS_SLOT_SECONDARY;    // sawedoff, scar17, scar20, scout, sg550, sg552, sg556, ssg08
            }
        }
        case 't':    // tablet, tagrenade, taser, tec9            // проверить слот
        {
            switch(cls[9])
            {
                case 'b': return CS_SLOT_UTILITY;    // tablet                // проверить слот
                case 'g': return CS_SLOT_GRENADE;    // tagrenade            // проверить слот
                case 's': return CS_SLOT_KNIFE;        // taser                // проверить слот
                case 'c': return CS_SLOT_SECONDARY;    // tec9
                case 'c': return CS_SLOT_PRIMARY;    // tmp
            }
        }
        case 'u':    // ump45, usp, usp_silencer
            return cls[8] == 'm' ? CS_SLOT_PRIMARY : CS_SLOT_SECONDARY;
        case 'x':    // xm1014
            return CS_SLOT_PRIMARY;
/*        case 'z':    // zone_repulsor
            return CS_SLOT_;                                            // проверить слот
*/    }

    return -1;
}
Я бы вообще вызвал через SDKCall

P. S. Мне лень писать код, который VALVe уже написали за меня
 

7pElllHuK

Участник
Сообщения
1,454
Реакции
483
Вот как-то так:
C-подобный:
// cstrike.inc:
//#define CS_SLOT_PRIMARY        0   /**< Primary weapon slot. */
//#define CS_SLOT_SECONDARY    1   /**< Secondary weapon slot. */
//#define CS_SLOT_KNIFE        2   /**< Knife slot. */
//#define CS_SLOT_GRENADE        3   /**< Grenade slot (will only return one grenade). */
//#define CS_SLOT_C4            4   /**< C4 slot. */
//#define CS_SLOT_BOOST        11  /**< Slot for healthshot and shield (will only return one weapon/item). */
//#define CS_SLOT_UTILITY        12  /**< Slot for tablet. */

int GetSlotByClassname(char[] cls)
{
    if(cls[0] != 'w')
        return -1;

    switch(cls[7])
    {
        case 'a':    // ak47, aug, awp, axe
            return cls[8] == 'x' ? CS_SLOT_KNIFE : CS_SLOT_PRIMARY;            // проверить слот
        case 'b':
        {
            switch(cls[8])
            {
                case 'a': return CS_SLOT_KNIFE;        // bayonet
                case 'i': return CS_SLOT_PRIMARY;    // bizon
                case 'r': return CS_SLOT_;            // breachcharge            // проверить слот
                case 'u': return CS_SLOT_;            // bumpmine                // проверить слот
            }
        }
        case 'c':    // c4, cz75a
            return cls[8] == '4' ? CS_SLOT_C4 : CS_SLOT_SECONDARY;
        case 'd':    // deagle, decoy
            return cls[9] == 'a' ? CS_SLOT_SECONDARY : CS_SLOT_GRENADE;
        case 'e':    // elite
            return CS_SLOT_SECONDARY;
        case 'f':
        {
            switch(cls[9])
            {
                case 'm': return CS_SLOT_PRIMARY;    // famas
                case 's': return CS_SLOT_KNIFE;        // fists                // проверить слот
                case 'v': return CS_SLOT_SECONDARY;    // fiveseven
                case 'a': return CS_SLOT_GRENADE;    // flashbang
            }
        }
        case 'g':    // g3sg1, galil, galilar, glock
            return cls[8] == 'l' ? CS_SLOT_SECONDARY : CS_SLOT_PRIMARY;
        {
        }
        case 'h':
        {
            switch(cls[9])
            {
                case 'm': return CS_SLOT_KNIFE;        // hammer                // проверить слот
                case 'a': return CS_SLOT_BOOST;        // healthshot
                case 'g': return CS_SLOT_GRENADE;    // hegrenade
                case 'p': return CS_SLOT_SECONDARY;    // hkp2000
            }
        }
        case 'i':    // incgrenade
            return CS_SLOT_GRENADE;
        case 'k':    // knife*
            return CS_SLOT_KNIFE;
        case 'm':
        {
            switch(cls[8])
            {
                case 'e': return CS_SLOT_KNIFE;        // melee                // проверить слот
                case 'o': return CS_SLOT_GRENADE;    // molotov
                default:  return CS_SLOT_PRIMARY;    // m249, m3, m4a1, m4a1_silencer, mac10, mag7, mp5navy, mp5sd, mp7, mp9
            }
        }
        case 'n':    // negev, nova
            return CS_SLOT_PRIMARY;
        case 'p':    // p228, p250, p90
            return cls[8] == '2' ? CS_SLOT_SECONDARY : CS_SLOT_PRIMARY;
        case 'r':    // revolver
            return CS_SLOT_SECONDARY;
        case 's':
        {
            switch(cls[8])
            {
                case 'h': return CS_SLOT_BOOST;        // shield
                case 'm': return CS_SLOT_GRENADE;        // smokegrenade
                case 'n': return CS_SLOT_;            // snowball                // проверить слот
                case 'p': return CS_SLOT_;            // spanner                // проверить слот
                default:  return CS_SLOT_SECONDARY;    // sawedoff, scar17, scar20, scout, sg550, sg552, sg556, ssg08
            }
        }
        case 't':    // tablet, tagrenade, taser, tec9            // проверить слот
        {
            switch(cls[9])
            {
                case 'b': return CS_SLOT_UTILITY;    // tablet                // проверить слот
                case 'g': return CS_SLOT_GRENADE;    // tagrenade            // проверить слот
                case 's': return CS_SLOT_KNIFE;        // taser                // проверить слот
                case 'c': return CS_SLOT_SECONDARY;    // tec9
                case 'c': return CS_SLOT_PRIMARY;    // tmp
            }
        }
        case 'u':    // ump45, usp, usp_silencer
            return cls[8] == 'm' ? CS_SLOT_PRIMARY : CS_SLOT_SECONDARY;
        case 'x':    // xm1014
            return CS_SLOT_PRIMARY;
/*        case 'z':    // zone_repulsor
            return CS_SLOT_;                                            // проверить слот
*/    }

    return -1;
}
Спасибо, уже реализовал все через sf_item_info.inc, там как раз все то что нужно было
 

DarkerZ

Участник
Сообщения
405
Реакции
183
@Grey83
Я бы вообще вызвал через SDKCall

P. S. Мне лень писать код, который VALVe уже написали за меня
Я в курсе про это решение и оно было реализовано, только плагин изначально писался под кс:го, а валв известно своей проблемой, что почти каждая обнова ломает сервера сообщества... Поэтому проще прописать так и не искать геймдату каждый раз
 

DarkerZ

Участник
Сообщения
405
Реакции
183
Вот только там оружие из одного CS:S прописано. 😏
А оружия из CS:GO нету.
после обновы CS:GO до CS2, смысла поддерживать CS:GO_legasy нет(нету серверов ze, либо пускай используют старый билд), поэтому осталась только поддержка CSS
 

Kewn

Участник
Сообщения
336
Реакции
62
после обновы CS:GO до CS2, смысла поддерживать CS:GO_legasy нет(нету серверов ze, либо пускай используют старый билд), поэтому осталась только поддержка CSS
Мб со скуки для 34 версии поддержку сделаешь? 😅. У меня есть своя версия. Но она сырая капец. И что-то с ней делать, желания просто нет)
 

Kewn

Участник
Сообщения
336
Реакции
62
А там думаешь большая разница?
По большому счету нет. Нет худа и айтемы не берутся по hammer id. Я пробовал переписывать эту версию. Но где-то, что-то забывал либо не находил. И оно не работало. Уже и не помню. Да и в целом знаний не так много.
 

Synd1qate

Участник
Сообщения
819
Реакции
292
По большому счету нет. Нет худа и айтемы не берутся по hammer id. Я пробовал переписывать эту версию. Но где-то, что-то забывал либо не находил. И оно не работало. Уже и не помню. Да и в целом знаний не так много.
Понял, я просто суть не могу уловить, для чего он, можешь пример какой нибудь написать?
 

Kewn

Участник
Сообщения
336
Реакции
62
Понял, я просто суть не могу уловить, для чего он, можешь пример какой нибудь написать?
На ze картах есть айтемы с разными скилами типо отталкивания или поджога зомби. EntWatch показывает какие айтамы подняты и использованы. Также дает возможность банить игроков чтобы не могли их поднимать. Благодаря этому плагину это айтемы подсвечиваются . Функционал большой так-то.
 

Synd1qate

Участник
Сообщения
819
Реакции
292
На ze картах есть айтемы с разными скилами типо отталкивания или поджога зомби. EntWatch показывает какие айтамы подняты и использованы. Также дает возможность банить игроков чтобы не могли их поднимать. Благодаря этому плагину это айтемы подсвечиваются . Функционал большой так-то.
Понял, интересно, надо будет попробовать
 
  • Мне нравится
Реакции: Kewn

Mr_panica

XenForo one 💖
Сообщения
931
Реакции
441
Подскажите, какой способ отлова мультаккаунтов существует?
Сейчас я отлавливаю мульты по IP и куки, но хотелось бы ещё пару способов для надёжности.
Вроде слышал что можно по файлу или переменной, но что-то информацию найти не получается.

Игра: TF2
 

DarkerZ

Участник
Сообщения
405
Реакции
183
По большому счету нет. Нет худа и айтемы не берутся по hammer id. Я пробовал переписывать эту версию. Но где-то, что-то забывал либо не находил. И оно не работало. Уже и не помню. Да и в целом знаний не так много.
т.е. в v34 нет такого?
C-подобный:
stock int Entity_GetHammerID(int entity)
{
    return GetEntProp(entity, Prop_Data, "m_iHammerID");
}
 

DarkerZ

Участник
Сообщения
405
Реакции
183
ну и тогда как можно уникально идентифицировать тот же пистолет от маппера? типо по таргетнейму? но не все итемы на карте имеют таргетнейм. ну и идентифицировать надо не только пистолет но и кнопки, math_counterы
 
  • Мне нравится
Реакции: Kewn

Vit_ amin

Добрая душа
Сообщения
1,525
Реакции
688
ну и тогда как можно уникально идентифицировать тот же пистолет от маппера? типо по таргетнейму? но не все итемы на карте имеют таргетнейм. ну и идентифицировать надо не только пистолет но и кнопки, math_counterы
Парсить entity lump
 
Сверху Снизу