Объясните пожалуйста почему EntRefToEntIndex + SDKHook_WeaponCanUse не дружат?

Banana

Участник
Сообщения
892
Реакции
113
C-подобный:
/////////////Пример №1//////////////////////
int Index_WeaponLr[MAXPLAYERS+1];
void SetAmmo(int t, int ct)
{
    int entity_ct = GivePlayerItem(ct, "weapon_deagle");
    int entity_t = GivePlayerItem(t, "weapon_deagle");
    SetEntProp(entity_ct, Prop_Send, "m_iPrimaryReserveAmmoCount", 0); // патроны в запасе
    SetEntProp(entity_t, Prop_Send, "m_iPrimaryReserveAmmoCount", 0); // патроны в запасе
    SetEntProp(entity_ct, Prop_Send, "m_iClip1", 1); // патроны в обойме
    SetEntProp(entity_t, Prop_Send, "m_iClip1", 0); // патроны в обойме
    Index_WeaponLr[ct] = EntIndexToEntRef(entity_ct);
    Index_WeaponLr[t] = EntIndexToEntRef(entity_t);
    
    PrintToChatAll("entity_ct = %d", entity_ct);
    PrintToChatAll("entity_t = %d", entity_t);
}
public item_pickup(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    SDKHook(client, SDKHook_WeaponCanUse, WeaponCanUse);   
}
public Action:WeaponCanUse(int client, int weapon)
{
    int entity = EntRefToEntIndex(Index_WeaponLr[client]);
    PrintToChat(client, "entity == weapon (%d=%d)", entity, weapon);
    if (entity != weapon) return Plugin_Handled; //Не даем взять оружие если оно не то что мы выдали в SetAmmo
    
    return Plugin_Continue; //Оружие взялось, но в нем почему-то нет указанного в SetAmmo количества патронов
}

/////////////Пример №2//////////////////////

int Index_WeaponLr[MAXPLAYERS+1];
void SetAmmo(int t, int ct)
{
    Index_WeaponLr[ct] = GivePlayerItem(ct, "weapon_deagle");
    int Index_WeaponLr[t] = GivePlayerItem(t, "weapon_deagle");
    SetEntProp(Index_WeaponLr[ct], Prop_Send, "m_iPrimaryReserveAmmoCount", 0); // патроны в запасе
    SetEntProp(Index_WeaponLr[t], Prop_Send, "m_iPrimaryReserveAmmoCount", 0); // патроны в запасе
    SetEntProp(Index_WeaponLr[ct], Prop_Send, "m_iClip1", 1); // патроны в обойме
    SetEntProp(Index_WeaponLr[t], Prop_Send, "m_iClip1", 0); // патроны в обойме
    
    PrintToChatAll("entity_ct = %d", entity_ct);
    PrintToChatAll("entity_t = %d", entity_t);
}
public item_pickup(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    SDKHook(client, SDKHook_WeaponCanUse, WeaponCanUse);   
}
public Action:WeaponCanUse(int client, int weapon)
{
    if (Index_WeaponLr[client] != weapon) return Plugin_Handled; //Не даем взять оружие если оно не то что мы выдали в SetAmmo
    
    return Plugin_Continue; //Оружие взялось, И В НЕМ НУЖНОЕ КОЛИЧЕСТВО ПАТРОНОВ
}

Почему так?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
почему как?
какие результаты работы кода?
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
Вероятно, во время тестов оружия принимали одни и те же индексы, и уже были сохранены в Index_WeaponLr[MAXPLAYERS+1]
Не совсем понимаю, почему ты хукаешь WeaponCanUse в item_pickup, я бы выдал оружие, потом а навесил хук на блокировку использования
Так мы точно будем уверены, что оружие в руках, а хук не проглядел или не заблокировал наше оружие, что оно уже в руках игрока
А так, если во время GivePlayerItem навесится хук из-за ивента, и хук действительно сработает, пока выполняется GivePlayerItem, то хук просто не даст взять оружие (но может позволить, если в Index_WeaponLr[MAXPLAYERS+1] хранится индекс старый старого оружия, но равный новому)
 

Banana

Участник
Сообщения
892
Реакции
113
Вероятно, во время тестов оружия принимали одни и те же индексы, и уже были сохранены в Index_WeaponLr[MAXPLAYERS+1]
Не совсем понимаю, почему ты хукаешь WeaponCanUse в item_pickup, я бы выдал оружие, потом а навесил хук на блокировку использования
Так мы точно будем уверены, что оружие в руках, а хук не проглядел или не заблокировал наше оружие, что оно уже в руках игрока
А так, если во время GivePlayerItem навесится хук из-за ивента, и хук действительно сработает, пока выполняется GivePlayerItem, то хук просто не даст взять оружие (но может позволить, если в Index_WeaponLr[MAXPLAYERS+1] хранится индекс старый старого оружия, но равный новому)
Спасибо, ваша рекомендация исправлю проблему, но пока не пойму почему.. обьясните?
 

Banana

Участник
Сообщения
892
Реакции
113
Оффтоп
почему EntRefToEntIndex, а не GetEntPropEnt?
обьясните какая между ними связь и в чем отличие относительно а данному решению.. Ref использую чтоб быть уверенным что в любой момент времени я обращусь к тому обьекту который я хочу (из-за смены индекса предмета)
 

Nebraska

Участник
Сообщения
225
Реакции
293
@Banana, записывай индекс оружия сразу в массив и будет тебе счастье. EntIndexToEntRef - аналог user id у клиента. К примеру, с таймером он будет кстати. Ты столько лет кодишь и на таких мелочах теряешься...
 
Последнее редактирование:
Сверху Снизу