Доступ к готовым решениям

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

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

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

Мануал Случайная погода и время как в сингле

oxygenium

Компетентный
Внимание! Я использовал альтернативу таймерам от XemyL (http://pawno-info.ru/showthread.php?t4893). Думаю, не составит труда перевести на стоковые таймеры.

И так, мне в голову пришла идея сделать систему времени как сингле, т.е. 1 игровой час будет длиться 1 минуту.
Так же я добавил рандомную погоду. Шанс довольно невысокий, но он есть.
Система подойдет как для мода с 0, так и для RLS и прочих. Время и погода устанавливаются абсолютно для всех игроков на сервере.

И так, для начала заходим в тему XemyL'а и ставим себе альтернативу таймеров, либо же переводим мой код на обычные таймеры.
Затем задейфайним несколько значений, чтобы потом не искать их по всему моду.


PHP:
#define DEFAULT_TIME 12 
#define DEFAULT_WEATHER 2 
#define ONE_HOUR_TIME 60
Я сделал так, чтобы при запуске мода время выставлялось ровно на 12 часов, т.к. так удобно мне. Меняйте под себя на значение от 0 до 24 соответственно.
Погоду я установил под номером 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;
}
Если вы посмотрите ID погоды, то увидите, что разновидностей обычной погоды всего 19, остальные погоды какие-то странные и подойдут, разве что, для эффекта от приема наркотиков или подобных систем. Так же мы можем увидеть, что и из этих 19 разновидностей большинство одинаковы, как например с 0 по 7 лишь слегка меняют цвет неба, оставаясь ясной погодой.
Опять же, сгенерируем случайное число от 0 до 19 и установим погоду на сервере. Так же можно вывести сообщение игрокам о погоде.
Благодарю за просмотр темы.
 
Последнее редактирование:
  • Нравится
Реакции: Iwka
Сверху Снизу