You are not logged in.
Pages: 1
А вот страшный низкоуровневый! скрипт. Рядом с домом в тупике заходим на красный круг и попадаем прямо в кусок Либерти. Можно идти только вверх по дороге, по направлению к бистро с.марка, иначе - провалетесь, там дороги не настоящие. Вобщем халтурили разработчики :-)
{$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
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}. Например, вот тебе "макрос" загрузки какой-то модели и ожидания когда она загрузится.
: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
Все здорово, но код
0AB1: call_scm_func @MODEL_LOAD 1 #phoenix
Неудобочитаем. Хотя спасибо, незнал такого. Просто под макросами я имею в виду нечто совсем другое.
А есть ли у СБ препроцессор???
Last edited by JNikc (30-05-2009 22:52)
Offline
Это скриптовый байт-код. Как можно требовать от этого кода возможностей полноценных программ, если они всего лишь исполняются каким-то интерпретатором? Все возможности этого интерпретатора реализованы в СБ, а некоторые даже добавлены через 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
В любом случае дальнейшего развития СБ уже наверное не будет
Почему? :-< Есть же 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