You are not logged in.
Seemann, запись/чтение таким способом:
write<dword> baseStructAddr :: memberOffset << _VALUE write<dword> addr << _VALUEИли не удобно?
Мне кажется, это тяжело читается. К тому же
baseStructAddr :: memberOffset
нужно ведь как-то объявлять? Как компилятор узнает, на какую структуру ты передаёшь указатель?
DK22Pac,
спасибо, все работает прекраснои спасибо за полезные советы.
Ещё много полезных советов можно найти изучая справку (F12).
068C: is_player_autoaiming $PLAYER_CHARне подойдет?
У меня, видимо, старая версия опкодов. Хотя, сама проверка звучит как-то не очень правильно, если она проверяет, целится ли игрок обычным способом - с помощью мыши.
судя по базе, первая переменная занимает 4 байта
.data:008CC388 dword_8CC388
Прошу прощения, так и есть. Я просто посмотрел только вторую и решил, что первая тоже байтовая.
1) Можно ли как то скрыть прицел(пистолета, дробовика автомата и т.п) кроме того как вместо текстуры прицела засунуть пустую текстуру.
Можно переместить его в координаты, находящиеся за пределами экрана.
0A8C: write_memory 0xB6EC10 size 4 value 1.5 virtual_protect 0 0A8C: write_memory 0xB6EC14 size 4 value 1.5 virtual_protect 0
Чтобы вернуть обратно, делаем так:
0A8C: write_memory 0xB6EC10 size 4 value 0.40000001 virtual_protect 0 0A8C: write_memory 0xB6EC14 size 4 value 0.52999997 virtual_protect 0
2) Есть проверка на то активен ли прицел(игрок целится)?
Поигравшись с Cheat Engine'ом, выяснил, что есть парочка переменных - 0x8CC388 и 0x8CCB80 (обе размером в 1 байт). Первая "по умолчанию" равна 4, если прицелиться - значение меняется на 53, если целишься из обычного оружия (пистолет, дробовик, штурмовая винтовка), на 51 - если из базуки, на 7 - если из снайперки. Вторая меняет своё значение на 0 при использовании обычного оружия (с обычным прицелом). Не меняется при использовании базуки или снайпы.
И еще вопрос: можно ли загрузить и использовать текстуры(не оригинальные) в hud.txd. И надо ли загружать тхд архив в скрипте?
Не совсем понял вопрос. Как именно ты собираешься использовать текстуры? По сути, hud.txd уже загружен игрой, в любом случае, это не так уж сложно проверить, вроде.
Скопировать опкод из списка в буфер обмена можно кнопкой Enter. Добавить опкод к содержимому буфера обмена - Shift+Enter
Слишком непривычно. Да и неудобно - приходится убирать руку с мыши. А так левая рука сама тянется нажать Ctrl+C
Насчёт поиска опкодов:
Меня ещё всегда бесило, что нельзя скопировать опкод сочетанием клавиш Ctrl+C.
Попробуй такой вариант, но не знаю, что получится:
008A: $player_actor = 0@ // (int) 0@ - переменная педа
Полный бред. Управление игроком никак не зависит от переменной, куда записан его хендл.
Можно посмотреть структуру CPlayer. Там в самом первом поле стоит указатель на структуру педа игрока. Можно попробовать подменить указатель.
UPD. Если подменить указатель - вылет. Видимо нужно ещё что-то где-то менять.
можно ли поставить камеру на объект с смещением по оси X или Y?
Стандартными средствами игры - нет. А зачем, если не секрет?)
Просто я уже пытался это сделать, мне было необходимо создать вид от первого лица. Но ничего толкового из этой идеи не вышло. Пришлось решать проблему другими способами.
ДД, товарищи. Скажите, какую команду использовать, что бы убрать в миссии, скажем, задние двери автомобиля?
Тебе нужен один из опкодов с компонентами:
0697: set_car 543@ remove_component 4 visible_effect_flag 1 06E8: car 4@ destroy_component 2
У меня 2 вопроса:
1. Как перевести из игровых координат в экранные
2. Как перевести из экранных координат в игровые
В обоих случаях нельзя использовать игровые функции - нужен код, который будет работать в SA-MP (пишу на Pawno). У меня в распоряжении позиция камеры и Front-вектор камеры (вектор указывающий направление, куда смотрит камера), помимо координат, которые необходимо перевести.
@Voron295 -
4 года спустя)
Изначально этот пост был в теме "Sanny Builder v3.xx". Seemann его перенёс сюда.
а исправления ошибок можно сюда.
У меня есть варианты исправлений почти для всех опкодов, воспроизводящих анимацию для актёра. Я много работал с этими опкодами, поэтому знаю, как работают некоторые параметры.
0393: actor 215@ perform_animation "POOL_SHORT_SHOT" at 248@ times_normal_rate
Этот опкод лучше перефразировать так:
0393: actor $PLAYER_ACTOR animation "POOL_SHORT_SHOT" set_speed 1.0
04ED: load_animation "LOWRIDER" 04EE: animation "LOWRIDER" loaded 04EF: release_animation "LOWRIDER"
Заменить на:
04ED: load_IFP_file "LOWRIDER" 04EE: IFP_file "LOWRIDER" loaded 04EF: release_IFP_file "LOWRIDER"
0605: actor -1 perform_animation "M_SMKLEAN_LOOP" IFP "LOWRIDER" framedelta 4.0 loop 1 lockX 0 lockY 0 lockF 0 time -1 // versionA 0812: AS_actor -1 perform_animation "LRGIRL_IDLELOOP" IFP "LOWRIDER" framedelta 4.0 loopA 0 lockX 0 lockY 0 lockF 0 time -1 // versionB 088A: actor 34@ perform_animation "RAIL_FALL" IFP "SWAT" 8.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1 disable_force 0 disable_lockZ 1 0A1A: actor 88@ perform_walk_animation "HIKER_POSE_L" IFP "MISC" framedelta 4.0 loopA 0 lockX 0 lockY 0 lockF 1 -1 ms // versionC
В этих опкодах нужно посоветоваться, как лучше переименовать. Я распишу за что отвечает каждый параметр.
Actor, animation и IFP - думаю понятно, здесь всё правильно описано.
framedelta нужно переименовать в interpolation. Этот параметр отвечает за плавность перехода в анимацию (и за плавность выхода из анимации или перехода в другую анимацию). Чем больше этот параметр - тем быстрее и заметнее переход. Чем меньше параметр - тем плавнее и красивее. Обычно лучше ставить его в районе 4.0-15.0. Если поставить 10000.0, то актёр моментально примет начальную позу анимации, т.е. вообще без перехода.
loop - здесь всё ясно, цикл. lockX и lockY нужно поменять местами. Они отвечают за перемещение коллизии игрока вместе с анимацией (Root-костью в анимации). Т.е. если выставить lockX = 1 то коллизия игрока будет двигаться вместе с анимацией вперёд-назад (по оси Y относительно игрока); если выставить lockY = 1, то коллизия игрока будет двигаться вместе с анимацией влево-вправо (по оси X относительно игрока). Поэтому нужно бы их поменять местами. Ещё замечен следующий факт: если выставить только lockY = 1, а lockX оставить равным нулю, то перемещения игрока вместе с анимацией не будет ни по одной из осей. Проще говоря у нас 3 варианта - без перемещения коллизии (0, 0), с перемещением по оси Y (1, 0) и с перемещением по осям X и Y (1, 1).
lockF отвечает за замораживание игрока в последней позе анимации. Не знаю даже, как его переименовать. Наверное лучше так и оставить.
time - тут, я думаю, без комментариев. Здесь всё верно.
У нас есть 4 опкода воспроизводящих анимации для актёров (не считая комбинированных с прикреплением объектов и т.п.). Они отличаются между собой некоторыми нюансами. Есть 3 опкода с одинаковыми параметрами и один содержащий те же параметры + 2 дополнительных параметра. Первые 3 опкода можно разделить по версиям (A, B, C), как это сделано комментариями к опкодам.
versionA (0605): Отличительная особенность опкода состоит в том, что анимация воспроизводится только если актёр находится на земле. Если во время выполнения анимации актёр слетел с поверхности, т.е. оказался в воздухе, то воспроизведение анимации прервётся.
versionB (0812): Тоже самое, что и versionA, только работает и в воздухе. Т.е. нет зависимости от того, в воздухе актёр или нет, анимация будет работать в любом случае, даже под водой.
versionC (0A1A): Имеет ту же особенность, что и versionA - не работает в воздухе. Имеет дополнительную особенность - выполняется относительно кости Root актёра и может выполняться параллельно другой анимации. К примеру, если включить lockX и lockY, бежать, и воспроизвести анимацию на игроке, то перемещение Root в анимации будет прибавляться к бегу. Если lockX и lockY отключить, перемещение будет только визуальным, без перемещения коллизии актёра. При этом анимацию можно сбить, например, совершив удар (ЛКМ).
Ну и последний опкод, содержащий дополнительные параметры, 088A.
Первый параметр описан как disable_force. На самом деле этот параметр отвечает за возможность воспроизведения анимации в воздухе. Если выставить 1, то опкод будет равносилен опкоду 0812 (versionB), если 0, то, соответственно, опкоду 0605 (versionA).
Второй параметр описан как disable_lockZ, что опять же неверно. Если выставить параметр равным 1, то по окончанию анимации коллизия актёра будет установлена в то место, где закончилась анимация, но это - если lockX и lockY равны нулю. Примечательно, что на ось Z это тоже работает. Т.е. если в анимации актёр смещается ещё и по оси Z, то в конце анимации коллизия актёра будет установлена точно в то место, где анимация закончилась, по всем трём координатам. Судя по всему, алгоритм использует разницу между начальным положением и конечным положением, а в конце анимации смещает коллизию на заранее вычисленную разницу. Из-за этого, если использовать параметры lockX и lockY, актёр будет дополнительно смещён в конце анимации на ту самую разницу, о которой я упомянул предложением ранее. Если отключить параметр disable_lockZ, то опкод будет работать полностью точно так же, как и опкоды версии A и B, в зависимости от параметра disable_force.
Параметр disable_force лучше переименовать в allow_air или что-то в этом роде, а disable_lockZ - пока что не могу придумать, как изъяснить его коротко и понятно.
Если кого-то интересует синхронизация в SA-MP, то воспроизведение анимации опкодом 0812 даёт возможность другим игрокам видеть вашу анимацию в SA-MP'е, при двух условиях:
1. Анимация находится в оригинальных игровых IFP-файлах. Т.е. если создать свой IFP-файл, или добавить свою анимацию к уже существующему игровому IFP-файлу, то другие игроки их не увидят, даже если у них есть эта анимация тоже. Видимо, SA-MP использует список всех игровых анимаций для синхронизации.
2. IFP-файл, из которого воспроизводится анимация, загружен у других игроков. Обычно SA-MP сам загружает нужный IFP-файл при 1-2 воспроизведениях из этого IFP.
До некоторых пор меня устраивали возможности анимационного движка SA, но теперь нужно нечто большее - сохранение угла разворота по окончании анимации, перемещение коллизии игрока по оси Z вместе с анимацией и т.п. Поэтому я сейчас занимаюсь разработкой собственного анимационного движка для SA.
Ну, вроде всё рассказал о анимациях. Думаю, кое-что из моих описаний можно было бы в справку SB добавить Но для начала нужно придумать названия к тем параметрам, к которым я названия придумать не смог. Думаю, у тех, кто лучше разбирается в инглише, получится грамотно назвать их.
Кстати, исправления описания опкодов куда писать?)
@wmysterio, при создании проекта в MVS вверху можно выбрать версию фреймворка, которую будешь использовать. Наверняка можно изменить её и для уже созданного проекта. Надо бы покопаться в гугле.
Проект будет ориентирован на скрипты движка RAGE (GTA4 и последующие игры).
Чисто под RAGE или предыдущие игры тоже будут поддерживаться?
Я сейчас как раз занимаюсь переговорами с заинтересованными людьми о дальнейшей разработке CLEO.
Обращайтесь, если что. Помогу с удовольствием
Кроме того, недавно начал думать над Sanny Builder 4. Но это еще в стадии раннего планирования.
А что собой будет представлять такое глобальное изменение в целую версию?)
Кстати, русский язык на баг-трекере лучше не ставить... там сплошной ужас
@Seemann, как насчёт обработки декомпилируемых скриптов, приведение их к высокоуровневым конструкциям?) Это, наверняка будет очень сложно, но если вносить о них информацию в скрипты (в конце, как и информация о конструкциях hex..end и т.п), то можно было бы оформить что-нибудь такое. Хотя, вроде предлагали делать исходник внутри cs-файла - тоже идея неплохая.
Кстати, выше прозвучала идея об автообновлениях - тоже пригодилось бы)
И, да, планируется написание CLEO 5?
Seemann эх.. лучше бы это дело все организовать в текст и разместить в русскоязычной GTA-Википедии чтобы, страна знала своих героев
и будущим поколениям я думаю, будет наверняка интересно узнать историю создания CLEO и СанниБилдера...
Мне кажется, скриптингом сейчас в основном занимаются олдфаги, да и те уже завязывают с CLEO. А если новички пытаются что-то делать, то они на этих форумах редко появляются. Хотя историю написать было бы совсем неплохо и даже интересно.
Я вот сюда уже очень давно не заходил. Перешёл на плагины (ASI). Хотя, в своё время CLEO подарило мне множество интересных открытий, скриптов и всякого разного фана, за что спасибо Seemann'у и Alien'у
Я вот собираюсь сейчас стать программистом, а если бы не Sanny Builder и CLEO, не знаю, ушёл бы я в эту сферу или нет, ведь всё с него и началось. C++ я стал изучать только год-полтора назад, а Паскаль был по школьной программе, но если б не Sanny Bulder и CLEO - я б так быстро не смог понять синтаксис и логику того или иного языка программирования.
Я вот сам не знал истории создания CLEO, а вот сейчас прочитал и... оказывается CLEO 1 написано ассемблерными вставками в самом scm... Вобщем, интересно было почитать топик о продвижениях в разработке CLEO
Здарова, ребят. Как сделать, что бы актер в scm пути ходил бесконечно? Две координаты: Начало и конец пути, и он по ним ходит и ходит.. Патрулирование что-ли.
Первое, что приходит на ум - проверять, находится ли актёр в конечной точке, если да, то по новой ставить его на путь.
т.е. для двух тачек одинаковой модели будут существовать в памяти две разные модели(сорри за тавтологию)?
Зачем две разные? Одна и та же. Модель загружается только один раз и пока она используется (неважно, 1 машина с такой моделью или 100), она есть в памяти, только одна. Как только ни одной машины с такой моделью не будет использоваться в игре - модель будет выгружена из памяти.
Я канеш могу ошибаться, но:
0xA47B60 - Start of the external scripts info pool. There are 82 elements with 32 bytes of size each
+0 = [dword] Script IP
+4 = [word] Status (can be obtained by 0926)
+6 = [word] Index in SCM (a number as defined in the scm header)
+8 = [char] Name, char 20
+28 = [dword] Size
Предполагается не имя потока, а имя файла .cs, а это совершенно разные вещи.
Можно попробовать разобраться в том, как CLEO загружает скрипты, хотя я сильно сомневаюсь, что там есть то, что тебе нужно.
Хай! Вопрос такой: модельки тачек SA подгружает динамически по мере надобности или один раз загрузила и пользуется, пока её не закроют?
Если модель не используется - она выгружается. Да, динамически.
Да, именно так :3
Тогда я не пойму одного - ты не знаешь, как называется твой .cs-файл?)
Я имел ввиду поток, клео скрипт. Можно ли открыть файл %script_name%.ini если имя скрипта %script_name%.cs
Имеется ввиду клео-скрипт, который выполняется в данный момент? Т.е. в своём скрипте ты хочешь открыть файл ini, с таким же именем как и твой скрипт? Или как? Объясни задачу подробнее.
Хм, а как узнать имя текущего выполняемого скрипта? И можно ли, опираясь на него, открыть файл для чтения с тем же именем, но другим расширением (например, .ini)?
Что значит "текущего выполняемого скрипта"? В один момент выполняется только один скрипт)
2 - Как записать в переменную дистанцию от одной машины к другой?
Элементарно:
050A: 0@ = distance_between_XYZ 1@ 2@ 3@ and_XYZ 4@ 5@ 6@
где 1@, 2@, 3@ - координаты первой машины, а 4@, 5@, 6@ - координаты второй машины.
По поводу первого вопроса ничего не могу сказать. Скорее всего нужно разбирать код в экзешнике (базе).
Приветствую. А как создать грузовик с прицепом?
Загрузить две модели. А какой опкод, что бы прицепить к грузовику прицеп?
0893: put_trailer 0@ on_cab 1@
Вот так, вроде. 0@ - хэндл прицепа, 1@ - хэндл грузовика.