Не могу получить оставшееся патроны

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
Здравствуйте, может кто подскажет как получить оставшееся патроны?.

Конкретнее - допустим мы имеем оружие weapon_deagle, стандарт патронов 7/35
code:
int i = GetEntProp(iEnt, Prop_Send, "m_iPrimaryReserveAmmoCount");
Переменная i выведет 35. Но если мы потратим и перезарядим оружие, получится уже 7/28 а переменная до сих пор выводит 35. 😡
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
C-подобный:
int ofs = GetEntProp(ent, Prop_Send, "m_iPrimaryAmmoType");
int ammoCount = GetEntProp(client, Prop_Send, "m_iAmmo", ofs);
maybe
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
ну как-то так вроде должно получиться:
C-подобный:
stock int GetReserveAmmo(int client)
{
    static int o_wpn, o_type, o_ammo, weapon, type;
    // получаем оффсеты
    if((o_wpn > 0 || (o_wpn = FindSendPropInfo("CCSPlayer", "m_hActiveWeapon")) > 0)
    && (o_type > 0 || (o_type = FindSendPropInfo("CWeaponCSBase", "m_iPrimaryAmmoType")) > 0)
    && (o_ammo > 0 || (o_ammo = FindSendPropInfo("CCSPlayer", "m_iAmmo")) > 0)
    // получаем индекс энтити текущего оружия
    && (weapon = GetEntDataEnt2(client, o_wpn)) > MaxClients
    // получаем тип патронов текущего оружия
    && (type = GetEntData(weapon, o_type)) > 0)
    // получаем количество запасных патронов нужного нам типа
            return GetEntData(client, (o_ammo + (type << 2)));

    return -1;
}
 

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
ну как-то так вроде должно получиться:
C-подобный:
stock int GetReserveAmmo(int client)
{
    static int o_wpn, o_type, o_ammo, weapon, type;
    // получаем оффсеты
    if((o_wpn > 0 || (o_wpn = FindSendPropInfo("CCSPlayer", "m_hActiveWeapon")) > 0)
    && (o_type > 0 || (o_type = FindSendPropInfo("CWeaponCSBase", "m_iPrimaryAmmoType")) > 0)
    && (o_ammo > 0 || (o_ammo = FindSendPropInfo("CCSPlayer", "m_iAmmo")) > 0)
    // получаем индекс энтити текущего оружия
    && (weapon = GetEntDataEnt2(client, o_wpn)) > MaxClients
    // получаем тип патронов текущего оружия
    && (type = GetEntData(weapon, o_type)) > 0)
    // получаем количество запасных патронов нужного нам типа
            return GetEntData(client, (o_ammo + (type << 2)));

    return -1;
}
Выводит просто 0. Кстати, что интересно так это то что он выводит от AWP, но от дигла не хочет

Сообщения автоматически склеены:

C-подобный:
int ofs = GetEntProp(ent, Prop_Send, "m_iPrimaryAmmoType");
int ammoCount = GetEntProp(client, Prop_Send, "m_iAmmo", ofs);
maybe
Ну и это тоже выводит 0
 
Последнее редактирование:

Grey83

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

Madness aka null138

Участник
Сообщения
713
Реакции
734
попробуй так.
C++:
int GetReservedAmmo(int weapon)
{     
    int ammoType = GetEntProp(weapon, Prop_Send, "m_iPrimaryAmmoType");
    if(ammoType == -1) return -1;

    return GetEntProp(weapon, Prop_Send, "m_iAmmo", _, ammoType);
}
Сообщения автоматически склеены:

Ну и это тоже выводит 0
там оффсет передается как параметр size вместо element, поэтому выводит 0.
 

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
попробуй так.
C++:
int GetReservedAmmo(int weapon)
{    
    int ammoType = GetEntProp(weapon, Prop_Send, "m_iPrimaryAmmoType");
    if(ammoType == -1) return -1;

    return GetEntProp(weapon, Prop_Send, "m_iAmmo", _, ammoType);
}
Сообщения автоматически склеены:


там оффсет передается как параметр size вместо element, поэтому выводит 0.
Выводит -1, та и ко всему еще и еррорит. (Exception reported: Property "m_iAmmo" not found (entity 106/weapon_deagle))
Сообщения автоматически склеены:

Самый нормальный варик это у Grey83, но он на диглах не пашет.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@MrQout, только что перепроверил.
Я в другом плагине точно так же патроны получаю. И для ксго в тестовом так получал.
Можешь попробовать выводить в чат или консоль информацию о типе патронов (у дигла тип 1 должен быть).
Я таким же макаром запасные выдаю в ксго без проблем.
типы патронов КСГО:
deagle        - 1
ak47        - 2
aug            - 2
g3sg1        - 2
scar        - 2
scout        - 2
famas        - 3
galil        - 3
m4a4        - 3
sg556        - 3
m4a1        - 4
m249        - 5
negev        - 5
awp            - 6
bizon         - 7
glock        - 7
mp5            - 7
mp9            - 7
tec-9        - 7
берреты        - 7
nova        - 8
xm1014        - 8
обрез        - 8
ump-45        - 9
p2000        - 10
usp            - 11
cz75        - 12
FiveSeveN    - 13
p90            - 13
HE            - 14
smoke        - 16
флешка        - 16
молотов        - 17
обманка        - 18
zeus        - 19
P250        - 20
healthshot    - 21
взрывчатка    - 23
 

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
@MrQout, только что перепроверил.
Я в другом плагине точно так же патроны получаю. И для ксго в тестовом так получал.
Можешь попробовать выводить в чат или консоль информацию о типе патронов (у дигла тип 1 должен быть).
Я таким же макаром запасные выдаю в ксго без проблем.
типы патронов КСГО:
deagle        - 1
ak47        - 2
aug            - 2
g3sg1        - 2
scar        - 2
scout        - 2
famas        - 3
galil        - 3
m4a4        - 3
sg556        - 3
m4a1        - 4
m249        - 5
negev        - 5
awp            - 6
bizon         - 7
glock        - 7
mp5            - 7
mp9            - 7
tec-9        - 7
берреты        - 7
nova        - 8
xm1014        - 8
обрез        - 8
ump-45        - 9
p2000        - 10
usp            - 11
cz75        - 12
FiveSeveN    - 13
p90            - 13
HE            - 14
smoke        - 16
флешка        - 16
молотов        - 17
обманка        - 18
zeus        - 19
P250        - 20
healthshot    - 21
взрывчатка    - 23
Тип выводит 1, но выводит 0.
Сообщения автоматически склеены:

Еще требуется помощь 🥺
 
Последнее редактирование:

MrQout

~[C0d3z]
Сообщения
314
Реакции
246
По тестировал еще раз, получает абсолютно всё, начиная от основного оружия заканчивая кол-во гранат. Но конкретно пистолеты это исключение, он не может получить их актуальный запас патронов. Что за бред? хаха.

Ну наконец-то разобрался.
Вообщем, если вам необходимо получать кол-во запаса патронов, гранат и подобного то используйте функцию от Grey83, но если вам необходимо получить кол-во патронов в запасе именно на пистолетах еще, тогда необходим их получать так:

code:
// For pistol
int iAmmo = GetEntProp(iEntity, Prop_Send, "m_iPrimaryReserveAmmoCount");

Ну и соответственно функция которая получает с любого оружия запас патронов, надеюсь кому-то поможет! :)
code:
int GetReserveAmmo(int iClient, int iEnt = -1)
{
   if (iClient <= 0 || !IsClientInGame(iClient) || !IsPlayerAlive(iClient))return -1;
  
   if (iEnt == -1)
   {
       int Offset;
       if ((Offset = FindSendPropInfo("CCSPlayer", "m_hActiveWeapon")) <= 0
           || (iEnt = GetEntDataEnt2(iClient, Offset)) <= 0
           || !IsValidEntity(iEnt))return -1;
   }
   else if(!IsValidEntity(iEnt))return -1;
  
   int iAmmo = -1, iEnt2 = GetPlayerWeaponSlot(iClient, 1);
   if (iEnt2 > 0 && IsValidEntity(iEnt2) && iEnt == iEnt2)
       iAmmo = GetEntProp(iEnt, Prop_Send, "m_iPrimaryReserveAmmoCount");
   else
   {
       int Offset1, Offset2, AmmoType;
       if ((Offset1 = FindSendPropInfo("CWeaponCSBase", "m_iPrimaryAmmoType")) > 0
           && (Offset2 = FindSendPropInfo("CCSPlayer", "m_iAmmo")) > 0
           && (AmmoType = GetEntData(iEnt, Offset1)) > 0)
               iAmmo = GetEntData(iClient, (Offset2 + (AmmoType << 2)));
   }
  
   return iAmmo;
}
 
Последнее редактирование:
Сверху Снизу