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