Погода и время в Pawn: управление окружением

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

8

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

Погода и время создают атмосферу на сервере. Разберем управление ими.

Установка погоды
Код:
SetWeather(weatherid);
// Пример:
SetWeather(10); // туман

ID погоды:
- 0 - ясно
- 1 - облачно
- 2 - облачно
- 3 - облачно
- 4 - дождь
- 5 - дождь
- 6 - дождь
- 7 - дождь
- 8 - дождь
- 9 - дождь
- 10 - туман
- 11 - туман
- 12 - туман
- 13 - туман
- 14 - туман
- 15 - туман
- 16 - туман
- 17 - туман
- 18 - туман
- 19 - песчаная буря

Установка времени
Код:
SetWorldTime(hour);
// Пример:
SetWorldTime(12); // полдень

Пример: система смены погоды
Код:
new currentWeather = 0;
new weatherCycle[] = {0, 1, 4, 10, 0}; // цикл погоды
new currentWeatherIndex = 0;

public OnGameModeInit()
{
    // Смена погоды каждые 10 минут
    SetTimer("ChangeWeather", 600000, true);
    return 1;
}

forward ChangeWeather();
public ChangeWeather()
{
    currentWeatherIndex++;
    if(currentWeatherIndex >= sizeof(weatherCycle))
    {
        currentWeatherIndex = 0;
    }
    
    currentWeather = weatherCycle[currentWeatherIndex];
    SetWeather(currentWeather);
    
    new string[128];
    format(string, sizeof(string), "Погода изменена на ID: %d", currentWeather);
    SendClientMessageToAll(-1, string);
}

CMD:weather(playerid, params[])
{
    if(!IsPlayerAdmin(playerid))
    {
        SendClientMessage(playerid, -1, "У вас нет прав");
        return 1;
    }
    
    new weatherid;
    if(sscanf(params, "i", weatherid))
    {
        SendClientMessage(playerid, -1, "Использование: /weather [id]");
        return 1;
    }
    
    if(weatherid < 0 || weatherid > 19)
    {
        SendClientMessage(playerid, -1, "ID погоды должен быть от 0 до 19");
        return 1;
    }
    
    SetWeather(weatherid);
    currentWeather = weatherid;
    
    new string[128];
    format(string, sizeof(string), "Погода изменена на ID: %d", weatherid);
    SendClientMessage(playerid, -1, string);
    return 1;
}

Пример: система времени
Код:
new serverHour = 12;
new serverMinute = 0;

public OnGameModeInit()
{
    SetWorldTime(serverHour);
    
    // Обновление времени каждую минуту
    SetTimer("UpdateTime", 60000, true);
    return 1;
}

forward UpdateTime();
public UpdateTime()
{
    serverMinute++;
    if(serverMinute >= 60)
    {
        serverMinute = 0;
        serverHour++;
        if(serverHour >= 24)
        {
            serverHour = 0;
        }
        SetWorldTime(serverHour);
    }
    
    // Уведомление о смене часа
    if(serverMinute == 0)
    {
        new string[128];
        format(string, sizeof(string), "Сейчас %02d:00", serverHour);
        SendClientMessageToAll(-1, string);
    }
}

CMD:time(playerid, params[])
{
    if(!IsPlayerAdmin(playerid))
    {
        SendClientMessage(playerid, -1, "У вас нет прав");
        return 1;
    }
    
    new hour;
    if(sscanf(params, "i", hour))
    {
        new string[64];
        format(string, sizeof(string), "Текущее время: %02d:%02d", serverHour, serverMinute);
        SendClientMessage(playerid, -1, string);
        return 1;
    }
    
    if(hour < 0 || hour > 23)
    {
        SendClientMessage(playerid, -1, "Час должен быть от 0 до 23");
        return 1;
    }
    
    serverHour = hour;
    serverMinute = 0;
    SetWorldTime(serverHour);
    
    new string[128];
    format(string, sizeof(string), "Время установлено на %02d:00", hour);
    SendClientMessage(playerid, -1, string);
    return 1;
}

Синхронизация времени с реальным
Код:
public OnGameModeInit()
{
    // Получение реального времени
    new year, month, day, hour, minute, second;
    getdate(year, month, day);
    gettime(hour, minute, second);
    
    SetWorldTime(hour);
    
    // Синхронизация каждую минуту
    SetTimer("SyncRealTime", 60000, true);
    return 1;
}

forward SyncRealTime();
public SyncRealTime()
{
    new hour, minute, second;
    gettime(hour, minute, second);
    SetWorldTime(hour);
}

Погода для разных зон
Код:
SetPlayerWeather(playerid, weatherid);

// Пример: разная погода для разных игроков
CMD:myweather(playerid, params[])
{
    new weatherid;
    if(sscanf(params, "i", weatherid))
    {
        SendClientMessage(playerid, -1, "Использование: /myweather [id]");
        return 1;
    }
    
    SetPlayerWeather(playerid, weatherid);
    SendClientMessage(playerid, -1, "Ваша погода изменена");
    return 1;
}

Время для разных игроков
Код:
SetPlayerTime(playerid, hour, minute);

// Пример: разное время для разных игроков
CMD:mytime(playerid, params[])
{
    new hour, minute;
    if(sscanf(params, "ii", hour, minute))
    {
        SendClientMessage(playerid, -1, "Использование: /mytime [час] [минута]");
        return 1;
    }
    
    SetPlayerTime(playerid, hour, minute);
    SendClientMessage(playerid, -1, "Ваше время изменено");
    return 1;
}

Пример: динамическая смена погоды по времени
Код:
public OnGameModeInit()
{
    SetTimer("DynamicWeather", 300000, true); // каждые 5 минут
    return 1;
}

forward DynamicWeather();
public DynamicWeather()
{
    new hour, minute, second;
    gettime(hour, minute, second);
    
    // Утро (6-12) - ясная погода
    if(hour >= 6 && hour < 12)
    {
        SetWeather(0);
    }
    // День (12-18) - облачно
    else if(hour >= 12 && hour < 18)
    {
        SetWeather(1);
    }
    // Вечер (18-22) - дождь
    else if(hour >= 18 && hour < 22)
    {
        SetWeather(4);
    }
    // Ночь (22-6) - туман
    else
    {
        SetWeather(10);
    }
}

Важные моменты:
- Используйте таймеры для автоматической смены
- Синхронизируйте время для всех игроков
- Учитывайте влияние погоды на геймплей
- Предоставляйте команды для управления

Погода и время создают уникальную атмосферу сервера!
 

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

Сверху