[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder (Вы можете получить ответы на вопросы по SB)
Вопросы по скриптингу Sanny Builder
wmysterio
Администраторы
Скриптер
22.11.11 21:52
Offline
Если у вас возник вопрос по скриптингу Sanny Builder, обращайтесь! Мы постараемся решить вашу проблему wink Это ещё не значит, что все прям бросятся решать во чтобы то не стало, но ответ вы сможете вы получить как вариант решения или как невозможность или сложность решения.
УВАЖАЕМЫЕ ПОЛЬЗОВАТЕЛИ! ПРОСЬБА КОД СКРИПТОВ ПОМЕЩАТЬ В КОНСТРУКЦИЮ КОДА:

или

Также указывайте полный код скрипта, иначе причина ошибок может быть и не выявлена.
Прикрепления: 0248203.png(0.9 Kb) · 9085525.png(0.2 Kb)

wmysterio
Администраторы
Скриптер
07.08.13 15:44
Offline
Цитата (Slivkin-Sergey)
Я посмотрел код миссии "Девочка Свита", никакого цикла не обнаружил.
Чего тебя так не нравятся циклы? happy Даже безобидный
Код
:Label
wait 0
jump @Label
является циклом. Возможно он не использовался в диалогах(не смотрел код той миссии), но в большинстве случаев это так.
Цитата (Slivkin-Sergey)
Можешь написать небольшой цикл с двумя-тремя фразами?
Вот примерно так:
Код
0@ = 0      // for while
1@ = 0      // index dialog
2@ = 0.0    // mini-timer

while 0@ == 0
     if OR
     actor.Dead($PLAYER_ACTOR)
     0741:   actor $PLAYER_ACTOR busted
     then
     0@ = -1
         break
     end
      
     if AND
     1@ == 0
     2@ > 3.0
     then
     0AD0: show_formatted_text_lowpriority "This Text 1" time 6000
     1@ += 1
     2@ = 0.0
     end
      
     if AND
     1@ == 1
     2@ > 6.0
     then
     0AD0: show_formatted_text_lowpriority "This Text 2" time 6000
     1@ += 1
     2@ = 0.0
     end     
      
     if AND
     1@ == 2
     2@ > 6.0
     then
     0AD0: show_formatted_text_lowpriority "This Text 3" time 6000
     1@ += 1
     2@ = 0.0
     end      
      
     if AND
     1@ == 3
     2@ > 6.0
     then
     0AD0: show_formatted_text_lowpriority "This Text 4" time 6000
     1@ += 1
     2@ = 0.0
     end      
      
     // ...
      
      
     2@ += 0.25
wait 0
end

00BE: text_clear_all
if
0@ == -1
then
jump @LABEL_FAILED
end

0394: play_music 1
// ...

Slivkin-Sergey
Модераторы
07.08.13 15:51
Offline
У меня получилась вот такая здоровенная хрень, но после посадки в машину игра виснет sad .
Код
:STEVEN1_5
wait 1000
6@ = Marker.CreateAboveCar(5@)
00BB: show_text_lowpriority GXT 'M2T1' time 5000 flag 1
0001: wait 5000

:STEVEN1_6
wait 1
if
Actor.InCar($PLAYER_ACTOR, 5@)
jf @STEVEN1_6
00BE: text_clear_all     
Marker.Disable(6@)    
repeat
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)
jf @STEVEN1_CLEANUP
Actor.InCar($PLAYER_ACTOR, 5@)
0AA0: gosub_if_false @STEVEN1_7
00BB: show_text_lowpriority GXT 'M2S8' time 1 flag 1
$181 += 1
until $181 == 4000
$181 = 0
repeat
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)
jf @STEVEN1_CLEANUP
if
Actor.InCar($PLAYER_ACTOR, 5@)
0AA0: gosub_if_false @STEVEN1_7
00BB: show_text_lowpriority GXT 'M2S9' time 1 flag 1
$181 += 1
until $181 == 4000

:STEVEN1_7
wait 0
6@ = Marker.CreateAboveCar(5@)
repeat
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)                    
jf @STEVEN1_CLEANUP
00BB: show_text_lowpriority GXT 'M2S9' time 1 flag 1
$181 += 1
until $181 == 4000
return

:STEVEN1_8
wait 1
if
not Actor.InCar($PLAYER_ACTOR, 5@)
then
if
not Actor.Dead(5@)
jf @STEVEN1_FAILED
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
else
return
end

:STEVEN1_FAILED  
00BA: text_styled 'M_FAIL' 5000 ms 1
create_thread @STEVEN1_START
return

Добавлено (07.08.13, 14:51)
---------------------------------------------
Переменная $181 была объявлена.


wmysterio
Администраторы
Скриптер
07.08.13 15:57
Offline
Slivkin-Sergey, естественно виснет. Как минимум нет wait 0 в циклах repaet. Где он?
Код
repeat
wait 0
// Опкоды
// Опкоды
until ~~~~~~~
И вообще кидай исходный код, а не декомпилированный - скорее ошибки обнаружить можно

Slivkin-Sergey
Модераторы
07.08.13 15:59
Offline
wmysterio, это исходный.

Так что там с циклами из оригинальных миссий?

wmysterio
Администраторы
Скриптер
07.08.13 16:04
Offline
Цитата (Slivkin-Sergey)
это исходный.
какой-то он странный, как на исходный, но ничё, проехали.
Цитата (Slivkin-Sergey)
Так что там с циклами из оригинальных миссий?
Я ответил на этот вопрос выше.

Hit
Пользователи
07.08.13 16:21
Offline
1 1. Hit
2 2. Счетчик убийств + Растояние

3 3. Счетчик убийств - тоесть количество человек убивший ты
       Расстояние - например: Ты убил игрока с 2 метров и т.д

4 -

Slivkin-Sergey
Модераторы
07.08.13 16:38
Offline
Цитата (wmysterio)
Я ответил на этот вопрос выше.
Я имею ввиду, что мой вопрос до банальности прост - как это происходит (имею ввиду в ориг. миссиях)? С помощью циклов? Каких?

Кстати, я немного модифицировал код:
Код
:STEVEN1_5
wait 1000
6@ = Marker.CreateAboveCar(5@)
00BB: show_text_lowpriority GXT 'M2T1' time 5000 flag 1
0001: wait 5000

:STEVEN1_6
wait 1
if
Actor.InCar($PLAYER_ACTOR, 5@)
jf @STEVEN1_6
00BE: text_clear_all     
Marker.Disable(6@)    
repeat
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)
jf @STEVEN1_CLEANUP
Actor.InCar($PLAYER_ACTOR, 5@)
0AA0: gosub_if_false @STEVEN1_7
00BB: show_text_lowpriority GXT 'M2S8' time 1 flag 1
$181 += 1
until $181 == 4000
$181 = 0
repeat
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)
jf @STEVEN1_CLEANUP
if
Actor.InCar($PLAYER_ACTOR, 5@)
0AA0: gosub_if_false @STEVEN1_7
00BB: show_text_lowpriority GXT 'M2S9' time 1 flag 1
$181 += 1
until $181 == 4000

:STEVEN1_7
wait 0
6@ = Marker.CreateAboveCar(5@)
repeat
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)                    
jf @STEVEN1_CLEANUP
00BB: show_text_lowpriority GXT 'M2S9' time 1 flag 1
$181 += 1
until $181 == 4000
return

:STEVEN1_8
wait 1
if
not Actor.InCar($PLAYER_ACTOR, 5@)
then
if
not Actor.Dead(5@)
jf @STEVEN1_FAILED
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
else
return
end

:STEVEN1_FAILED  
00BA: text_styled 'M_FAIL' 5000 ms 1
create_thread @STEVEN1_START
return

Но теперь дело обстоит так: после первого захода в машину маркер исчезает через секуну, начинается первая фраза. Выхожу из машины, маркер появляется, обратно не зовут, диалог продолжается. Убивать актёра бесполезно - миссия не будет провалена. В чём проблема? Это связано с тем, что я использую break перед gosub в цикле?

Кстати: чем мой код не похож на исходник? Просто из интереса...

Добавлено (07.08.13, 15:12)
---------------------------------------------
Блин, это не то, вот правильный:

Код
:STEVEN1_6
wait 1
if
Actor.InCar($PLAYER_ACTOR, 5@)
jf @STEVEN1_6
00BE: text_clear_all     
Marker.Disable(6@)    
repeat
wait 0
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)
jf @STEVEN1_FAILED
if
Actor.InCar($PLAYER_ACTOR, 5@)
then
00BB: show_text_lowpriority GXT 'M2S8' time 1 flag 1
$181 += 1
else
break
gosub @STEVEN1_7
end
until $181 == 4000
$181 = 0
repeat
wait 0
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)
jf @STEVEN1_CLEANUP
if
Actor.InCar($PLAYER_ACTOR, 5@)
then
00BB: show_text_lowpriority GXT 'M2S9' time 1 flag 1
$181 += 1
else
break
gosub @STEVEN1_7
end
until $181 == 4000

:STEVEN1_7
wait 0
6@ = Marker.CreateAboveCar(5@)
repeat
wait 0
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
if
not Actor.Dead(1@)                    
jf @STEVEN1_CLEANUP
00BB: show_text_lowpriority GXT 'M2S9' time 1 flag 1
$181 += 1
until $181 == 4000
return

:STEVEN1_8
wait 0
if
not Actor.InCar($PLAYER_ACTOR, 5@)
then
if
not Actor.Dead(5@)
jf @STEVEN1_FAILED
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED
else
return
end

:STEVEN1_FAILED  
00BA: text_styled 'M_FAIL' 5000 ms 1
create_thread @STEVEN1_START
return

Добавлено (07.08.13, 15:38)
---------------------------------------------
UP


wmysterio
Администраторы
Скриптер
07.08.13 17:48
Offline
Slivkin-Sergey, Я сделал урок, сейчас загружаю видео. Переделаешь его под себя и не нужно будет над чем-то мудрить -> Вот.

Slivkin-Sergey
Модераторы
07.08.13 18:19
Offline
wmysterio, классный урок! Только один вопрос: как проверка на то, что одна из переменных = 40 выдала положительный результат, если ты давал им значения 0?

wmysterio
Администраторы
Скриптер
07.08.13 18:30
Offline
Цитата (Slivkin-Sergey)
Только один вопрос: как проверка на то, что одна из переменных = 40 выдала положительный результат, если ты давал им значения 0?
Она менялась в цикле, в самом низу, возле
Код
1@ += 0.25
jump @MISSION_AA_LOOP

Slivkin-Sergey
Модераторы
08.08.13 06:10
Offline
У меня вопрос, может, не совсем по теме, но всё же: для чего нужны массивы, помимо того, что из них можно случайно "извлекать" его части? Он экономит память для хранения переменных?

Кстати, я не очень понял: что такое "default_jump" в таблице переходов? И что такое вход и выход из этой таблицы?

wmysterio
Администраторы
Скриптер
08.08.13 06:41
Offline
Цитата (Slivkin-Sergey)
для чего нужны массивы,
это уже решает скриптер для чего ему нужен тот или иной массив. В общем можно сказать, для быстрого получения/заполнения каких-то значений в массив/из массива
Цитата (Slivkin-Sergey)
Он экономит память для хранения переменных?
нет, не экономит. в sanny builder он просто присваивает индексы переменным, например так:
Код
$22 -> $22[0]
$23 -> $22[1]
$24 -> $22[2]
$25 -> $22[3]
$26 -> $22[4]
Цитата (Slivkin-Sergey)
что такое "default_jump" в таблице переходов?
прыжок на метку, если входящий параметр не соответствует ни одному номеру метки

Slivkin-Sergey
Модераторы
08.08.13 09:33
Offline
Цитата (wmysterio)
прыжок на метку, если входящий параметр не соответствует ни одному номеру метки
В смысле? То есть, если я ссылаюсь на номер перехода, которого в таблице нет?

И кстати: в видеоуроке №50 вроде было сказано про опкод 01FA... вроде так... в общем, он связан с режимом ярости, но у меня такого опкода нет. Это какая-то сторонняя библиотека, или?..

Добавлено (08.08.13, 08:10)
---------------------------------------------
Кстати, ещё пара вопросов: что такое Camera.SetAtPos? И почему вылетает на этом моменте (все переменные, массивы и т.д. объявлены и настроены):
Код
:STEVEN1_CARDAM
wait 0
0209: 198@ = random_int_in_ranges 0 4
var
199@ : string
end
199@ = $200[198@]
00BC: show_text_highpriority GXT 199@ time 3500 flag 0
return


Добавлено (08.08.13, 08:33)
---------------------------------------------
Нашёл альтернативу для вывода случайного текста. Теперь вот в чём вопрос: почему при такой конструкции, если я в машине, постоянно выводятся случайные тексты?
Код
:STEVEN1_5
wait 1000   
0186: 6@ = create_marker_above_car 5@
07E0: set_marker 6@ type_to 1
00BB: show_text_lowpriority GXT 'M2T1' time 5000 flag 1
Model.Load(#BALLAS1)
038B: load_requested_models

:STEVEN1_6
wait 1
if and
Model.Available(#BALLAS1)
Actor.InCar($PLAYER_ACTOR, 5@)
jf @STEVEN1_6
00BE: text_clear_all
0164: disable_marker 6@
018A: 7@ = create_checkpoint_at 1994.4166 -1463.0018 13.3906
                      
:STEVEN1_7
wait 0
0227: 28@ = car 5@ health
if
not Car.Wrecked(5@)
jf @STEVEN1_FAILED_CW
if
82BF:   not car 5@ sunk
jf @STEVEN1_FAILED_CD
if
not Actor.Dead(1@)
jf @STEVEN1_FAILED_SD
if and
28@ < 100
15@ == 0
0AA0: gosub_if_false @STEVEN1_CARDAM
if and
001D: 136@ > 28@
15@ == 1
0AA0: gosub_if_false @STEVEN1_CARDAM
...
...
...
Код
:STEVEN1_CARDAM
wait 0
136@ = Car.Health(5@)
0209: 198@ = random_int_in_ranges 0 4
00BC: show_text_highpriority GXT $200[198@] time 3500 flag 0
if
45@ == 0
then
45@ += 1
end
return
Отредактировал Slivkin-Sergey - Четверг, 08.08.13, 09:34

SHooZ
Друзья
08.08.13 11:23
Offline
[offtop]wmysterio, сделай тему "ВОПРОСЫ ПО СКРИПТИНГУ SANNY BUILDER от Slivkin-Sergey" :3[/offtop]

Slivkin-Sergey
Модераторы
08.08.13 12:24
Offline
Опять проверка не работает:
Код
if and
Actor.InCar($PLAYER_ACTOR, 5@)
not Actor.Dead(1@)
82BF:   not car 5@ sunk
not Car.Wrecked(5@)
875C:   not marker 7@ enabled  
then
7@ = Marker.CreateIconWithoutSphere(0, 2002.6569, -1462.4677, 13.3906)
03A1: show_sphere_at 2002.6569 -1462.4677 13.3906 radius 4.0  
end
if and
Actor.InCar($PLAYER_ACTOR, 5@)
00EC:   actor $PLAYER_ACTOR 0 near_point 2002.6569 -1462.4677 13.3906 radius 4.0 4.0  
Actor.InCar(1@, 5@)
not Actor.Dead($PLAYER_ACTOR)
then
jump @STEVEN1_8
end
Не создаёт сферу и не прыгает на метку, если игрок в точке.

Добавлено (08.08.13, 11:24)
---------------------------------------------
Всё, уже работает.


wmysterio
Администраторы
Скриптер
08.08.13 12:45
Offline
SHooZ, Ахах ))  Можно и так поступить. Хоть кто-то поддерживает форум :)
Цитата (Slivkin-Sergey)
В смысле? То есть, если я ссылаюсь на номер перехода, которого в таблице нет?
совершенно верно
Цитата (Slivkin-Sergey)
Нашёл альтернативу для вывода случайного текста.
Сколько скриптеров, столько и альтернатив. smile

Slivkin-Sergey
Модераторы
08.08.13 12:51
Offline
wmysterio, но почему-то сфера всё равно не отображается.
И кстати, я уже много чего перепробовал, всё время какие-то глюки да баги: как сделать так, чтобы, если машина врезалась, то выводилась случайная надпись из массива?

Добавлено (08.08.13, 11:49)
---------------------------------------------
Я делаю крупный проект на main.scm, скоро будет тема (не заброшу 100%, так как весь сюжет есть).

Добавлено (08.08.13, 11:51)
---------------------------------------------

Цитата (wmysterio)
совершенно верно
Зачем это надо? Если я создаю таблицу переходов, то я, наверное, знаю, что мне от неё нужно?

Добавлено (08.08.13, 11:51)
---------------------------------------------

Цитата (SHooZ)
wmysterio, сделай тему "ВОПРОСЫ ПО СКРИПТИНГУ SANNY BUILDER от Slivkin-Sergey" :3
happy

wmysterio
Администраторы
Скриптер
08.08.13 13:34
Offline
Цитата (Slivkin-Sergey)
но почему-то сфера всё равно не отображается.
Вроде маркер с иконкой не создаётся, если указать тип 0:
Код
7@ = Marker.CreateIconWithoutSphere(0, 2002.6569, -1462.4677, 13.3906) // 0 поменяй на 15, например
Цитата
00EC:   actor $PLAYER_ACTOR 0 near_point 2002.6569 -1462.4677 13.3906 radius 4.0 4.0
Убери параметр 13.3906, так как опкод принимает только координаты X и Y.
Цитата (Slivkin-Sergey)
Зачем это надо? Если я создаю таблицу переходов, то я, наверное, знаю, что мне от неё нужно?
Это, как говорится, на всякий пожарный. Мало ли какие глюки могут случится smile
Цитата
03A1
опкод рисует сферу в цикле. Если нужно создать сферу и что-бы она постоянно висела без циклов, используй опкод 03BC

Slivkin-Sergey
Модераторы
08.08.13 13:40
Offline
wmysterio, тогда что такое Camera.SetAtPos? И ещё:
Цитата (Slivkin-Sergey)
я уже много чего перепробовал, всё время какие-то глюки да баги: как сделать так, чтобы, если машина врезалась, то выводилась случайная надпись из массива?

wmysterio
Администраторы
Скриптер
08.08.13 13:49
Offline
Цитата (Slivkin-Sergey)
тогда что такое Camera.SetAtPos?
-> сюда
Цитата (Slivkin-Sergey)
я уже много чего перепробовал, всё время какие-то глюки да баги: как сделать так, чтобы, если машина врезалась, то выводилась случайная надпись из массива?
Код
var
$ARRAY_STRING: array 10 of string
end

v$ARRAY_STRING[0] = "Text 1"
v$ARRAY_STRING[1] = "Text 2"
v$ARRAY_STRING[2] = "Text 3"
v$ARRAY_STRING[3] = "Text 4"
v$ARRAY_STRING[4] = "Text 5"
v$ARRAY_STRING[5] = "Text 6"
v$ARRAY_STRING[6] = "Text 7"
v$ARRAY_STRING[7] = "Text 8"
v$ARRAY_STRING[8] = "Text 9"
v$ARRAY_STRING[9] = "Text 10"

while true
      if OR
      actor.Dead($PLAYER_ACTOR)
      0741:   actor $PLAYER_ACTOR busted
      car.Wrecked(5@)
      02BF:   car 5@ sunk
      then
          break
      end

      if
      // Машина врезалась
      then
      0209: 0@ = random_int_in_ranges 0 9
      0AD0: show_formatted_text_lowpriority $ARRAY_STRING(0@,10v) time 4000
      end

wait 0
end

Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder (Вы можете получить ответы на вопросы по SB)
Поиск: