Забрать все оружие игрока и с последующим его возвратом

MrBoogidy

Участник
Сообщения
24
Реакции
19
Народ, помогите решить проблему. Задача: забрать у игрока все оружие и вернуть его в определенный момент в случае необходимости.
Игра CS:GO (если это важно)

Сделал так:
PHP:
char PrimaryWeaponName[][] = {"weapon_ak47", "weapon_aug", "weapon_awp", "weapon_famas", "weapon_g3sg1", "weapon_galilar", "weapon_m249", "weapon_m4a1", "weapon_mac10", "weapon_p90", "weapon_ump45", "weapon_xm1014", "weapon_bizon", "weapon_mag7", "weapon_negev", "weapon_scar20", "weapon_sg556", "weapon_ssg08"};
char ClientPrimaryWeapon[MAXPLAYERS+1][1][64];

SaveWeapons(client) //сохраняем пушку
{
    char sPimaryBuff[64];
    GetClientWeapon(client, sPimaryBuff, sizeof(sPimaryBuff));
    LogMessage("Client %N has a %s", client, sPimaryBuff);
    for ( int i = 0; i <= sizeof(PrimaryWeaponName); i++)
    {
        if (StrEqual(sPimaryBuff, PrimaryWeaponName[i]))
        {
            ClientPrimaryWeapon[client][0] = sPimaryBuff;
            StripWeapons(client);
            LogMessage("Saved weapon %s to client %N", ClientPrimaryWeapon[client][0], client);
        }else
        {
            StripWeapons(client);
        }
    }
}

StripWeapons(client)
{
    LogMessage("We are in stripweapon function");
    int primary = GetPlayerWeaponSlot ( client, CS_SLOT_PRIMARY );
    if(primary != INVALID_ENT_REFERENCE && IsValidEdict(primary)){
        RemovePlayerItem(client, primary);
        RemoveEdict(primary);
    }
    int secondary = GetPlayerWeaponSlot(client, CS_SLOT_SECONDARY);
    if(secondary != INVALID_ENT_REFERENCE && IsValidEdict(secondary)){
        RemovePlayerItem(client, secondary);
        RemoveEdict(secondary);
    }
    int grenade = GetPlayerWeaponSlot(client, CS_SLOT_GRENADE);
    if(grenade != INVALID_ENT_REFERENCE && IsValidEdict(grenade)){
        RemovePlayerItem(client, grenade);
        RemoveEdict(grenade);
    }
}

GiveWeapons(client)
{
    GivePlayerItem(client, ClientPrimaryWeapon[client][0]);
    LogMessage("Give client %N his %s", client, ClientPrimaryWeapon[client][0]);
}
Но выдается только то оружие, которое находится в руках.
А мне бы нужно, что бы и Primary и Secondary пушки сохранялись с последующей выдачей.

Попробовал вот так:
PHP:
int    iActiveWeapon[MAXPLAYERS+1],
    iPrimAddonWpn[MAXPLAYERS+1],
    iSecAddonWpn[MAXPLAYERS+1];

SaveWeapons(client)
{
    if (client && IsClientInGame(client) && IsPlayerAlive(client))
    {
        iPrimAddonWpn[client] = GetEntProp(client, Prop_Send, "m_iPrimaryAddon");
        iSecAddonWpn[client] = GetEntProp(client, Prop_Send, "m_iSecondaryAddon");
        iActiveWeapon[client] = GetEntProp(client, Prop_Send, "m_hActiveWeapon");
     
        StripWeapons(client);
    }
}

StripWeapons(client)
{
    int primary = GetPlayerWeaponSlot ( client, CS_SLOT_PRIMARY );
    if(primary != INVALID_ENT_REFERENCE && IsValidEdict(primary)){
        RemovePlayerItem(client, primary);
        RemoveEdict(primary);
    }
    int secondary = GetPlayerWeaponSlot(client, CS_SLOT_SECONDARY);
    if(secondary != INVALID_ENT_REFERENCE && IsValidEdict(secondary)){
        RemovePlayerItem(client, secondary);
        RemoveEdict(secondary);
    }
    int grenade = GetPlayerWeaponSlot(client, CS_SLOT_GRENADE);
    if(grenade != INVALID_ENT_REFERENCE && IsValidEdict(grenade)){
        RemovePlayerItem(client, grenade);
        RemoveEdict(grenade);
    }
}

GiveWeapons(client)
{
    EquipPlayerWeapon(client, iActiveWeapon[client]);
    if(iPrimAddonWpn[client] > 0)
    {
        EquipPlayerWeapon(client, iPrimAddonWpn[client]);
    }
    if(iSecAddonWpn[client] > 0)
    {
        EquipPlayerWeapon(client, iSecAddonWpn[client]);
    }
}
Второй вариант компилируется без ошибок, но не работает. Пушки стрипаются, но вот потом не выдаются. Не работает функция GiveWeapons.
Как выдавать оружие по ай ди?

Или может кто-то подскажет по первому способу, как сохранить все оружия, а не только активное? Дайте подсказок, спасибо.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
как сохранить все оружия
PHP:
#include <sdktools_entinput>
#include <sdktools_functions>

new Handle:g_hWeapons[MAXPLAYERS + 1];

public OnPluginStart()
{
	for (new i = 1; i < sizeof(g_hWeapons); ++i) g_hWeapons[i] = CreateArray(32);
}

public OnClientDisconnect_Post(client) ClearArray(g_hWeapons[client]);

//Одновременно сохраняет и удаляет всё оружие игрока с индексом client
SaveDeleteWeaponsPlayer(client)
{
	decl String:classname[32], weapon;
	for (new slot; slot < 5; ++slot)
	{
		while ((weapon = GetPlayerWeaponSlot(client, slot)) != -1)
		{
			GetEdictClassname(weapon, classname, sizeof(classname));
			PushArrayString(g_hWeapons[client], classname);
			RemovePlayerItem(client, weapon);
			AcceptEntityInput(weapon, "Kill");
		}
	}
}

//Выдаёт всё сохранённое оружие игроку с индексом client
GiveDeletedWeapons(client)
{
	decl String:classname[32];
	for (new i = GetArraySize(g_hWeapons[client]) -1; i > -1; --i)
	{
		GetArrayString(g_hWeapons[client], i, classname, sizeof(classname));
		GivePlayerItem(client, classname);
	}
	//ClearArray(g_hWeapons[client]);		//Очистить сохранённое оружие после его выдачи?
}
 
Сверху Снизу