Mafia-Game Forum

Mafia-Game Forum (https://mafia-game.ru/forum/index.php)
-   Скриптинг (https://mafia-game.ru/forum/forumdisplay.php?f=10)
-   -   Скрипт автомобильного радио (https://mafia-game.ru/forum/showthread.php?t=1047)

Kaiser 04.10.2020 10:37

Ребята! Коллеги! Друзья!

Помогите разобраться со скриптом пожалуйста.

Намедни мне Фаерфокс прислал один скрипт, который к сожалению, нормально отказался работать. И мы не можем понять почему.

На деле происходит следующее:

1. Я сажусь в авто, городская музыка выключается и включается радио.
2. Я выхожу из авто, радио продолжает играть, хотя должно выключаться.
3. Я снова сажусь в авто и радио начинает играть сначала.

Фактически, радио должно включаться при посадке в авто и выключаться при выходе из него.

Развернуть для просмотра


dim_act 2
dim_frm 1
dim_flt 5
findactor 0, "Tommy"
findactor 1, "fire"

let flt[0]=0

label 1
wait 100
compareownerwithex 0, 1, 101, 102

label 101
if flt[0]=1,-,1
citymusic_off
stream_create 0, "sounds\music\fireradio.ogg"
stream_play 0
wait 2000
let flt[0]=0
goto 1

label 102
if flt[0]=0,-,1
stream_stop 0
citymusic_on
wait 2000
let flt[0]=1
goto 1
[свернуть]

KlassenAS 04.10.2020 11:53

Цитата:

Сообщение от Kaiser (Сообщение 12185)
Ребята! Коллеги! Друзья!
Помогите разобраться со скриптом пожалуйста.

У тебя проблема с присвоением значения переменой flt[0]
Проследи логику:
Переменная равна 0
Далее проверяем наличие Тома в машине.
И смотрим значение переменной.
1 Томми в машине:
Если переменная 0 - музыка не играет, включить и присвоить ей 1
если переменная 1 - музыка уже играет, ничего делать не нужно

2 Томми не в машине
Если переменная 0 - музыка не играет, ничего делать не нужно
Если переменная 1 - выключить музыку и присвоить переменной 0

И вот в этом присвоении переменных, вроде, путаница затесалась.

Во-первых, если я не ошибаюсь, номер аудиопотока может быть одновременно и переменной.
Тогда stream_create 0 и stream_play 0 обращаются к переменной flt[0], используемой для логики включения/выключения. Возникает конфликт, ведь значение переменной меняется и ты пытаешься остановить не тот аудиопоток, который запустил.

Попробуй использовать вторую переменную:
let flt[1]=0

И через неё упралять аудиопотоком:
stream_create 1
stream_play 1
stream_stop 1

Должно помочь, вроде.

Также стоит проверить сравнение условий включения/выключения

Под лабелом 101 сделай
if flt[0]=0,-,1
let flt[0]=1

Под лабелом 102 сделай
if flt[0]=1,-,1
let flt[0]=0

Так больше будет соответствовать логике скрипта.

Вместо findactor nn, "Tommy" лучше использовать getactiveplayer nn, эта команда универсальна и не привязана к используемой модели персонажа.

И ещё я не понял, что это за актор "fire"?
У тебя радио будет включатся только если Томми садится в одну конкретную машину?
Почему бы, в принципе, не проверить его нахождение в любой машине?
Используешь ещё одну переменную.
Присваиваешь ей вначале скрипта let flt[2]=-1
И запрашиваешь у игры номер сиденья в машине, на котором сидит Томми:
Human_GetSeatidx 0,2 (актор чела, переменная с номером сиденья)
И дальше проверяешь значение переменной:
If Flt[2]=-1,102,101
Если переменная осталась равна -1, чел не в машине, идём на метку 102
Если переменная изменилась, чел в машине, идём на метку 101.
Ладно, я тебе щас по-своему скрипт напишу, и всё )
И фреймы в скрипте не используются, их можно не объявлять

Развернуть для просмотра



Dim_Act 2 //Два актора
Dim_Flt 3 //Три переменных
GetActivePlayer 0 //Получаем актора игрока

Let Flt[0]=0 //Переменная для логики вкл/выкл
Let Flt[1]=0 //Переменная для аудиопотока
Let Flt[2]=-1 //Переменная для сидения в машине

Label CHECK
Wait 100
Human_GetSeatIdx 0,2 //Запрашиваем номер сиденья
If Flt[2]=-1,CAR_OUT,-1 //Если получили, идём дальше, если не получили, идём к метке CAR_OUT

If Flt[0]=0,-,CHECK //Если музыка не играет, идём дальше, иначе возвращаемся к проверке
CityMusic_Off
Stream_Create 1, "sounds\music\fireradio.ogg"
Stream_Play 1
Let Flt[0]=1 //Запоминаем, что музыка играет
Wait 2000 //Ждём
GoTo CHECK //Возвращаемся к проверке

Label CAR_OUT //Если не в машине
If Flt[0]=1,-,CHECK //Если музыка играет, идём дальше, иначе возвращаемся к проверке
Stream_Stop 1
CityMusic_On
Let Flt[0]=0 //Запоминаем, что музыка не играет
Wait 2000 //Ждём
GoTo CHECK //Возвращаемся к проверке

[свернуть]


Вроде, всё верно, проверяй )

А ещё можно расширить скрипт и рандомно воспроизводить одну из нескольких аудиозаписей. Хоть сто песен можно в скрипт воткнуть. Только затрахаешься строки кода копипастить и имена файлов прописывать )

Firefox3860 04.10.2020 15:17

KlassenAS, Спасибо за хороший разбор логики. Видимо, основная проблема была в конфликте переменной потока с логической переменной. Я этого не заметил.

Ещё круто, что ты показал команду Human_GetSeatidx. Наверное, это лучший способ отслеживания сидения чела в любой машине :)

KlassenAS 04.10.2020 15:21

Цитата:

Сообщение от Firefox3860 (Сообщение 12192)
Ещё круто, что ты покакзал команду Human_GetSeatidx. Наверное, это лучший способ отслеживания сидения чела в любой машине :)

Я этот способ использовал, когда писал систему скриптов для Sity Bars +, чтобы тачка, припаркованная возле загружаемой локации, типа отеля или порта, при возвращении была на месте.

А подсказал мне этот способ GOLOD55, за что ему огромное спасибо! )

GOLOD55 04.10.2020 18:24

возможно, саунд_стрим лучше вдобавок хорошенько отдестроить после выключения, а то у мафы бажок был...что-то типа перезапуска стрима при юзании хнопички ESC.

Kaiser 04.10.2020 18:41

2 KlassenAS

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

KlassenAS 04.10.2020 19:53

Цитата:

Сообщение от Kaiser (Сообщение 12197)
Только вот оно работает во всех автомобилях, а мне бы надо в одном. Тогда мне гетактивплейер просто заменить на нужный мне файндактор?

GetActivePlayer 0 - это поиск управляемого игроком персонажа. К машине отношения не имеет.
А тебе нужно конкретное авто.
Я сделал, чтобы работало во всех, потому, что посчитал, что так лучше )
Тогда сделаем с одной:

Развернуть для просмотра



Dim_Act 2 //Два актора
Dim_Flt 2 //Две переменных
GetActivePlayer 0 //Получаем актора игрока
FindActor 1, "fire" //Получаем актор с нужной машиной

Let Flt [0] = 0 //Переменная для логики вкл/выкл
Let Flt [1] = 0 //Переменная для аудиопотока

Label CHECK
Wait 100
CompareOwnerWithEx 0, 1, -, CAR_OUT //Проверяем, сидит ли игрок в конкретной машине, если да, идём дальше, если нет, идём к метке CAR_OUT

If Flt [0] = 0, -, CHECK //Если музыка не играет, идём дальше, иначе возвращаемся к проверке
CityMusic_Off
Stream_Create 1, "sounds\music\fireradio.ogg"
Stream_Play 1
Let Flt [0] = 1 //Запоминаем, что музыка играет
Wait 2000 //Ждём
GoTo CHECK //Возвращаемся к проверке

Label CAR_OUT //Если не в машине
If Flt [0] = 1, -, CHECK //Если музыка играет, идём дальше, иначе возвращаемся к проверке
Stream_Stop 1
Stream_Destroy 1 // Уничтожаем аудиопоток, как посоветовал GOLOD55
CityMusic_On
Let Flt [0] = 0 //Запоминаем, что музыка не играет
Wait 2000 //Ждём
GoTo CHECK //Возвращаемся к проверке

[свернуть]

Kaiser 04.10.2020 20:06

2 KlassenAS

Некорректно работает. Срабатывает в одной машине, но! Садишься в машине запускается первая секунда трека, после чего выключается. После чего опять включается на секунду и так по кругу.

Причем, когда выходишь из машины, тогда начинает проигрываться нормально.

KlassenAS 04.10.2020 20:15

Цитата:

Сообщение от Kaiser (Сообщение 12204)
2 KlassenAS

Некорректно работает. Срабатывает в одной машине, но! Садишься в машине запускается первая секунда трека, после чего выключается. После чего опять включается на секунду и так по кругу.

Причем, когда выходишь из машины, тогда начинает проигрываться нормально.

Хз, может, опечатку допустил, или движку пробелы мои в скриптах не понравились.
Убрал лишнее, пробуем ещё раз:

Развернуть для просмотра



Dim_Act 2
Dim_Flt 2
GetActivePlayer 0
FindActor 1, "fire"

Let Flt[0]=0
Let Flt[1]=0

Label CHECK
Wait 100
CompareOwnerWithEx 0,1,-,CAR_OUT

If Flt[0]=0,-,CHECK
CityMusic_Off
Stream_Create 1, "sounds\music\fireradio.ogg"
Stream_Play 1
Let Flt[0]=1
Wait 2000
GoTo CHECK

Label CAR_OUT
If Flt[0]=1,-,CHECK
Stream_Stop 1
Stream_Destroy 1
CityMusic_On
Let Flt[0]=0
Wait 2000
GoTo CHECK

[свернуть]

Kaiser 04.10.2020 20:22

Пробежался по скрипту, вроде он без изменений. Что принципиально изменено?


Текущее время: 03:52. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.11 Release Candidate 2
Copyright ©2000 - 2020, vBulletin Solutions Inc. Перевод: zCarot