Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Бонусная система

Статус
В этой теме нельзя размещать новые ответы.

feskocheats

Умник
Всем здравствуйте, делать было нечего, а правильнее что хочу - то не выходит, решил потренироваться на стандартных инклудах.
И получилось что-то типо системы бонусов.
Суть ее в том:
Если вы взяли бонусный пикап, то вам дадут +1500$ и пикап исчезнет.
Пикапы можно создавать из игры командой /addbonus (только для RCON админов)
Запись/сохранение на инклуде file

Ну и собственно система:

PHP:
#include <a_samp>

#define mbs 75//максимум пикапов

main(){}
enum b
{
    Float:coord[3],//коодринаты
    pickup//pickup
};
new bns[mbs][b];//:D
new counter;//подсчет

public OnGameModeInit()
{
    createbonus();//загоним все
    return 1;
}

public OnGameModeExit()
{
    for(new pi; pi<counter; pi++) DestroyPickup(bns[pi][pickup]);//убъем все
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/addbonus", cmdtext, true, 9) == 0)
    {
        if(IsPlayerAdmin(playerid))//rcon
        {
    if(counter == mbs) return true;          
new Float:pco[3],str[256];//coords,str
            GetPlayerPos(playerid,pco[0],pco[1],pco[2]);//my pos
            format(str,sizeof(str),"%0.f,%0.f,%0.f",pco[0],pco[1],pco[2]);//format
            addbo(str);//write
            for(new idq; idq<counter; idq++) bns[idq][pickup] = CreatePickup(1276, 2, pco[0],pco[1],pco[2]);//create
        }
        return 1;
    }
    return 0;
}

forward addbo(string[]);
public addbo(string[])
{
    new entry[256];
    format(entry, sizeof(entry), "%s\r\n",string);
    new File:hFile;
    hFile = fopen("Bonus.txt", io_append);
    fwrite(hFile, entry);
    fclose(hFile);
    return 1;
}

forward createbonus();
public createbonus()
{
    if(fexist("Bonus.txt"))//проверим на существование
    {//если есть, то go
        counted();
        new Argument[3][90];
        new entry[256];
        new File: bnfile = fopen("Bonus.txt", io_read);//откроем его
        if (bnfile)
        {
            for(new idq; idq<counter; idq++)
            {//прогоним все по циклу
                fread(bnfile, entry);//все прочтем
                split(entry, Argument, ',');//знак отделение будет у нас ","
                bns[idq][coord][0] = floatstr(Argument[0]);//коорда x
                bns[idq][coord][1] = floatstr(Argument[1]);//коорда y
                bns[idq][coord][2] = floatstr(Argument[2]);//коорда z
                bns[idq][pickup] = CreatePickup(1276, 2, bns[idq][coord][0], bns[idq][coord][1], bns[idq][coord][2]);//ну и создаем все пикапы во всех мирах
            }
            fclose(bnfile);//закроем
            print("----------------------------");
            printf("Создано %d бонусов",counter);//доложим сколько создано
            print("----------------------------");
         }
    }
}
stock counted()
{
    new entry[256];
    new File: bnfile = fopen("Bonus.txt", io_read);
    while(fread(bnfile, entry, 256))
    {
        counter++;
      }
      fclose(bnfile);
}
public OnPlayerPickUpPickup(playerid, pickupid)
{
    for(new pi; pi<counter; pi++)
    {//прогоним по циклу
        if(pickupid == bns[pi][pickup])
        {//если наступил на этот пикап
            GivePlayerMoney(playerid,1500);//дадим бабло
            SendClientMessage(playerid,-1,"Вы подобрали бонус!");//сообщим
            DestroyPickup(bns[pi][pickup]);//убъем
        }
    }
    return 1;
}

stock split(const strsrc[], strdest[][], delimiter)
{
    new i, li;
    new aNum;
    new len;
    while(i <= strlen(strsrc)){
        if(strsrc[i]==delimiter || i==strlen(strsrc)){
            len = strmid(strdest[aNum], strsrc, li, i, 128);
            strdest[aNum][len] = 0;
            li = i+1;
            aNum++;
        }
        i++;
    }
    return 1;
}
А теперь поясню более "гадкие " моменты данной системы.
PHP:
#define mbs 75
В этой строке содержится максимальное кол-во пикапов которые можно хранить в файле, в данном случае их 75

PHP:
enum b
{
    Float:coord[3],//здесь содержится все 3 координаты для пикапа....  (x.y.z)
    pickup//а это нужно для воссоздания самого пикапа из файла
};
new bns[mbs][b];//ну это для массива
new counter;//эта переменная будет все пикапы на сервере
PHP:
for(new pi; pi<counter; pi++) DestroyPickup(bns[pi][pickup]);//убъем все
Данным циклом мы найдем все пикапы на сервере и при выключении мода/скрипта уничтожим все пикапы бонусов

PHP:
if(IsPlayerAdmin(playerid))//проверим игрока на наличие RCON
{
if(counter == mbs) return true; //также просмотрим, если создаваемый пикап будет превышать максимум пикапов то в данной ситуации ничего не произойдет         
new Float:pco[3],str[256];//создадим локальные переменные для обнаружения координат игрока и записи сообщения в файл
GetPlayerPos(playerid,pco[0],pco[1],pco[2]);//узнаем позицию игрока
format(str,sizeof(str),"%0.f,%0.f,%0.f",pco[0],pco[1],pco[2]);//и отформатируем координаты для записи данных в файл
addbo(str);//с этой функции мы запишим все данные в файл, подробнее будет описано ниже
for(new idq; idq<counter; idq++) bns[idq][pickup] = CreatePickup(1276, 2, pco[0],pco[1],pco[2]);//и при помощи цикла создаем новый пикап с бонусами
}
return 1;
}
PHP:
forward addbo(string[]);//этой функцией мы будем записывать данные в файл
public addbo(string[])
{
    new entry[256];//переменная для формата
    format(entry, sizeof(entry), "%s\r\n",string);//отформатируем данные которые были записаны
    new File:hFile;//переменная для нашего файла
    hFile = fopen("Bonus.txt", io_append);//откроем наш файл, в данном случае это Bonus.txt
    fwrite(hFile, entry);//запишем в него наши координаты
    fclose(hFile);//и закроем файл
    return 1;
}
PHP:
stock counted()//этой функцией мы подсчитаем кол-во пикапов в файле
{
    new entry[256];//опять же локал переменная для формата
    new File: bnfile = fopen("Bonus.txt", io_read);//откроем наш файл 
    while(fread(bnfile, entry, 256))//прочтем в нем чтото
    {
        counter++;//и добавим к подсчету 1 значение
      }
      fclose(bnfile);//и на десерт закроем
}
PHP:
   for(new pi; pi<counter; pi++)//проверим по циклу
    {
        if(pickupid == bns[pi][pickup])//если пикап оказался одним из бонусных
        {
            GivePlayerMoney(playerid,1500);//то дадим 1500 денег
            SendClientMessage(playerid,-1,"Вы подобрали бонус!");//сообщим игроку что он подобрал наш бонус
            DestroyPickup(bns[pi][pickup]);//и уничтожим пикап дабы не было повторного подбора
        }
    }
Устанавливать данную систему можно как скриптом, так и в мод, во всех случаях работает одинаково.

Автор: Seregamil​
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу