> > > >

ReturnAmmo 1.0.0

Нет прав для скачивания
Сообщения
17
Рейтинг
29
#1
Drumanid добавил(а) новый ресурс:

ReturnAmmo - Возвращает потраченные патроны игроку после убийства или же перезарядки.

Возвращает(восстанавливает) потраченные патроны игроку после убийства или же перезарядки.
Демонстрация:


C++:
#include <sdkhooks>

public Plugin myinfo =
{
    name = "Return Ammo",
    author = "Drumanid",
    version = "1.0.0",
    url = "http://vk.com/drumanid"
};

StringMap g_hTrie;
int g_iReturnType;

public void OnPluginStart()
{
    g_hTrie = new StringMap();

    g_hTrie.SetValue("7", 30)...
Узнать больше об этом ресурсе...
 
  3
Сообщения
110
Рейтинг
89
#2
Лучше сделать массив на все пушки, избавившись от использования Trie, ещё и строковым.
 
  1
Сообщения
17
Рейтинг
29
#3
Лучше сделать массив на все пушки, избавившись от использования Trie, ещё и строковым.
Ну такое себе...

C++:
#include <sdkhooks>

public Plugin myinfo =
{
    name = "Return Ammo",
    author = "Drumanid",
    version = "1.0.0",
    url = "http://vk.com/drumanid"
};

static const int g_iWeapons[][] =
{
    {7, 30}, {16, 30}, {9, 10}, {60, 20}, {10, 25}, {13, 35}, {39, 30}, {8, 30}, {40, 10}, {17, 30}, {34, 30},
    {33, 30}, {24, 25}, {19, 50}, {26, 64}, {35, 8}, {25, 7}, {27, 5}, {29, 7}, {28, 150}, {14, 100}, {4, 20},
    {61, 12}, {32, 13}, {36, 13}, {30, 18}, {1, 7}, {2, 30}, {3, 20}, {63, 12}, {64, 8}, {23, 30}
};

/*static const int g_iWeapons[] =
{
    7, 16, 9, 60, 10, 13, 39, 8, 40, 17, 34,
    33, 24, 19, 26, 35, 25, 27, 29, 28, 14,
    4, 61, 32, 36, 30, 1, 2, 3, 63, 64, 23
};

static const int g_iAmmo[] =
{
    30, 30, 10, 20, 25, 35, 30, 30, 10, 30, 30,
    30, 25, 50, 64, 8, 7, 5, 7, 150, 100, 20,
    12, 13, 13, 18, 7, 30, 20, 12, 8, 30
};*/

int    g_iReturnType;

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre);

    ConVar hCvar = CreateConVar("sm_return_ammo", "2", "0 - возвращать обойму / 1 - запас / 2 - запас и обойму");
    hCvar.AddChangeHook(HookCvarTime); g_iReturnType = hCvar.IntValue;
    AutoExecConfig(true, "ReturnAmmo");
}

public void HookCvarTime(ConVar hCvar, const char[] sOldValue, const char[] sNewValue)
{
    g_iReturnType = hCvar.IntValue;
}

public void OnEntityCreated(int iEntity, const char[] sClassname)
{
    if(g_iReturnType != 0 && StrContains(sClassname, "weapon_", false) != -1) SDKHook(iEntity, SDKHook_ReloadPost, ReloadPost);
}

public void ReloadPost(int iWeapon, bool bSuccess)
{
    if(bSuccess) SetAmmo(iWeapon, false);
}

public void Event_PlayerDeath(Event hEvent, const char[] sName, bool bDbc)
{
    if(g_iReturnType != 1)
    {
        int iUserId = hEvent.GetInt("attacker");
        if(iUserId != hEvent.GetInt("userid"))
        {
            int iWeapon = GetEntPropEnt(GetClientOfUserId(iUserId), Prop_Data, "m_hActiveWeapon");
            if(iWeapon > 0) SetAmmo(iWeapon, true);
        }
    }
}

void SetAmmo(int iWeapon, bool bFire)
{
    int iItem = GetEntProp(iWeapon, Prop_Send, "m_iItemDefinitionIndex");
    for(int i; i < /*sizeof(g_iWeapons)*/31; i++)
    {
        if(g_iWeapons[i][0] == iItem)
        {
            SetEntProp(iWeapon, Prop_Send, "m_iClip1", bFire ? g_iWeapons[i][1] +1:g_iWeapons[i][1]);
            break;
        }
    }
}
C++:
#include <sdkhooks>

public Plugin myinfo =
{
    name = "Return Ammo",
    author = "Drumanid",
    version = "1.0.0",
    url = "http://vk.com/drumanid"
};

static const int g_iAmmo[] =
{
    0, 7, 30, 20, 20, 0, 0, 30, 30, 10, 25,0, 0, 35, 100,
    0, 30, 30, 0, 50, 0, 0, 0, 30, 25, 7, 64, 5, 150, 7,
    18, 0, 13, 30, 30, 8, 13, 0, 0, 30, 10, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 12, 12, 8
};

int    g_iReturnType;

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre);

    ConVar hCvar = CreateConVar("sm_return_ammo", "2", "0 - возвращать обойму / 1 - запас / 2 - запас и обойму");
    hCvar.AddChangeHook(HookCvarTime); g_iReturnType = hCvar.IntValue;
    AutoExecConfig(true, "ReturnAmmo");
}

public void HookCvarTime(ConVar hCvar, const char[] sOldValue, const char[] sNewValue)
{
    g_iReturnType = hCvar.IntValue;
}

public void OnEntityCreated(int iEntity, const char[] sClassname)
{
    if(g_iReturnType != 0 && StrContains(sClassname, "weapon_", false) != -1) SDKHook(iEntity, SDKHook_ReloadPost, ReloadPost);
}

public void ReloadPost(int iWeapon, bool bSuccess)
{
    if(bSuccess) SetEntProp(iWeapon, Prop_Send, "m_iClip1", g_iAmmo[GetEntProp(iWeapon, Prop_Send, "m_iItemDefinitionIndex")]);
}

public void Event_PlayerDeath(Event hEvent, const char[] sName, bool bDbc)
{
    if(g_iReturnType != 1)
    {
        int iUserId = hEvent.GetInt("attacker");
        if(iUserId != hEvent.GetInt("userid"))
        {
            int iWeapon = GetEntPropEnt(GetClientOfUserId(iUserId), Prop_Data, "m_hActiveWeapon");
            if(iWeapon > 0) SetEntProp(iWeapon, Prop_Send, "m_iClip1", g_iAmmo[GetEntProp(iWeapon, Prop_Send, "m_iItemDefinitionIndex")] +1);
        }
    }
}

/*void SetAmmo(int iWeapon, bool bFire)
{
    SetEntProp(iWeapon, Prop_Send, "m_iClip1", g_iAmmo[GetEntProp(iWeapon, Prop_Send, "m_iItemDefinitionIndex")] + (bFire ? 1:0));
}*/
 
Последнее редактирование:
 
Сообщения
110
Рейтинг
89
#4
Drumanid, массив можно было и не инициализировать, а чтоб он сам заполнился после выдачи оружия.
 
 
Сообщения
17
Рейтинг
29
#5
fl0wer, лишние проверки и хук. Я понимаю если бы значения менялись, в этом был бы смысл.
Короче, кто будет использовать пусть выбирает из трех вариантов.

C++:
#include <sdkhooks>

#define GWI(%0) GetEntProp(%0, Prop_Send, "m_iItemDefinitionIndex")

public Plugin myinfo =
{
    name = "Return Ammo",
    author = "Drumanid",
    version = "1.0.1",
    url = "http://vk.com/drumanid"
};

int g_iAmmo[64], g_iReturnType;

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre);

    ConVar hCvar = CreateConVar("sm_return_ammo", "2", "0 - возвращать обойму / 1 - запас / 2 - запас и обойму");
    hCvar.AddChangeHook(HookCvarTime); g_iReturnType = hCvar.IntValue;
    AutoExecConfig(true, "ReturnAmmo");
}

public void HookCvarTime(ConVar hCvar, const char[] sOldValue, const char[] sNewValue) { g_iReturnType = hCvar.IntValue; }
public void OnClientPostAdminCheck(int iClient) { SDKHook(iClient, SDKHook_WeaponEquipPost, WeaponEquipPost); }

public void WeaponEquipPost(int iClient, int iWeapon)
{
    int iNumber = GWI(iWeapon);
    if(g_iAmmo[iNumber] == 0) g_iAmmo[iNumber] = GetEntProp(iWeapon, Prop_Send, "m_iClip1");
}

public void OnEntityCreated(int iEntity, const char[] sClassname)
{
    if(g_iReturnType != 0 && StrContains(sClassname, "weapon_", false) != -1) SDKHook(iEntity, SDKHook_ReloadPost, ReloadPost);
}

public void ReloadPost(int iWeapon, bool bSuccess)
{
    if(bSuccess) SetEntProp(iWeapon, Prop_Send, "m_iClip1", g_iAmmo[GWI(iWeapon)]);
}

public void Event_PlayerDeath(Event hEvent, const char[] sName, bool bDbc)
{
    if(g_iReturnType != 1)
    {
        int iUserId = hEvent.GetInt("attacker");
        if(iUserId != hEvent.GetInt("userid"))
        {
            int iWeapon = GetEntPropEnt(GetClientOfUserId(iUserId), Prop_Data, "m_hActiveWeapon");
            if(iWeapon > 0) SetEntProp(iWeapon, Prop_Send, "m_iClip1", g_iAmmo[GWI(iWeapon)] +1);
        }
    }
}
 

Вложения

Последнее редактирование:
  2
> > > >