[ Новые сообщения · Участники · Правила форума · Поиск · 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
Администраторы
Скриптер
18.07.13 12:40
Offline
Цитата (vKew)
Мне надо: вводишь LOCK и ближайщяя машина открывается
Код
{$CLEO}
0000:

while true
      0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to 1@
      if AND  
      0ADC:   test_cheat "LOCK"
      056E:   car 0@ defined
      then
      020A: set_car 0@ door_status_to 0
      end
wait 0
end

Vital
Модераторы
Скриптер
18.07.13 18:05
Offline
wmysterio, желательно ещё на существование игрока проверить. Можно в цикле repeat это сделать перед while true.
vKew, возьми то же самое, что и у wmysterio, но перед while true поставь:
Код
repeat
wait 0
until Player.Defined(0)
Лучше всё же проверить на то, что игрок есть, прежде чем делать что-то с $PLAYER_ACTOR.

Добавлено (18.07.13, 16:55)
---------------------------------------------
wmysterio, для открытия всех машин можно воспользоваться 0AE2. Вот, как это показал мне Den_Spn. А DK22Pac напомнил ещё, что есть сделанные им "инклуды" ($Include) с такими конструкциями. Можно применить такой алгоритм или сам $Include, чтобы открыть все машины разом.

Добавлено (18.07.13, 17:05)
---------------------------------------------
wmysterio, мне тоже моделирование кажется жутким занятием. Можно часами и даже днями сидеть за одной моделью, я попробовал сделать мелкий дорожный знак, на это ушло столько! Это не Source SDK, в котором несмотря на функциональность, можно вполне быстро и просто сделать даже домик, в SA нужно считать каждый полигон, нету интуитивности в управлении программой (если брать Zanoza), но самое страшное, в отличие от скриптов, - гораздо больше неизвестности. Если в скрипте можно по-разному понять, как обезопасить работу программы от всяких вмешательств, то в моделировании... Могут быть другие моды, несовместимость с файлом управления, нужно по сто раз переделывать каждую мелкую деталь, чтобы всё заработало... Честно говоря, в скриптинге мне эта возня гораздо приятнее, лучше и нагляднее понимаешь, в чём проблемы, потому что в игре всё чаще всего проявляется с первого раза, а затем уже совершенствуешь скрипт, добавляя в него что-либо, обеспечивая его нормальную и красивую работу при многих обстоятельствах. И кроме SB, не нужно ничего. Разве что иногда. А для моделей надо найти текстуры и модели, да так, чтобы всякие правообладатели не возмущались и не кричали с пеной у рта о нарушениях прав, надо найти ещё программы для редактирования текстур, настроек машин/объектов/актёров, сделать col файл, правильно наложить текстуры, в общем, даже для одной модели понадобится гораздо более, чем одна программа (либо одна, но сложная и запутанная). Короче говоря, мне скрипты ближе, хоть я и думал когда-то, что это не моё. Я бы сказал, что скрипты - это основа, без которой все эти модели и текстуры не ожили бы, к тому же скриптами можно вытащить из игры многие сведения: модели машин/объектов/актёров, названия районов, координаты, при этом не прибегая к другим программам.

2109: create_special_actor $VITAL in_front_of_computer

wmysterio
Администраторы
Скриптер
18.07.13 18:29
Offline
Цитата (Vital)
для открытия всех машин можно воспользоваться 0AE2
Можно конечно, я этого не отрицаю. Я просто стараюсь сделать скрипт как можно производительным. Я пробовал циклы с большим количеством итерации на своём старом компе, то игра работает намного медленней, а когда только 1 цикл, где проверяется несколько условий - всё работает без проблем.

Parenek
Пользователи
18.07.13 19:58
Offline
Вообщем я пишу миссии в main.csm, иногда после пройгрыша, они не полностью отчищаются, поясню.
Например я создал таймер, я проиграл на начале миссии и он не хотит отчищаться, mission_cleanup не убирает его,после "Миссия провалена" он спокойно идет.Миссии создаются в Gta criminal Russia beta 2.
Ну что скажете?Код миссии прикрепил, взгляньте
Прикрепления: test.txt(16.2 Kb)

wmysterio
Администраторы
Скриптер
18.07.13 20:06
Offline
Цитата (Parenek)
я проиграл на начале миссии и он не хотит отчищаться
Нужно убирать таймер ещё и в коде провала миссии:
Код
:KOD_PROVALA2
//....
014F: stop_timer 32@

Parenek
Пользователи
18.07.13 21:52
Offline
Я так делал и ноль результатов, ладно, а вот у меня есть проблемка с миссией "Побег из тюрьмы"
Значит пишу миссию, делаю чтобы охранники патрулировали тюрьму, делаю проверку на то-что актер не замечен актером, а она работает некоректно!Даже когда я к нему спиной, он меня замечает, даже в присядку!
Гляньте код.
Прикрепления: TEST_MIS.txt(9.9 Kb)

wmysterio
Администраторы
Скриптер
18.07.13 22:26
Offline
Parenek, опкод и в правду странно работает, но можно схитрить:
Код
:METKA
wait 0
04C4: store_coords_to 0@ 1@ 2@ from_actor 3@ with_offset 0.0 5.0 0.0
if
00EC:   actor $PLAYER_ACTOR sphere 0 near_point 0@ 1@ radius 5.0 5.0
jf @METKA
Получается, что если игрок находится в точке, впереди актёра-стражника, тогда идёт провал.
-------------------------------------------------
к тому же код построен так, что нет прыжка на метку удачного выполнения миссии а как бы объедено в одно с провалом.

Parenek
Пользователи
18.07.13 22:50
Offline
Это я зделал специально, для проверки!Спасибо за вариант!Пойду проверю.

Добавлено (18.07.13, 21:38)
---------------------------------------------
Когда он поворачиваеться, он его замечает!

Добавлено (18.07.13, 21:41)
---------------------------------------------
Прошу мне помочь, дальнейшая работа над сюжетом остановлена!

Добавлено (18.07.13, 21:50)
---------------------------------------------
Я добавил задержку в 2 секунды, им на поворот хватает, еще чутка доработаю и все!


wmysterio
Администраторы
Скриптер
18.07.13 22:57
Offline
Цитата (Parenek)
Прошу мне помочь, дальнейшая работа над сюжетом остановлена!
Ну так скажи когда миссия считается выполненной?

mos_cracin
Пользователи
18.07.13 23:13
Offline
wmysterio,
Код
// This file was decompiled using sascm.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013

{$VERSION 3.1.1000}
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
0662: printstring "#MOS_CRACIN-SCRIPT"
0662: printstring "НАСТАЯЩЯЯ ИМЯ - ANDREI COJOCARU"
0000: NOP
thread "MOS_CRACIN"
gosub @MOS_CRACIN_111
if
wasted_or_busted
else_jump @MOS_CRACIN_102
gosub @MOS_CRACIN_644

:MOS_CRACIN_102
$ONMISSION == 0
mission_cleanup

:MOS_CRACIN_111
increment_mission_attempts
$ONMISSION == 1
Model.Load(#VLA1)
Model.Load(#VLA2)
Model.Load(#VLA3)
Model.Load(#BAT)
Model.Load(#COLT45)
038B: load_requested_models

:MOS_CRACIN_144
wait 0
if
Model.Available(#VLA1)
Model.Available(#VLA2)
Model.Available(#VLA3)
Model.Available(#BAT)
Model.Available(#COLT45)
else_jump @MOS_CRACIN_144
Actor.PutAt($PLAYER_ACTOR, 2056.109, -1977.737, 13.5545)
Actor.Angle($PLAYER_ACTOR) = 89.2086
$ACTOR1 = Actor.Create(Criminal, #VLA1, 2031.426, -1981.053, 13.5545)
Actor.Angle($ACTOR1) = 278.2756
Actor.Health($ACTOR1) = 150
03FE: set_actor $ACTOR1 money 10
Actor.GiveWeaponAndAmmo($ACTOR1, BaseballBat, 1)
$ACTOR2 = Actor.Create(Criminal, #VLA2, 2030.784, -1977.539, 13.5545)
Actor.Angle($ACTOR2) = 269.6484
Actor.Health($ACTOR2) = 200
03FE: set_actor $ACTOR2 money 20
Actor.GiveWeaponAndAmmo($ACTOR2, Pistol, 40)
$ACTOR3 = Actor.Create(Criminal, #VLA3, 2031.22, -1975.07, 13.5545)
Actor.Angle($ACTOR3) = 255.1723
Actor.Health($ACTOR3) = 150
03FE: set_actor $ACTOR3 money 50
Actor.GiveWeaponAndAmmo($ACTOR1, BaseballBat, 1)
Camera.Restore_WithJumpCut
Camera.SetBehindPlayer
wait 2000
fade 1 1000
wait 1000
05E2: AS_actor $ACTOR1 kill_actor $PLAYER_ACTOR
05E2: AS_actor $ACTOR2 kill_actor $PLAYER_ACTOR
05E2: AS_actor $ACTOR3 kill_actor $PLAYER_ACTOR
Actor.SetImmunities($PLAYER_ACTOR, 0, 0, 0, 0, 0)
Player.CanMove($PLAYER_ACTOR) = True
$MARKER1 = Marker.CreateAboveActor($ACTOR1)
$MARKER2 = Marker.CreateAboveActor($ACTOR2)
$MARKER3 = Marker.CreateAboveActor($ACTOR3)
07E0: set_marker $MARKER1 type_to 0
07E0: set_marker $MARKER2 type_to 0
07E0: set_marker $MARKER3 type_to 0

:MOS_CRACIN_497
wait 0
if
Actor.Dead($ACTOR1)
else_jump @MOS_CRACIN_522
Marker.Disable($MARKER1)

:MOS_CRACIN_522
if
Actor.Dead($ACTOR2)
else_jump @MOS_CRACIN_543
Marker.Disable($MARKER2)

:MOS_CRACIN_543
if
Actor.Dead($ACTOR3)
else_jump @MOS_CRACIN_564
Marker.Disable($MARKER3)

:MOS_CRACIN_564
if and
Actor.Dead($ACTOR1)
Actor.Dead($ACTOR2)
Actor.Dead($ACTOR3)
else_jump @MOS_CRACIN_597
jump @MOS_CRACIN_497

:MOS_CRACIN_597
jump @MOS_CRACIN_604

:MOS_CRACIN_604
wait 0
gosub @MOS_CRACIN_673
01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1  // MЃCCЃ• Bѓ’O‚HEHA!~n~~w~$~1~
Player.Money($PLAYER_ACTOR) += 500
return

:MOS_CRACIN_644
wait 0
gosub @MOS_CRACIN_673
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1  // ~r~MЃCCЃ• ’POBA‚EHA!
return

:MOS_CRACIN_673
wait 0
if
056D:   actor $ACTOR1 defined
else_jump @MOS_CRACIN_703
Actor.RemoveReferences($ACTOR1)
Actor.DestroyInstantly($ACTOR1)

:MOS_CRACIN_703
if
056D:   actor $ACTOR2 defined
else_jump @MOS_CRACIN_729
Actor.RemoveReferences($ACTOR2)
Actor.DestroyInstantly($ACTOR2)

:MOS_CRACIN_729
if
056D:   actor $ACTOR3 defined
else_jump @MOS_CRACIN_755
Actor.RemoveReferences($ACTOR3)
Actor.DestroyInstantly($ACTOR3)

:MOS_CRACIN_755
Marker.Disable($MARKER1)
Marker.Disable($MARKER2)
Marker.Disable($MARKER3)
return
При компиляций пишет ошибка...и когда в игре захожу кикает, что тут за ошибка?
я понять не могу..

wmysterio
Администраторы
Скриптер
18.07.13 23:17
Offline
Цитата (mos_cracin)
При компиляций пишет ошибка...и когда в игре захожу кикает, что тут за ошибка?
У меня ошибка связана с меткой выхода MOS_CRACIN_644 в случае провала миссии. Она попросту отсутствует

mos_cracin
Пользователи
18.07.13 23:22
Offline
wmysteriosad в формате  .cs и в формате .cm сохраняются.. но открывать их не хотят... значит проблемы с метками да?

Добавлено (18.07.13, 22:22)
---------------------------------------------
wmysterio, как исправить?


wmysterio
Администраторы
Скриптер
18.07.13 23:25
Offline
Цитата (mos_cracin)
как исправить?
добавить код
Код
:MOS_CRACIN_644    
    gosub @MOS_CRACIN_673    
01E3: show_text_1number_styled GXT 'M_FAIL' number 1000 time 5000 style 1 // миссия провалена
return     

:MOS_CRACIN_673    
wait 0
return
в конец миссии.

Кстати, для миссий нужно использовать директиву {$CLEO .cm}

mos_cracin
Пользователи
18.07.13 23:34
Offline
wmysterio, Всерамно вылет, ... sad

wmysterio
Администраторы
Скриптер
18.07.13 23:39
Offline
Цитата (mos_cracin)
Всерамно вылет, ...
ща посмотрю что к чему.

mos_cracin
Пользователи
18.07.13 23:54
Offline
wmysterio, Прошу помочь!  sad

wmysterio
Администраторы
Скриптер
18.07.13 23:55
Offline
Так, разобрался. Есть нюансы:
1) Использовалась директива {$CLEO .CS} в место {$CLEO .CM}
2) Главный поток был объявлен в двойных кавычках, а нужно в одинарных:
Код
thread 'MOS_CRACIN'
3) Проверка нескольких условий - упущен указатель на это. Нужно так делать:
Код
:MOS_CRACIN_144
wait 0   
if AND
Model.Available(#VLA1)
Model.Available(#VLA2)
Model.Available(#VLA3)
Model.Available(#BAT)
Model.Available(#COLT45)
jf @MOS_CRACIN_144
4) Главные ошибкы: используете $PLAYER_ACTOR  в место $PLAYER_CHAR:
Код
Player.Money($PLAYER_CHAR) += 500
Player.CanMove($PLAYER_CHAR) = True

Вот такой код должен работать адекватно:
Код
{$CLEO .cm}   
//------------- Mission ---------------

:MOS_CRACIN
thread 'MOS_CRACIN'
gosub @MOS_CRACIN_29_57   
if   
wasted_or_busted   
jf @MOS_CRACIN_29_46   
gosub @MOS_CRACIN_29_144   

:MOS_CRACIN_29_46
$ONMISSION = 0   
mission_cleanup   
end_thread   

:MOS_CRACIN_29_57
increment_mission_attempts   
$ONMISSION = 1   
0662: printstring "#MOS_CRACIN-SCRIPT"   
0662: printstring "НАСТАЯЩЯЯ ИМЯ - ANDREI COJOCARU"
Model.Load(#VLA1)
Model.Load(#VLA2)
Model.Load(#VLA3)
Model.Load(#BAT)
Model.Load(#COLT45)
038B: load_requested_models   

:MOS_CRACIN_A
wait 0   
if AND
Model.Available(#VLA1)
Model.Available(#VLA2)
Model.Available(#VLA3)
Model.Available(#BAT)
Model.Available(#COLT45)
jf @MOS_CRACIN_A   

Actor.PutAt($PLAYER_ACTOR, 2056.109, -1977.737, 13.5545)
Actor.Angle($PLAYER_ACTOR) = 89.2086

$ACTOR1 = Actor.Create(Criminal, #VLA1, 2031.426, -1981.053, 13.5545)
Actor.Angle($ACTOR1) = 278.2756
Actor.Health($ACTOR1) = 150
03FE: set_actor $ACTOR1 money 10   
Actor.GiveWeaponAndAmmo($ACTOR1, BaseballBat, 1)

$ACTOR2 = Actor.Create(Criminal, #VLA2, 2030.784, -1977.539, 13.5545)
Actor.Angle($ACTOR2) = 269.6484
Actor.Health($ACTOR2) = 200
03FE: set_actor $ACTOR2 money 20   
Actor.GiveWeaponAndAmmo($ACTOR2, Pistol, 40)

$ACTOR3 = Actor.Create(Criminal, #VLA3, 2031.22, -1975.07, 13.5545)
Actor.Angle($ACTOR3) = 255.1723
Actor.Health($ACTOR3) = 150
03FE: set_actor $ACTOR3 money 50   
Actor.GiveWeaponAndAmmo($ACTOR3, BaseballBat, 1)

Camera.Restore_WithJumpCut
Camera.SetBehindPlayer
wait 2000   
fade 1 1000   
wait 1000     
$MARKER1 = Marker.CreateAboveActor($ACTOR1)
$MARKER2 = Marker.CreateAboveActor($ACTOR2)
$MARKER3 = Marker.CreateAboveActor($ACTOR3)
07E0: set_marker $MARKER1 type_to 0   
07E0: set_marker $MARKER2 type_to 0   
07E0: set_marker $MARKER3 type_to 0   
Actor.SetImmunities($PLAYER_ACTOR, 0, 0, 0, 0, 0)
Player.CanMove($PLAYER_CHAR) = True
05E2: AS_actor $ACTOR1 kill_actor $PLAYER_ACTOR   
05E2: AS_actor $ACTOR2 kill_actor $PLAYER_ACTOR   
05E2: AS_actor $ACTOR3 kill_actor $PLAYER_ACTOR   

:MOS_CRACIN_B
wait 0
if   
Actor.Dead($ACTOR1)
then
Marker.Disable($MARKER1)
end
if   
Actor.Dead($ACTOR2)
then   
Marker.Disable($MARKER2)
end
if   
Actor.Dead($ACTOR3)
then
Marker.Disable($MARKER3)
end
if and
Actor.Dead($ACTOR1)
Actor.Dead($ACTOR2)
Actor.Dead($ACTOR3)
jump @MOS_CRACIN_C
end
jump @MOS_CRACIN_B   

:MOS_CRACIN_C
wait 0
gosub @MOS_CRACIN_END
01E3: show_text_1number_styled GXT 'M_PASS' number 500 time 5000 style 1  // MЃCCЃ• Bѓ’O‚HEHA!~n~~w~$~1~
Player.Money($PLAYER_CHAR) += 500
return   

:MOS_CRACIN_29_144
wait 0   
gosub @MOS_CRACIN_END
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1  // MISSION FAILED
return

:MOS_CRACIN_END
wait 0
Marker.Disable($MARKER1)
Marker.Disable($MARKER2)
Marker.Disable($MARKER3)
return

mos_cracin
Пользователи
19.07.13 00:01
Offline
wmysterio, Как мне отблагадорить?

wmysterio
Администраторы
Скриптер
19.07.13 00:05
Offline
Цитата (mos_cracin)
Как мне отблагадорить?
Пытаться делать скрипты дальше и не останавливаться на достигнутом smile

mos_cracin
Пользователи
19.07.13 00:16
Offline
wmysterio, Хорошо, спасибо!

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