[InkCore] AmmoManager CSGO/CSS v1.4.1

Тема в разделе "Тестовые плагины", создана пользователем inklesspen, 9 июл 2016.

  1. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Версия: 1.4.1
    Резил(ну оно и понятно)
    Пофикшена ошибка, связанная с определением game_weapon_manager как оружие
    Исправлена утечка Handle
    Уменьшен размер массива в команде !getclassindex
    (Спасибо RIKO)
    Убрал лишний SDKUnhook
    Изменена проверка подлиности оружия
    (Спасибо RIKO)
    Исправлена утечка памяти (Когда оружие из разряда ignore)
    Добавлена поддержка CSS
    Плагин переписан на рекомендуемый синтаксис
    Урезан icpack

    Описание:

    Выставляет макс.размер обоимы и запаса у оружия. Например у калаша в обоиме вмещается 100 патрон, а в запасе 500

    Поддерживаемые игры:
    - CSGO
    - CSS (С версии 1.4.1, не тестирован, конфиг лишь для CS:GO)

    Требования:
    - SourceMod (Хотя это и так понятно...)
    - DHooks

    Конфиги (Для CSS патроны изменяются только в обоиме)
    Определяет макс. колво патрон для оружий
    Код:
    "weapons"
    {
        "weapon_usp_silencer"
        {
            "clip"    "12"
            "reserve"    "24"
        }
        "weapon_hkp2000"
        {
            "clip"    "13"
            "reserve"    "52"
        }
        "weapon_ak47"
        {
            "clip"    "30"
            "reserve"    "90"
        }
        "weapon_galilar"
        {
            "clip"    "35"
            "reserve"    "90"
        }
        "weapon_famas"
        {
            "clip"    "25"
            "reserve"    "90"
        }
        "weapon_negev"
        {
            "clip"    "150"
            "reserve"    "200"
        }
        "weapon_m249"
        {
            "clip"    "100"
            "reserve"    "200"
        }
        "weapon_mag7"
        {
            "clip"    "5"
            "reserve"    "32"
        }
        "weapon_xm1014"
        {
            "clip"    "7"
            "reserve"    "32"
        }
        "weapon_nova"
        {
            "clip"    "8"
            "reserve"    "32"
        }
        "weapon_awp"
        {
            "clip"    "10"
            "reserve"    "30"
        }
        "weapon_mp9"
        {
            "clip"    "30"
            "reserve"    "120"
        }
        "weapon_mp7"
        {
            "clip"    "30"
            "reserve"    "120"
        }
        "weapon_ump45"
        {
            "clip"    "25"
            "reserve"    "100"
        }
        "weapon_p90"
        {
            "clip"    "50"
            "reserve"    "100"
        }
        "weapon_bizon"
        {
            "clip"    "64"
            "reserve"    "120"
        }
        "weapon_ssg08"
        {
            "clip"    "10"
            "reserve"    "90"
        }
        "weapon_aug"
        {
            "clip"    "30"
            "reserve"    "90"
        }
        "weapon_scar20"
        {
            "clip"    "20"
            "reserve"    "90"
        }
        "weapon_elite"
        {
            "clip"    "30"
            "reserve"    "120"
        }
        "weapon_deagle"
        {
            "clip"    "7"
            "reserve"    "35"
        }
        "weapon_p250"
        {
            "clip"    "13"
            "reserve"    "26"
        }
        "weapon_revolver"
        {
            "clip"    "8"
            "reserve"    "8"
        }
        "weapon_fiveseven"
        {
            "clip"    "8"
            "reserve"    "8"
        }
        "weapon_glock"
        {
            "clip"    "20"
            "reserve"    "120"
        }
        "weapon_tec9"
        {
            "clip"    "24"
            "reserve"    "120"
        }
        "weapon_sawedoff"
        {
            "clip"    "7"
            "reserve"    "32"
        }
        "weapon_mac10"
        {
            "clip"    "30"
            "reserve"    "100"
        }
        "weapon_sg556"
        {
            "clip"    "30"
            "reserve"    "90"
        }
        "weapon_g3sg1"
        {
            "clip"    "20"
            "reserve"    "90"
        }
        "weapon_m4a1"
        {
            "clip"    "30"
            "reserve"    "90"
        }
        "weapon_cz75a"
        {
            "clip"    "12"
            "reserve"    "12"
        }
        "weapon_m4a1_silencer"
        {
            "clip"    "20"
            "reserve"    "40"
        }
    }
    
    Конфиг, на случай, если попадеться например weapon_revolver, а получит weapon_deagle класс
    Так вот плагин дополнительно определяет по этому кфг что это за оружие
    Код:
    "classnames"
    {
        "64"
        {
            "name"    "weapon_revolver"
        }
        "60"
        {
            "name"    "weapon_m4a1_silencer"
        }
        "61"
        {
            "name"    "weapon_usp_silencer"
        }
        "63"
        {
            "name"    "weapon_cz75a"
        }
    }
    

    Конфиг для игнорирования тех или иных оружий.
    Если оружие не будет ни в originalammo.ini ни в этом кфг, плагин сообщит об этом(В логах или в ошибках)
    Код:
    "weapons"
    {
        "weapon_c4"
        {
            "disable"    "1"
        }
        "weapon_knife"
        {
            "disable"    "1"
        }
        "weapon_hegrenade"
        {
            "disable"    "1"
        }
        "weapon_molotov"
        {
            "disable"    "1"
        }
        "weapon_incgrenade"
        {
            "disable"    "1"
        }
        "weapon_healthshot"
        {
            "disable"    "1"
        }
        "weapon_decoy"
        {
            "disable"    "1"
        }
        "weapon_smokegrenade"
        {
            "disable"    "1"
        }
        "weapon_tagrenade"
        {
            "disable"    "1"
        }
        "weapon_flashbang"
        {
            "disable"    "1"
        }
        "weapon_knifegg"
        {
            "disable"    "1"
        }
        "weapon_taser"
        {
            "disable"    "1"
        }
    }
    

    Примеры плагинов, использующих нативы:
    Выставляет макс.кол-во патрон для ЛЮБОГО АК47 (100 в обоиме, 30 в запасе)
    Код:
    #include <ic_ammomanager>
    #include <icpack/load>
    
    public ICAM_EntityFirstAmmoFinished(int weapon)
    {
        decl String:classname[64]
        GetEntityClassname(weapon, classname, 64)
        // PrintToChatAll("FoundAK: %i", weapon)
        if(StrEqual(classname, "weapon_ak47"))
        {
            ICAM_SetWeaponClipSize(weapon, 100)
            ICAM_SetWeaponReserveSize(weapon, 30)
        }
    }
    

    Выдает АК47 с моделью М4А1 от 1-го лица (100 в обоиме, 500 в запасе)
    Код:
    #include <icpack/load>
    #include <ic_ammomanager>
    new bool:ak[2049] = {false,...}
    new model = -1
    public OnPluginStart()
    {
        RegConsoleCmd("sm_getnewak", GNA)
    }
    
    public OnMapStart()
    {
        model = PrecacheModel("models/weapons/v_rif_m4a1.mdl")
    }
    
    public Action GNA(client,args)
    {
        new item = ICAM_GivePlayerItem(client, "weapon_ak47", 100, 500)
        ak[item]=true
    }
    
    public OnEntityCreated(weapon)
    {
        ak[weapon]=false
    }
    
    public OnClientPutInServer(client)
    {
        SDKHook(client, SDKHook_WeaponSwitchPost, Switch)
        SDKHook(client, SDKHook_WeaponEquipPost, Switch)
    }
    
    public Switch(client, weap2on)
    {
        new weapon = GetClientActiveWeapon(client)
        if(ak[weapon])
        {
            SetViewModelIndex(client, model)
        }
    }
    
    SetViewModelIndex(client, index)
    {
        if(!YesPlayer(client))
            return;
        new viewmodel = GetEntPropEnt(client, Prop_Send, "m_hViewModel")
        new weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon")
        if(YesEntityMe(weapon))
            SetEntProp(weapon, Prop_Send, "m_nModelIndex", 0)
        if(YesEntityMe(viewmodel))
            SetEntProp(viewmodel, Prop_Send, "m_nModelIndex", index)
    
    }
    
    // SetWorldModelIndex(weapon, index)
    // {
        // SetEntProp(weapon, Prop_Send, "m_iWorldModelIndex", index);
        // SetEntProp(weapon, Prop_Send, "m_PredictableID", index);
    // }
    

    Все примеры есть в архиве

    Нативы\Форварды
    Код:
    native ICAM_SetWeaponClipSize(int weapon, int amount) // Устанавливает макс.размер обоимы для оружия
    native ICAM_SetWeaponReserveSize(int weapon, int amount) // Устанавливает макс.размер запаса для оружия
    
    native int ICAM_GetWeaponClipSize(int weapon) // Получить макс.размер обоимы
    native int ICAM_GetWeaponReserveSize(int weapon) // Получить макс.размер запаса
    
    forward ICAM_EntityFirstAmmoFinished(int weapon) // После этой функции можно выставлять макс.размер обоимы и запаса
    
    // Создать оружие игроку со своим значением макс.размера обоимы и запаса
    stock int ICAM_GivePlayerItem(int client, const String:weaponname[], clipsize, reservesize, iSubType = 0)
    {
        new weapon = GivePlayerItem(client, weaponname) // Создаем оружие
        ICAM_SetWeaponClipSize(weapon, clipsize) // Выставляем макс.размер обоимы
        ICAM_SetWeaponReserveSize(weapon, reservesize)// Выставляем макс.размер запаса
        SetEntProp(weapon, Prop_Send, "m_iPrimaryReserveAmmoCount", reservesize)// Выставляем размер запаса
        SetEntProp(weapon, Prop_Send, "m_iClip1", clipsize)// Выставляем размер обоимы
        return weapon
    }
    

    Отдельная благодарность:
    komashchenko - За помощь в оффсетах
    Кстати не рекомендую выставлять значение выше, чем 511 для запаса и 255 для обоимы
    Запас: если будет 512, покажет 0, 513 = 1 и т.д. Но сами патроны будут в полном порядке
    Обоима: если будет 256, покажет 0, 257 = 1 и т.д. Но сами патроны будут в полном порядке

    Идеи пишите в ЛС, если есть время и желание, сделаю.
    И еще, прошу IP серверов с этим плагином мне писать в ЛС. Хочу знать сколько таких серверов :)

    P.S. Что-то может не работать на Windows.
    И.... Поидеи должно работать с гранатами, если менять макс.запас
    (Ну значение 0 не заблокировало 1-ю флеху, а заблочило вторую)
     

    Вложения:

    Последнее редактирование: 7 окт 2016
    Dreizehnt, Rabb1t, 666FoX666 и 2 другим нравится это.
  2. Yura7181

    Yura7181

    Сообщения:
    367
    Симпатии:
    293
    На эмке с глушителем как было 20 патронов в магазине так и есть.
     
    Святослав124 нравится это.
  3. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Ось какая?
    Остальные оружия работают?
    --- Добавлено позже ---
    Упс, я weapon_m4a1_silencer и не впихнул в кфг :D
    --- Добавлено позже ---
    Добавь в конце originalammo.ini ключ weapon_m4a1_silencer и внеси данные, что тебе нужны
    --- Добавлено позже ---
    Ведь если оружия нет в кфг, то над ним и работать нельзя.
    --- Добавлено позже ---
    Я архив перезалил.
     
    Yura7181 нравится это.
  4. Yura7181

    Yura7181

    Сообщения:
    367
    Симпатии:
    293
    Теперь работает как надо! На эмке 200 патронов поставил в магазине! Спасибо.
     
    Святослав124 нравится это.
  5. Rabb1t

    Rabb1t "Почетный раздолбай"

    Сообщения:
    925
    Симпатии:
    123
    Отличный плагин! Парню респект, потенциал есть! Да и людям помогает!
     
  6. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Упс, ток щас заметил. в fiveseven столько же патрон, как и в revolver. Исправь у себя
    20 в обоиме
    100 в запасе
    КФГ ток что перезалил.
     
  7. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.977
    @inklesspen,
    PHP:
    if(ReplaceString(classname264"weapon_""weapon_"false)!=0&&ReplaceString(classname264"_weapon_""_weapon_"false)==0)
        {
            new 
    Handle:kv CreateKeyValues("classnames"// создали кв 1
            
    FileToKeyValues(kv"addons/sourcemod/configs/ic_ammomanager/classnames.ini")
            
    KvRewind(kv)
            
    decl String:index2[8]
            
    FormatEx(index28"%i"GetEntProp(entityProp_Send"m_iItemDefinitionIndex"))
            if(
    KvJumpToKey(kvindex2false))
            {
                
    KvGetString(kv"name"classname264classname2)
            }
            
    CloseHandle(kv// удалили кв 1
           
            
    kv CreateKeyValues("weapons"// создали кв 2
            
    FileToKeyValues(kv"addons/sourcemod/configs/ic_ammomanager/ignore.ini")
            
    KvRewind(kv)
            if(
    KvJumpToKey(kvclassname2false))
            {
                if(
    bool:KvGetNum(kv"disable"0))
                    return;
            }
            
    CloseHandle(kv// удалили кв 2
           
            
    kv CreateKeyValues("weapons"// создали кв 3
            
    FileToKeyValues(kv"addons/sourcemod/configs/ic_ammomanager/originalammo.ini")
            
    KvRewind(kv)
            if(
    KvJumpToKey(kvclassname2false))
            {
                
    iAmmoMax[0][entity]=KvGetNum(kv"clip"0)
                
    iAmmoMax[1][entity]=KvGetNum(kv"reserve"0)
                
    Forward_FinishSetAmmoFirst(entity)
                
    DHookEntity(dGetMaxClip1falseentity)
                
    DHookEntity(dGetReserveAmmoMaxfalseentity)
            }
            else
            {
                
    LogError("%s not found"classname2)
            }
            
    #if defined _DEBUG
            
    PrintToChatAll("Found: %s %i"classname2entity)
            
    #endif
            // где удаление кв 3 ?
        
    }
    PHP:
    public OnEntityCreated(entity, const String:classname[])
    {
        if(
    entity<1||entity>2048)
            return;
        
    SDKUnhook(entitySDKHook_SpawnPostSpawnWeapon)
        
    SDKHook(entitySDKHook_SpawnPostSpawnWeapon)
       
    }
    Зачем тут анхук?

    PHP:
    decl String:arg[256]
        new 
    weapon GetEntPropEnt(clientProp_Send"m_hActiveWeapon")
        
    GetEntityClassname(weaponarg256)
        
    Размера 32 вполне достаточно

    PHP:
    if(ReplaceString(classname264"weapon_""weapon_"false)!=0&&ReplaceString(classname264"_weapon_""_weapon_"false)==0)
    Это еще зачем ?
     
  8. Sleeparts

    Sleeparts

    Сообщения:
    48
    Симпатии:
    9
    @R1KO сделай модуль для VIP из этого :)
     
  9. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Я так проверяю, оружие это или нет(есть ли часть weapon_, так-же проверяю, не game_weapon_manager ли это)

    Привычка, исправлю

    Я боюсь, что хукнет 2 раза, если каким-то образом он небыл разхукан.

    Забыл, исправлю.

    P.S. Спасибо, все исправлю, но анхук в начале убрать?
     
  10. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.977
    PHP:
    if(strncmp(classname2"weapon_"7)==0)
    {
    // это оружие
    }
    При смерти ентити всё анхукнется. так что можешь не опасаться
     
  11. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Хорошо, спасибо
     
  12. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.977
    Ну кто поставил его, как плагин? Стабильный? Работает корректно?
     
  13. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Я его держу у себя на ZM сервере и пока крашов не было. Я его держу где-то неделю с избытком
     
  14. AS TRO

    AS TRO

    Сообщения:
    1.055
    Симпатии:
    508
    @R1KO, работает как часы :)
     
    Последнее редактирование: 18 июл 2016
  15. Dreizehnt

    Dreizehnt Unteroffizier

    Сообщения:
    619
    Симпатии:
    199
    Что-то проглядел, буду смотреть обязательно)
    --- Добавлено позже ---
    Так, ну всё работает, только не сказано про dhooks. Ещё бы скорость пушкам изменить :gamer4:
     
    Последнее редактирование: 17 июл 2016
  16. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Про DHooks добавлю. А скорость перезарядки иль стрельбы?
     
  17. Dreizehnt

    Dreizehnt Unteroffizier

    Сообщения:
    619
    Симпатии:
    199
    Так, ну всё работает, только не сказано про dhooks.
    Стрельбу подразумевал.
     
  18. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Может и это сделаю:) Но добыть стандарт.значения будет уже сложнее
     
  19. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.972
    Симпатии:
    2.977
    @inklesspen, как по мне - удобнее в кфг вынести стандартные значения оружий
     
  20. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    830
    Симпатии:
    195
    Идея хорошая автоматизировать процесс, но все-же сложнее уже будет писать код и названия оружий)