Иконка ресурса

[InkCore] AmmoManager CSGO/CSS v1.4.1

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
  • Автор ресурса
  • #1
Версия: 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 патроны изменяются только в обоиме)
Определяет макс. колво патрон для оружий
C-подобный:
"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 класс
Так вот плагин дополнительно определяет по этому кфг что это за оружие
C-подобный:
"classnames"
{
    "64"
    {
        "name"    "weapon_revolver"
    }
    "60"
    {
        "name"    "weapon_m4a1_silencer"
    }
    "61"
    {
        "name"    "weapon_usp_silencer"
    }
    "63"
    {
        "name"    "weapon_cz75a"
    }
}

Конфиг для игнорирования тех или иных оружий.
Если оружие не будет ни в originalammo.ini ни в этом кфг, плагин сообщит об этом(В логах или в ошибках)
C-подобный:
"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 в запасе)
C-подобный:
#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 в запасе)
C-подобный:
#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);
// }

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

Нативы\Форварды
C-подобный:
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

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

Yura7181

Участник
Сообщения
678
Реакции
594
Теперь работает как надо! На эмке 200 патронов поставил в магазине! Спасибо.
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #5
Отличный плагин! Парню респект, потенциал есть! Да и людям помогает!
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
  • Автор ресурса
  • #6
На эмке с глушителем как было 20 патронов в магазине так и есть.
Упс, ток щас заметил. в fiveseven столько же патрон, как и в revolver. Исправь у себя
20 в обоиме
100 в запасе
КФГ ток что перезалил.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
@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

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
  • Автор ресурса
  • #9
@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
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
Я так проверяю, оружие это или нет(есть ли часть weapon_, так-же проверяю, не game_weapon_manager ли это)
PHP:
if(strncmp(classname2, "weapon_", 7)==0)
{
// это оружие
}

Я боюсь, что хукнет 2 раза.
При смерти ентити всё анхукнется. так что можешь не опасаться
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #12
Ну кто поставил его, как плагин? Стабильный? Работает корректно?
 

AS TRO

Участник
Сообщения
1,159
Реакции
750
@R1KO, работает как часы :)
 
Последнее редактирование:

Dreizehnt

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

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
  • Автор ресурса
  • #16
Что-то проглядел, буду смотреть обязательно)
--- Добавлено позже ---
Так, ну всё работает, только не сказано про dhooks. Ещё бы скорость пушкам изменить :gamer4:
Про DHooks добавлю. А скорость перезарядки иль стрельбы?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #19
@inklesspen, как по мне - удобнее в кфг вынести стандартные значения оружий
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
  • Автор ресурса
  • #20
Сверху Снизу