You are not logged in.
Pages: 1
А вот страшный низкоуровневый! скрипт. Рядом с домом в тупике заходим на красный круг и попадаем прямо в кусок Либерти. Можно идти только вверх по дороге, по направлению к бистро с.марка, иначе - провалетесь, там дороги не настоящие. Вобщем халтурили разработчики :-)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | { $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)
А это просто полетать :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // By Alien { $CLEO } 0A8C: write_memory 0x67F 268 size 4 value 0x44e 9 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
Offline
Ну как? Что является признаком низкоуровневых языков? Метки, goto, прыжки jump. Это я так, последнее время нахожусь под воздействием идеи... Должны быть скриптовые языки повыше уровнем.
Offline
А я бы так написал:
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
ну, собственно все это позволяет СБ.
Метки и условные/безусловные переходы использовать совсем необязательно (и их использование является дурным тоном скриптостроения, ибо приводит к плохой структурированности кода). Действительно, ведь реализованы же высокоуровневые конструкции условий и циклов.
Классы и методы: есть! Глянь на файл classes.db - много нового для себя откроешь. Можно объявлять там свои классы, свойства и методы. Так что ООП худо-бедно в СБ перекочевало.
От скрытия локальных переменных под x1, x2 итд, не давая скриптеру самому определить их (в const end, например), отказываться не стоит. Это позволяет работать с этими переменными через память. Я даже поэкспериментировал - попробовал читать и писать по переменным одного потока из другого.
Пользовательские функции объявлять можно, используя библиотеку CLEO. В справке все написано.
Вместо макросов можно воспользоваться вызовом функций, определив их в стороннем файле и подключив при помощи директивы {$i}. Например, вот тебе "макрос" загрузки какой-то модели и ожидания когда она загрузится.
1 2 3 4 5 | :MODEL_LOAD model.load( 0@ ) repeat wait 0 until model.available( 0@ ) |
Используется вызов пользовательской функции:
1 | 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
Все здорово, но код
1 | 0AB1: call_scm_func @MODEL_LOAD 1 #phoenix |
Неудобочитаем. Хотя спасибо, незнал такого. Просто под макросами я имею в виду нечто совсем другое.
А есть ли у СБ препроцессор???
Last edited by JNikc (30-05-2009 22:52)
Offline
Это скриптовый байт-код. Как можно требовать от этого кода возможностей полноценных программ, если они всего лишь исполняются каким-то интерпретатором? Все возможности этого интерпретатора реализованы в СБ, а некоторые даже добавлены через CLEO.
В любом случае дальнейшего развития СБ уже наверное не будет... Разве что выйдут новые версии SASCM.ini или еще что...
Кстати, я там неправильно написал. Нужно вот так:
1 2 3 4 5 6 | :MODEL_LOAD model.load( 0@ ) repeat wait 0 until model.available( 0@ ) 0AB2: ret 0 |
На самом деле возможностей с этими пользовательскими функциями открывается огромное количество, только они почему-то недокументированы. Например, проверка нажатия клавиши и того, сколько времени она была нажата:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ... if 0AB1: call_scm_func @KEY_PRESS 1 0x 1 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
В любом случае дальнейшего развития СБ уже наверное не будет
Почему? :-< Есть же GTA 4, хотя там совсем другая модель с опкодами...
А нащет "всего лишь" интерпритаторов: есть такие интерпритируемые языки на основе байт-кода, что дадут фору любым высокоуровневым компиляторам. Чем же игровой язык хуже?
На самом деле при наличие определенного уровня кода переход на новый можно организовать добавив очередной модуль. То есть: раньше код обрабатывал сканер1, парсер1, анализатор1; потом это дело расширяют и уже работает система сканер1, парсер1, анализатор1, анализатор2, препроцессор. Это верно?
У СБ я нашел макросы macroes.txt это даже не макросы!!! :-) Ладно, шучу.
Offline
Супер-мега-полезные опкоды 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
Вот GTA 4 другое дело. Там изначально реализован другой подход к скриптам, поэтому там можно сделать гораздо больше.
В принципе, если начать плясать от хэндлов (как это сделано, например, в WTL), можно много чего сделать.
Другое дело, что сначала нужно сделать хоть какой-нибудь транслятор, а потом уже над ним колдовать.
Иначе может получиться как в русско-финской поговорке: "За двумя за яйцами погонишься, ни одного за яйца не поймаешь".
Offline
to JNikc
А как вертолет поднять в ЛС - не помню, где мах высоту в хандлинге менять...
Хотел джетпак запикапить, чё то не появляется - всё хочу в бистро пробраться, с мужиком поговорить...
Offline
Эээ... А метки NONAME_62 нету-то, а ссылки на неё есть...
Offline
Pages: 1