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

Тема в разделе "Программирование / Скриптинг", создана пользователем MrBoogidy, 17 авг 2016.

  1. MrBoogidy

    MrBoogidy

    Сообщения:
    23
    Симпатии:
    2
    Народ, помогите решить проблему. Задача: забрать у игрока все оружие и вернуть его в определенный момент в случае необходимости.
    Игра 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(clientsPimaryBuffsizeof(sPimaryBuff));
        
    LogMessage("Client %N has a %s"clientsPimaryBuff);
        for ( 
    int i 0<= sizeof(PrimaryWeaponName); i++)
        {
            if (
    StrEqual(sPimaryBuffPrimaryWeaponName[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 clientCS_SLOT_PRIMARY );
        if(
    primary != INVALID_ENT_REFERENCE && IsValidEdict(primary)){
            
    RemovePlayerItem(clientprimary);
            
    RemoveEdict(primary);
        }
        
    int secondary GetPlayerWeaponSlot(clientCS_SLOT_SECONDARY);
        if(
    secondary != INVALID_ENT_REFERENCE && IsValidEdict(secondary)){
            
    RemovePlayerItem(clientsecondary);
            
    RemoveEdict(secondary);
        }
        
    int grenade GetPlayerWeaponSlot(clientCS_SLOT_GRENADE);
        if(
    grenade != INVALID_ENT_REFERENCE && IsValidEdict(grenade)){
            
    RemovePlayerItem(clientgrenade);
            
    RemoveEdict(grenade);
        }
    }

    GiveWeapons(client)
    {
        
    GivePlayerItem(clientClientPrimaryWeapon[client][0]);
        
    LogMessage("Give client %N his %s"clientClientPrimaryWeapon[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(clientProp_Send"m_iPrimaryAddon");
            
    iSecAddonWpn[client] = GetEntProp(clientProp_Send"m_iSecondaryAddon");
            
    iActiveWeapon[client] = GetEntProp(clientProp_Send"m_hActiveWeapon");
         
            
    StripWeapons(client);
        }
    }

    StripWeapons(client)
    {
        
    int primary GetPlayerWeaponSlot clientCS_SLOT_PRIMARY );
        if(
    primary != INVALID_ENT_REFERENCE && IsValidEdict(primary)){
            
    RemovePlayerItem(clientprimary);
            
    RemoveEdict(primary);
        }
        
    int secondary GetPlayerWeaponSlot(clientCS_SLOT_SECONDARY);
        if(
    secondary != INVALID_ENT_REFERENCE && IsValidEdict(secondary)){
            
    RemovePlayerItem(clientsecondary);
            
    RemoveEdict(secondary);
        }
        
    int grenade GetPlayerWeaponSlot(clientCS_SLOT_GRENADE);
        if(
    grenade != INVALID_ENT_REFERENCE && IsValidEdict(grenade)){
            
    RemovePlayerItem(clientgrenade);
            
    RemoveEdict(grenade);
        }
    }

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

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.583
    Симпатии:
    1.990
    PHP:
    #include <sdktools_entinput>
    #include <sdktools_functions>

    new Handle:g_hWeapons[MAXPLAYERS 1];

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

    public 
    OnClientDisconnect_Post(clientClearArray(g_hWeapons[client]);

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

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