Частое получение данных из дин. массива

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
Возник такой вопрос...

Насколько сложно плагину тянуть данные из динамических массивов?
Например, если это происходит при каждом выстреле.

Есть такой вот код:
C++:
enum _:CWAPI_WeaponData{
    CWAPI_WD_Name[32],
    CWAPI_WD_DefaultName[32],
    CWAPI_WD_Models[CWAPI_WeaponModels],
    CWAPI_WD_Sounds[CWAPI_WeaponSounds],
    CWAPI_WD_ClipSize,
    CWAPI_WD_MaxAmmo,
    Float:CWAPI_WD_MaxWalkSpeed,
    CWAPI_WD_Weight,
    Array:CWAPI_WD_CustomHandlers[CWAPI_WeaponEvents],
    Float:CWAPI_WD_DamageMult,
    CWAPI_WD_Price,
    Float:CWAPI_WD_Accuracy,
    Float:CWAPI_WD_DeployTime,
    Float:CWAPI_WD_PrimaryAttackRate,
    Float:CWAPI_WD_SecondaryAttackRate,
    bool:CWAPI_WD_HasSecondaryAttack,
};

public Hook_PrimaryAttack_Post(ItemId){
    if(!IsCustomWeapon(GetWeapId(ItemId)))
        return HAM_IGNORED;

    if(
        get_member(ItemId, m_Weapon_iClientClip) < 1 ||
        get_member(ItemId, m_Weapon_iClientClip) == get_member(ItemId, m_Weapon_iClip)
    ) return HAM_IGNORED;

    static Data[CWAPI_WeaponData]; ArrayGetArray(CustomWeapons, GetWeapId(ItemId), Data);
   
    //...
 
    return HAM_IGNORED;
}
Не будет ли это сильно грузить серв, если, к примеру, человек 5 одновременно выстрелят очередь с кастомных пушек?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
m_Weapon_iClientClip зачем тебе последнее полученное значение от клиента, а не серверное? И какую даты ты хочешь? Может проще её в var_* засунуть?
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
m_Weapon_iClientClip зачем тебе последнее полученное значение от клиента, а не серверное?
Затем шо событие срабатывает не при выстреле, а каждый кадр пока зажата ЛКМ (или около того)... И если выстрел действительно был, то в пост хуке кол-во патронов на клиенте ещё не обновлено, а на сервере обновлено...
Возможно я занимаюсь хренью... Но в таком случае подскажи как будет лучше... Буду благодарен


И какую даты ты хочешь? Может проще её в var_* засунуть?
В том то и дело шо её не сунуть в var_... Я там в коде оставил enum... Это и есть структура массива, который вытаскивается из дин. массива
 
Последнее редактирование:

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
Тут надо профайлером смотреть.
А по сути, число оружия же не бесконечное.
Ну поставит себе человек 32 штуки, ну пусть 64 (даже не представляю себе такой сервер).
Делаем обычный глобальный массив этого размера, а в ентити держим только индекс оружия в массиве, откуда тянем всю инфу.
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
Делаем обычный глобальный массив этого размера
А если ставить этот плагин ради, например, 1-5 пушек? Получится шо большая часть ячеек будет просто так занимать память.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Затем шо событие срабатывает не при выстреле, а каждый кадр пока зажата ЛКМ (или около того)... И если выстрел действительно был, то в пост хуке кол-во патронов на клиенте ещё не обновлено, а на сервере обновлено...
Возможно я занимаюсь хренью... Но в таком случае подскажи как будет лучше... Буду благодарен
чаво?
m_Weapon_iClip работает как надо, в пре кол-во патронов до выстрела, в посте соотвественно, кол-во патронов после выстрела.
24 Сен 2019
В том то и дело шо её не сунуть в var_... Я там в коде оставил enum... Это и есть структура массива, который вытаскивается из дин. массива
Что там за данные такие, для которых нет в пушках свободных var'ов?
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
m_Weapon_iClip работает как надо, в пре кол-во патронов до выстрела, в посте соотвественно, кол-во патронов после выстрела.
В пре пихать в какой-нить var_iuserN кол-во патронов, и сравнивать в пост с текущим?
24 Сен 2019
Что там за данные такие, для которых нет в пушках свободных var'ов?
Хотя... Если в var'ы пихать данные только для выстрелов, то их должно хватить...
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
Пара строк и один Float (Ой... Чёт я не о том)

Патроны считаю для того шобы отсеять лишние события атаки и оставить только те, при которых действительно был выстрел
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
А если ставить этот плагин ради, например, 1-5 пушек? Получится шо большая часть ячеек будет просто так занимать память.
Вводишь константу для размера массива. Юзер редактирует под свои нужды.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
ArKaNeMaN, ну вычти в пре единицу и проверь на 0
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
ну вычти в пре единицу и проверь на 0
Не катит... В том то и дело... Если взять пистолет и зажать ЛКМ, то будет один выстрел, а событие будет вызываться каждый кадр пока зажата кнопка... Хз как с этим у автоматического оружия, но с пистолетами такая проблема точно есть
24 Сен 2019
Вообще... Это всё, получается, относится к этой теме
А тут я спрашивал именно про динамические массивы
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
ArKaNeMaN, ну сделай проверку на автоматическую стрельбу
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
ArKaNeMaN, что в итоге надо то? Не забывай о клиентськом предикшине если решил блочить атаку
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Тут надо профайлером смотреть.
Профайлер рипнулся 100 лет в обед. Его даже под 1.8.3 нет, не говоря уж про 1.9.0. Кое-какие замеры можно сделать через эту ботву: https://forums.alliedmods.net/showthread.php?t=199947

Если взять пистолет и зажать ЛКМ
А если взять исходники регейма и посмотреть код для нужного пистолета, ты вы сразу увидите как реализована стрельба и какой оффсет блокирует повторную атаку при ее удержании :smile3:

А тут я спрашивал именно про динамические массивы
По моим замерам через "Execution Time" динамические массивы, разумеется, дают чуток нагрузки (как ни как, нативы), но ничего существенно в этом нет. В целом не понятно, что и зачем вы делаете, но на вид это изобретение очередного велосипеда. Такие конструкции могут понадобиться, разве что для подсчета данных для статистики оружия.
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
433
Реакции
293
Помог
5 раз(а)
А если взять исходники регейма и посмотреть код для нужного пистолета, ты вы сразу увидите как реализована стрельба и какой оффсет блокирует повторную атаку при ее удержании :smile3:
О... Спасибо.... Забываю о том шо так можно делать XD
C++:
#define WEAPON_PISTOLS_BITSUMM (BIT(_:WEAPON_P228)|BIT(_:WEAPON_GLOCK)|BIT(_:WEAPON_ELITE)|BIT(_:WEAPON_FIVESEVEN)|BIT(_:WEAPON_USP)|BIT(_:WEAPON_GLOCK18)|BIT(_:WEAPON_DEAGLE))
#define IsPistol(%0) (WEAPON_PISTOLS_BITSUMM&BIT(rg_get_iteminfo(%0,ItemInfo_iId)))

public Hook_PrimaryAttack_Pre(ItemId){
    if(!IsCustomWeapon(GetWeapId(ItemId)))
        return HAM_IGNORED;

    if(get_member(ItemId, m_Weapon_iClip) < 1)
        return HAM_IGNORED;

    static ShotsFired; ShotsFired = get_member(ItemId, m_Weapon_iShotsFired);
    if(IsPistol(ItemId) && ++ShotsFired > 1)
        return HAM_IGNORED;
    
    //...
    
    return HAM_IGNORED;
}

По моим замерам через "Execution Time" динамические массивы, разумеется, дают чуток нагрузки (как ни как, нативы), но ничего существенно в этом нет.
Ну тогда пусть будет так как есть... Это в принципе всё шо я хотел знать

В целом не понятно, что и зачем вы делаете
Для этого вот...
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу