[CLEO] Панель (меню) - Форум Cheat-Master.ru
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: Alowir, Sanoxxx  
[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
Новичок
Статус: Offline
Хороший урок, понятно пояснил. Как всегда молодец Меломан

В скайпе и вк сделок не веду, ни под какими логинами не добавляюсь чтобы занять денег \ купить \ продать что либо
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
Новичок
Статус: Offline
[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
Новичок
Статус: Offline
Мирон[CM], Обычное меню, как в админ панели на самп рп слева.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:
Статистика Форума