#4726 23-07-2016 16:24

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Один вопрос

Ага оно, спасибо! Ещё вопросы: а на флаги handling, как потом выйти?  И проверить есть ли второй глушитель? Для VC когда-то ты помнится объяснял про проверку второго глушителя через опкод 05F9. Не могу тот пост, к сожалению, найти. Просьба пояснить ещё раз на примере для GTA3.
В VC было так:

05E7: STRUCT_AVTO = car AVTO struct 
STRUCT_AVTO += 0x120
05E0: STRUCT_AVTO = read_memory STRUCT_AVTO size 4 virtual_protect 0
0085: EXHAUST = STRUCT_AVTO
EXHAUST += 0xCC
05E0: EXHAUST = read_memory EXHAUST size 4 virtual_protect 0
05F9: 8@ = EXHAUST AND 0x100
if
  8@ > 0
then
         EXHAUST = 2
else
         EXHAUST = 1
end

Offline

#4727 23-07-2016 17:17

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Один вопрос

Смотри если ты знаешь номер бита с 0 итд  то можно проверять значение вот так:

05F9: 8@ = EXHAUST AND BIT
if
  8@ > 0

где BIT равен, если нулевой то  = 1, если первый то = 2, второй = 4, третий = 8 итд. Т.е. умножаешь на 2

Структуру handling для gta 3 я к сожалению не знаю...

Last edited by mfisto (23-07-2016 17:19)


I know everything and nothing...

Offline

#4728 23-07-2016 18:34

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Один вопрос

Спасибо, буду разбираться. А в CLEO GTA3 вместо опкода

05F9: 8@ = EXHAUST AND BIT 

этот?

0B10: 0@ = 0@ AND 0xFF 

Offline

#4729 23-07-2016 21:02

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Один вопрос

Можно и тот тоже, кстати, и в Вайсе также. Но это уже во второй версии клео, а в первой для GTA 3 не было и того и другого.


I know everything and nothing...

Offline

#4730 24-07-2016 09:52

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Один вопрос

Смещение на флаги handling нашёл 0xC8, может кому ещё понадобится. С проверкой битов разобрался, спасибо.

Offline

#4731 24-07-2016 10:52

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Один вопрос

Почему игра зависает при столкновении об чего-либо на максимальной скорости, если изменить максимальную скорость авто через структуру хендлинга 0xC2B9DC по смещению 0x84 ?
вот примерно так подменяю значение:

{$CLEO .cs}
0000:
       
while true
    wait 0                                
    if and
    00DF:  actor $PLAYER_ACTOR driving
    0AB0: key_pressed 48  // 0
    then
    03C0: 0@ = actor $PLAYER_ACTOR car
    0AB1: @getVehHandlingOffset 1 from_car 0@ store_to 2@
    2@ += 0x84
    0A8C: write_memory 2@ size 4 value 1.155 virtual_protect 0 //  TransmissionData.fMaxVelocity
    end
end
// source http://gtaforums.com/topic/429194-changing-car-handling/#entry1059632226
:getVehicleNum
{
Parameters:
   Passed:
     0@ - vehicle handle
   Result:
     1@ - vehicle number
Example:
   0AB1: @getVehicleNum 1 from_car 0@ store_to 1@
}
0441: 1@ = car 0@ model
1@ -= 400
0AB2: ret 1 1@
:getVehHandlingOffset
{
Parameters:
   Passed:
     0@ - vehicle handle
   Result:
     3@ - vehicle handling offset
Example:
   0AB1: @getVehHandlingOffset 1 from_car 0@ store_to 1@
}
0AB1: @getVehicleNum 1 from_car 0@ store_to 1@
0085: 2@ = 1@
2@ *= 0x308
2@ += 0xB1F650
2@ += 0x4E
0A8D: 3@ = read_memory 2@ size 2 virtual_protect 0 // get handling ID
3@ *= 0xE0
3@ += 0xC2B9DC
0AB2: ret 1 3@
:getVehHandlingOffset_onID
0@ -= 400
0085: 2@ = 0@
2@ *= 0x308
2@ += 0xB1F650
2@ += 0x4E
0A8D: 3@ = read_memory 2@ size 2 virtual_protect 0 // get handling ID
3@ *= 0xE0
3@ += 0xC2B9DC
0AB2: ret 1 3@

Offline

#4732 24-07-2016 14:24

Seemann
Registered: 07-08-2006
Posts: 2,153

Re: Один вопрос

kenking
можешь обобщить эти знания о хендлинге в GTA3 и запостить в этой теме?

Offline

#4733 25-07-2016 06:39

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Один вопрос

Да там пока обобщать-то нечего, только начал разбирать.

UPD: кое-что разобрал

Last edited by kenking (25-07-2016 11:47)

Offline

#4734 01-09-2016 00:13

Hedgy
Registered: 11-09-2014
Posts: 9

Re: Один вопрос

Доброго времени суток!
(Общая идея топика - градусное фиксированное вращение автомобиля, как 0453: set_object $CRANE_MAGNET XY_rotation 15.0 0.0 angle $TEMPVAR_ANGLE для объекта)
)
Возник вопрос такого рода - дано смещение для машины в пуле, выводящее на углы поворота в градусах (возможно в градах, но не в этом суть).

For each vehicle in the pool:
+20 = [byte] Contains a pointer to the rotation/position matrix (84 bytes):
+0 = [float] X-axis Rotation (Grad)
+4 = [float] Y-axis Rotation (Grad)
+8 = [float] Z-axis Rotation (Grad)

Правильно ли прибавлять это смещение сразу к структуре авто?

0A97: 10@ = car $car struct
10@ += 20     
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0  // pointer                                  
0A8D: 4@ = read_memory 10@ size 4 virtual_protect 0   // x rot in grad
...

При таком развитии событий, градусы совсем не градусы, а как будто значения тригонометрической окружности, строго от -1.0 до 1.0, с привязкой к ориентации мировых координат.
Хочется получить эффект, как у опкода

 0731: set_car $car y_angle_to 60.0 

, однако запись своего значения (у = 1.0 к примеру) такого эффекта не дает и не фиксируется.
Проблему можно было бы решить, имея опкод XXXX: set_car $car X_angle_to 60.0, но увы, такого нет.
Кто может здравую мысль подкинуть?)

Offline

#4735 01-09-2016 08:35

wmysterio
Registered: 04-03-2011
Posts: 214
Website

Re: Один вопрос

Кто может здравую мысль подкинуть?)

Ну, если значение угла находятся строго от -1.0 до 1.0, значит, возможно, это кватернион.

Offline

#4736 01-09-2016 12:09

Hedgy
Registered: 11-09-2014
Posts: 9

Re: Один вопрос

+20 = [byte] Contains a pointer to the rotation/position matrix (84 bytes):
+0 = [float] X-axis Rotation (Grad)
+4 = [float] Y-axis Rotation (Grad)
+8 = [float] Z-axis Rotation (Grad)
+16 = [float] X-axis Rotation (Looking)

Идея имеет место, т.к. после Z-axis Rotation не указано смещение +12. Скорее всего это и есть четвёртый компонент кватерниона, вечером проверю.

Offline

#4737 02-09-2016 17:35

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Один вопрос

Это всё конечно здорово, но мне не понятен один момент. При:

For each vehicle in the pool:
+20 = [byte] Contains a pointer to the rotation/position matrix (84 bytes):
+0 = [float] X-axis Rotation (Grad)
+4 = [float] Y-axis Rotation (Grad)
+8 = [float] Z-axis Rotation (Grad)

Разве не правильней будет удалить одну строчку тут???:

(1) 0A97: 10@ = car $car struct
(2) 10@ += 20     
(3) Вот эту>>>>>>>>>>>>>0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0  // pointer                                  
(4) ИЛИ эту(на выбор)>>>0A8D: 4@ = read_memory 10@ size 4 virtual_protect 0   // x rot in grad
...

???
А иначе, насколько я понял, получается, что мы высчитываем поинтер X ротации(1,2), потом читаем значение, записанное туда(3), а потом читаем значение по адресу, который равен(sic!) X ротации автомобиля(4)!

Offline

#4738 03-09-2016 23:19

Hedgy
Registered: 11-09-2014
Posts: 9

Re: Один вопрос

Не соглашусь с тобой.
Все работает и лишних строк там нет.

0A97: 10@ = car $car struct
10@ += 20                    // смещение на поинтер матрицы                      
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0   //сам переход к матрице 
10@ += 48                   // смещение на мировую XYZ позицию                        
0A8D: 4@ = read_memory 10@ size 4 virtual_protect 0   //чтение X позиции в мировых координатах
10@ += 4                                                            
0A8D: 5@ = read_memory 10@ size 4 virtual_protect 0  
10@ += 4
0A8D: 6@ = read_memory 10@ size 4 virtual_protect 0

А вот если не осуществлять переход на матрицу, считая, что +20 к структуре это указатель на Х-поворот, то результат выдаст равным 0.0.

--Edit    Использовал NO опкоды работы с матрицами, проблема решена.

0A97: 10@ = car $car struct
10@ += 20                                          
0A8D: 4@ = read_memory 10@ size 4 virtual_protect 0 
0D06: get_matrix 4@ position_to 1@ 2@ 3@ 
10@ = car.Angle($car)
10@ /= 57.2958   // перевод в радианы
11@ = 1.0471975511965977461542144610932
0D08: set_matrix 4@ rotation 0.0 11@ 10@ //радианы
0D05: set_matrix 4@ position 1@ 2@ 3@

Last edited by Hedgy (04-09-2016 13:00)

Offline

#4739 04-09-2016 17:39

Shag
Registered: 29-03-2010
Posts: 147
Website

Re: Один вопрос

Пардон - забыл, что речь о SA(в VC в структуре авто не поинтеры матриц позиции, поворота и т.д., а сами матрицы)...

Offline

#4740 12-09-2016 19:13

Hedgy
Registered: 11-09-2014
Posts: 9

Re: Один вопрос

Продолжаю штурм вопросами.

Возможно ли передвинуть сферу коллизии в транспорте посредством скрипта в игре?
Или деактивировать, что тоже сойдет.

Хм, как-то же сделан погрузчик, надо покопать этот момент.

Last edited by Hedgy (14-09-2016 06:17)

Offline

#4741 13-09-2016 17:26

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Один вопрос

1) Можно передвинуть и можно уменьшить (можно даже попробовать поставить радиус в 0 и глянуть, что получится).
2) Можно удалить.

Могу показать как это выглядит в С++, в CLEO надо будет копипастить кучу read/write_memory, что есть нечитабельный код.

static void VehicleRemoveSphere(CVehicle *vehicle) {
    CColData *colData = vehicle->GetColModel()->m_pColData;
    for (unsigned int i = 0; i < colData->m_wNumSpheres; i++) {
        if (colData->m_pSpheres[i].m_nFlags == 19) { // windscreen col sphere
            colData->m_pSpheres[i].m_fRadius = 0.0f;
            colData->m_pSpheres[i].m_vCenter = {0.0f, 0.0f, 0.0f};
        }
    }
}

PS Модели коллизии - общие для всех авто с одной моделью, копии не создаются.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#4742 14-09-2016 06:29

Hedgy
Registered: 11-09-2014
Posts: 9

Re: Один вопрос

О, спасибо, интересно!  Общая коллизия - не проблема, в принципе.
Проблема в С++. Срочно буду его осваивать тогда, ибо весь бмх-мод хорошо бы увидеть в виде плагина.

Тогда ещё вопрос, в гта на мото и велосипедах у персонажа руки крепятся к координатам дамми bargrip и его зеркалу по Х. Ты где-то писал ноп, чтобы не удалялись эти дамми, так что теперь я могу двигать его.
Вопрос в том, как выйти на адрес координат для левой руки (тех зеркальных координат по Х*-1)?

---UPD
По поводу коллизии погрузчика - у него подвижная часть коллизии соединена с крышей :о
Вопрос - как игра отцепляет этот кусок и двигает? Хм.

Last edited by Hedgy (15-09-2016 11:53)

Offline

#4743 15-09-2016 17:42

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Один вопрос

Hedgy wrote:

Тогда ещё вопрос, в гта на мото и велосипедах у персонажа руки крепятся к координатам дамми bargrip и его зеркалу по Х. Ты где-то писал ноп, чтобы не удалялись эти дамми, так что теперь я могу двигать его.
Вопрос в том, как выйти на адрес координат для левой руки (тех зеркальных координат по Х*-1)?

Увы, про nop я ничего не помню.
И вопрос я что-то не очень понял. Можно же просто умножить x-координату на (-1), нет?
Координаты bargrip записаны в VehicleStruct, в массиве позиций дамми:

CVector bargripRight = CModelInfo::ms_modelInfoPtrs[bike->m_wModelIndex]->m_pVehicleStruct->m_vDummyPos[10];

Компонент bargrip (RwFrame) действительно удаляется игрой (удаляются все компоненты, которые используются только для определения позиции - headlights, engine, exhaust и прочие, а их позиции записываются в массиве в VehiceStruct).

Hedgy wrote:

По поводу коллизии погрузчика - у него подвижная часть коллизии соединена с крышей :о
Вопрос - как игра отцепляет этот кусок и двигает? Хм.

Всё очень просто. Всем сферам и треугольникам коллизии, которые отвечают за подвижную часть, присвоен материал CAR_MOVINGCOMPONENT (ID: 65). Ищем все такие сферы/треугольники и перемещаем их.

Hedgy wrote:

Срочно буду его осваивать тогда, ибо весь бмх-мод хорошо бы увидеть в виде плагина.

Удачи. По всем вопросам можешь обращаться в skype (dk22pac).


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#4744 15-09-2016 18:02

Hedgy
Registered: 11-09-2014
Posts: 9

Re: Один вопрос

DK22Pac wrote:

И вопрос я что-то не очень понял. Можно же просто умножить x-координату на (-1), нет?

Ан-нет, вопрос именно в нахождении адреса, где присваиваются координаты для кости левой руки.

По поводу материала коллизии погрузчика - не знал такого свойства. good
Но с коллизией все равно разбираться и разбираться..

Offline

#4745 17-09-2016 21:38

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Один вопрос

как в SA через cleo активировать возможность использования оружий всех типов?
т.е. по несколку винтовок, автоматов и оружий ближнего боя.

но не так чтоб выдать тупо все оружия, а именно что бы можно было и пикапом поднимать оружия без замены и через скрипт дать так же.

Offline

#4746 21-09-2016 07:53

Mr.GeniusZ
Registered: 09-11-2014
Posts: 29

Re: Один вопрос

Как можно узнать, что машина поддерживает набор винил? (097D: get_car $CARMOD_CAR number_of_possible_paintjobs_to $10084
- не то)

Last edited by Mr.GeniusZ (21-09-2016 07:54)

Offline

#4747 21-09-2016 15:51

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Один вопрос

Mr.GeniusZ wrote:

Как можно узнать, что машина поддерживает набор винил? (097D: get_car $CARMOD_CAR number_of_possible_paintjobs_to $10084
- не то)

06EC: get_car AVTO number_of_possible_paintjobs_to SUM_VINIL_AVTO

Offline

#4748 22-09-2016 09:43

Mr.GeniusZ
Registered: 09-11-2014
Posts: 29

Re: Один вопрос

kenking wrote:
Mr.GeniusZ wrote:

Как можно узнать, что машина поддерживает набор винил? (097D: get_car $CARMOD_CAR number_of_possible_paintjobs_to $10084
- не то)

06EC: get_car AVTO number_of_possible_paintjobs_to SUM_VINIL_AVTO

Спасибо!

Offline

#4749 28-09-2016 08:26

Mr.GeniusZ
Registered: 09-11-2014
Posts: 29

Re: Один вопрос

Еще один вопрос: как узнать включен воздушный трафик или нет?

Offline

#4750 28-09-2016 17:59

Seemann
Registered: 07-08-2006
Posts: 2,153

Re: Один вопрос

0A8D: 0@ = read_memory 0x008D33BC size 1 virtual_protect 0

Offline

Board footer

Powered by FluxBB