You are not logged in.
Pages: 1
Раскройте секрет, как работает
0893: put_trailer @ on_cab @
?
крешит игру при непонятных обстоятельствах.
стопроцентно ставит трейлер только если тягач стоит на месте.
если же ловить машину просто в пуле например и ставить, то 50 на 50. либо поставит либо вывалит игру. скинул бы и логи, но scmlog нифига не пишет после краша. бывают еще варианты ведения логов?
танцы с бубнами типа установки скорости, имунитетов, лока в текущей позиции и видимости как в скрипте T_TRAIL_XX не спасают от вылетов, они вообще даже и не нужны совсем, если создать тягач как car.create() и цеплять к нему прицеп он и так цепляеться на отлично и без дополнительных манипуляций.
банальная запись указателя на трейлер по смещению в тягач тоже не помогла, прицеп не цепляеться, либо я что-то не так сделал, по крайней мере прочитать ее обратно можно было.
хочу заменить его на что-то более внятное и без звука клацания при стыковке.
кода пока под рукой нет, сорри. просто если кто чего копал в этом направлении поделитесь мыслями и ссылочками на инфу
--------
UPD: вопрос по опкоду снимается. скачал компактный ехе, базу и дебугер в котором хоть нифига практически и не понятно, но понятно, что натупил где-то с освобождением созданной тачки. 0893 работает на 100%.
0A8D: 0@ = read_memory 0xB74494 size 4 virtual_protect 0
inc(0@, 4)
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
....
0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
...
вот так и читал, не был уверенн что это именно те байты.
получаеться что по 0xB74494+4 лежит первый элемент массива, а не указатель pointer to a byte map спасибо
ну и для полного счастья, что значит когда в 0xB74494+12 (количество элементов в vehicle pool) значение -1? вроде количество чего-то должно с 0 начинаться.
Пул состоит из двух массивов: в обном лежат объекты, в другом - флаги к ним (по байту на объект).
Старший бит этого байта - флаг того, что элемент пула свободен.
Добрался до посмотреть на эти флаги.
0xB74494 - Contains a pointer to main struct
This struct:
+4 = Contains a pointer to a byte map indicating which elements are in use
пытають прочитать
0A8D: 0@ = read_memory 0xB74494 size 4 virtual_protect 0
0@ += 4
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
по идее ведь в 0@ должен записаться указатель на начало массива байтов флажков.
но когда я пытаюсь прочитать что либо из 0@ игра вылетает.
что не так? как эти байтики найти?
Пул состоит из двух массивов: в обном лежат объекты, в другом - флаги к ним (по байту на объект).
Старший бит этого байта - флаг того, что элемент пула свободен.
спасибо.
тоесть все авто полюбому находятся в пуле, а свобон не свободен отмечено флажками.
видимо тогда с моим кодом какие-то проблемы. будем искать дальше
друзья, а тыкните мордой в какое-либо описание пула vehicle, а то не совсем понятно что там ожидать.
делаю следующее пробегають от начала пула до текущего количества элементов в нем.
для каждого элемента проверяю есть ли в нем че на позиции прицепа и вывожу на экран количество тачек с прицепами, вот она мой быстренький код для сего действия:
0A8D: 0@ = read_memory 0xB74494 size 4 virtual_protect 0 0A8D: 3@ = read_memory 0@ size 4 virtual_protect 0 0A8E: 1@ = 0@ + 12 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 if 802B: not 1 >= 2@ //0029: 2@ >= 1? jf @trailinfo 0A90: 4@ = 0xA18 * 2@ // int 005A: 4@ += 3@ 0006: 5@ = -1 for 6@ = 3@ to 4@ step 0xA18 0A8E:7@ = 6@ + 0x4C8 0A8D: 7@ = read_memory 7@ size 4 virtual_protect 0 if 8039: not 7@ == 0 jf continue 000A: 5@ += 1 end 000A: 5@ += 1 03F0: enable_text_draw 1 045B: draw_text_2numbers 350.0 320.0 GXT 'TINF' numbers 5@ 2@
в основном все показываеться правдоподобно, других скриптов нет потому с прицепами только то, что я сам прицепил.
проблемы возникают с машиной в которой я катаюсь, если она только одна с прицепом. иногда она включаеться в общее количество машин с прицепами иногда нет. какой-то закономерности не нашел, просто когда хочет включаеться когда хочет нет.
В пуле есть указатель на мапу тех что машин которые используються, они включены в текущие элементы или может просто не входять в раздел памяти который я сканирую?
Тут вообще-то матрица преобразования координат нужна.
А как в скриптах реализована работа с матрицами? насколько я понимаю что никак,
все равно раскладывать по уравнениям
x = x1*cos A + y1*sinA + x0
y = x1*sin A + y1*cosA + y0
учитывая что в новых координатах x1 =0
x = y1*sinA + x0
y = y1*cosA + y0y1 = y-y0/cosA
- что и написано выше с учетом того что 02F7: 13@ = sine 10@ // (float) это косинус
я просто изначально подумао грешным делом обойтись двухмерными преобразованиями, а за растояние по Z взять разницу координат по Z.
к сожалению ничего не получилось, после долгого катания на пакере в разных местах, особенно в сельской местности в горах, рухнули надежды не только на разницу по Z но и на угол поворота x_angle машины в качестве ротейшена
придеться таки сделать полный перенос по всем понятиям и узнать все координаты
а вот с углами rotation в
0683: attach_car 5@ to_car 6@ with_offset 0.0 25@ 9@ rotation 14@ 0.0 0.0
не все так просто, по сути канечно можно по Z проигнорировать и оставить 0, чтобы машина прилипала правильно без перегибов, это если оставлять возможность прикреплять тачку только правильно заехав на пакер.
по Y нужно чтобы определить задом заехал или передом, думаю можно четко весь угол не знать, а просто 180 либо 0.
ну и по Х это полюбому нужно, но банальный угол наклона машины не пройдет когда пакер тоже наклонен вниз
вот думаю хватит ли мне разниц углов пакера и машины или тоже мудрить в сторону преобразования координат в сферических системах...
Благодарю за разьяснения, действительно то что оффсеты относительно пакера считаються нужно было догадаться сразу после того как с глобальными координатами ниче не получилось
вобщем начал пробовать прикреплять, к сожалению самое правильное расстояние получаеться банальной теоремой пифагора. к сожалению потому что расстояние беззнаковое, и не прокатит за оффсет
а у меня чето мозк не работает уже сеня
0407: store_coords_to 7@ 8@ 9@ from_car 5@ with_offset 0.0 0.0 0.0 0407: store_coords_to 10@ 11@ 12@ from_car 6@ with_offset 0.0 0.0 0.0 0063: 9@ -= 12@ // (float) //- z difference 077D: 14@ = car 5@ x_angle //0087: 22@ = 10@ // (float) 0063: 10@ -= 7@ // (float) //- x difference 0063: 11@ -= 8@ // (float) //- y difference 0087: 23@ = 10@ // (float) 006B: 10@ *= 23@ // (float) x2 // почему-то работало только так 0087: 24@ = 11@ // (float) 006B: 11@ *= 24@ // (float) y2 005B: 10@ += 11@ // (float) //x2+y2 01FB: 25@ = square_root 10@ // - идеальное расстояние, но не известен знак ... тут нужно как-то выкупить знак ... 0683: attach_car 5@ to_car 6@ with_offset 0.0 25@ 9@ rotation 14@ 0.0 0.0
потом я уже нашел в хелпе коды для квадратов sqr($var) и все такое, но не стал менять рабочее
вспомнилось что нужно только перенести и повернуть и получить нахаляву новые координаты, а учитывая что по х всегда 0, потому как крепим пока не как поставили, а на линии на пакере, то вообще получаеться одно уравнение
и родился вророй вариант
0063: 9@ -= 12@ // (float) //- z difference 077D: 14@ = car 5@ x_angle 0174: 10@ = car 6@ Z_angle 02F7: 13@ = sine 10@ // (float) 0063: 8@ -= 11@ // (float) //y - y0 0073: 8@ /= 13@ // (float) y-y0/sin() wait 500 0683: attach_car 5@ to_car 6@ with_offset 0.0 8@ 9@ rotation 14@ 0.0 0.0 // 2nd bottom place wait 500
во втором варианте получаеться отличный оффсет, сразу со знаком и всем. Но на практике в некоторых местах на втором этаже пакера присудсвует некоторая погрешность и выглядит некрасиво немножко.
Так что приходиться пока считать 1м вариантом число, а из второго брать знак оффсета, рачно короче. Если кто поможет тыкнуть в готовую реализацию подобного аттачмента, либо помочь советом милости просим. Погрешность там действительно не совсем значительная, но пифагор ваще идеально ставит.
У меня угол ротейшена береться x_angle с текущей машины подозревая что она станет где нажали кнопку, а если сдвигаеться немного то колеса какбы немного утопшие в пакере.
ну и понятно что пока задом заезжать на пакер я не рискую, угол атача еще не высчитывал
кстати координаты это кул, но заметил еще один потенциальный деффект, если прижать пакер немного грузом, то координаты по z тоже не совсем правильно считаються. Видимо уровень сжатия подвески тоже нужно учитывать в идеальном варианте
Смотрел в структуры, suspension height может или level to the ground хз, тут тоже нуждаюсь в подсказках
подобный вопрос, хочу прилепить тачку к пакеру
0683: attach_car @ to_car@ with_offset 0.0 0.0 0.0 rotation 0.0 0.0 0.0
опкод справляеться хорошо, вот только не понятен механизм оффсетов.
по z спокойно подходит разница между координатами z пакера и автомобиля.
а вот по х и y ваще какая-то фигня.
offset по х - тачка находиться на пакере только в случае если он 0. в других случаях висит в воздухе, странный оффсет.
по у разница у-ковых координат работает только на первых местах пакера, ближе к хвосту начитаеться хрень...
подскажите плиз где про эти координаты и офсеты вообще почитать можно.
Опкоды
08A4: set_car 0@ extra_parts_angle_to 1@ // установить угол
098D: get_car 0@ extra_parts_angle 1@ // записать угол в переменную
превосходно работают. Я тестировал их на автомобиле Dumper.
Alien использовал их в модификации "Оживляем катюшу" (см. раздел Модификации). "Катюша", кстати, была установлена на Packer.
Угол измеряется не в градусах. Насколько помню, значения угла в игре (без скриптового вмешательства) меняются от 0.0 до 1.0
итак про катюшу, мог бы глянуть туда, катюша заменяет раcker, все ей уже ниче делать не нужно, ибо у пакера все работает. там используеться только 098D, для вычисления полетов ракеты.
пробное использование гта как дебагера, выдаст что максимально поднятый кузов дампера 1056964608, что есть ничто иное как 0,5 float. делаю вывод что изменения будут важны только в диапазоне 0.0-0.5
и врятли это градусы.
я только что попробовал дампер, 08A4: для него не делает ничего, вернее машину стряхивает, не более.
вот такая вот катюша получаеться, get таки выдает, но set чет не ставит.
если не тяжело то скинь рабочий код для установки данного параметра, а я вернусь в длл специальных возможностей
если честно, это зашито в ЕХЕ, а не в скриптах.
можно попросить Лисенера откопать процедуру и попытаться вызвать её скриптом....
ну в скриптах я такого не нашел, да и в принципе мне намного лучше было бы откопать процедуру
вообще интересно посмотреть на наработки в области разбирания класов, большой вам парни респект за проделаную работу, я 3 дня читаю форум просто не отрываясь, раньше не занимался, тупо играл
а вот нашел исходники к Vehicle Special Abilities что-то там
CodePtr := VirtualAlloc(0, 10000 , MEM_COMMIT , PAGE_READWRITE) ; VirtualProtect(ptr($6AC4D9),5,PAGE_READWRITE,OldProtect); PByte($6AC4D9)^:= $E9; PInteger($6AC4DA)^:= Integer(CodePtr) - $6AC4D9 - 5; While not EOF(F) do begin ReadLn(F,StrName); if not (strpos(PChar(StrName),'[PACKERs]')=nil) then break; end; Count:= ReadIntValue('MAIN','PACKERs'); For i:= 0 to Count-1 do begin ReadLn(F,S[i]); PByte(Integer(CodePtr)+i*6)^:= $66; PByte(Integer(CodePtr)+i*6+1)^:= $3D; PSmallInt(Integer(CodePtr)+i*6+2)^:= StrToInt(S[i]); PByte(Integer(CodePtr)+i*6+4)^:= $74; PByte(Integer(CodePtr)+i*6+5)^:= (Count-i-1)*6 + $A; end; PByte(Integer(CodePtr)+Count*6)^:= $66; // cmp PByte(Integer(CodePtr)+Count*6+1)^:= $3D; // ax PByte(Integer(CodePtr)+Count*6+2)^:= $BB; // id PByte(Integer(CodePtr)+Count*6+3)^:= $01; // 2 b PByte(Integer(CodePtr)+Count*6+4)^:= $0F; // jnz PByte(Integer(CodePtr)+Count*6+5)^:= $85; // $6AC507 PInteger(Integer(CodePtr)+Count*6+6)^:= $6AC507 - (Integer(CodePtr)+Count*6+10); PByte(Integer(CodePtr)+Count*6+10)^:= $E9; // jmp $6AC4DF PInteger(Integer(CodePtr)+Count*6+11)^:= $6AC4DF - (Integer(CodePtr)+Count*6+15); {MOOVE_HOOK_2} CodePtr := VirtualAlloc(0, 10000 , MEM_COMMIT , PAGE_READWRITE) ; VirtualProtect(ptr($6B1F8F),5,PAGE_READWRITE,OldProtect); PByte($6B1F8F)^:= $E9; PInteger($6B1F90)^:= Integer(CodePtr) - $6B1F8F - 5; For i:= 0 to Count-1 do begin PByte(Integer(CodePtr)+i*6)^:= $66; PByte(Integer(CodePtr)+i*6+1)^:= $3D; PSmallInt(Integer(CodePtr)+i*6+2)^:= StrToInt(S[i]); PByte(Integer(CodePtr)+i*6+4)^:= $74; PByte(Integer(CodePtr)+i*6+5)^:= (Count-i-1)*6 + $A; end; PByte(Integer(CodePtr)+Count*6)^:= $66; // cmp PByte(Integer(CodePtr)+Count*6+1)^:= $3D; // ax PByte(Integer(CodePtr)+Count*6+2)^:= $BB; // id PByte(Integer(CodePtr)+Count*6+3)^:= $01; // 2 b PByte(Integer(CodePtr)+Count*6+4)^:= $0F; // jnz PByte(Integer(CodePtr)+Count*6+5)^:= $85; // $6B1F95 PInteger(Integer(CodePtr)+Count*6+6)^:= $6B1F95 - (Integer(CodePtr)+Count*6+10); PByte(Integer(CodePtr)+Count*6+10)^:= $E9; // jmp $6B200F PInteger(Integer(CodePtr)+Count*6+11)^:= $6B200F - (Integer(CodePtr)+Count*6+15);
как думаете это достойно того чтобы искать в нем разгадку управления пакером ?
пс. если что простите за глупые вопросы, день рождения праздную, пиво знаете-ли
я не работал, но, думаю, опкод 08A4 поможет.....
установка extra_parts_angle_to не помогла никопейки, я уже все в мире значения перепробовал, либо есть какая-то хитрость в использовании которой я не знаю. для самолетов работает, а пакер, лифт, цемент стоят как вкопаные
здавствуйте.
господа у меня к вам маленький вопрос, если кто-нибудь уже работал со специальными возможностями транспорта (подьемник пакера, лифта, дозера и т.д.) закидайте меня пожалуйста ссылками пожалуйста.
перечитал уже весь ваш и не только форумы и все не особо понятно откуда оно устанавливаеться, ни в обьектах, ни в опкодах не нашел методов влияния. продолжаю искать и надеюсь на помощь
Pages: 1