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