You are not logged in.
нашёл пару багов:
в версии 4.1.30 опкод 0AE6 отказывается работать, т.е. вылет (возможно потому что я использую вместо стринговой переменной переменную с адресом памяти строки), однако на версии 4.1.25 работает прекрасно (с той же переменной)
в версии 4.1.25 после использования опкода 0AE7 (хотя есть вариант что после 0AE6 или 0AE8, точно не проверял) происходит вылет на player.build , что неприемлимо...
вопрос: будут ли ещё обновления? если нет, то это плохо...
Last edited by Voron295 (14-05-2011 09:46)
Offline
Приведите полный код.
Offline
я вообще скрипт mp3-плеера пишу, завтра напишу комментарии и выложу исходник.
EDIT:
вот код с комментами:
{$CLEO} const MP3_ADDRESS = 10@ CURRENT_TRACK = 14@ MP3_STATE = 7@ TRACK = 17@ ARTIST = 18@ TRACK_ARTIST = 19@ VOLUME = 8@ VOLUME_PERCENT = 9@ MP3_NAME = 12@ MP3_ID = 5@ end var 0@ : Integer 1@ : Integer 2@ : Integer 10@: Integer 11@: Integer 12@: Integer 14@: Integer 19@: Integer 4@: Integer 9@: Float 8@: Float end 0AC8: MP3_ADDRESS = allocate_memory_size 260000 // поддержка максимум 1000 mp3-файлов 0AC8: TRACK = allocate_memory_size 30 // память под название трека из ID3 0AC8: ARTIST = allocate_memory_size 30 // память под имя артиста из ID3 0AC8: TRACK_ARTIST = allocate_memory_size 100 // память под строку, которая будет выведена на экран (Трек - Артист) VOLUME_PERCENT = 100 // громкость в процентах VOLUME = 1.0 // громкость для опкода 0ABC :FIND_MP3 wait 0 CURRENT_TRACK = 0 11@ = CURRENT_TRACK 11@ *= 260 11@ += MP3_ADDRESS if 0AE6: 1@ = find_first_file "mp3_player\*.mp3" get_filename_to 11@ //IF and SET then CURRENT_TRACK += 1 // тут происходит поиск mp3-файлов 11@ = CURRENT_TRACK // и запись их имён в память 11@ *= 260 // на каждый mp3-файл отводится 260 символов... 11@ += MP3_ADDRESS // хотя скорее 259, иначе следующее название будет продолжением предыдущего while 0AE7: 11@ = find_next_file 1@ //IF and SET // надо будет исправить... =) CURRENT_TRACK += 1 11@ = CURRENT_TRACK 11@ *= 260 11@ += MP3_ADDRESS wait 0 end 0AE8: find_close 1@ 4@ = CURRENT_TRACK 4@ -= 1 CURRENT_TRACK = 0 0AB1: call_scm_func @MP3_LOAD 2 CURRENT_TRACK MP3_ADDRESS MP3_NAME MP3_ID // сделал в виде scm-функции, чтобы было проще else // в MP3_NAME получаем имя mp3-файла, в MP3_ID - его ID в игре 0AE8: find_close 1@ // может там содержится не ID, но мне всё равно так проще =) jump @FIND_MP3 end :PLAY // на этой метке осуществляется запуск первого mp3-файла wait 0 if 0ab0: 101 jf @PLAY MP3_STATE = 1 while 0ab0: 101 wait 0 end gosub @MP3_GET_ID3 // получаем в MP3_NAME ID3 тэги... 0ACA: show_text_box MP3_NAME // и выводит в текстбокс jump @SET_STATE // переходим на метку установки статуса mp3 :PLAY_PAUSE wait 0 // т.к. установка определённого статуса mp3-файла происходит в цикле, if // после запуска mp3 сначала нужно сменить следующую операцию над ним MP3_STATE == 1 // (продолжение воспроизведения) then MP3_STATE = 3 end 0AB9: get_audiostream MP3_ID state_to 6@ // получаем текущий статус mp3-файла if 0ab0: 101 // если нажата кнопка Num 5, идём дальше, если нет - проверяем другие нажатия и т.д. jf @STOP while 0ab0: 101 // ждём, когда игрок отпустит клавишу wait 0 end if 6@ == 1 // если он на данный момент воспроизводится, then MP3_STATE = 2 // то применяем к нему операцию приостановки 0ACA: show_text_box "Pause" // и выводим текстбокс "Pause" else MP3_STATE = 3 // в случае, если mp3 на данный момент приостановлен, продолжаем его воспроизведение 0ACA: show_text_box "Play" // и выводим текстбокс "Play" end jump @SET_STATE //------------------------- :STOP // ну тут если нажать Num *, то остановим файл и выведем "Stop" if 0ab0: 106 jf @NEXT // если не нажать - идём дальше while 0ab0: 106 wait 0 end MP3_STATE = 0 0ACA: show_text_box "Stop" jump @SET_STATE :STOP_1 if 6@ == -1 jf @SET_STATE if not MP3_STATE == 0 then jump @NEXT_1 else jump @SET_STATE end //-------------------------- :NEXT if 0ab0: 102 // если нажать Num 6, то.... jf @PREV :NEXT_1 0AAD: set_audiostream MP3_ID perform_action 0 // останавливаем текущий mp3-файл audiostream.Release(MP3_ID) // и выгружаем его из памяти if // убеждаемся, что текущий трек не является последним CURRENT_TRACK == 4@ // 4@ - переменная содержащая общее кол-во mp3-файлов (учитывая, что первым является номер 0) then CURRENT_TRACK = 0 // если всё-таки является, то загрузим первый файл else CURRENT_TRACK += 1 // а если нет - загрузим следующий end 0AB1: call_scm_func @MP3_LOAD 2 CURRENT_TRACK MP3_ADDRESS MP3_NAME MP3_ID // загружаем mp3 while 0ab0: 102 wait 0 end if MP3_STATE == 2 then MP3_STATE = 0 end gosub @MP3_GET_ID3 // получаем его ID3 теги 0ACA: show_text_box MP3_NAME // и выводим их в текстбоксе jump @SET_STATE //------------------------- :PREV // тут аналогично предыдущей метке... if 0ab0: 100 jf @VOLUME_PLUS 0AAD: set_audiostream MP3_ID perform_action 0 audiostream.Release(MP3_ID) if CURRENT_TRACK == 0 then CURRENT_TRACK = 4@ else CURRENT_TRACK -= 1 end 0AB1: call_scm_func @MP3_LOAD 2 CURRENT_TRACK MP3_ADDRESS MP3_NAME MP3_ID while 0ab0: 100 wait 0 end if MP3_STATE == 2 then MP3_STATE = 0 end gosub @MP3_GET_ID3 0ACA: show_text_box MP3_NAME jump @SET_STATE //------------------------- :VOLUME_PLUS // тут управление громкостью if 0ab0: 107 jf @VOLUME_MINUS if VOLUME_PERCENT < 100 then VOLUME_PERCENT += 2 008F: VOLUME = integer VOLUME_PERCENT to_float VOLUME /= 100.0 // решил проценты переводить в дробное число 0ABC: set_audiostream MP3_ID volume VOLUME // ибо, если делать наоборот, получается на 1 процент меньше... end 0ACE: show_formatted_text_box "Volume: %d%%" VOLUME_PERCENT // форматирование и вывод в текстбокс {while 0ab0: 107 wait 0 end} jump @STOP_1 //------------------------- :VOLUME_MINUS // аналогично предыдущей метке if 0ab0: 109 jf @STOP_1 if VOLUME_PERCENT > 0 then VOLUME_PERCENT -= 2 008F: VOLUME = integer VOLUME_PERCENT to_float VOLUME /= 100.0 0ABC: set_audiostream MP3_ID volume VOLUME end 0ACE: show_formatted_text_box "Volume: %d%%" VOLUME_PERCENT {while 0ab0: 109 wait 0 end} jump @STOP_1 //------------------------- :SET_STATE // тут устанавливаем громкость и статус 0ABC: set_audiostream MP3_ID volume VOLUME 0AAD: set_audiostream MP3_ID perform_action MP3_STATE jump @PLAY_PAUSE //===================================================== :MP3_LOAD // это scm-функция загрузки mp3-файла 2@ = 0@ 2@ *= 260 2@ += 1@ 0A99: chdir "mp3_player" audiostream.Load(3@, 2@) 0A99: chdir 0 0AB2: ret 2 2@ 3@ //===================================================== :MP3_GET_ID3 // а это gosub для получения ID3 тэгов 0A99: chdir "mp3_player" 0A9A: 13@ = openfile MP3_NAME mode "rb" // IF and SET 0A99: chdir 0 0A9C: 16@ = file 13@ size //---------------------------------- 16@ -= 128 0AD5: file 13@ seek 16@ from_origin 0 //IF and SET 0A9D: readfile 13@ size 2 to 15@ 0A9D: readfile 13@ size 1 to 20@ if and 0039: 15@ == 0x4154 0039: 20@ == 0x47 then 0A9C: 16@ = file 13@ size //---------------------------------- 16@ -= 125 0AD5: file 13@ seek 16@ from_origin 0 //IF and SET 0AD7: read_string_from_file 13@ to TRACK size 30 //IF and SET 0AD5: file 13@ seek 16@ from_origin 0 //IF and SET 0AD7: read_string_from_file 13@ to 21@v size 30 //IF and SET //---------------------------------- 16@ += 30 0AD5: file 13@ seek 16@ from_origin 0 //IF and SET 0AD7: read_string_from_file 13@ to ARTIST size 30 //IF and SET 0AD5: file 13@ seek 16@ from_origin 0 //IF and SET 0AD7: read_string_from_file 13@ to 22@v size 30 //IF and SET 0A9B: closefile 13@ //---------------------------------- if 8846: not string 21@v empty // same as 0844 then if 8846: not string 22@v empty // same as 0844 then 0AD3: string TRACK_ARTIST format "%s - %s" TRACK ARTIST else 0AD3: string TRACK_ARTIST format "%s - %s" TRACK "Unknown Artist" end MP3_NAME = TRACK_ARTIST return else if 8846: not string 22@v empty // same as 0844 then 0AD3: string TRACK_ARTIST format "%s - %s" "Unknown Track" ARTIST MP3_NAME = TRACK_ARTIST return else return end end else 0A9B: closefile 13@ return end
Last edited by Voron295 (16-05-2011 13:56)
Offline
Народ, извините если повторяюсь, но у меня проблема. CLEO save не пашет что ли? Когда я начинаю новую
игру у меня все сохранения работают и после перезапуска игры, а если я загружаю и снова сохраняюсь, то
игра вылетает. В чем дело??? CLEO 4 ставил сразу после установки, подправил в папке ...\GTA SA\Data
пару файлов и закинул старые скрипты с CLEO 3 (когда я в прошлый раз ставил GTA SA устанавливал CLEO 3 и сохранил все скрипты, которые делал сам и которые скачал) и поставил GTA-SA_Parkour MOD. РУДЗ!!!
Offline
Ну что ж ищи баги в самих скриптах. Была у меня такая же проблема поисправлял скрипты теперь все ок.
Offline
Выкладываю первую публичную версию 4.2a. Буковка 'a' обозначает 'alpha', то есть версия не является стабильной и не предназначена для публичного использования.
Новых "фич" нет, из нововведений - открытие исходного кода. Теперь любой желающий может с ним ознакомиться. Никаких лицензий не прикрепляю, поскольку то, чем мы тут занимаемся, все равно "не вполне законно".
PS: Если появится группа людей, заинтересованная в разработке, возможно имеет смысл переехать на sourceforge или google code. А может быть Deji возьмется за разработку и выпустит что-то вроде CLEO 5 (это обсуждалось в английской ветке, если кто-то не в курсе). В общем, поживем - увидим.
[You must login to view hidden text.]
Last edited by Alien (29-10-2011 09:59)
Offline
Offline
UPD. Блин, что-то игра ошибку выбивает в самом начале - Error loading plugin cleo.asi
Хм. Интересно, попробуйте пересобрать из исходников. Посмотрите, создался ли в корне файл cleo.log и выложите его содержимое (если игра установлена в Program Files, переустановите куда-нибудь, куда разрешена запись без админ-прав).
Offline
Хм. Интересно, попробуйте пересобрать из исходников. Посмотрите, создался ли в корне файл cleo.log и выложите его содержимое
где взять make.exe? и вообще, не проще ли было просто сделать в виде проекта для, скажем, вижуал студио 10?
P.S. прошу простить меня за подобные вопросы, я ещё начинающий программист)
Last edited by Voron295 (29-10-2011 10:18)
Offline
Может быть и проще, но у меня лично с каких-то пор имеется предпочтение к GNU toolchain. Кроме того, код является специфичным к GCC, компилятор Microsoft его не соберет.
make.exe брать в интернете (нужна сборка под винду).
Вообще, удобно будет использовать этот toolchain (там уже есть GNU make).
Еще понадобится Cygwin, с его поиском и установкой проблем быть не должно.
Offline
Может быть и проще, но у меня лично с каких-то пор имеется предпочтение к GNU toolchain. Кроме того, код является специфичным к GCC, компилятор Microsoft его не соберет.
А разве есть разница между компиляторами одного и того же языка?
Offline
А разве есть разница между компиляторами одного и того же языка?
Ну этот вопрос явно не мне надо задавать, ибо я сам являюсь может быть хоть и не "начинающим программистом", но программистом-любителем то уж точно... Ну, попробую ответить.
Да, разница есть...
Во-первых, язык кучу раз перестандартизировался (в последний раз это произошло в августе этого года, и на данный момент не существует ни одного компилятора, который бы полностью имплементировал все нововведения этого стандарта. А я все равно уже начал использовать эти нововведения в CLEO - не удержался ). По этому поводу мне вообще кажется, что нет такого языка C++, есть только языки, определяемые соответствующими ANSI/ISO стандартами C++.
Во-вторых, разработчики коммерческих компиляторов часто кладут болт на обеспечение совместимости со стандартами. GCC тут старается более или менее им следовать, но это не всегда удается.
В-третьих, у большинства компиляторов имеются некоторые специфические только для них (или для целевой платформы) расширения языка. Например, описанные тут или тут). Когда имеешь дело с низкоуровневыми хаками, без них просто не обойтись (без того же inline-ассемблера, например). Поэтому приходится писать код, специфический для какого-то конкретного компилера...
PS: чего-то мы нафлудили много. Вы лучше попробуйте решить проблему с Error loading plugin. Вопрос к другим скачавшим - у вас есть такая же ошибка?
Offline
Offline
Ну, вообще-то я никаких вылетов в приведенном коде не наблюдал и не наблюдаю. Что касается опкодов вызова нативного кода, то с ними надо работать очень осторожно и четко понимать, что делаешь. Вполне возможно, что в вызываемой функции не сохраняется какой-нибудь регистр (меняться могут только eax, ecx, edx) или неверно указан stack_align.
Единственный баг, который, признаю, есть - это баг со звуком (на машинах с аппаратным ускорением 3d audio positioning ломается внутриигровая звуковая подсистема). Баг остается.
Ах да, еще был баг с тем, что скриптовая музыка продолжает играть, когда окно сворачивают. Этот баг должен быть исправлен, но я не проверял.))
Offline
Offline
Alien, ожидаются ли исходники Cleo для Vice City? Или хотя бы версия CLEO Vice City с поддержкой этого:
http://www.gtagarage.com/mods/show.php?id=2508
Добавление своих анимаций - очень нужная вещь, а с клео тот плагин почему-то не совместим
Пишу сюда, т.к. Alien не заметил видимо лс еще с июля
Last edited by Shag (01-11-2011 15:52)
Offline
В последней версии CLEO проблема с опкодами, созданными с помощью CLEO SDK. Проблема в этой фунции
CLEO_GetFloatOpcodeParam
Вылетает не только с моими опкодами, но и с плагином Sanchez'a frOpcodes.cleo, который тоже использует эту функцию.
PS раньше, несколько месяцев назад, frOpcodes.cleo у меня работал.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Проблема решена.
Ошибка была в совместимости с scm-log'ом.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Sanny Builder не может знать, какая из двух проверок должна быть использована - для дробных или для целых чисел:
001D: 27@ > 33@ // (int)
0025: 27@ > 33@ // (float)
Поэтому надо либо указывать номер опкода, либо предварительно объявить тип переменных в конструкции var..end (см. справку СБ, раздел Кодинг - Переменные).
Last edited by Den_spb (07-01-2012 16:59)
Offline
Рад что есть планы сделать новую версию Cleo.
Очень бы хотелось, что бы изменили проверки двух переменных, например:
в место 001D: 27@ > 33@ // (int) можно было писать просто 27@ > 33@
Ну, если уж на то пошло, то это не от CLEO зависит, а от SannyBuilder'а, а насколько мне известно, Seemann больше не собирается выпускать новых версий.
Offline
var 27@: int 33@: int end if 27@ > 33@
Last edited by DK22Pac (07-01-2012 20:40)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
CLEO4 SDK
Игра вылетает, если добавляю опкод с неопределённым кол-вом параметров (-1).
Хотел добавить опкод
0D00: store_memory_array 0xB7C4D6 elements 3 size 2 to 0@ 1@ 2@
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Здравствуйте, ребята, запилил, значит, 100 дополнительных опкодов.
http://www.gtaforums.com/index.php?showtopic=518780
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Offline