#1 Re: Вопросы по скриптингу » Один вопрос » 06-07-2011 09:28

Раскройте секрет, как работает

0893: put_trailer @ on_cab @

?
крешит игру при непонятных обстоятельствах.
стопроцентно ставит трейлер только если тягач стоит на месте.
если же ловить машину просто в пуле например и ставить, то 50 на 50. либо поставит либо вывалит игру. скинул бы и логи, но scmlog нифига не пишет после краша. бывают еще варианты ведения логов?

танцы с бубнами типа установки скорости, имунитетов, лока в текущей позиции и видимости как в скрипте T_TRAIL_XX не спасают от вылетов, они вообще даже и не нужны совсем, если создать тягач как car.create() и цеплять к нему прицеп он и так цепляеться на отлично и без дополнительных манипуляций. 

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

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

--------
UPD: вопрос по опкоду снимается. скачал компактный ехе, базу и дебугер в котором хоть нифига практически и не понятно, но понятно, что натупил где-то с освобождением созданной тачки. 0893 работает на 100%.

#2 Re: Вопросы по скриптингу » Один вопрос » 30-06-2011 13:39

DK22Pac wrote:

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 smile спасибо

ну и для полного счастья, что значит когда в 0xB74494+12 (количество элементов в vehicle pool) значение -1? вроде количество чего-то должно с 0 начинаться.

#3 Re: Вопросы по скриптингу » Один вопрос » 30-06-2011 11:58

listener wrote:

Пул состоит из двух массивов: в обном лежат объекты, в другом - флаги к ним (по байту на объект).
Старший бит этого байта - флаг того, что элемент пула свободен.

Добрался до посмотреть на эти флаги.

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@ игра вылетает.
что не так? как эти байтики найти?

#4 Re: Вопросы по скриптингу » Один вопрос » 27-06-2011 11:39

listener wrote:

Пул состоит из двух массивов: в обном лежат объекты, в другом - флаги к ним (по байту на объект).
Старший бит этого байта - флаг того, что элемент пула свободен.

спасибо.
тоесть все авто полюбому находятся в пуле, а свобон не свободен отмечено флажками.
видимо тогда с моим кодом какие-то проблемы. будем искать дальше smile

#5 Re: Вопросы по скриптингу » Один вопрос » 27-06-2011 10:57

друзья, а тыкните мордой в какое-либо описание пула 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@

в основном все показываеться правдоподобно, других скриптов нет потому с прицепами только то, что я сам прицепил.
проблемы возникают с машиной в которой я катаюсь, если она только одна с прицепом. иногда она включаеться в общее количество машин с прицепами иногда нет. какой-то закономерности не нашел, просто когда хочет включаеться когда хочет нет. 
В пуле есть указатель на мапу тех что машин которые используються, они включены в текущие элементы или может просто не входять в раздел памяти который я сканирую?

#6 Re: Вопросы по скриптингу » Прикрепление тачек » 25-01-2010 11:14

Den_spb wrote:

Тут вообще-то матрица преобразования координат нужна.

А как в скриптах реализована работа с матрицами? насколько я понимаю что никак,
все равно раскладывать по уравнениям

x = x1*cos A  + y1*sinA + x0
y = x1*sin A  + y1*cosA + y0

учитывая что в новых координатах x1 =0

x = y1*sinA + x0
y = y1*cosA + y0

y1 = y-y0/cosA

- что и написано выше с учетом того что 02F7: 13@ = sine 10@ // (float)  это косинус

я просто изначально подумао грешным делом обойтись двухмерными преобразованиями, а за растояние по Z взять разницу координат по Z.

к сожалению ничего не получилось, после долгого катания на пакере в разных местах, особенно в сельской местности в горах, рухнули надежды не только на разницу по Z smile но и на угол поворота x_angle машины в качестве ротейшена  smile

придеться таки сделать полный перенос по всем понятиям и узнать все координаты smile

а вот с углами 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.

ну и по Х это полюбому нужно, но банальный угол наклона машины не пройдет когда пакер тоже наклонен вниз

вот думаю хватит ли мне разниц углов пакера и машины или тоже мудрить в сторону преобразования координат в сферических системах...

#7 Re: Вопросы по скриптингу » Прикрепление тачек » 22-01-2010 00:29

Благодарю за разьяснения, действительно то что оффсеты относительно пакера считаються нужно было догадаться сразу после того как с глобальными координатами ниче не получилось smile

вобщем начал пробовать прикреплять, к сожалению самое правильное расстояние получаеться банальной теоремой пифагора. к сожалению потому что расстояние беззнаковое, и не прокатит за оффсет
а у меня чето мозк не работает уже сеня smile

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) и все такое, но не стал менять рабочее smile

вспомнилось что нужно только перенести и повернуть и получить нахаляву новые координаты, а учитывая что по х всегда 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 с текущей машины подозревая что она станет где нажали кнопку, а если сдвигаеться немного то колеса какбы немного утопшие в пакере.

ну и понятно что пока задом заезжать на пакер я не рискую, угол атача еще не высчитывал smile

кстати координаты это кул, но заметил еще один потенциальный деффект, если прижать пакер немного грузом, то координаты по z тоже не совсем правильно считаються. Видимо уровень сжатия подвески тоже нужно учитывать в идеальном варианте smile
Смотрел в структуры, suspension height может или level to the ground хз, тут тоже нуждаюсь в подсказках smile

#8 Re: Вопросы по скриптингу » Прикрепление тачек » 18-01-2010 14:53

подобный вопрос, хочу прилепить тачку к пакеру

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. в других случаях висит в воздухе, странный оффсет.

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

подскажите плиз где про эти координаты и офсеты вообще почитать можно.

#9 Re: Вопросы по скриптингу » Один вопрос » 29-09-2009 23:12

Den_spb wrote:

Опкоды
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 чет не ставит.
если не тяжело то скинь рабочий код для установки данного параметра, а я вернусь в длл специальных возможностей smile

#10 Re: Вопросы по скриптингу » Один вопрос » 29-09-2009 19:44

3Doomer wrote:

если честно, это зашито в ЕХЕ, а не в скриптах.
можно попросить Лисенера откопать процедуру и попытаться вызвать её скриптом....

ну в скриптах я такого не нашел, да и в принципе мне намного лучше было бы откопать процедуру smile

вообще интересно посмотреть на наработки в области разбирания класов, большой вам парни респект за проделаную работу, я 3 дня читаю форум просто не отрываясь, раньше не занимался, тупо играл smile

а вот нашел исходники к 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);

как думаете это достойно того чтобы искать в нем разгадку управления пакером ?

пс. если что простите за глупые вопросы, день рождения праздную, пиво знаете-ли smile

#11 Re: Вопросы по скриптингу » Один вопрос » 29-09-2009 12:59

3Doomer wrote:

я не работал, но, думаю, опкод 08A4 поможет.....

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

#12 Re: Вопросы по скриптингу » Один вопрос » 29-09-2009 12:07

здавствуйте.
господа у меня к вам маленький вопрос, если кто-нибудь уже работал со специальными возможностями транспорта (подьемник пакера, лифта, дозера и т.д.) закидайте меня пожалуйста ссылками пожалуйста.

перечитал уже весь ваш и не только форумы и все не особо понятно откуда оно устанавливаеться, ни в обьектах, ни в опкодах не нашел методов влияния. продолжаю искать и надеюсь на помощь smile

Board footer

Powered by FluxBB