#1 21-11-2009 06:00

GTASA
Registered: 13-09-2008
Posts: 476

Тюнинг, не заезжая в гараж

Здравствуйте. Как вывести список компонентов тюнинга, словно я заехал в Transfender или другой вид тюнинга (нужны разные списки для разных типов машин)?

Offline

#2 23-11-2009 17:40

WinuX
Registered: 06-03-2009
Posts: 138

Re: Тюнинг, не заезжая в гараж

там, по-моему, внешний скрипт вызывать надо.

Offline

#3 23-11-2009 17:53

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Тюнинг, не заезжая в гараж

можно и руками сделать, но у него получится только после очень долгих объяснений и тупняка.......я не возьмусь за это!


GIMS developer

Offline

#4 23-11-2009 18:15

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Тюнинг, не заезжая в гараж

@3Doomer -

я не возьмусь за это!

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


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#5 24-11-2009 09:27

GTASA
Registered: 13-09-2008
Posts: 476

Re: Тюнинг, не заезжая в гараж

А разве скрипт траснсфендера находится в мэйне? Что-то я его там не нашел.

Offline

#6 24-11-2009 13:48

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Тюнинг, не заезжая в гараж

кагбэ все экстерналы лежат в мейне) ищи


GIMS developer

Offline

#7 24-11-2009 13:59

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Тюнинг, не заезжая в гараж

Кагбэ исчо можно вытащить его из script.img


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#8 24-11-2009 14:14

GTASA
Registered: 13-09-2008
Posts: 476

Re: Тюнинг, не заезжая в гараж

Я искал так: ввел в мэин слово какое-то, которым называется зап часть, и ответа не было. Может, все-таки не в мэине оно? Надо какой-то адрес памяти, который вызывает то меню.

Offline

#9 24-11-2009 14:38

yelmi
Registered: 10-12-2006
Posts: 134
Website

Re: Тюнинг, не заезжая в гараж

GTASA wrote:

Я искал так: ввел в мэин слово какое-то, которым называется зап часть, и ответа не было. Может, все-таки не в мэине оно? Надо какой-то адрес памяти, который вызывает то меню.

Неужели так трудно посмотреть внешние скрипты? External script 66 (CARMOD1), например. Все вам адрес памяти подавай.

Offline

#10 04-12-2009 04:54

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: Тюнинг, не заезжая в гараж

Через память всё-таки можно, вот скрипт:

thread 'AnyTrasfender'

{$CLEO}
{$I stdconsts.txt}

var
  $Player_Char: Player
  $Player_Actor: Actor
  $419: Integer
end
wait 1000
$419=0
0@s='MAIN'
0AB1: call_scm_func @InjectJumpOpcode 4 0@ 1@ 60194 @MainIfInject
0AB1: call_scm_func @SetIfNumber 4 thread_name 0@ 1@ offset 60190 number 25
0@s='CARMOD'

while true
  if $Player_Char.Defined
  then
    if and
      0AB0: key_pressed VK_CONTROL
      0AB0: key_pressed VK_T
      $Player_Actor.Driving
      09E7:   player $PLAYER_CHAR not_frozen 
    then
      0926: $Script_Status = external_script_status 66 (CARMOD1) 
      if 
        $Script_Status == 0 
      then
        32@=0
        $419=1
        while 88AB: not external_script 66 (CARMOD1) loaded
          08A9: load_external_script 66 (CARMOD1)
          wait 0
        end
        0913: run_external_script 66 (CARMOD1)
        32@=0
        wait 0
        0AAA: 5@ = pointer_to_thread 'CARMOD' 
        if 5@==0
        then
          0513: show_text_box_1number 'NUMBER' number 666 // ~1~
        end
        0AB1: call_scm_func @SetIfNumber 4 thread_name 0@ 1@ offset 1584 number 23
        0AB1: call_scm_func @InjectJumpOpcode 4 0@ 1@ 1588 @CarmodInject1
        0AB1: call_scm_func @InjectJumpOpcode 4 0@ 1@ 3972 @CarmodInject3
        0AB1: call_scm_func @InjectJumpOpcode 4 0@ 1@ 9765 @CarmodInjectLoadPos
        0AB1: call_scm_func @ReplaceLabelInOpcode 4 0@ 1@ 2148 @CarmodInjectStorePos
        0AB1: call_scm_func @ReplaceLabelInOpcode 4 0@ 1@ 1803 @CarmodInject4
      else
        end_thread_named 'CARMOD'
        090F: end_external_script 66 (CARMOD1) 
      end
      wait 200
    end  
  end
  wait 0
end

:MainIfInject
03B0:   garage 'BODLAWN' door_open 
03B0:   garage 'MODLAST' door_open 
03B0:   garage 'MDSSFSE' door_open 
03B0:   garage 'MDS1SFS' door_open 
03B0:   garage 'VECMOD' door_open 
        $419 == 1
jump 60249

:CarmodInjectEF
00D6: if 0   
0256:   player $2  defined 
004D: jump_if_false -13936
if and
  $419==1
  33@>5000
  09E7: player $PLAYER_CHAR not_frozen 
jf -1426
01EB: set_traffic_density_multiplier_to 1.0
end_thread

:CarmodInject4
if
  $419==1
jf -2356
jump -1810

:CarmodInject3
if
  $419<>1
jf -7392
00D6: if 0   
096F:   car $10431  street_racing_car 
004D: jump_if_false -5615   
jump -3988

:CarmodInjectStorePos
00aa: store_car $CARMOD_Car position_to $10428 $10429 $10430
0A97: 0@ = car $CARMOD_Car struct
0@+=0x14
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0

0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0 //right.x
0@+=4
0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0 //right.y
0@+=4
0A8D: 3@ = read_memory 0@ size 4 virtual_protect 0 //right.z
0@+=8

0A8D: 4@ = read_memory 0@ size 4 virtual_protect 0 //top.x
0@+=4
0A8D: 5@ = read_memory 0@ size 4 virtual_protect 0 //top.y
0@+=4
0A8D: 6@ = read_memory 0@ size 4 virtual_protect 0 //top.z
0@+=8

0A8D: 7@ = read_memory 0@ size 4 virtual_protect 0 //at.x
0@+=4
0A8D: 8@ = read_memory 0@ size 4 virtual_protect 0 //at.y
0@+=4
0A8D: 9@ = read_memory 0@ size 4 virtual_protect 0 //at.z
jump -2185

:CarmodInjectLoadPos
04E4: unknown_refresh_game_renderer_at $10428  $10429   
03CB: set_rendering_origin_at $10428  $10429  $10430  
00AB: put_car $10431  at $10428  $10429  $10430   

if $419<>0
jf -9779
$419=0

0A97: 0@ = car $10431 struct
0@+=0x14
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0

0A8C: write_memory 0@ size 4 value 1@ virtual_protect 0 //right.x
0@+=4
0A8C: write_memory 0@ size 4 value 2@ virtual_protect 0 //right.y
0@+=4
0A8C: write_memory 0@ size 4 value 3@ virtual_protect 0 //right.z
0@+=8

0A8C: write_memory 0@ size 4 value 4@ virtual_protect 0 //top.x
0@+=4
0A8C: write_memory 0@ size 4 value 5@ virtual_protect 0 //top.y
0@+=4
0A8C: write_memory 0@ size 4 value 6@ virtual_protect 0 //top.z
0@+=8

0A8C: write_memory 0@ size 4 value 7@ virtual_protect 0 //at.x
0@+=4
0A8C: write_memory 0@ size 4 value 8@ virtual_protect 0 //at.y
0@+=4
0A8C: write_memory 0@ size 4 value 9@ virtual_protect 0 //at.z
jump -9869

:CarmodInject1 
0103:   actor $3  in_sphere 1042.01294  -1019.92700  31.12700  radius 4.00000  4.00000  2.00000  sphere 1  stopped_in_car 
0103:   actor $3  in_sphere -1935.52795  247.02901  33.56100  radius 4.00000  4.00000  2.00000  sphere 1  stopped_in_car 
0103:   actor $3  in_sphere 2387.07495  1050.51099  9.81200  radius 4.00000  4.00000  2.00000  sphere 1  stopped_in_car 
        $419  == 1        //<<<  
jump -1699


:SetIfNumber{SetFirstByteConstOpcodeParam}
var
  //0@s - InNameThread
  2@: Integer //Offset
  3@: Integer //IfNumber
  
  6@: Integer //Pointer to thread
  4@: Integer
  5@: Integer
end
0AAA: 6@ = pointer_to_thread 0@s
if 6@ == 0
then
  0AB2: ret 0
end
6@+=16
0A8D: 6@ = read_memory 6@ size 4 virtual_protect 0
if 6@==0
then
  6@=0xA49960
end
4@=6@
4@+=2@
//0A8C: write_memory 4@ size 2 {word} value 0x00D6 {if opcode} virtual_protect 1
4@+=2
//0A8C: write_memory 4@ size 1 {byte} value 0x04 {signed byte type} virtual_protect 1
4@+=1

0A8C: write_memory 4@ size 1 {byte} value 3@ {IfNumber} virtual_protect 0
0AB2: ret 0


:ReplaceLabelInOpcode
var
  //0@s - InNameThread
  2@: Integer //Offset
  3@: Integer //InLabel
  
  6@: Integer //Pointer to thread
  4@: Integer
  5@: Integer
end
0AAA: 6@ = pointer_to_thread 0@s
if 6@ == 0
then
  0AB2: ret 0
end
6@+=16
0A8D: 6@ = read_memory 6@ size 4 virtual_protect 0
if 6@==0
then
  6@=0xA49960
end
4@=6@
4@+=2@
//0A8C: write_memory 4@ size 2 {word} value 0x0002 {jump opcode} virtual_protect 1
4@+=2
0A8C: write_memory 4@ size 1 {byte} value 0x01 {label type} virtual_protect 1
4@+=1

0A9F: 5@ = current_thread_pointer

5@+=16
0A8D: 5@ = read_memory 5@ size 4 virtual_protect 0

5@-=0xA49960
5@-=3@

0A8C: write_memory 4@ size 4 {dword} value 5@ {label} virtual_protect 0
0AB2: ret 0


:InjectJumpOpcode
var
  //0@s - InNameThread
  2@: Integer //Offset
  3@: Integer //InLabel
  
  6@: Integer //Pointer to thread
  4@: Integer
  5@: Integer
end
0AAA: 6@ = pointer_to_thread 0@s
if 6@ == 0
then
  0AB2: ret 0
end
6@+=16
0A8D: 6@ = read_memory 6@ size 4 virtual_protect 0
if 6@==0
then
  6@=0xA49960
end
4@=6@
4@+=2@
0A8C: write_memory 4@ size 2 {word} value 0x0002 {jump opcode} virtual_protect 1
4@+=2
0A8C: write_memory 4@ size 1 {byte} value 0x01 {label type} virtual_protect 1
4@+=1

0A9F: 5@ = current_thread_pointer

5@+=16
0A8D: 5@ = read_memory 5@ size 4 virtual_protect 0

5@-=0xA49960
5@-=3@

0A8C: write_memory 4@ size 4 {dword} value 5@ {label} virtual_protect 0
0AB2: ret 0

Используется run-time изменение оригинального скрипта трансфендера через редактирование памяти. Правда, иногда глючит, пропадает траффик.

Last edited by VcSaJen (04-12-2009 04:55)


[small][/small]

Offline

#11 04-12-2009 06:52

GTASA
Registered: 13-09-2008
Posts: 476

Re: Тюнинг, не заезжая в гараж

Через память все можно, хоть карту с ног на голову повернуть. Спасибо.

Last edited by GTASA (05-12-2009 04:02)

Offline

Board footer

Powered by FluxBB