You are not logged in.
Pages: 1
Добрый вечер.
Заранее прошу прощение за столь глупые для вас вопросы.
Можно ли этими функциями создать выстрелы в определённых координатах и с определённым направлением:
1 2 3 | 005D 1140 CWeapon: :FireInstantHit (( CEntity *, CVector *)) 005D 0560 CWeapon: :FireHeliGun (( CEntity *, CVector *, CVector *,float)) 005CCF 90 CWeapon: :FireProjectile (( CEntity *, CVector *,float)) |
Если да, то объясните пожалуйста каким образом?
И можно ли создать свечение на земле как от фонарных столбов, или как от фар мотоциклов, или же как от прожектора полицейского вертолёта, в указанных координатах? если да, то как?
Заранее благодарю.=) Я просто мало что понимаю в работе с памятью игры, но хочу заполнить эти пробелы.
З.Ы. Функции взяты вот отсюда.
Last edited by Pavlent (04-04-2012 16:20)
Offline
Помогут ли эти функции - не знаю, а как вызывать функции и методы в скриптах, написано тут: http://sannybuilder.com/forums/viewtopi … 046#p15046
Если рассматривать, например, 005D0560, то будут передаваться 4 параметра:
CEntity - указатель на структуру какого-то физического объекта (под этим понимается в т.ч. транспорт и педы) - в данном случае, возможно, это вертолёт, с которого открывается огонь.
CVector - адрес вектора (вектор - это набор из трёх координат). Можно записать координаты в три последовательные переменные, тогда адрес вектора - это адрес первой переменной.
В случае с данной функцией первый вектор, возможно, будет указывать на точку начала выстрела, а второй - на точку конца выстрела. И тогда векторы скорее всего будут локальными, т.е. координаты будут являться оффсетами относительно объекта (вертолёта).
float - какое-то дробное число, может быть энергия выстрела.
В общем, тут надо поэкспериментировать.
Световая проекция на земле в SA создаётся опкодом 016F, в gta_sa.exe за это отвечает функция 0x707390. В VC должна быть аналогичная функция, только её надо найти.
Offline
В СА у меня описаны некоторые процедуры
1 | 4A0DE 0 ; void __stdcall CParticle_doGunEffects(CPed *Owner, RwV3D *pStartPoint, RwV3D *pTarget, char DoGunflash?) |
Создаёт эффект вспышки и дыма (поинтлайт и проекцию надо создавать самому), Target - единичный вектор, DoGunflash - включить/отключить вспышку (для оружия, у которого есть дамми gunflash в иерархии, партикл-вспышка не создаётся), StartPoint - мировые координаты, Owner - только пед.
В СА и ВС есть опкод
1 | 058A: create_gun_flash_from - 684.222 - 1577.189 12.384 to - 695.416 - 1576.626 12.415 |
Для создания "пули" (СА)
1 | 73AF 00 ; void __cdecl createBulletShot(RwV3D *pStartPoint, RwV3D *pEndPoint, int intensity) |
Last edited by DK22Pac (06-04-2012 08:43)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Спасибо вам за предоставленную информацию
Den_spb, я читал это, даже по-моему сохранял куда-то, но к сожалению у меня не хватает знаний, что бы воспользоваться этой информацией... Как я не пробовал, так у меня ничего не получилось, просто вылетает и всё...
Пробовал найти аналог опкода 016F, найти нашёл, но вот в VC он не работает, хотя в VICESCM.INI он присутствует - это
1 | 0250: create_light_at 780.5 - 942.8749 39.0 RGB_values 235 255 250 |
И ещё вот такую функцию нашёл на том же сайте
1 | 005D 1140 No Category CWeapon: :FireInstantHit (( CEntity *, CVector *)) |
Но когда я пытаюсь её вызвать (я на 100% уверен в том, что я делаю абсолютно не правильно, но не знаю как сделать по другому),
1 2 3 4 5 6 7 8 9 | :1 wait 100 if and 05EE: key_pressed 72 Player.Defined( $PLAYER_CHAR ) jf @1 05E6: 0@ = actor $PLAYER_ACTOR struct 05E3: call_method 0x5D 1140 struct 0@ num_params 2 pop 2 здесь пробовал указывать все возможные варианты (координаты игрока с оффсетом, просто числа, целые, дробные, и тд) но ничего не вышло ... jump @1 |
то игра вылетает...=(
Подскажите пожалуйста, или приведите пример (желательно) как сделать правильно.
Offline
1 2 3 4 5 6 7 8 9 10 | 05E6: 0@ = actor $PLAYER_ACTOR struct 0@ += 0x 504 05E0: 1@ = read_memory 1@ size 1 virtual_protect 0 1@ *= 0x 18 1@ += 0x 408 005A: 1@ += 0@ 0@ -= 0x 504 04C4: create_coordinate 3@ 4@ 5@ from_actor $PLAYER_ACTOR offset 0.0 5.0 0.0 05F8: 2@ = var 3@ offset 05E3: call_method 0x5D 1140 struct 1@ num_params 2 pop 0 2@ 0@ |
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Ого! спасибо большое!:^
DK22Pac , извини, а ты не мог бы прокомментировать сие творение?
Просто мне не очень понятны некоторые моменты, например, что означают смещения 0x504, 0x18, 0x408?
Я просто, мягко говоря, новичок в этом деле
Offline
Да вещь!
1 | 005D 1140 No Category CWeapon: :FireInstantHit (( CEntity *, CVector *)) |
Last edited by VintProg_Pro (07-04-2012 15:29)
Offline
FireInstantHit - метод класса CWeapon, чтобы его вызвать в CLEO, нам надо найти адрес структуры нужного оружия. Эти структуры начинаются с CPed+ 0x408, размер одной структуры - 0x18 байт.
CPed +0x504 - текущий слот оружия. Адрес структуры находится по формуле:
1 2 3 4 | А = Стр + 0x 408 + Сл * 0x 18 А - адрес структуры Стр - адрес структуры игрока Сл - слот оружия (CPed+0x504) |
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
DK22Pac, спасибо большое!:^
Хотел ещё поинтересоваться, а можно в этой функции дальность стрельбы или тип изменить? просто максимальная дальность выстрела, примерно метра полтора, да и сила тоже слабовата...
И хотел ещё узнать почему, когда я пытаюсь вызвать функции,
1 2 3 | 005D45E 0 CWeapon: :Fire (( CEntity *, CVector *)) 005CCF 90 CWeapon: :FireProjectile (( CEntity *, CVector *,float)) 005CD 340 CWeapon: :FireShotgun (( CEntity *, CVector *)) |
таким же образом, то игра вылетает?
Offline
дальность стрельбы
Вектор пробовал менять? Попробуй увеличить 5.0 до 100.0, к примеру.
04C4: create_coordinate 3@ 4@ 5@ from_actor $PLAYER_ACTOR offset 0.0 5.0 0.0
таким же образом, то игра вылетает?
Параметры значит не те - возможно нужна какая-то другая структура.
но вот в VC он не работает, хотя в VICESCM.INI он присутствует - это
А как ты его вызывал? Источники света и тому подобные "одноразовые" объекты надо создавать в цикле с одним wait 0:
1 2 3 4 5 6 | { $CLEO } 0000: while true wait 0 0250: create_light_at 780.5 - 942.8749 39.0 RGB_values 235 255 250 end |
П.С. Тут:
05E0: 1@ = read_memory 1@ size 1 virtual_protect 0
вроде 0@ должно быть.
Last edited by Den_spb (09-04-2012 04:56)
Offline
Вектор пробовал менять? Попробуй увеличить 5.0 до 100.0, к примеру.
Den_spb, пробовал, вот что выходит:
при 1.0
при 10.0
А как ты его вызывал?
Пробовал так:
1 2 3 4 5 6 7 8 9 10 11 | { $CLEO } Thread 'light' while true if Player.Defined( $PLAYER_CHAR ) then wait 0 04C4: create_coordinate 3@ 4@ 5@ from_actor $PLAYER_ACTOR offset 0.0 0.0 0.0 0250: create_light_at 3@ 4@ 5@ RGB_values 235 255 250 end end |
Пробовал делать, чтоб по нажатию кнопки, но всегда одно и то же - вылет.
П.С. Тут:
05E0: 1@ = read_memory 1@ size 1 virtual_protect 0
вроде 0@ должно быть.
Да, я заметил это с самого начала.
Last edited by Pavlent (09-04-2012 08:51)
Offline
Можно посмотреть как используется 0250: в main VC с помощью Поиска.
И wait 0 надо перенести сразу под while true, иначе если игрок не существует, то игра зависнет или вылетит.
Last edited by Den_spb (09-04-2012 10:13)
Offline
Там нет такого опкода, я смотрел информацию про него, в VC он не используется.. только в III и SA...
А на счёт дальности и типа стрельбы, больше нет вариантов? Просто хотелось бы в VC создать аналог опкода
1 | 06BC: create_M4_shoot_from 2193.268 - 1165.441 1031.124 target $TEMPVAR_X_COORD $TEMPVAR_Y_COORD $TEMPVAR_Z_COORD energy 1 |
но к сожалению моих знаний на это вообще никак не хватает...
Offline
Узнал, как работает эта функция:
1 | 005D 0560 CWeapon: :FireHeliGun (( CEntity *, CVector *, CVector *,float)) |
Она создаёт гильзу, float - размер гильзы, один из векторов, как я понял, это расстояние, между гильзами.
Я делал так: получал оффсет от гг, первый на расстоянии 1.0, второй на расстоянии 20.0, по преодолению первой гильзы 20 метров, создавалась вторая и тд. Но есть одна странность - почему-то у меня не выходит изменить направление гильз, они все летят на запад, вроде как, и создаются только над водой...
Может это кому пригодится для чего-нибудь
Last edited by Pavlent (11-04-2012 04:13)
Offline
Начнём с того, что эти векторы - точки в локальной системе координат.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Допустим так, а что дальше?
Опять же извиняюсь за глупый вопрос, а в чём различия между локальными и глобальными системами?
Offline
Но есть одна странность - почему-то у меня не выходит изменить направление гильз, они все летят на запад
Код хорошо бы посмотреть, по описанию мало что понял.
Опять же извиняюсь за глупый вопрос, а в чём различия между локальными и глобальными системами?
Глобальная система - мировая, локальная - связанная с каким-то объектом. Локальные координаты ещё называют оффсетами. Например, в опкоде крепления объекта к машине (СА) указываются локальные координаты и углы (т.е. они отсчитываются в системе координат машины и показывают, как объект будет расположен относительно этой машины)
0681: attach_object 71@ to_car 60@ with_offset 0.5 0.3 0.3 rotation 0.0 0.0 0.0
Last edited by Den_spb (16-04-2012 14:25)
Offline
А, понятно, спасибо, с оффсетами я знаком более менее.
А вот с дальностью выстрела я так и не разобрался, но зато сделал по другому:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | {$CLEO .cs} thread 'B6' :B6_0 wait 100 if Player.Defined( $PLAYER_CHAR ) jf @B6_0 :B6_1 wait 0 6@ = 0.0 if 05EE: key_pressed 69 jf @B6_1 :B6_1a 05E6: 0@ = actor $PLAYER_ACTOR struct 0@ += 0x 504 05E3: call_method 0x5F9DA 0 struct 0@ num_params 3 pop 0 100.0 10 54 05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 1@ *= 0x 18 1@ += 0x 408 005A: 1@ += 0@ 0@ -= 0x 504 :B6_2 04C4: create_coordinate 3@ 4@ 5@ from_actor $PLAYER_ACTOR offset 0.0 6@ 0.0 05F8: 2@ = var 3@ offset 05E3: call_method 0x5D 1140 struct 1@ num_params 2 pop 0 2@ 0@ 6@ += 1.0 if 6@ >= 100.0 jf @B6_2 jump @B6_1 |
Надо теперь как-то звук выстрела создать, а вот не могу понять, как... Есть вот такая функция:
1 | 005F9DA 0 cDMAudio: :PlayOneShot (( int,ushort,float )) |
Но я не могу что-то с ней разобраться, как я понимаю int - номер или ID звука, ushort - продолжительность, float - скорее всего громкость, но я в этом не очень уверен.
Offline
1 2 3 4 | 05E6: 0@ = actor $3 struct 0@ += 0x 64 05E0: 0@ = read_memory 0@ size 4 virtual_protect 0 05E4: call_function_method 0x5F9DA 0 struct 0xA10B8A num_params 3 pop 0 1.0 54 0@ 1@ |
Last edited by DK22Pac (21-04-2012 09:57)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Спасибо!
Извини, а ты не мог бы объяснить, на что указывает это смещение
1 | 0@ += 0x64 |
и что это за структура?
1 | 0xA10B8A |
Offline
1 | 0xA10B8A cDMAudio |
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Pages: 1