[InkCore] AmmoManager CSGO/CSS v1.4.1

inklesspen

Юзя есть Юзя с его ключами :3
Сообщения
1,537
Реакции
532
Версия: 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-ю флеху, а заблочило вторую)
 

Вложения

Последнее редактирование:

inklesspen

Юзя есть Юзя с его ключами :3
Сообщения
1,537
Реакции
532
На эмке с глушителем как было 20 патронов в магазине так и есть.
Ось какая?
Остальные оружия работают?
--- Добавлено позже ---
Упс, я weapon_m4a1_silencer и не впихнул в кфг :D
--- Добавлено позже ---
Добавь в конце originalammo.ini ключ weapon_m4a1_silencer и внеси данные, что тебе нужны
--- Добавлено позже ---
Ведь если оружия нет в кфг, то над ним и работать нельзя.
--- Добавлено позже ---
Я архив перезалил.
 

Rabb1t

*здесь могла быть ваша реклама*
Команда форума
Сообщения
2,726
Реакции
1,102
Отличный плагин! Парню респект, потенциал есть! Да и людям помогает!
 

inklesspen

Юзя есть Юзя с его ключами :3
Сообщения
1,537
Реакции
532
На эмке с глушителем как было 20 патронов в магазине так и есть.
Упс, ток щас заметил. в fiveseven столько же патрон, как и в revolver. Исправь у себя
20 в обоиме
100 в запасе
КФГ ток что перезалил.
 

R1KO

fuck society
Команда форума
Сообщения
8,839
Реакции
6,445
@inklesspen,
PHP:
if(ReplaceString(classname2, 64, "weapon_", "weapon_", false)!=0&&ReplaceString(classname2, 64, "_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(index2, 8, "%i", GetEntProp(entity, Prop_Send, "m_iItemDefinitionIndex"))
        if(KvJumpToKey(kv, index2, false))
        {
            KvGetString(kv, "name", classname2, 64, classname2)
        }
        CloseHandle(kv) // удалили кв 1
       
        kv = CreateKeyValues("weapons") // создали кв 2
        FileToKeyValues(kv, "addons/sourcemod/configs/ic_ammomanager/ignore.ini")
        KvRewind(kv)
        if(KvJumpToKey(kv, classname2, false))
        {
            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(kv, classname2, false))
        {
            iAmmoMax[0][entity]=KvGetNum(kv, "clip", 0)
            iAmmoMax[1][entity]=KvGetNum(kv, "reserve", 0)
            Forward_FinishSetAmmoFirst(entity)
            DHookEntity(dGetMaxClip1, false, entity)
            DHookEntity(dGetReserveAmmoMax, false, entity)
        }
        else
        {
            LogError("%s not found", classname2)
        }
        #if defined _DEBUG
        PrintToChatAll("Found: %s %i", classname2, entity)
        #endif
        // где удаление кв 3 ?
    }
PHP:
public OnEntityCreated(entity, const String:classname[])
{
    if(entity<1||entity>2048)
        return;
    SDKUnhook(entity, SDKHook_SpawnPost, SpawnWeapon)
    SDKHook(entity, SDKHook_SpawnPost, SpawnWeapon)
   
}
Зачем тут анхук?

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

PHP:
if(ReplaceString(classname2, 64, "weapon_", "weapon_", false)!=0&&ReplaceString(classname2, 64, "_weapon_", "_weapon_", false)==0)
Это еще зачем ?
 

inklesspen

Юзя есть Юзя с его ключами :3
Сообщения
1,537
Реакции
532
@inklesspen
PHP:
if(ReplaceString(classname2, 64, "weapon_", "weapon_", false)!=0&&ReplaceString(classname2, 64, "_weapon_", "_weapon_", false)==0)
Это еще зачем ?
Я так проверяю, оружие это или нет(есть ли часть weapon_, так-же проверяю, не game_weapon_manager ли это)

@inklesspen
PHP:
decl String:arg[256]
    new weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon")
    GetEntityClassname(weapon, arg, 256)
Размера 32 вполне достаточно
Привычка, исправлю

@inklesspen
PHP:
public OnEntityCreated(entity, const String:classname[])
{
    if(entity<1||entity>2048)
        return;
    SDKUnhook(entity, SDKHook_SpawnPost, SpawnWeapon)
    SDKHook(entity, SDKHook_SpawnPost, SpawnWeapon)
}
Зачем тут анхук?
Я боюсь, что хукнет 2 раза, если каким-то образом он небыл разхукан.

@inklesspen
PHP:
if(ReplaceString(classname2, 64, "weapon_", "weapon_", false)!=0&&ReplaceString(classname2, 64, "_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(index2, 8, "%i", GetEntProp(entity, Prop_Send, "m_iItemDefinitionIndex"))
        if(KvJumpToKey(kv, index2, false))
        {
            KvGetString(kv, "name", classname2, 64, classname2)
        }
        CloseHandle(kv) // удалили кв 1
   
        kv = CreateKeyValues("weapons") // создали кв 2
        FileToKeyValues(kv, "addons/sourcemod/configs/ic_ammomanager/ignore.ini")
        KvRewind(kv)
        if(KvJumpToKey(kv, classname2, false))
        {
            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(kv, classname2, false))
        {
            iAmmoMax[0][entity]=KvGetNum(kv, "clip", 0)
            iAmmoMax[1][entity]=KvGetNum(kv, "reserve", 0)
            Forward_FinishSetAmmoFirst(entity)
            DHookEntity(dGetMaxClip1, false, entity)
            DHookEntity(dGetReserveAmmoMax, false, entity)
        }
        else
        {
            LogError("%s not found", classname2)
        }
        #if defined _DEBUG
        PrintToChatAll("Found: %s %i", classname2, entity)
        #endif
        // где удаление кв 3 ?
    }
Забыл, исправлю.

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

R1KO

fuck society
Команда форума
Сообщения
8,839
Реакции
6,445
Я так проверяю, оружие это или нет(есть ли часть weapon_, так-же проверяю, не game_weapon_manager ли это)
PHP:
if(strncmp(classname2, "weapon_", 7)==0)
{
// это оружие
}
Я боюсь, что хукнет 2 раза.
При смерти ентити всё анхукнется. так что можешь не опасаться
 

R1KO

fuck society
Команда форума
Сообщения
8,839
Реакции
6,445
Ну кто поставил его, как плагин? Стабильный? Работает корректно?
 
Сообщения
1,083
Реакции
584
@R1KO, работает как часы :)
 
Последнее редактирование:

Dreizehnt

Команда моркови 🥕
Сообщения
1,062
Реакции
594
Что-то проглядел, буду смотреть обязательно)
--- Добавлено позже ---
Так, ну всё работает, только не сказано про dhooks. Ещё бы скорость пушкам изменить :gamer4:
 
Последнее редактирование:

inklesspen

Юзя есть Юзя с его ключами :3
Сообщения
1,537
Реакции
532
Что-то проглядел, буду смотреть обязательно)
--- Добавлено позже ---
Так, ну всё работает, только не сказано про dhooks. Ещё бы скорость пушкам изменить :gamer4:
Про DHooks добавлю. А скорость перезарядки иль стрельбы?
 

R1KO

fuck society
Команда форума
Сообщения
8,839
Реакции
6,445
@inklesspen, как по мне - удобнее в кфг вынести стандартные значения оружий
 

inklesspen

Юзя есть Юзя с его ключами :3
Сообщения
1,537
Реакции
532
Сверху