Система работы в Pawn: создание профессий

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Работа позволяет игрокам зарабатывать деньги. Разберем создание системы профессий.

Типы работ
- Водитель такси
- Водитель автобуса
- Водитель грузовика
- Курьер
- Охранник
- Продавец

Структура работы
Код:
enum JobInfo
{
    jName[32],
    jType,
    jPayRate,
    jRequiredLevel,
    Float:jStartX,
    Float:jStartY,
    Float:jStartZ
}

new JobData[10][JobInfo];
new TotalJobs = 0;
new PlayerJob[MAX_PLAYERS] = {-1, ...};
new PlayerJobProgress[MAX_PLAYERS];

Создание работы
Код:
CreateJob(name[], type, payRate, requiredLevel, Float:x, Float:y, Float:z)
{
    if(TotalJobs >= sizeof(JobData))
    {
        return -1;
    }
    
    strcpy(JobData[TotalJobs][jName], name, 32);
    JobData[TotalJobs][jType] = type;
    JobData[TotalJobs][jPayRate] = payRate;
    JobData[TotalJobs][jRequiredLevel] = requiredLevel;
    JobData[TotalJobs][jStartX] = x;
    JobData[TotalJobs][jStartY] = y;
    JobData[TotalJobs][jStartZ] = z;
    
    TotalJobs++;
    return TotalJobs - 1;
}

Начало работы
Код:
StartJob(playerid, jobid)
{
    if(jobid >= TotalJobs)
    {
        return 0;
    }
    
    if(PlayerInfo[playerid][pLevel] < JobData[jobid][jRequiredLevel])
    {
        new string[128];
        format(string, sizeof(string), "Требуется уровень %d", JobData[jobid][jRequiredLevel]);
        SendClientMessage(playerid, -1, string);
        return 0;
    }
    
    if(PlayerJob[playerid] != -1)
    {
        SendClientMessage(playerid, -1, "Вы уже работаете");
        return 0;
    }
    
    PlayerJob[playerid] = jobid;
    PlayerJobProgress[playerid] = 0;
    
    // Телепортация на рабочее место
    SetPlayerPos(playerid, JobData[jobid][jStartX], JobData[jobid][jStartY], JobData[jobid][jStartZ]);
    
    SendClientMessage(playerid, -1, "Работа начата!");
    return 1;
}

Выполнение работы
Код:
ProcessJob(playerid)
{
    if(PlayerJob[playerid] == -1)
    {
        return 0;
    }
    
    new jobid = PlayerJob[playerid];
    
    switch(JobData[jobid][jType])
    {
        case JOB_TYPE_TAXI:
        {
            ProcessTaxiJob(playerid);
        }
        case JOB_TYPE_BUS:
        {
            ProcessBusJob(playerid);
        }
        case JOB_TYPE_COURIER:
        {
            ProcessCourierJob(playerid);
        }
    }
    
    return 1;
}

ProcessTaxiJob(playerid)
{
    // Логика работы таксиста
    if(IsPlayerInAnyVehicle(playerid))
    {
        new vehicleid = GetPlayerVehicleID(playerid);
        if(GetVehicleModel(vehicleid) == 420) // такси
        {
            // Проверка пассажиров
            // Начисление денег
        }
    }
}

Завершение работы
Код:
EndJob(playerid)
{
    if(PlayerJob[playerid] == -1)
    {
        return 0;
    }
    
    new jobid = PlayerJob[playerid];
    new earnings = PlayerJobProgress[playerid] * JobData[jobid][jPayRate];
    
    GivePlayerMoney(playerid, earnings);
    
    new string[128];
    format(string, sizeof(string), "Работа завершена! Заработано: $%d", earnings);
    SendClientMessage(playerid, -1, string);
    
    PlayerJob[playerid] = -1;
    PlayerJobProgress[playerid] = 0;
    
    return 1;
}

Команды
Код:
CMD:job(playerid, params[])
{
    new string[256] = "";
    for(new i = 0; i < TotalJobs; i++)
    {
        format(string, sizeof(string), "%s%s (Уровень: %d)\n", 
            string, JobData[i][jName], JobData[i][jRequiredLevel]);
    }
    
    ShowPlayerDialog(playerid, DIALOG_JOBS, DIALOG_STYLE_LIST, "Доступные работы", string, "Начать", "Отмена");
    return 1;
}

CMD:endjob(playerid, params[])
{
    EndJob(playerid);
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == DIALOG_JOBS)
    {
        if(response)
        {
            StartJob(playerid, listitem);
        }
    }
    return 1;
}

Важные моменты:
- Реализуйте различные типы работ
- Начисляйте справедливую оплату
- Добавляйте прогресс работы
- Сохраняйте статистику

Система работы добавляет геймплей на сервер!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху