Продвинутая работа с транспортом в Pawn

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

8

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

Транспорт - важная часть сервера. Разберем продвинутые техники работы.

Система владения транспортом
Код:
enum VehicleInfo
{
    vOwner[MAX_PLAYER_NAME],
    vModel,
    Float:vX,
    Float:vY,
    Float:vZ,
    Float:vAngle,
    vColor1,
    vColor2,
    vComponents[14],
    vLocked,
    vFuel,
    Float:vHealth
}

new VehicleData[MAX_VEHICLES][VehicleInfo];

CreatePlayerVehicle(playerid, modelid)
{
    new Float:x, Float:y, Float:z, Float:angle;
    GetPlayerPos(playerid, x, y, z);
    GetPlayerFacingAngle(playerid, angle);
    
    new vehicleid = CreateVehicle(modelid, x+3, y, z, angle, 0, 1, -1);
    
    GetPlayerName(playerid, VehicleData[vehicleid][vOwner], MAX_PLAYER_NAME);
    VehicleData[vehicleid][vModel] = modelid;
    VehicleData[vehicleid][vX] = x+3;
    VehicleData[vehicleid][vY] = y;
    VehicleData[vehicleid][vZ] = z;
    VehicleData[vehicleid][vAngle] = angle;
    VehicleData[vehicleid][vLocked] = 0;
    VehicleData[vehicleid][vFuel] = 100;
    VehicleData[vehicleid][vHealth] = 1000.0;
    
    return vehicleid;
}

Система топлива
Код:
new VehicleFuel[MAX_VEHICLES];

public OnGameModeInit()
{
    // Обновление топлива каждую секунду
    SetTimer("UpdateVehicleFuel", 1000, true);
    return 1;
}

forward UpdateVehicleFuel();
public UpdateVehicleFuel()
{
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
        if(GetVehicleModel(i) > 0)
        {
            new engine, lights, alarm, doors, bonnet, boot, objective;
            GetVehicleParamsEx(i, engine, lights, alarm, doors, bonnet, boot, objective);
            
            if(engine == 1 && VehicleFuel[i] > 0)
            {
                VehicleFuel[i]--;
                
                if(VehicleFuel[i] <= 0)
                {
                    SetVehicleParamsEx(i, 0, lights, alarm, doors, bonnet, boot, objective);
                    
                    for(new j = 0; j < MAX_PLAYERS; j++)
                    {
                        if(IsPlayerInVehicle(j, i))
                        {
                            SendClientMessage(j, -1, "Топливо закончилось!");
                        }
                    }
                }
            }
        }
    }
}

CMD:refuel(playerid, params[])
{
    new vehicleid = GetPlayerVehicleID(playerid);
    if(vehicleid == 0)
    {
        SendClientMessage(playerid, -1, "Вы не в транспорте");
        return 1;
    }
    
    if(GetPlayerMoney(playerid) < 100)
    {
        SendClientMessage(playerid, -1, "Недостаточно денег для заправки");
        return 1;
    }
    
    VehicleFuel[vehicleid] = 100;
    GivePlayerMoney(playerid, -100);
    SendClientMessage(playerid, -1, "Транспорт заправлен");
    return 1;
}

Система повреждений
Код:
public OnVehicleDamageStatusUpdate(vehicleid, playerid)
{
    new Float:health;
    GetVehicleHealth(vehicleid, health);
    
    if(health < 300.0)
    {
        // Транспорт сильно поврежден
        new engine, lights, alarm, doors, bonnet, boot, objective;
        GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
        
        // Двигатель может заглохнуть
        if(random(100) < 30)
        {
            SetVehicleParamsEx(vehicleid, 0, lights, alarm, doors, bonnet, boot, objective);
            SendClientMessage(playerid, -1, "Двигатель заглох из-за повреждений!");
        }
    }
    
    return 1;
}

Тюнинг транспорта
Код:
CMD:tune(playerid, params[])
{
    new vehicleid = GetPlayerVehicleID(playerid);
    if(vehicleid == 0)
    {
        SendClientMessage(playerid, -1, "Вы не в транспорте");
        return 1;
    }
    
    // Проверка владельца
    if(strlen(VehicleData[vehicleid][vOwner]) > 0)
    {
        if(strcmp(GetPlayerName(playerid), VehicleData[vehicleid][vOwner], true))
        {
            SendClientMessage(playerid, -1, "Это не ваш транспорт");
            return 1;
        }
    }
    
    // Меню тюнинга
    new string[256] = "Спойлер\nКапот\nКрыша\nБоковые юбки\nЛампы\nВыхлоп\nДиски\nСтерео\nГидравлика\nПередний бампер\nЗадний бампер";
    ShowPlayerDialog(playerid, DIALOG_TUNE, DIALOG_STYLE_LIST, "Тюнинг транспорта", string, "Выбрать", "Отмена");
    PlayerVehicleID[playerid] = vehicleid;
    
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == DIALOG_TUNE)
    {
        if(response)
        {
            new vehicleid = PlayerVehicleID[playerid];
            new components[] = {1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011};
            
            if(listitem < sizeof(components))
            {
                AddVehicleComponent(vehicleid, components[listitem]);
                VehicleData[vehicleid][vComponents][listitem] = components[listitem];
                SendClientMessage(playerid, -1, "Компонент установлен");
            }
        }
    }
    return 1;
}

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

Продвинутая система транспорта улучшает геймплей!
 

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

Сверху