|
Ребята! Коллеги! Друзья!
Помогите разобраться со скриптом пожалуйста. Намедни мне Фаерфокс прислал один скрипт, который к сожалению, нормально отказался работать. И мы не можем понять почему. На деле происходит следующее: 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 [свернуть] |
Цитата:
Проследи логику: Переменная равна 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 //Возвращаемся к проверке [свернуть] Вроде, всё верно, проверяй ) А ещё можно расширить скрипт и рандомно воспроизводить одну из нескольких аудиозаписей. Хоть сто песен можно в скрипт воткнуть. Только затрахаешься строки кода копипастить и имена файлов прописывать ) |
KlassenAS, Спасибо за хороший разбор логики. Видимо, основная проблема была в конфликте переменной потока с логической переменной. Я этого не заметил.
Ещё круто, что ты показал команду Human_GetSeatidx. Наверное, это лучший способ отслеживания сидения чела в любой машине :) |
Цитата:
А подсказал мне этот способ GOLOD55, за что ему огромное спасибо! ) |
возможно, саунд_стрим лучше вдобавок хорошенько отдестроить после выключения, а то у мафы бажок был...что-то типа перезапуска стрима при юзании хнопички ESC.
|
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 //Проверяем, сидит ли игрок в конкретной машине, если да, идём дальше, если нет, идём к метке 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 //Возвращаемся к проверке [свернуть] |
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, пробелы убрал
|
2 KlassenAS
На самом деле очень круто получилось, все прекрасно работает. Проверил неоднократно. Спасибо тебе большое, с твоего разрешения, использую этот скрипт в своем дополнении к Angel Pine Mod. п.с.Плохо только то, что скрипт постоянно сначала начинается, при каждой очередной посадке в автомобиль. Так наверное никогда радио до конца не дослушать))). |
Цитата:
Цитата:
Так что, можно заморочиться и при выходе из машины паузить скрипт. Ввести дополнительные переменные для отслеживания проигрываемого стрима на паузе, чтобы не создавать заново и не дестроить его лишний раз. Отслеживать окончание воспроизведения и перезапускать. Но тогда возникает вопрос: не появится ли баг с ненужным воспроизведением при нажатии ESC, о котором упомянул GOLOD55? |
Цитата:
Цитата:
|
Цитата:
Ну-ка, попробуй такой вариант: Развернуть для просмотраDim_Act 2
Dim_Flt 3 GetActivePlayer 0 FindActor 1, "fire" Let Flt[0]=0 Let Flt[1]=0 Let Flt[2]=0 //Для паузы Label CHECK Wait 100 CompareOwnerWithEx 0,1,-,CAR_OUT If Flt[0]=0,-,CHECK CityMusic_Off If Flt[2]=0,-1,ALREADYCREATED //Проверяем, создан ли уже поток, вдруг он на паузе Stream_Create 1, "sounds\music\fireradio.ogg" Label ALREADYCREATED //Поток уже создан Stream_Play 1 Let Flt[0]=1 Let Flt[2]=0 Wait 2000 GoTo CHECK Label CAR_OUT If Flt[0]=1,-,CHECK Stream_Pause 1 Let Flt[2]=1 //Запоминаем, что на паузе CityMusic_On Let Flt[0]=0 Wait 2000 GoTo CHECK [свернуть] Теперь он должен ставить на паузу и возобновлять воспроизведение. Проверь, нет ли бага с клавишей ESC, когда аудиопоток на паузе. Пока простой вариант, без проверки окончания воспроизведения. |
2 KlassenAS
Я проверил. Все работает!!! Спасибо тебе огромное, теперь у меня в дополнение будет прям идеальное радио. Все отлично! Выходишь из машины, радио выключается, садишься в машину, продолжается с того момента, когда ты вышел из автомобиля. Я как раз не успел радио запихнуть в ЭП. Теперь выпущу в виде дополнения, в РидМи укажу, что скрипт твой. |
Цитата:
2 Если работает без багов, то его ещё доделать надо ) Чтобы по окончании мелодии начинал воспроизведение заново. Он, по логике, не должен сам понимать, что песня закончилась. Доиграл, - и всё ) 3 И вообще, тебе что, хватает одной мелодии? Давай, заморочимся, чтобы несколько было, с рандомным воспроизведением ) |
1. Нет. Сейчас проверю. (Все работает нормально).
2. А ты можешь зациклить воспроизведение? 3. Там не одна песня. Там на час музыки и болтовни. Как выйдет дополнение, зацени))) |
Цитата:
Цитата:
Вот тебе с зацикливанием, всего одну команду дописал: Развернуть для просмотраDim_Act 2
Dim_Flt 3 GetActivePlayer 0 FindActor 1, "fire" Let Flt[0]=0 Let Flt[1]=0 Let Flt[2]=0 //Для паузы Label CHECK Wait 100 CompareOwnerWithEx 0,1,-,CAR_OUT If Flt[0]=0,-,CHECK CityMusic_Off If Flt[2]=0,-1,ALREADYCREATED //Проверяем, создан ли уже поток, вдруг он на паузе Stream_Create 1, "sounds\music\fireradio.ogg" Stream_SetLoop 1,1 //Зацикливаем Label ALREADYCREATED //Поток уже создан Stream_Play 1 Let Flt[0]=1 Let Flt[2]=0 Wait 2000 GoTo CHECK Label CAR_OUT If Flt[0]=1,-,CHECK Stream_Pause 1 Let Flt[2]=1 //Запоминаем, что на паузе CityMusic_On Let Flt[0]=0 Wait 2000 GoTo CHECK [свернуть] |
Блин, ну теперь надо час играть, чтобы посмотреть, работает ли воспроизведение)) Сегодня точно тебе не дам ответ)
|
Я вот ещё, чё удумал:
В реале, когда слушаешь радио, выходишь из машины, но эфир-то продолжается. Садишься в машину и продолжаешь слушать, пропустив часть эфира. И в Мафии 2 эта фича реализована. Так что я глянул, есть команда для управления громкостью аудиопотока. Stream_FadeVol ww, xx, yy, zz изменить громкость стрима ww - номер стрима xx - время (мс) (не м.б. флт, недопустим 0) yy - громкость1 (не м.б. флт) zz - громкость2 (не м.б. флт) Можно не ставить на паузу, а убрать громкость, и потом восстанавливать. Но в описании не указано, используются ли с этой командой значения громкости, или переменные. Так же не указано, в каком диапазоне значений изменяется громкость. Поэтому я предположил, что вместо переменных там числа и громкость от 0 до 100. Если тебе интересна такая фича, то можешь попробовать этот экспериментальный вариант, но я хз, будет ли он вообще работать: Развернуть для просмотраDim_Act 2
Dim_Flt 3 GetActivePlayer 0 FindActor 1, "fire" Let Flt[0]=0 Let Flt[1]=0 Let Flt[2]=0 //Для паузы Label CHECK Wait 100 CompareOwnerWithEx 0,1,-,CAR_OUT If Flt[0]=0,-,CHECK CityMusic_Off If Flt[2]=0,-1,ALREADYCREATED Stream_Create 1, "sounds\music\fireradio.ogg" Stream_Play 1 Label ALREADYCREATED Stream_FadeVol 1, 200, 100, 0 Let Flt[0]=1 Wait 2000 GoTo CHECK Label CAR_OUT If Flt[0]=1,-,CHECK Stream_FadeVol 1, 200, 0, 100 Let Flt[2]=1 CityMusic_On Let Flt[0]=0 Wait 2000 GoTo CHECK [свернуть] Или второй вариант, из предположения, что команда использует переменные: Развернуть для просмотраDim_Act 2
Dim_Flt 6 GetActivePlayer 0 FindActor 1, "fire" Let Flt[0]=0 Let Flt[1]=0 Let Flt[2]=0 //Для паузы Let Flt[3]=200 Let Flt[4]=0 Let Flt[5]=100 Label CHECK Wait 100 CompareOwnerWithEx 0,1,-,CAR_OUT If Flt[0]=0,-,CHECK CityMusic_Off If Flt[2]=0,-1,ALREADYCREATED Stream_Create 1, "sounds\music\fireradio.ogg" Stream_Play 1 Label ALREADYCREATED Stream_FadeVol 1, 3, 5, 4 Let Flt[0]=1 Wait 2000 GoTo CHECK Label CAR_OUT If Flt[0]=1,-,CHECK Stream_FadeVol 1, 3, 4, 5 Let Flt[2]=1 CityMusic_On Let Flt[0]=0 Wait 2000 GoTo CHECK [свернуть] Но тут я тоже хз, будет ли работать ) И я хз, надо ли это тебе вообще, просто Остапа понесло ) |
Вообще меня устраивает тот вариант, который есть, так как хочется, чтобы в итоге человек, который играет в мод, прослушал весь часовой эфир. Но тебе все равно огромное спасибо за участие!
|
Ребята такой полезный скрипт. Можно ли его финальную версию сделать для любой машины? Может быть потом вытащим из Мафии ДЕ радиостанции и засунем в оригинальную Мафию... Как реализовывается использование аудиофайлов? Игра подхватывает их из какой-то папки? Собственно сам скрип как реализован, в каком файле?
А можно ли отключить обычную музыку скриптом? Есть идея сделать несколько радиостанций, на одной из которых будет играть обычная мафийная музыка. |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Когда приступаем? |
А возможно сделать эти скрипты через asi плагин? Чтобы не модифицировать файлы миссий.
|
Цитата:
Либо можно использовать старинный способ, добавив скрипт в taxi_pas.dat |
В общем, если реализуете, без необходимости модифицировать файлы миссий, то честь вам и хвала.
Пусть путь ведет в папку Radio |
Цитата:
Но для того, кто умеет, думаю, не сложно. Цитата:
Ни разу в нём не копался, но, я так понимаю, скрипты там так же устроены, как и в сценах? Тогда и в нём можно сделать. Можно мне краткий ликбез по taxi_pas.dat? В нём, как я понимаю, находятся скрипты, общие для всех сцен? Чем и как его редактировать? |
мафияпатчер имеет файл для внешнего скрипта(опция ThunderboltCheatReplacementScriptPath = script.sc) и также функцию его активирования не только в городских-миссиях(DisableThunderboltCheatScriptMissio nCheck = 1).
|
Цитата:
Можно объяснить, чтобы мне, неандертальцу, было понятно, что к чему? Что за зверь этот патчер, в каком месте к нему прикручиваются скрипты, и как эти скрипты пишутся? То есть, так же, как скрипты в сценах? Или как-то иначе? |
KlassenAS, вот здесь http://mafiascene.com/forum/viewtopic.php?p=128823 и здесь http://mafiascene.com/forum/viewtopic.php?p=127693
|
Цитата:
Цитата:
Дайте готовый файл со скриптами и я протестирую. путь там сделайте Mafia/radio |
ога внешний скрипт по типу таксипаса, но работает со сначала миссии.
файл script.sc создаем в папке с мафой, и(при активированиии опции(й) патчера) он работает как скрипт_объект(по статусу ближе к инит_скриптам). еще там небольшая шапочка предлагалась в скрипте, чтоб какую-то проблему решить сопутствующую...нипомню... а вот: dim_act 1 dim_flt 1 getactiveplayer 0 human_getproperty 0,0,energy if flt[0]=0,-1,dan_on act_setstate 100,off Label dan_on енту шапку можно в файл сразу вписать(а ниже уже - тело любого скрипта(начиная со своих dim-ов)); как видно, шапка призвана завейтить скрипт до момента пока миссиия не активируется полностью. |
Цитата:
Цитата:
А дальше, когда будут извлечены записи радиоэфиров из Mafia DE, тогда его допилю. Цитата:
Просто текстовый файл, созданный в блокноте? В какой кодировке? Или я могу просто сделать копию taxi_pas.dat и переименовать? |
txt в sc переименовываем и норм.
|
Вложений: 4
Цитата:
Даже два раза патчер закинул и в папку игры, и в папку scripts, а работать не хочет. Версия игры 1.2 Сам скрипт: Развернуть для просмотраDim_Act 1
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 If Flt[0]=0,-,CHECK CityMusic_Off If Flt[2]=0,-1,ALREADYCREATED Stream_Create 1,"radio\radio.ogg" Stream_SetLoop 1,1 Label ALREADYCREATED Stream_Play 1 Let Flt[0]=1 Let Flt[2]=0 Wait 2000 GoTo CHECK Label CAR_OUT If Flt[0]=1,-,CHECK Stream_Pause 1 Let Flt[2]=1 CityMusic_On Let Flt[0]=0 Wait 2000 GoTo CHECK [свернуть] Если вставить в сцену, будет работать как надо. |
Цитата:
|
Цитата:
Теперь всё пашет. Исправил ошибку из-за которой поток пересоздавался, добавил переменную. Теперь работает правильно: Развернуть для просмотраdim_act 1
dim_flt 1 getactiveplayer 0 human_getproperty 0,0,energy if flt[0]=0,-1,dan_on act_setstate 100,off Label dan_on Dim_Act 1 Dim_Flt 4 GetActivePlayer 0 Let Flt[0]=0 Let Flt[1]=0 Let Flt[2]=-1 Let Flt[3]=0 Label CHECK Wait 100 Human_GetSeatIdx 0,2 If Flt[2]=-1,CAR_OUT,-1 If Flt[0]=0,-,CHECK CityMusic_Off If Flt[3]=0,-1,ALREADYCREATED Stream_Create 1,"radio\radio.ogg" Stream_SetLoop 1,1 Label ALREADYCREATED Stream_Play 1 Let Flt[0]=1 Let Flt[3]=0 Wait 2000 GoTo CHECK Label CAR_OUT If Flt[0]=1,-,CHECK Stream_Pause 1 Let Flt[3]=1 CityMusic_On Let Flt[0]=0 Wait 2000 GoTo CHECK [свернуть] Прикольно кататься по Лост-Хэвену под Paul Wardingham - Assimilate Regenerate ) Так можно в скрипт целый плейлист зафигачить. Жаль, что патчер, как я понял, только один скрипт может использовать. Так было бы круто, если бы в настройках патчера прописывалось количество скриптов и их имена. Можно было бы дофига всего в игру наскриптить. А вот тут интересно: после того, как сохранился с работающим скриптом, вышел из миссии, при загрузке из сохранения начинает играть аудиопоток. Буду думать. Выяснил, что это происходит, если зациклить аудиопоток командой Stream_SetLoop Пришлось убрать её из кода. Теперь надо повтор реализовать обходным путем, через определение времени воспроизведения. |
Цитата:
Еще момент, в каждой миссии музыка будет начинаться с первого трека и с начала. Можно ли выбор трека рандомизировать? еще надо исключить работу скрипта в главном меню. |
Цитата:
мафа понимает мп3, наскоко помню. путь указать также и все. |
Текущее время: 19:55. Часовой пояс GMT +3. |
|
Powered by vBulletin® Version 3.8.11 Release Candidate 2
Copyright ©2000 - 2024, vBulletin Solutions Inc. Перевод: zCarot