#1 28-05-2009 16:06

JNikc
From: SPB
Registered: 27-05-2009
Posts: 22

Двигаем прямо в Liberty City

А вот страшный низкоуровневый! скрипт. Рядом с домом в тупике заходим на красный круг и попадаем прямо в кусок Либерти. Можно идти только вверх по дороге, по направлению к бистро с.марка, иначе - провалетесь, там дороги не настоящие. Вобщем халтурили разработчики :-)

{$CLEO}
thread 'LIBERTY'

$1 = 0 

:LIBERTY_1
wait 0 
09E8: $ACTIVE_INTERIOR = actor $PLAYER_ACTOR active_interior // записывается активный интерьер актёра
if AND
  $ACTIVE_INTERIOR == 0 
  Player.Defined($PLAYER_CHAR)
jf @LIBERTY_1 

0570: $SPH1 = create_asset_radar_marker_with_icon 31 at 2464.905 -1667.774 13.4724

:LIBERTY_2
wait 0 
if 
0102:   actor $PLAYER_ACTOR in_sphere 2464.905 -1667.774 13.4724 radius 1.2 1.2 3.0 sphere 1 stopped_on_foot 
else_jump @NONAME_141 

jump @NONAME_256 

:NONAME_141
wait 0 
if 
0102:   actor $PLAYER_ACTOR in_sphere -906.704 447.9177 1346.872 radius 1.2 1.2 3.0 sphere 1 stopped_on_foot 
else_jump @NONAME_200 

jump @NONAME_496 

:NONAME_200
wait 0 
if 
  $1 == 1 
else_jump @NONAME_62 

:NONAME_222
wait 0 
if and
0457:   player $PLAYER_CHAR aiming_at_actor 5@ 
0AB0:   key_pressed 89 
else_jump @NONAME_62 
jump @NONAME_496 

:NONAME_256
wait 0 
select_interior 1 
0860: link_actor $PLAYER_ACTOR to_interior 1 
Actor.PutAt($PLAYER_ACTOR, -900.2229, 456.3773, 1346.872)
08DC: create_interior_marker $SPH2 at -906.704 447.9177 1346.872 radius 5.0 
018B: set_marker $SPH2 radar_mode 2
096A: enable_flying_helis 1 
09AC: disable_map_icons 1 
03DE: set_pedestrians_density_multiplier_to 0.0 
01EB: set_traffic_density_multiplier_to 0.0 
0898: set_cranes_controls_enable_UP 0 enable_DOWN 0 enable_RELEASE 0 
//0826: enable_hud 0 
0581: enable_radar 1 
//075B: zoom_radar 100 
//02A3: enable_widescreen 1 
Camera.SetAtPos(-975.6997, 1061.162, 344.7998)

wait 0 
if 
  $1 == 0 
else_jump @NONAME_222 
$1 = 1 
Model.Load(#POLMAV)

:NONAME_325
wait 10 
if 
   Model.Available(#POLMAV)
else_jump @NONAME_325 
Model.Load(#SOMYBU)

:NONAME_350
wait 10 
if 
   Model.Available(#SOMYBU)
else_jump @NONAME_350 
5@ = Actor.Create(Mission1, #SOMYBU, -783.5714, 497.4976, 1376.195)
0860: link_actor 5@ to_interior 1 
Actor.PutAt(5@, -783.5714, 497.4976, 1376.195)
$GRN = Car.Create(#POLMAV, 0.0, 0.0, 0.0)
0840: link_car $GRN to_interior 1 
Car.PutAt($GRN, -900.2229, 463.3773, 1346.873)
Car.Angle ($GRN) = 90
0825: set_helicopter $GRN instant_rotor_start 
Model.Destroy(#POLMAV)
Model.Destroy(#SOMYBU)
jump @NONAME_62 

:NONAME_496
wait 0 
select_interior 0 
0860: link_actor $PLAYER_ACTOR to_interior 0 
Actor.PutAt($PLAYER_ACTOR, 2469.905, -1667.774, 13.472)
jump @NONAME_62

Это не оптимизированный скрипт, но вроде работает.

Основная идея - линкуемся в интерьер с номером 1 и перемещаемся в Либерти, что по координатам
-900.2229, 456.3773, 1346.872

Last edited by JNikc (Today 18:56)

А это просто полетать :

// By Alien
{$CLEO}
0A8C: write_memory 0x67F268 size 4 value 0x44e9 virtual_protect 1
0A8C: write_memory 0x67F26c size 1 value 0 virtual_protect 1
repeat
wait 10
until player.Defined($player_char)
select_interior 1
0860: link_actor $PLAYER_ACTOR to_interior 1 
04E4: unknown_refresh_game_renderer_at -750.5782 490.7358
0A0B: set_rendering_origin_at_3D_coord -750.5782 490.7358 1371.7162 angle 82.0 
Actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
0792: disembark_instantly_actor $PLAYER_ACTOR 
Actor.PutAt($PLAYER_ACTOR, -750.5782, 490.7358, 1371.7162)
07A7: put_jetpack_on_actor $PLAYER_ACTOR 
0A93: end_custom_thread

Last edited by JNikc (02-06-2009 09:41)

Offline

#2 29-05-2009 07:30

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Двигаем прямо в Liberty City

и чем же он низкоуровневый ? grin

Offline

#3 29-05-2009 10:35

JNikc
From: SPB
Registered: 27-05-2009
Posts: 22

Re: Двигаем прямо в Liberty City

Ну как? Что является признаком низкоуровневых языков? Метки, goto, прыжки jump. Это я так, последнее время нахожусь под воздействием идеи... Должны быть скриптовые языки повыше уровнем.

Offline

#4 29-05-2009 10:38

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Двигаем прямо в Liberty City

Ну так вместо меток и прыжков можно использовать циклы, if then end smile

Offline

#5 29-05-2009 10:43

JNikc
From: SPB
Registered: 27-05-2009
Posts: 22

Re: Двигаем прямо в Liberty City

А я бы так написал:

if (Player.OkFreeWalkig) & (Player.Interier == 0) {
   Around.CreateIcon('red', 2464.905, -1667.774, 13.4724)
   if Player.StayIn(1, 2464.905, -1667.774, 13.4724) {
      Player.Interier = 1
      Player.PutAt(-900.2229, 456.3773, 1346.872)
   }
}

if (Player.OkFreeWalkig) & (Player.Interier == 1) {
   Around.CreateIcon('red', -902.2229, 458.3773, 1346.872)
   if Player.StayIn(1, -902.2229, 458.3773, 1346.872) {
      Player.Interier = 0
      Player.PutAt(2462.905, -1665.774, 13.4724)
   }
}

И всё.

Конечно высокоуровневые if then else и циклы это шаг вперед, но классы и методы... А ещё мощнее - макросы!

Можно сократить код ещё в два раза. Определим функцию:

Teleport(interier1, interier2, x1, y1, z1, x2, y2, z2) {
if (Player.OkFreeWalkig) & (Player.Interier == interier1) {
   Around.CreateIcon('red', x1, y1, z1)
   if Player.StayIn(1, x1, y1, z1) {
      Player.Interier = interier2
      Player.PutAt(x2+2, y2+2, z2)
   }
}
}

И потом просто вызовем её два раза

Teleport(0, 1, 2464.905, -1667.774, 13.4724, -902.2229, 458.3773, 1346.872)
Teleport(1, 0, -902.2229, 458.3773, 1346.872, 2464.905, -1667.774, 13.4724)

Две строчки против того что было вначале.

Last edited by JNikc (29-05-2009 11:05)

Offline

#6 29-05-2009 12:41

Alien
Registered: 12-10-2008
Posts: 564

Re: Двигаем прямо в Liberty City

ну, собственно все это позволяет СБ.
Метки и условные/безусловные переходы использовать совсем необязательно (и их использование является дурным тоном скриптостроения, ибо приводит к плохой структурированности кода). Действительно, ведь реализованы же высокоуровневые конструкции условий и циклов.
Классы и методы: есть! Глянь на файл classes.db - много нового для себя откроешь. Можно объявлять там свои классы, свойства и методы. Так что ООП худо-бедно в СБ перекочевало.
От скрытия локальных переменных под x1, x2 итд, не давая скриптеру самому определить их (в const end, например), отказываться не стоит. Это позволяет работать с этими переменными через память. Я даже поэкспериментировал - попробовал читать и писать по переменным одного потока из другого.
Пользовательские функции объявлять можно, используя библиотеку CLEO. В справке все написано.
Вместо макросов можно воспользоваться вызовом функций, определив их в стороннем файле и подключив при помощи директивы {$i}. Например, вот тебе "макрос" загрузки какой-то модели и ожидания когда она загрузится.

:MODEL_LOAD
model.load(0@)
repeat
wait 0 
until model.available(0@)

Используется вызов пользовательской функции:

0AB1: call_scm_func @MODEL_LOAD 1 #phoenix

Вся низкоуровневость проявляется только в необходимости использования OPR-кодов (каждый опкод с новой строчки) и отсутствие нормальной арифметики. Там куча тех же опкодов увеличения: для локальных переменных, для глобальных переменных, для int, для float...
К слову, в папке data SA есть файл main.sc, в котором можно найти исходник некоторого кода. Разрабы пользовались этим синтаксисом для написания main.scm.

Last edited by Alien (29-05-2009 12:57)

Offline

#7 30-05-2009 22:51

JNikc
From: SPB
Registered: 27-05-2009
Posts: 22

Re: Двигаем прямо в Liberty City

Все здорово, но код

0AB1: call_scm_func @MODEL_LOAD 1 #phoenix

Неудобочитаем. Хотя спасибо, незнал такого. Просто под макросами я имею в виду нечто совсем другое.

А есть ли у СБ препроцессор???

Last edited by JNikc (30-05-2009 22:52)

Offline

#8 31-05-2009 05:42

Alien
Registered: 12-10-2008
Posts: 564

Re: Двигаем прямо в Liberty City

Это скриптовый байт-код. Как можно требовать от этого кода возможностей полноценных программ, если они всего лишь исполняются каким-то интерпретатором? Все возможности этого интерпретатора реализованы в СБ, а некоторые даже добавлены через CLEO.
В любом случае дальнейшего развития СБ уже наверное не будет... Разве что выйдут новые версии SASCM.ini или еще что...
Кстати, я там неправильно написал. Нужно вот так:

:MODEL_LOAD
model.load(0@)
repeat
wait 0 
until model.available(0@)
0AB2: ret 0

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

...
            if
                0AB1: call_scm_func @KEY_PRESS 1 0x1 0@
            then
               ...
            end
...

:KEY_PRESS
32@ = 0
059A: return_false
if
    0ab0: 0@
then
    while 0ab0: 0@
        wait 0
    end
    0485: return_true
end
0AB2:ret 1 32@

Супер-мега-полезные опкоды 0485 и 059A вообще даже отсутствуют в стандартном SASCM.ini. Они там unknown'ы до сих пор.
Есть еще одна возможность макроса, возможно ты это имел ввиду. Нажми Ctrl+J, вылезет окошко. Все макросы настраиваются в файле macroes.txt.

Offline

#9 31-05-2009 07:39

JNikc
From: SPB
Registered: 27-05-2009
Posts: 22

Re: Двигаем прямо в Liberty City

В любом случае дальнейшего развития СБ уже наверное не будет

Почему? :-< Есть же GTA 4, хотя там совсем другая модель с опкодами...

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

На самом деле при наличие определенного уровня кода переход на новый можно организовать добавив очередной модуль. То есть: раньше код обрабатывал сканер1, парсер1, анализатор1; потом это дело расширяют и уже работает система сканер1, парсер1, анализатор1, анализатор2, препроцессор. Это верно?

У СБ я нашел макросы macroes.txt это даже не макросы!!! :-) Ладно, шучу.

Offline

#10 31-05-2009 10:30

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

Re: Двигаем прямо в Liberty City

Супер-мега-полезные опкоды 0485 и 059A вообще даже отсутствуют в стандартном SASCM.ini. Они там unknown'ы до сих пор.

Это в какой версии СБ? У меня они помечены как

0485=0,  NOP_true
059A=0,  NOP_false

и это правильное описание. Возможность использования их в функциях для возвращения результата является трюком (описано в соотв. теме на форуме), вместо них можно использовать любой NOP_true/false (0831, например).

Язык GTA3-SA изначально не был объектно-ориентированным. Реализовать в нем настоящие классы, макросы и все такое можно, но очень сложно и нецелесообразно (см. Point). На мой взгляд, те элементы языка, которых не хватало ранее в MB, были реализованы в SB и расширены в CLEO.

Вот GTA 4 другое дело. Там изначально реализован другой подход к скриптам, поэтому там можно сделать гораздо больше.

Offline

#11 31-05-2009 14:34

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Двигаем прямо в Liberty City

Seemann wrote:

Вот GTA 4 другое дело. Там изначально реализован другой подход к скриптам, поэтому там можно сделать гораздо больше.

В принципе, если начать плясать от хэндлов (как это сделано, например, в WTL), можно много чего сделать.
Другое дело, что сначала нужно сделать хоть какой-нибудь транслятор, а потом уже над ним колдовать.

Иначе может получиться как в русско-финской поговорке: "За двумя за яйцами погонишься, ни одного за яйца не поймаешь".

Offline

#12 22-08-2009 20:59

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: Двигаем прямо в Liberty City

to JNikc

А как вертолет поднять в ЛС - не помню, где мах высоту в хандлинге менять...
Хотел джетпак запикапить, чё то не появляется - всё хочу в бистро пробраться, с мужиком поговорить...

Offline

#13 08-01-2011 17:36

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Двигаем прямо в Liberty City

Эээ... А метки NONAME_62 нету-то, а ссылки на неё есть...

Offline

Board footer

Powered by FluxBB