Показано с 1 по 8 из 8

Тема: Основа для инвентаря взаимосвязаного с оружием

  1. #1
    Проверенный Аватар для e.kosovskij
    Регистрация
    09.07.2010
    Адрес
    Украина, Харьков
    Сообщений
    3,180
    Репутация: 308

    Звание: как роза среди колючек

    Основа для инвентаря взаимосвязаного с оружием

    Писал тестовое задание для приема на работу, поэтому уже нет надобности в нём.
    Выкладываю, вдруг пригодится кому на доработку.

    Инвентарь расчитан на 20 ячеек для вещей.
    Открыть инвентарь - Y (там идет по номеру слота по возрастанию)
    Добавить предмет - /addstuff [ид предмета] [количество] [string до 32 символов] [значение с плавающей точкой]
    (оружие выдается так же, если выбирает ид предмета от 1 до 46)
    Удалить предмет - /delstuff [номер слота] (если оружие, то тоже забирается)
    Открыть от сортированный инвентарь (по количеству, в убывание) - /inv1

    При выстрелах из любого оружия изменяется так же количество патронов в инвентаре.









    PHP код:
    #include <a_samp>
    #include <sscanf2>
    #include <izcmd>
     
     
    #define SCM(%0,%1)      SendClientMessage(%0,-1,%1)
    #define INV_MAX_SLOT    20
    #define INV_MAX_STUFF   5 // +43 из них это все оружие
     
     
    enum EnumPlayerInv
    {
        
    i_stuffid,
        
    i_value,
        
    i_string[32],
        
    Floati_float
    };
     
    new
        
    pname[MAX_PLAYERS][24],
     
        
    invinfo[MAX_PLAYERS][INV_MAX_SLOT][EnumPlayerInv],
        
    invstuff[INV_MAX_STUFF][32] =
        {
            
    "Паспорт",
            
    "Медицинская карта",
            
    "Права категории 'A'",
            
    "Права категории 'B'",
            
    "Права категории 'C'"
        
    },
        
    WEAPON_ID[MAX_PLAYERS][13],
        
    WEAPON_AMMO[MAX_PLAYERS][13],
        
    WEAPON_INVSLOT[MAX_PLAYERS][13]
    ;
     
     
    public 
    OnFilterScriptInit()
    {
        return 
    1;
    }
     
    public 
    OnFilterScriptExit()
    {
        return 
    1;
    }
     
    public 
    OnPlayerConnect(playerid)
    {
        
    GetPlayerName(playeridpname[playerid], 24);
     
        for(new 
    0INV_MAX_SLOTi++)
        {
            if(
    13)
            {
                
    WEAPON_ID[playerid][i] = 0;
                
    WEAPON_AMMO[playerid][i] = 0;
                
    WEAPON_INVSLOT[playerid][i] = -1;
            }
            
    invinfo[playerid][i][i_stuffid] = 0;
        }
        
    SCM(playerid"Открыть инвентарь: Y, добавить предмет: /addstuff, удалить предмет: /delstuff, сортировка по количеству: /inv1, сортировка по алфавиту: /inv2");
        return 
    1;
    }
     
    public 
    OnPlayerDisconnect(playeridreason)
    {
        return 
    1;
    }
     
    public 
    OnPlayerDeath(playeridkilleridreason)
    {
        return 
    1;
    }
     
    public 
    OnPlayerWeaponShot(playeridweaponidhittypehitidFloat:fXFloat:fYFloat:fZ)
    {
        new 
    slot GetSlotWeaponID(weaponid);
        if(
    WEAPON_AMMO[playerid][slot] > 0)
        {
            
    WEAPON_AMMO[playerid][slot]--;
            
    invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_value]--;
            if(
    WEAPON_AMMO[playerid][slot] == 0)
            {
                
    invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_stuffid] = 0;
                
    WEAPON_ID[playerid][slot] = 0;
                
    WEAPON_INVSLOT[playerid][slot] = -1;
            }
        }
        return 
    1;
    }
     
    public 
    OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        if(
    newkeys 65536)
        {
            new 
    dialogInfo[64*INV_MAX_SLOT], count 0;
            for(new 
    0INV_MAX_SLOTi++)
            {
                if(!
    invinfo[playerid][i][i_stuffid]) continue;
                new 
    weaponname[32];
                if(
    invinfo[playerid][i][i_stuffid] < 47)
                    
    GetWeaponName(invinfo[playerid][i][i_stuffid], weaponnamesizeof weaponname);
                
    format(dialogInfosizeof dialogInfo"%s%i. %s (кол-во: %d)\n",
                    
    dialogInfo,
                    
    i+1,
                    (
    invinfo[playerid][i][i_stuffid] > 46) ? (invstuff[invinfo[playerid][i][i_stuffid]-47]) : (weaponname),
                    
    invinfo[playerid][i][i_value]
                );
                
    count++;
            }
            
    ShowPlayerDialog(playerid789DIALOG_STYLE_LIST"Инвентарь", (!count) ? ("У вас нет предметов") : (dialogInfo), "Выбрать""Закрыть");
        }
        return 
    1;
    }
     
    public 
    OnPlayerClickTextDraw(playeridText:clickedid)
    {
        return 
    1;
    }
     
    public 
    OnDialogResponse(playeriddialogidresponselistiteminputtext[])
    {
        switch(
    dialogid)
        {
            case 
    789:
            {
                if(!
    response || !strval(inputtext)) return 1;
                new 
    str[73];
                
    format(str66"Выбран слот #%i."strval(inputtext));
                
    SCM(playeridstr);
            }
        }
        return 
    1;
    }
     
    COMMAND:addstuff(playeridparams[])
    {
        new 
    stuffidvaluestring[32], floatt;
        if(
    sscanf(params"ids[32]f"stuffidvaluestringfloatt)) return SCM(playerid"Используйте: /additem [ид предмета] [кол-во] [string] [float]");
        new 
    slot FindFreeInvSlot(playerid);
        if(
    slot == -1) return SCM(playerid"В вашем инвентаре нет свободного слота. Чтобы удалить предмет, введите /invdel");
        if(
    stuffid || stuffid 46+INV_MAX_STUFF || stuffid == 19 || stuffid == 20 || stuffid == 21)
            return 
    SCM(playerid"Допустимые иды предметов: 1-46 - оружие, 47 - паспорт, 48 - мед.карта, 49 - права A, 50 - права B, 51 - права C.");
        if(
    value || value 1000) return SCM(playerid"Количество может быть от 1 до 1000.");
        if(
    strlen(string) > 32) return SCM(playerid"String не должен иметь более 32 символов.");
        if(
    0.0 floatt || floatt 1000.0) return SCM(playerid"Float может быть от 0.0 до 1000.0.");
       
        if(
    stuffid 46)
        {
            
    invinfo[playerid][slot][i_stuffid] = stuffid;
            
    invinfo[playerid][slot][i_value] = value;
            
    strmid(invinfo[playerid][slot][i_string], string0strlen(string), 32);
            
    invinfo[playerid][slot][i_float] = floatt;
        }
        else 
    GiveWeapon(playeridstuffidvalue);
     
        new 
    str[73];
        
    format(str66"Вы добавили предмет в ваш инвентарь. Предмет занесен в #%d слот."slot+1);
        
    SCM(playeridstr);
        if(
    stuffid 47GetWeaponName(stuffidstrsizeof str);
        
    format(str73"Название предмета: %s    (ид предмета: %i)", (stuffid 46) ? (invstuff[stuffid-47]) : (str), stuffid);
        
    SCM(playeridstr);
        
    format(str16"Количество: %d"value);
        
    SCM(playeridstr);
        
    format(str42"String: %s"string);
        
    SCM(playeridstr);
        
    format(str11"Float: %f"floatt);
        
    SCM(playeridstr);
        return 
    1;
    }
     
    COMMAND:delstuff(playeridparams[])
    {
        new 
    slot;
        if(
    sscanf(params"i"slot)) return SCM(playerid"Используйте: /delstuff [номер слот]");
        if(
    slot || slot INV_MAX_SLOT) return SCM(playerid"Номер слота может быть от 1 до 20.");
        
    slot--;
        if(!
    invinfo[playerid][slot][i_stuffid]) return SCM(playerid"В этом слоте нет предмета.");
     
        if(
    invinfo[playerid][slot][i_stuffid] > 46)
        {
            
    invinfo[playerid][slot][i_stuffid] = 0;
            
    invinfo[playerid][slot][i_value] = 0;
            
    invinfo[playerid][slot][i_string] = EOS;
            
    invinfo[playerid][slot][i_float] = 0.0;
        }
        else 
    ResetWeapon(playeridGetSlotWeaponID(invinfo[playerid][slot][i_stuffid]));
        new 
    str[32];
        
    format(str32"Вы удалили предмет в #%i слоте."slot+1);
        
    SCM(playeridstr);
        return 
    1;
    }
     
    COMMAND:inv1(playeridparams[])
    {
     
        new 
    _i 1_j 2parts[INV_MAX_SLOT];
        for(new 
    0INV_MAX_SLOTi++)
        {
            
    parts[i] = i;
        }
        while(
    _i INV_MAX_SLOT)
        {
            if(
    invinfo[playerid][parts[_i-1]][i_value] > invinfo[playerid][parts[_i]][i_value])
            {
                
    _i _j;
                
    _j++;
            }
            else
            {
                
    parts[_i] += parts[_i-1];
                
    parts[_i-1] = parts[_i]-parts[_i-1];
                
    parts[_i] -= parts[_i-1];
                
    _i--;
                if(
    _i == 0)
                {
                    
    _i _j;
                    
    _j++;
                }
            }
        }
     
        new 
    dialogInfo[64*INV_MAX_SLOT], count 0;
        for(new 
    0INV_MAX_SLOTi++)
        {
            if(!
    invinfo[playerid][parts[i]][i_stuffid]) continue;
            new 
    weaponname[32];
            if(
    invinfo[playerid][parts[i]][i_stuffid] < 47)
                
    GetWeaponName(invinfo[playerid][parts[i]][i_stuffid], weaponnamesizeof weaponname);
            
    format(dialogInfosizeof dialogInfo"%s%i. %s (кол-во: %d)\n",
                
    dialogInfo,
                
    parts[i]+1,
                (
    invinfo[playerid][parts[i]][i_stuffid] > 46) ? (invstuff[invinfo[playerid][parts[i]][i_stuffid]-47]) : (weaponname),
                
    invinfo[playerid][parts[i]][i_value]
            );
            
    count++;
        }
        
    ShowPlayerDialog(playerid789DIALOG_STYLE_LIST"Инвентарь (сортировка по количеству в убывание)", (!count) ? ("У вас нет предметов") : (dialogInfo), "Выбрать""Закрыть");
        return 
    1;
    }
     
    FindFreeInvSlot(playerid)
    {
        new 
    i;
        for(
    0INV_MAX_SLOT+1i++)
        {
            if(
    == INV_MAX_SLOT) break;
            if(!
    invinfo[playerid][i][i_stuffid])
            {
                break;
            }
        }
        return (
    == INV_MAX_SLOT) ? (-1) : (i);
    }
     
    GetSlotWeaponID(weaponid)
    {
        switch(
    weaponid)
        {
            case 
    01: return 0;
            case 
    2..9: return 1;
            case 
    10..15: return 10;
            case 
    16..1839: return 8;
            case 
    22..24: return 2;
            case 
    25..27: return 3;
            case 
    282932: return 4;
            case 
    3031: return 5;
            case 
    3334: return 6;
            case 
    35..38: return 7;
            case 
    40: return 12;
            case 
    41..43: return 9;
            case 
    44..46: return 11;
        }
        return -
    1;
    }
     
    GiveWeapon(playeridgunidammo)
    {
        new 
    invslot FindFreeInvSlot(playerid);
        if(
    invslot == -1) return 1;
        new 
    slot GetSlotWeaponID(gunid);
        if(
    slot == -1) return 1;
        
    invinfo[playerid][invslot][i_stuffid] = gunid;
        
    invinfo[playerid][invslot][i_value] = ammo;
       
        
    WEAPON_ID[playerid][slot] = gunid;
        
    WEAPON_AMMO[playerid][slot] = ammo;
        
    WEAPON_INVSLOT[playerid][slot] = invslot;
        
    GivePlayerWeapon(playeridgunidammo);
        return 
    1;
    }
     
    ResetWeapon(playeridslot)
    {
        
    ResetPlayerWeapons(playerid);
        
    WEAPON_ID[playerid][slot] = 0;
        
    WEAPON_AMMO[playerid][slot] = 0;
        
    invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_stuffid] = 0;
        
    invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_value] = 0;
        
    WEAPON_INVSLOT[playerid][slot] = -1;
        for(new 
    013i++)
        {
            if(!
    WEAPON_ID[playerid][i]) continue;
            
    GivePlayerWeapon(playeridWEAPON_ID[playerid][i], WEAPON_AMMO[playerid][i]);
        }
        return 
    1;

    Последний раз редактировалось e.kosovskij; 13.01.2016 в 04:21.

  2. 1 пользователь сказал cпасибо e.kosovskij за это полезное сообщение:

    Fallen A. (13.01.2016)

  3. #2

  4. #3
    Проверенный Аватар для e.kosovskij
    Регистрация
    09.07.2010
    Адрес
    Украина, Харьков
    Сообщений
    3,180
    Репутация: 308

    Звание: как роза среди колючек
    Цитата Сообщение от Fallen A. Посмотреть сообщение
    СкринОФФ нет?
    Что там скринить, он на диалогах.

  5. #4
    Проверенный Аватар для Dr.Vandersexxx
    Регистрация
    09.01.2011
    Адрес
    Kherson
    Возраст
    31
    Сообщений
    1,240
    Репутация: 219

    Звание: - весьма и весьма положительная личность
    Цитата Сообщение от e.kosovskij Посмотреть сообщение
    Что там скринить, он на диалогах.
    Делай ебт скрины, скрины интересуют людей
    <3 Sex and flood

  6. #5
    ID 1 Аватар для LCBot
    Регистрация
    18.03.2010
    Сообщений
    30
    Репутация: 103

    Звание: скоро придёт к известности
    Лучше бы, конечно, добавил код прямо в тему.
    Если код занимает много места - можно спрятать под спойлер.

  7. #6
    Активный пользователь Аватар для Argument
    Регистрация
    06.11.2012
    Адрес
    δδδδδδδδδδδδδδδδ
    Возраст
    55
    Сообщений
    780
    Репутация: 118

    Звание: скоро придёт к известности
    LCBot, муйсоновский ид приватизировали.

  8. #7
    Проверенный Аватар для e.kosovskij
    Регистрация
    09.07.2010
    Адрес
    Украина, Харьков
    Сообщений
    3,180
    Репутация: 308

    Звание: как роза среди колючек
    Цитата Сообщение от Dr.Vandersexxx Посмотреть сообщение
    Делай ебт скрины, скрины интересуют людей





    Цитата Сообщение от LCBot Посмотреть сообщение
    Лучше бы, конечно, добавил код прямо в тему.
    Если код занимает много места - можно спрятать под спойлер.
    Добавил код в [ PHP]
    Последний раз редактировалось e.kosovskij; 13.01.2016 в 04:21.

  9. #8
    Джентльмен лжец Аватар для Fallen A.
    Регистрация
    03.09.2011
    Адрес
    Минск, БССР
    Возраст
    30
    Сообщений
    2,409
    Репутация: 337

    Звание: как роза среди колючек
    Цитата Сообщение от e.kosovskij Посмотреть сообщение






    Добавил код в [ PHP]
    Вот такое я, пожалуй, и возьму: давно хотел сделать, а руки никак не доходили.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •