#1 04-01-2008 07:52

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Реалистичный трафик

Сделал модификатор трафика на дорогах (в зависимости от времени суток, с увеличенным уровнем в городах).

Используется два потока (можно обойтись и одним, просто лень переписывать wink )

// 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

#2 04-01-2008 09:32

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Реалистичный трафик

Это уже кто-то делал , но всё же хорошо .
А глобальными переменными можно было бы и обойтись в количестве нескольких штук , т.е. только для поддержание связи между потоками crazy.

Last edited by Alexander (04-01-2008 09:32)

Offline

#3 04-01-2008 15:41

Capushon
Registered: 13-08-2006
Posts: 350
Website

Re: Реалистичный трафик

2AleX AciD:
А разве нельзя обойтись просто правкой файла Data\popcycle.dat ???


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#4 05-01-2008 03:55

Agenzvell
From: Windows/system32
Registered: 28-08-2007
Posts: 109
Website

Re: Реалистичный трафик

Capushon, да можно и так, только там запутаться легко.

Offline

#5 05-01-2008 11:49

Capushon
Registered: 13-08-2006
Posts: 350
Website

Re: Реалистичный трафик

2Agenzvell:
А че там путаться - всё разложенно по дням и часам.
У меня другой принцип: если что-то можно сделать без скриптов - именно так и нужно делать (меньше глюков).


Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ

Offline

#6 06-01-2008 04:19

Agenzvell
From: Windows/system32
Registered: 28-08-2007
Posts: 109
Website

Re: Реалистичный трафик

Не буду вступать в дискуссию и разводить флуд, лучше останусь при своем мнении.

Offline

#7 06-01-2008 10:28

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Реалистичный трафик

Хорошо бы в скрипте избавиться от глобальных переменных, чтобы сделать его "CLEO-compatible". Вместо них можно использовать конструкцию const..end:

const
TIME_HOURS = 0@
end

если использовать в опкодах имя TIME_HOURS, то фактически компилироваться будет переменная 0@. И всем хорошо smile

Offline

#8 13-01-2008 22:32

jayrocc
From: MSK
Registered: 09-06-2007
Posts: 50

Re: Реалистичный трафик

@Seemann

А как быть с двумя потоками? Если их сделать двумя отдельными CLEO файлами они не будут линковаться между собой и использовать одни и те же переменные, тем более локальные...

Offline

#9 14-01-2008 08:16

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Реалистичный трафик

А как быть с двумя потоками?

Объединить их в один файл

Offline

#10 14-01-2008 10:46

jayrocc
From: MSK
Registered: 09-06-2007
Posts: 50

Re: Реалистичный трафик

Ну вот предположим, есть 2 вот этих потока (или там про бензин - сам бензин и заправки), то как их паралеллить, чтобы они одновременно были запускались. Может есть готовые примеры как это в других скриптах сделано... ?

Offline

#11 14-01-2008 11:33

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Реалистичный трафик

Эти потоки - два цикла. Самый простой способ, написать в начале файла еще один цикл, а в нем 2 gosub, один за другим.

while true
gosub @firstmod
gosub @secondmod
end

в firstmod вставить тело 1-го цикла (кроме while true..end, конечно), в secondmod - 2-го.

Offline

#12 14-01-2008 13:21

jayrocc
From: MSK
Registered: 09-06-2007
Posts: 50

Re: Реалистичный трафик

хм, понятно. Мне почему то казалось, что gosub не дружит с cleo. А в конце тела каждого цикла должна стоять return?

Offline

#13 14-01-2008 13:26

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Реалистичный трафик

да, там, где в оригинале end

Offline

#14 14-01-2008 19:28

jayrocc
From: MSK
Registered: 09-06-2007
Posts: 50

Re: Реалистичный трафик

типа того получается:

:Start
gosub @TIME_WATCH 
gosub @TRAFFIC_MOD
jump @Start 

:TIME_WATCH
thread 'Thread1' 
return 

:TRAFFIC_MOD
thread 'Thread2' 
return

Слушай, Seemann, а зачем это jump @Start? Не получится, что он вернется и потоки по второму разу запустит поверх уже запущенных?

Offline

#15 14-01-2008 20:16

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Реалистичный трафик

потоки по второму разу запустит

здесь нет команды создания потока smile Все, что ты написал - это один поток, с двумя разными кусками кода, которые выполняются один за другим, в цикле.

Offline

Board footer

Powered by FluxBB