You are not logged in.
Pages: 1
Сделал модификатор трафика на дорогах (в зависимости от времени суток, с увеличенным уровнем в городах).
Используется два потока (можно обойтись и одним, просто лень переписывать )
// put your create_thread commands here create_thread @TIME_WATCH create_thread @TRAFFIC_MOD
Один поток просто следит за временем и устанавливает "сигнальные" переменные:
// time intervals :TIME_WATCH thread 'TIME' var $TIME_HOURS: Integer $TIME_MINS: Integer $TIME_MS: Integer $LAST_HOUR: Integer $LAST_MIN: Integer $IS_NEXT_HOUR: Integer $IS_NEXT_5MIN: Integer $IS_NEXT_MIN: Integer end 00BF: $LAST_HOUR = current_time_hours, $LAST_MIN = current_time_minutes while TRUE wait 200 00BF: $TIME_HOURS = current_time_hours, $TIME_MINS = current_time_minutes 01BD: $TIME_MS = current_time_in_ms $IS_NEXT_HOUR = FALSE $IS_NEXT_MIN = FALSE $IS_NEXT_5MIN = FALSE if not $LAST_HOUR == $TIME_HOURS then $IS_NEXT_HOUR = TRUE // срабатывает каждый час end $LAST_HOUR = $TIME_HOURS if not $LAST_MIN == $TIME_MINS then 0006: 0@ = $TIME_MINS 0006: 1@ = 0@ 0@ /= 5 // 17 / 5 = 3 20 / 5 = 4 (целочисленное деление) 0@ *= 5 000E: 1@ -= 0@ // 17 - ((17 / 5) * 5) = 2 20 - ((20 / 5) * 5) = 0 if 1@ == 0 // если остаток от деления минут на 5 равен нулю then $IS_NEXT_5MIN = TRUE // срабатывает каждые 5 минут end $IS_NEXT_MIN = TRUE // срабатывает каждую минуту end $LAST_MIN = $TIME_MINS end end_thread
Второй контролирует трафик по такой схеме:
время: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 уровень: 0.1 | 0.09 |0.1 0.2 0.4| 1.0 | 0.6 | 1.0 | 0.6 |0.4 0.2
// traffic modifier, based on current time :TRAFFIC_MOD thread 'TRAFFIC' var $trafic_multiplier: Float $traffic_density: Float end $IS_NEXT_HOUR = TRUE while TRUE wait 100 if $IS_NEXT_HOUR == TRUE then if $TIME_HOURS == 0 then $trafic_multiplier = 0.1 end if and $TIME_HOURS >= 1 $TIME_HOURS <= 3 then $trafic_multiplier = 0.09 end if $TIME_HOURS == 4 then $trafic_multiplier = 0.1 end if $TIME_HOURS == 5 then $trafic_multiplier = 0.2 end if $TIME_HOURS == 6 then $trafic_multiplier = 0.4 end if and $TIME_HOURS >= 7 $TIME_HOURS <= 9 then $trafic_multiplier = 1.0 end if and $TIME_HOURS >= 10 $TIME_HOURS <= 16 then $trafic_multiplier = 0.6 end if and $TIME_HOURS >= 17 $TIME_HOURS <= 19 then $trafic_multiplier = 1.0 end if and $TIME_HOURS >= 20 $TIME_HOURS <= 21 then $trafic_multiplier = 0.6 end if $TIME_HOURS == 22 then $trafic_multiplier = 0.4 end if $TIME_HOURS == 23 then $trafic_multiplier = 0.2 end end if $IS_NEXT_5MIN == TRUE then $traffic_density = $trafic_multiplier if or 0583: player $PLAYER_CHAR in_zone 'LA' // los santos 0583: player $PLAYER_CHAR in_zone 'SF' // san fierro 0583: player $PLAYER_CHAR in_zone 'VE' // las venturas then //01E3: show_text_1number_styled GXT 'NUMBER' number 333 time 1000 style 4 $traffic_density *= 1.5 end 01EB: set_traffic_density_multiplier_to $traffic_density end { // удалить скобку для проверки переменной var $di: Integer $df: Float end $df = $traffic_density $df *= 10.0 008C: $di = float $df to_integer 01E3: show_text_1number_styled GXT 'NUMBER' number $di time 1000 style 2 //} end end_thread
Last edited by AleX AciD (04-01-2008 07:55)
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
Это уже кто-то делал , но всё же хорошо .
А глобальными переменными можно было бы и обойтись в количестве нескольких штук , т.е. только для поддержание связи между потоками .
Last edited by Alexander (04-01-2008 09:32)
Offline
2Agenzvell:
А че там путаться - всё разложенно по дням и часам.
У меня другой принцип: если что-то можно сделать без скриптов - именно так и нужно делать (меньше глюков).
Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ
Offline
Хорошо бы в скрипте избавиться от глобальных переменных, чтобы сделать его "CLEO-compatible". Вместо них можно использовать конструкцию const..end:
const TIME_HOURS = 0@ end
если использовать в опкодах имя TIME_HOURS, то фактически компилироваться будет переменная 0@. И всем хорошо
Offline
@Seemann
А как быть с двумя потоками? Если их сделать двумя отдельными CLEO файлами они не будут линковаться между собой и использовать одни и те же переменные, тем более локальные...
Offline
А как быть с двумя потоками?
Объединить их в один файл
Offline
Ну вот предположим, есть 2 вот этих потока (или там про бензин - сам бензин и заправки), то как их паралеллить, чтобы они одновременно были запускались. Может есть готовые примеры как это в других скриптах сделано... ?
Offline
Эти потоки - два цикла. Самый простой способ, написать в начале файла еще один цикл, а в нем 2 gosub, один за другим.
while true gosub @firstmod gosub @secondmod end
в firstmod вставить тело 1-го цикла (кроме while true..end, конечно), в secondmod - 2-го.
Offline
хм, понятно. Мне почему то казалось, что gosub не дружит с cleo. А в конце тела каждого цикла должна стоять return?
Offline
да, там, где в оригинале end
Offline
типа того получается:
:Start gosub @TIME_WATCH gosub @TRAFFIC_MOD jump @Start :TIME_WATCH thread 'Thread1' return :TRAFFIC_MOD thread 'Thread2' return
Слушай, Seemann, а зачем это jump @Start? Не получится, что он вернется и потоки по второму разу запустит поверх уже запущенных?
Offline
потоки по второму разу запустит
здесь нет команды создания потока Все, что ты написал - это один поток, с двумя разными кусками кода, которые выполняются один за другим, в цикле.
Offline
Pages: 1