oxygenium
Компетентный
Внимание! Я использовал альтернативу таймерам от XemyL (http://pawno-info.ru/showthread.php?t4893). Думаю, не составит труда перевести на стоковые таймеры.
И так, мне в голову пришла идея сделать систему времени как сингле, т.е. 1 игровой час будет длиться 1 минуту.
Так же я добавил рандомную погоду. Шанс довольно невысокий, но он есть.
Система подойдет как для мода с 0, так и для RLS и прочих. Время и погода устанавливаются абсолютно для всех игроков на сервере.
И так, для начала заходим в тему XemyL'а и ставим себе альтернативу таймеров, либо же переводим мой код на обычные таймеры.
Затем задейфайним несколько значений, чтобы потом не искать их по всему моду.
Я сделал так, чтобы при запуске мода время выставлялось ровно на 12 часов, т.к. так удобно мне. Меняйте под себя на значение от 0 до 24 соответственно.
Погоду я установил под номером 2, опять же, т.к. мне она нравится. Ставьте любую. Эта погода будет устанавливаться при запуске сервера. ID погоды можно посмотреть тут
Создадим две переменные. Первой мы присвоим таймер на 60 секунд (1 час в сингле), а во второй будем считать часы, чтобы обнулить их, когда время будет 24:00. Тут стоит сделать акцент на том, что таймер от XemyL'а не работает с числами, которые имеют плавающую точку или же просто с числами с точкой. Ровно как и стандартная функция SetWorldTime(); не работает с минутами, а только с часами. В связи с этим, время сменяется немного ступенчато, нет плавных переходов от утра ко дню, от дня к вечеру. Проблем добавляют и стандартные таймциклы GTA San Adnreas, например в 19:00 у нас еще вроде бы как светло, а в 20:00 все небо заливается ярко-оранжевым закатом. Поэтому ранее я сказал, что время сменяется ступенчато, и это будет видно. В любом случае, можно увеличить длительность таймера, чтобы 1 игровой час длился минут 10 - 20, тогда игрок забудет об этой резкой смене, т.к. она будет не слишком частая. Вернемся к коду.
Теперь добавим действия при запуске мода. В public OnGameModeInit() добавляем следующее:
Если вы уже прочли предыдущий мануал про альтернативу таймеров, вопросов возникнуть не должно.
Далее устанавливаем время на 12 часов (изменяется в define) и погоду, опять же на свою. Последней функцией мы запускаем таймер.
Теперь самое интересное. В только что созданный коллбэк для таймеров (к этому моменту я надеюсь вы окончательно прочитали мануал от XemyL'а и даже успели применить его к своему моду).
Разберем код. Как я писал выше, в переменную hours записываются текущие часы. Если время в данный момент не больше, или равно 23 часам, мы увеличиваем переменную hours, тем самым добавляя еще один час. Если же в переменной значение больше 23, т.е. 24 - самое время обнулить переменную, что мы и сделали. Затем мы устанавливаем игровое время на то значение, которое у нас записано в hours и снова запускаем таймер, чтобы отсчитать еще один игровой час.
Идем дальше. Переменная weatherchange означает шанс на смену погоды. Этот шанс 50/50. Мы генерируем случайное число от 0 до 1, и если это 1 - меняем погоду. Но тут все не так просто. Представим, что мы очень везучие, и нам постоянно выпадает 1, тогда погода будет меняться каждую минуту. Я думаю, это будет, как минимум, неприятно. Как максимум это может раздражать. Поэтому я сделал так, чтобы погода менялась каждые 4 игровых часа, тем самым шанс на смену погоды еще больше уменьшается и будет равен 6 из 24, т.е. 1 к 3. И это только на каждый промежуток в 4 часа. Если вы хотите, вы можете добавить еще условия, либо убрать их вовсе и действительно менять погоду каждый час уже без случайных чисел, в этом случае погода будет меняться каждый час в 100% случаях. Выглядеть это будет следующим образом:
Если вы посмотрите ID погоды, то увидите, что разновидностей обычной погоды всего 19, остальные погоды какие-то странные и подойдут, разве что, для эффекта от приема наркотиков или подобных систем. Так же мы можем увидеть, что и из этих 19 разновидностей большинство одинаковы, как например с 0 по 7 лишь слегка меняют цвет неба, оставаясь ясной погодой.
Опять же, сгенерируем случайное число от 0 до 19 и установим погоду на сервере. Так же можно вывести сообщение игрокам о погоде.
Благодарю за просмотр темы.
И так, мне в голову пришла идея сделать систему времени как сингле, т.е. 1 игровой час будет длиться 1 минуту.
Так же я добавил рандомную погоду. Шанс довольно невысокий, но он есть.
Система подойдет как для мода с 0, так и для RLS и прочих. Время и погода устанавливаются абсолютно для всех игроков на сервере.
И так, для начала заходим в тему XemyL'а и ставим себе альтернативу таймеров, либо же переводим мой код на обычные таймеры.
Затем задейфайним несколько значений, чтобы потом не искать их по всему моду.
PHP:
#define DEFAULT_TIME 12
#define DEFAULT_WEATHER 2
#define ONE_HOUR_TIME 60
Погоду я установил под номером 2, опять же, т.к. мне она нравится. Ставьте любую. Эта погода будет устанавливаться при запуске сервера. ID погоды можно посмотреть тут
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
PHP:
forward UpdateTimers();
new worldtime;
new hours = DEFAULT_TIME;
Создадим две переменные. Первой мы присвоим таймер на 60 секунд (1 час в сингле), а во второй будем считать часы, чтобы обнулить их, когда время будет 24:00. Тут стоит сделать акцент на том, что таймер от XemyL'а не работает с числами, которые имеют плавающую точку или же просто с числами с точкой. Ровно как и стандартная функция SetWorldTime(); не работает с минутами, а только с часами. В связи с этим, время сменяется немного ступенчато, нет плавных переходов от утра ко дню, от дня к вечеру. Проблем добавляют и стандартные таймциклы GTA San Adnreas, например в 19:00 у нас еще вроде бы как светло, а в 20:00 все небо заливается ярко-оранжевым закатом. Поэтому ранее я сказал, что время сменяется ступенчато, и это будет видно. В любом случае, можно увеличить длительность таймера, чтобы 1 игровой час длился минут 10 - 20, тогда игрок забудет об этой резкой смене, т.к. она будет не слишком частая. Вернемся к коду.
Теперь добавим действия при запуске мода. В public OnGameModeInit() добавляем следующее:
PHP:
SetTimer("UpdateTimers", 250, true);
SetWorldTime(DEFAULT_TIME);
SetWeather(DEFAULT_WEATHER);
worldtime = gettime()+ONE_HOUR_TIME;
Далее устанавливаем время на 12 часов (изменяется в define) и погоду, опять же на свою. Последней функцией мы запускаем таймер.
Теперь самое интересное. В только что созданный коллбэк для таймеров (к этому моменту я надеюсь вы окончательно прочитали мануал от XemyL'а и даже успели применить его к своему моду).
PHP:
public UpdateTimers ()
{
if(worldtime <= gettime() && worldtime != 0)
{
if(hours <= 23)
hours++;
else
hours = 0;
SetWorldTime(hours);
worldtime = gettime()+ONE_HOUR_TIME;
new weatherchange = random(1);
if(weatherchange)
{
switch (hours)
{
case 4: SetWeather(random(20));
case 8: SetWeather(random(20));
case 12: SetWeather(random(20));
case 16: SetWeather(random(20));
case 20: SetWeather(random(20));
case 24: SetWeather(random(20));
}
}
}
return true;
}
Разберем код. Как я писал выше, в переменную hours записываются текущие часы. Если время в данный момент не больше, или равно 23 часам, мы увеличиваем переменную hours, тем самым добавляя еще один час. Если же в переменной значение больше 23, т.е. 24 - самое время обнулить переменную, что мы и сделали. Затем мы устанавливаем игровое время на то значение, которое у нас записано в hours и снова запускаем таймер, чтобы отсчитать еще один игровой час.
Идем дальше. Переменная weatherchange означает шанс на смену погоды. Этот шанс 50/50. Мы генерируем случайное число от 0 до 1, и если это 1 - меняем погоду. Но тут все не так просто. Представим, что мы очень везучие, и нам постоянно выпадает 1, тогда погода будет меняться каждую минуту. Я думаю, это будет, как минимум, неприятно. Как максимум это может раздражать. Поэтому я сделал так, чтобы погода менялась каждые 4 игровых часа, тем самым шанс на смену погоды еще больше уменьшается и будет равен 6 из 24, т.е. 1 к 3. И это только на каждый промежуток в 4 часа. Если вы хотите, вы можете добавить еще условия, либо убрать их вовсе и действительно менять погоду каждый час уже без случайных чисел, в этом случае погода будет меняться каждый час в 100% случаях. Выглядеть это будет следующим образом:
PHP:
public UpdateTimers ()
{
if(worldtime <= gettime() && worldtime != 0)
{
if(hours <= 23)
hours++;
else
hours = 0;
SetWorldTime(hours);
worldtime = gettime()+ONE_HOUR_TIME;
SetWeather(random(20))
return true;
}
Опять же, сгенерируем случайное число от 0 до 19 и установим погоду на сервере. Так же можно вывести сообщение игрокам о погоде.
Благодарю за просмотр темы.
Последнее редактирование:
