CS:GO Наклейки (Stickers)

komashchenko

Идиот
Сообщения
916
Реакции
2,573
У каждого CEconItemView есть 2 списка атрибутов, m_AttributeList и m_NetworkedDynamicAttributesForDemos которые хранят в себе CEconItemAttribute.
m_AttributeList (смещение 128) предназначен для изменений характеристик предмета (До перехода CS:GO на CCSWeaponData это работало, сейчас это просто бесполезный список), не транслируется игрокам.
m_NetworkedDynamicAttributesForDemos (смещение 156) предназначен для "визуальных" атрибутов, транслируется игрокам.

C++:
class CEconItemAttribute
{
    void *m_pVTable; // 0 - Виртуальная таблица
    uint16 m_iAttributeDefinitionIndex; // 4 - Индекс атрибута
    float m_flValue; // 8 - Его значение
    float m_flInitialValue; // 12 - Значение которое было при создании
    int m_nRefundableCurrency; // 16
    bool m_bSetBonus; // 20 - Бонусный атрибут или нет
};

Для изменения наклеек нам понадобиться второй список и такие функции.
CAttributeList::DestroyAllAttributes - очищает весь список атрибутов (не обязательно).
CEconItemAttribute::AddAttribute - добавляет атрибут в список.

У наклеек есть такие параметры: ID (int), износ (float), масштаб (float), поворот (float).

Пример после обновления PTaH 1.1.3

C++:
//Получаем CEconItemView из EconEntity
CEconItemView pItem = PTaH_GetEconItemViewFromEconEntity(iEnt);

//Получаем сколько всего может быть наклеек на предмете
int iStickersMax = pItem.GetItemDefinition().GetNumSupportedStickerSlots();

if(iStickersMax > 0)
{
    static int iIDHigh = 16384;

    //Ломаем ID прдмета дабы визуал бррался из NetProp и атрибут листа для демок
    SetEntProp(iEnt, Prop_Send, "m_iItemIDLow", -1);
    SetEntProp(iEnt, Prop_Send, "m_iItemIDHigh", iIDHigh++);

    //Очищаем оружие от визуальных атрибутов
    SDKCall(g_hCAttributeList_DestroyAllAttributes, view_as<int>(pItem) + 156);

    for(int i = 0; i < iStickersMax; i++)
    {
        //Для 0 слота ID - 113, износ - 114, масштаб - 115, поворот - 116
        //Добавляем наклейку
        CEconItemView_AddAttributeToNetworkedDynamicAttributesForDemos(pItem, 113 + i * 4, GetRandomInt(1, 3000));
        //Ставим качество
        CEconItemView_AddAttributeToNetworkedDynamicAttributesForDemos(pItem, 114 + i * 4, GetRandomFloat(0.2, 0.8));
    }
}

Оффтоп
 

Вложения

  • stickers_exemple.sp
    3.9 КБ · Просмотры: 139
  • stickers_exemple.txt
    1.5 КБ · Просмотры: 154
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,830
Реакции
5,267
wendermark,
C-подобный:
    RegConsoleCmd("sm_sticker", Command_Stickers);
    RegConsoleCmd("sm_stickers", Command_Stickers);
 

Auttend

Помешан на Лансере
Сообщения
155
Реакции
48
Custom Features в помощь
Пробовал, но дело в том, что то ли у меня плагин криво работает, то ли это так и должно быть, но !sticker ограничивается по VIP-группам, все хорошо, а вот если у игрока вообще нет VIP-группы, то он может спокойно использовать ограниченную команду
 

m0rbit

Участник
Сообщения
720
Реакции
159
Пробовал, но дело в том, что то ли у меня плагин криво работает, то ли это так и должно быть, но !sticker ограничивается по VIP-группам, все хорошо, а вот если у игрока вообще нет VIP-группы, то он может спокойно использовать ограниченную команду
Я использую в связке с Модуль плагина - [VIP] Command Blocker
Блокирую команды для обычных юзеров, и оставляю для ВИП.
А Custom Feature просто создает пункт в ВИП меню
 

Auttend

Помешан на Лансере
Сообщения
155
Реакции
48

komashchenko

Идиот
Сообщения
916
Реакции
2,573
После обновления PTaH до 1.1.3 появилась работа с атрибутами, больше не нужно никакой возни с gamedata

Тот же пример с PTaH 1.1.3:
#pragma semicolon 1
#include <PTaH>
#include <sdktools>

public Plugin myinfo =
{
    name = "Stickers exemple",
    author = "Phoenix (˙·٠●Феникс●٠·˙)",
    version = "1.0.1",
    url = "http://zizt.ru/"
};

public void OnPluginStart()
{
    PTaH(PTaH_GiveNamedItemPost, Hook, OnGiveNamedItemPost);
}

void OnGiveNamedItemPost(int iClient, const char[] sClassname, const CEconItemView Item, int iEnt, bool OriginIsNULL, const float Origin[3])
{
    if(iEnt != -1)
    {
        CEconItemView pItem = PTaH_GetEconItemViewFromEconEntity(iEnt);
       
        int iStickersMax = pItem.GetItemDefinition().GetNumSupportedStickerSlots();
       
        if(iStickersMax > 0)
        {
            static int iIDHigh = 16384;
            SetEntProp(iEnt, Prop_Send, "m_iItemIDLow", -1);
            SetEntProp(iEnt, Prop_Send, "m_iItemIDHigh", iIDHigh++);
           
            CAttributeList pDynamicAttributes = pItem.NetworkedDynamicAttributesForDemos;
           
            //Очищаем оружие от визуальных атрибутов
            pDynamicAttributes.DestroyAllAttributes();
           
            for(int i = 0; i < iStickersMax; i++)
            {
                pDynamicAttributes.SetOrAddAttributeValue(113 + i * 4, GetRandomInt(1, 3000));
                pDynamicAttributes.SetOrAddAttributeValue(114 + i * 4, GetRandomFloat(0.2, 0.8));
            }
        }
    }
}
 
Последнее редактирование:
Сверху Снизу