[CLEO] Панель (меню)
|
|
MelomanCool |
Дата: Среда, 09.01.2013, 18:29 | Сообщение # 1
|
Советник
Сообщений: 757
Статус: Offline
|
Несмотря на то, что уже существует несколько уроков по меню, там все так запутанно и непонятно, что я, когда их читал, мало что понял. Решил написать свой урок.
Немного теории
Чтобы понять принцип работы меню - откуда что берется, следует прочитать этот раздел.
Итак, первое что следует понять - как выводятся надписи в меню. Существует такая вещь как GXT-строки. Почти весь текст, который можно увидеть в игре (сингле, не мультиплеере) хранится как раз в GXT. У каждой такой строки есть свое имя. Пример GXT-строки: SAN_AND San Andreas SAN_AND - имя, San Andreas - содержание. Таким образом, в опкодах, которые используют GXT, мы указываем не сам текст, а название строки, в которой он содержится. Все достаточно просто - нашел нужный текст и вывел на экран, но возникает проблема - ведь в игре, зачастую нет такого текста, который полностью соответствует тому, что нужно показать. Что делать? Перезаписать! - то есть, записать свой текст поверх существующего в памяти игры (все игровые файлы остаются нетронутыми). Я немного оптимизировал код, чтобы не запутывать Вас:Код :GXT gosub @GXT1 1@ -= @1 // перезапись текста из метки 1 gosub @GXT2 return
:GXT1 0A9F: 1@ = current_thread_pointer 1@ += 16 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 return
:GXT2 1@ += 3 0AA8: call_function_method 6946896 12694336 num_params 1 pop 0 1@ 0@ 1@ += 12 0AA5: call 7439872 2 pop 2 0@ 1@ return
:1 0900: unknown_set_object 'CRED000' // название перезаписываемой записи, которую будем использовать в меню 0900: unknown_set_object "TEST TEXT" // содержание GXT, пишем текст тут (не обязательно капсом, // но в игре будет именно им, так что разницы нет) 0000: NOP Таким образом, если мы теперь будем использовать GXT CRED000, в меню отобразится TEST TEXT. Если нужно добавить еще одну строку:Код :GXT gosub @GXT1 1@ -= @1 // перезапись текста из метки 1 gosub @GXT2 gosub @GXT1 1@ -= @2 // перезапись текста из метки 2 gosub @GXT2 return
:GXT1 0A9F: 1@ = current_thread_pointer 1@ += 16 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 return
:GXT2 1@ += 3 0AA8: call_function_method 6946896 12694336 num_params 1 pop 0 1@ 0@ 1@ += 12 0AA5: call 7439872 2 pop 2 0@ 1@ return
:1 0900: unknown_set_object 'CRED000' 0900: unknown_set_object "TEST TEXT"
:2 0900: unknown_set_object 'CRED001' // название второй строки 0900: unknown_set_object "TEXT 2" // вторая строка Почти готово, теперь осталость только добавить gosub (jump с возвратом) в начало скрипта - gosub @GXT. Для меня самое сложное было понять именно это.
Теперь переходим к самому меню. Создается оно опкодом:Код 08D4: 0@ = create_panel_with_title 'WEAPONS' position 29.0 170.0 width 120.0 columns 1 interactive 1 background 1 alignment 0 Цитата WEAPONS - название меню, но на деле это пустая GXT без текста position 29.0 170.0 - координаты на экране, с дробной частью (.0) width 120.0 - ширина columns 1 - количество столбцов interactive 1 - активная панель background 1 - с фоном alignment 0 - тип выравнивания После чего нужно меню заполнить:Код 08DB: set_panel 0@ column 0 header 'DUMMY' data 'CRED000' 'CRED001' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' Задаем столбцу 0 (отсчет с нуля) содержание: Цитата Название - DYMMY, то есть пусто Первая строка - CRED000 (отобразится TEST TEXT) Вторая строка - CRED001 (отобразится TEXT 2) Оставшиеся десять строк нам не нужны, так что DYMMY Строк в панели всегда двенадцать, и оставшиеся нужно забивать DYMMY. Панель уже готова, осталось задать каждой строке какое-то действие. Для этого проще всего использовать таблицу jump'ов:Код :SELECT wait 0 if 0AB0: key_pressed 16 // если нажат шифт (указываем клавишу, которой будем выбирать в меню) jf @SELECT 08D7: 2@ = panel 0@ active_row // узнаем выбранную строку 0871: init_jump_table 2@ total_jumps 2 default_jump 0 @CLOSE jumps 0 @test_text 1 @text_2 2 @null 3 @null 4 @null 5 @null 6 @null Цитата 2@ - переменная, в которой хранится текущая выбранная строка total_jumps 2 - количество возможных действий (так как у нас две строки, действия тоже два) default_jump 0 @CLOSE - прыжек по умолчанию, указанная метка будет нужна для того, чтобы закрыть панель, введя какое-то слово jumps 0 @test_text 1 @text_2 - если 2@ равняется нулю (первая строка, т.к. отсчет с нуля), тогда переход на метку test_text, если единице - на метку text_1 Оставшиеся ненужные прыжки забиваем @null, то есть "ничего" Алгоритм такой: если мы нажимаем клавишу шифт, узнается, какая активная строка, и в зависимости от этого происходит то или иное действие.
Осталось написать сами действия:Код :CLOSE if 0ADC: test_cheat "Q" // нужный нам код для закрытия, можно указать и одну клавишу jf @SELECT 0581: enable_radar 1 08DA: remove_panel 0@ 0A96: 1@ = actor $PLAYER_ACTOR struct 1@ += 1432 0A8C: write_memory 1@ size 1 value 0 virtual_protect 0 Actor.LockInCurrentPosition($PLAYER_ACTOR, false) jump @Create_Menu // прыжок на начало (смотрите полный листинг в конце), так как панель удалена
:test_text 0ACD: show_text_highpriority "TEST TEXT" time 1000 // действие для первой строки jump @SELECT // прыжок на выбор действия
:text_2 0ACD: show_text_highpriority "TEXT 2" time 1000 // действие для второй строки jump @SELECT
:null jump @SELECT // тут действие и не нужно Теперь, когда мы знаем что и как происходит, код можно понять без труда: Код {$CLEO} 0000: NOP
gosub @GXT // перезапись игрового текста на наш
:Create_Menu wait 0 if and actor.Defined($PLAYER_ACTOR) 0ADC: test_cheat "TEST" // код для включения меню jf @Create_Menu 0A96: 1@ = actor $PLAYER_ACTOR struct 1@ += 1432 0A8C: write_memory 1@ size 1 value 1 virtual_protect 0 Actor.LockInCurrentPosition($PLAYER_ACTOR, true) // замораживаем актера, чтобы при выборе пунктов не бегал 0581: enable_radar 0 // выключаем радар для удобства 08D4: 0@ = create_panel_with_title 'WEAPONS' position 29.0 170.0 width 120.0 columns 1 interactive 1 background 1 alignment 0 08DB: set_panel 0@ column 0 header 'DUMMY' data 'CRED000' 'CRED001' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' // создание панели и заполнение столбца строками
:SELECT wait 0 if 0AB0: key_pressed 16 jf @CLOSE 08D7: 2@ = panel 0@ active_row 0871: init_jump_table 2@ total_jumps 2 default_jump 0 @CLOSE jumps 0 @test_text 1 @text_2 2 @null 3 @null 4 @null 5 @null 6 @null
:CLOSE if 0ADC: test_cheat "Q" jf @SELECT 0581: enable_radar 1 // включаем радар 08DA: remove_panel 0@ // удаляем меню 0A96: 1@ = actor $PLAYER_ACTOR struct 1@ += 1432 0A8C: write_memory 1@ size 1 value 0 virtual_protect 0 Actor.LockInCurrentPosition($PLAYER_ACTOR, false) // размораживаем актера jump @Create_Menu // прыжок на начало
:test_text 0ACD: show_text_highpriority "TEST TEXT" time 1000 jump @SELECT
:text_2 0ACD: show_text_highpriority "TEXT 2" time 1000 jump @SELECT
:null jump @SELECT
:GXT // перезапись текста gosub @GXT1 1@ -= @1 gosub @GXT2 gosub @GXT1 1@ -= @2 gosub @GXT2 return
:GXT1 0A9F: 1@ = current_thread_pointer 1@ += 16 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 return
:GXT2 1@ += 3 0AA8: call_function_method 6946896 12694336 num_params 1 pop 0 1@ 0@ 1@ += 12 0AA5: call 7439872 2 pop 2 0@ 1@ return
:1 0900: unknown_set_object 'CRED000' 0900: unknown_set_object "TEST TEXT"
:2 0900: unknown_set_object 'CRED001' 0900: unknown_set_object "TEXT 2" P.S. код компилировал, все работало как надо.
Ушел
|
|
|
|
Grimes |
Дата: Четверг, 07.02.2013, 05:20 | Сообщение # 2
|
Бывалый
Сообщений: 374
Статус: Offline
|
Хороший урок. У меня вопрос: К примеру, я хочу при выборе "TEXT 1" у меня началась активация телепорт по заданным координатам. После каких строк мне создавать новый поток?
|
|
|
|
MelomanCool |
Дата: Четверг, 07.02.2013, 10:28 | Сообщение # 3
|
Советник
Сообщений: 757
Статус: Offline
|
Код :test_text 0ACD: show_text_highpriority"TEST TEXT" time 1000 jump @SELECT :text_2 0ACD: show_text_highpriority"TEXT 2" time 1000 jump @SELECT Вот тут действия
Ушел
|
|
|
|
beweker |
Дата: Пятница, 08.02.2013, 14:51 | Сообщение # 4
|
Новичок
Сообщений: 5
Статус: Offline
|
Где 0ab0 который открывает само меню?
Моя правая рука от сердца к солнцу, моя правая нога во вашим еб*лам бьется.
|
|
|
|
Serega978 |
Дата: Пятница, 08.02.2013, 17:47 | Сообщение # 5
|
Боец
Сообщений: 96
Статус: Offline
|
beweker, там проверка на введенный код, а не на кнопки Код 0ADC: test_cheat "TEST" // код для включения меню
Нужны идеи для клео скриптов, пишите в скайп serega.9781
|
|
|
|
HaсkeR |
Дата: Четверг, 14.02.2013, 21:23 | Сообщение # 6
|
Бывалый
Сообщений: 349
Статус: Offline
|
Хороший урок, почти понял, не понял только как присваивать названия пунктам после тех 2-х которые написанны в примере
Помогаю новичкам и не только - писать в skype
|
|
|
|
[CM]Pirate |
Дата: Четверг, 14.02.2013, 23:27 | Сообщение # 7
|
|
Хороший урок, понятно пояснил. Как всегда молодец Меломан
В скайпе и вк сделок не веду, ни под какими логинами не добавляюсь чтобы занять денег \ купить \ продать что либо
|
|
|
|
HaсkeR |
Дата: Пятница, 15.02.2013, 11:40 | Сообщение # 8
|
Бывалый
Сообщений: 349
Статус: Offline
|
А все разобрался, меломан спасибо за урок!
Помогаю новичкам и не только - писать в skype
|
|
|
|
MxR_001 |
Дата: Пятница, 10.05.2013, 11:41 | Сообщение # 9
|
Новичок
Сообщений: 14
Статус: Offline
|
Отличный урок, все сдесь ясно, но у меня вопрос, а русскими буквами не выводится текст?, у меня только английские буквы
приму в дар пустышки 2-3 лвл
Сообщение отредактировал MxR_001 - Пятница, 10.05.2013, 19:09 |
|
|
|
[CM]Зайчег |
Дата: Воскресенье, 12.05.2013, 08:56 | Сообщение # 10
|
Новичок
Сообщений: 23
Статус: Offline
|
MelomanCool, я хочу сделать тп можешь дать код к этому уроку что бы в окоше выбрать пункт какой то и тебя ТП
|
|
|
|
iRicci |
Дата: Воскресенье, 12.05.2013, 09:46 | Сообщение # 11
|
|
[CM]Зайчег, вставь вместо 0ACD: show_text_highpriority "TEST TEXT" time 1000 Свой код телепорта.
|
|
|
|
[CM]Зайчег |
Дата: Воскресенье, 12.05.2013, 09:50 | Сообщение # 12
|
Новичок
Сообщений: 23
Статус: Offline
|
iRicci, я кода не знаю ТП много раз спрашивал не говорят p.s Код что бы по частям ТПхался
Сообщение отредактировал [CM]Зайчег - Воскресенье, 12.05.2013, 09:53 |
|
|
|
Мирон[CM] |
Дата: Воскресенье, 26.05.2013, 22:38 | Сообщение # 13
|
зеленый лох
Сообщений: 472
Статус: Offline
|
Это и есть вывод диалогов или я что-то путаю?
|
|
|
|
side75 |
Дата: Воскресенье, 09.06.2013, 17:39 | Сообщение # 14
|
Боец
Сообщений: 7
Статус: Offline
|
при компиляции пишет "Метка 1 переобъявленна"
|
|
|
|
iRicci |
Дата: Воскресенье, 09.06.2013, 19:04 | Сообщение # 15
|
|
Мирон[CM], Обычное меню, как в админ панели на самп рп слева.
|
|
|
|