komashchenko
Идиот
- Сообщения
- 916
- Реакции
- 2,573
У каждого CEconItemView есть 2 списка атрибутов, m_AttributeList и m_NetworkedDynamicAttributesForDemos которые хранят в себе CEconItemAttribute.
m_AttributeList (смещение 128) предназначен для изменений характеристик предмета (До перехода CS:GO на CCSWeaponData это работало, сейчас это просто бесполезный список), не транслируется игрокам.
m_NetworkedDynamicAttributesForDemos (смещение 156) предназначен для "визуальных" атрибутов, транслируется игрокам.
Для изменения наклеек нам понадобиться второй список и такие функции.
CAttributeList::DestroyAllAttributes - очищает весь список атрибутов (не обязательно).
CEconItemAttribute::AddAttribute - добавляет атрибут в список.
У наклеек есть такие параметры: ID (int), износ (float), масштаб (float), поворот (float).
Пример после обновления PTaH 1.1.3
Оффтоп
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));
}
}
Оффтоп
На самом деле сложного тут ничего нет, просто наверное никому за сколько лет это было не интересно :(
Это всего лишь базовое объяснение, управление атрибутами позволяет сделать более интересные вещи :)
Это всего лишь базовое объяснение, управление атрибутами позволяет сделать более интересные вещи :)
Вложения
Последнее редактирование: