[ Новые сообщения · Участники · Правила форума · Поиск · 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)

Dyabda
Пользователи
17.09.17 13:50
Offline
Цитата wmysterio ()
Без записи в память весь Ваш код будет бесполезен.

Но как их записывать?
И почему в данном случае число будет дробным? Я ведь прибавляю целые числа, а начальное значение вроде бы как 200.

wmysterio
Администраторы
Скриптер
17.09.17 14:17
Offline
Цитата Dyabda ()
И почему в данном случае число будет дробным?
Так указано в мануалах. Я посмотрел статические адреса памяти GTA SA, и там оно тоже числится как "float"
Цитата Dyabda ()
начальное значение вроде бы как 200
Изначально где? В оригинальном мейне в статистике указано тоже как float.
Цитата Dyabda ()
Но как их записывать?
Вот так:
Код
0A8C: write_memory 0xB793D4 size 4 value 0@ virtual_protect 0

Dyabda
Пользователи
17.09.17 14:28
Offline
Бесполезно.
Я уже не могу понять, почему ничего не происходит.
Код

:FAT
thread 'FAT'
wait 0
0A8C: write_memory 0xB793D4 size 4 value 0@ virtual_protect 0

:FAT_1
wait 0
if or
0AB0:   key_pressed 0x27
0AB0:   key_pressed 0x44
jf @FAT_2
0@ += 100.0
jump @FAT_1

:FAT_2
wait 0
if or
0AB0:   key_pressed 0x41
0AB0:   key_pressed 0x25
jf @FAT_1
0@ -= 100.0
jump @FAT_2

wmysterio
Администраторы
Скриптер
17.09.17 14:40
Offline
Цитата Dyabda ()
Бесполезно.
Вот мой вариант:
Код
{$CLEO}
thread 'FAT'

while true
wait 0
    if or
    0AB0:   key_pressed 39 // R Arrow
    0AB0:   key_pressed 68 // D
    then
    1@ = 100.0
    gosub @FAT_CHANGE
    wait 1500
    end
    if or               
    0AB0:   key_pressed 37 // L Arrow
    0AB0:   key_pressed 65 // A
    then        
    1@ = -100.0
    gosub @FAT_CHANGE
    wait 1500
end
end

:FAT_CHANGE
0A8D: 0@ = read_memory 0xB793D4 size 4 virtual_protect 0
005B: 0@ += 1@  // (float)  
0A8C: write_memory 0xB793D4 size 4 value 0@ virtual_protect 0
Player.Build($PLAYER_CHAR) // чтобы были заметны изменения, но ценой небольшого подвисания игры
return

Dyabda
Пользователи
17.09.17 14:55
Offline
Работает!
Спасибо Вам большое, буду разбираться.

wmysterio
Администраторы
Скриптер
17.09.17 15:10
Offline
Цитата Dyabda ()
Спасибо Вам большое, буду разбираться.
Незачто wink Интересно, почему Вы решили провернуть такое через игровую память, когда под рукой есть специальные опкоды для изменения статистики:
Код
{$CLEO}
thread 'FAT'

while true
wait 0
    if or
    0AB0:   key_pressed 39 // R Arrow
    0AB0:   key_pressed 68 // D
    then
    0A1F: increase_float_stat 21 by 100.0
    Player.Build($PLAYER_CHAR)
    wait 1500
    end
    if or               
    0AB0:   key_pressed 37 // L Arrow
    0AB0:   key_pressed 65 // A
    then            
    0626: decrease_float_stat 21 by 100.0
    Player.Build($PLAYER_CHAR)
    wait 1500
    end
end

Dyabda
Пользователи
18.09.17 06:30
Offline
Цитата wmysterio ()
Интересно, почему Вы решили провернуть такое через игровую память

Это я взял как пример, ведь скорость ветра, тяжёлые облака и т.д. через это провернуть не получится (Наверное, я точно не знаю.)

Добавлено (18.09.17, 06:30)
---------------------------------------------
Здравствуйте.
Решил по примеру выше, сделать скрипт, который будет менять скорость ветра по оси Х.

Код

while true
wait 0
    if or
    0AB0:   key_pressed 39 // R Arrow
    0AB0:   key_pressed 68 // D
    then
    1@ = 10.0
    gosub @Veter_1
    wait 1500
    end
    if or
    0AB0:   key_pressed 37 // L Arrow
    0AB0:   key_pressed 65 // A
    then
    1@ = -10.0
    gosub @Veter_1
    wait 1500
end
end

:Veter_1
0A8D: 0@ = read_memory 0xC813E0  size 4 virtual_protect 0
005B: 0@ += 1@
0A8C: write_memory 0xC813E0  size 4 value 0@ virtual_protect 0
return


Но вместо этого, ветер резко появляется и резко пропадает. Как можно сделать, чтобы он изменился навсегда (До входа в другой интерьер)?
Отредактировал Dyabda - Понедельник, 18.09.17, 10:49

wmysterio
Администраторы
Скриптер
20.09.17 09:22
Offline
Цитата Dyabda ()
Как можно сделать, чтобы он изменился навсегда
Можете попробовать так сделать:
Код
{$CLEO}
0A8D: 0@ = read_memory 0xC813E0  size 4 virtual_protect 0

while true
wait 0
    0A8C: write_memory 0xC813E0  size 4 value 0@ virtual_protect 0
    if or
    0AB0:   key_pressed 39 // R Arrow
    0AB0:   key_pressed 68 // D
    then
    1@ += 10.0    
    0087: 0@ = 1@ // (float)
    wait 1500
    end
    if or
    0AB0:   key_pressed 37 // L Arrow
    0AB0:   key_pressed 65 // A
    then
    1@ -= 10.0  
    0087: 0@ = 1@ // (float)
    wait 1500
    end
end

Dyabda
Пользователи
21.09.17 15:48
Offline
Большое Вам спасибо.
Появился ещё вопрос.
Проходил Ваш урок по поводу маркеров и решил его совместить с материалом из прошлых уроков.

Код

:MODEL
thread 'MODEL'
wait 0
if
0AB0:   key_pressed 115
then
gosub @MODEL_1
wait 1000
$IVKA = actor.Create(6, #SWAT, 2500.5637, -1669.097, 13.3541)
actor.Angle($IVKA) = 90.0
model.Destroy(#SWAT)
$IFA = car.Create(#INFERNUS, 2483.2671, -1654.4117, 13.304)
car.Angle($IFA) = 90.0
model.Destroy(#INFERNUS)
$OBJECT = object.Create(#AD_JUMP, 2473.2708, -1707.38, 12.5209)
object.Angle($OBJECT) = 180.0
object.SetImmunities($OBJECT, 1, 1, 1, 1, 1)
object.Indestructibility($OBJECT) = false
object.RemoveFromMissionCleanupList($OBJECT)
0213: 0@ = create_pickup #BAT type 15 at 2472.8599 -1687.4352 13.5078
02E1: 1@ = create_cash_pickup 500 at 2469.7446 -1679.8409 13.5078 permanence_flag 1
0213: 2@ = create_pickup #BODYARMOUR type 15 at 2472.8599 -1687.4352 13.5078
032B: 3@ = create_weapon_pickup #MINIGUN group 15 ammo 6000000000000 at 2469.7446 -1679.8409 13.5078
0187: 4@ = create_marker_above_actor $IVKA
0188: 5@ = create_marker_above_object $OBJECT
0186: 6@ = create_marker_above_car $IFA
03DC: 7@ = create_marker_above_pickup $PICKUP_0001
end
jump @MODEL

:MARKER
wait 0
if and
075C:   marker 4@ enabled
actor.Dead($IVKA)
jf @MARKER
wait 100
0164: disable_marker 4@
0164: disable_marker 5@
0164: disable_marker 6@
0164: disable_marker 7@
jump @MODEL_END

:MODEL_END
wait 0
jump @MODEL

:MODEL_1
wait 0
model.Load(#SWAT)
model.Load(#INFERNUS)
038B: load_requested_models

:MODEL_2
wait 0
if and
model.Available(#SWAT)
model.Available(#INFERNUS)
jf @MODEL_1
return

В условии написано, что если актёр погибнет, то все маркеры исчезнут, но они почему-то до сих пор стоят. В чём причина?
Отредактировал Dyabda - Четверг, 21.09.17, 15:58

wmysterio
Администраторы
Скриптер
21.09.17 16:06
Offline
Цитата Dyabda ()
но они почему-то до сих пор стоят
А как они должны исчезнуть, если нет прыжка на метку, где идёт проверка? smile Вот:
Код
:MODEL
thread 'MODEL'
wait 0
if
0AB0:   key_pressed 115
jf @MODEL
gosub @MODEL_1
$IVKA = actor.Create(6, #SWAT, 2500.5637, -1669.097, 13.3541)
actor.Angle($IVKA) = 90.0
model.Destroy(#SWAT)
$IFA = car.Create(#INFERNUS, 2483.2671, -1654.4117, 13.304)
car.Angle($IFA) = 90.0
model.Destroy(#INFERNUS)
$OBJECT = object.Create(#AD_JUMP, 2473.2708, -1707.38, 12.5209)
object.Angle($OBJECT) = 180.0
object.SetImmunities($OBJECT, 1, 1, 1, 1, 1)
object.Indestructibility($OBJECT) = false
object.RemoveFromMissionCleanupList($OBJECT)
0213: 0@ = create_pickup #BAT type 15 at 2472.8599 -1687.4352 13.5078
02E1: 1@ = create_cash_pickup 500 at 2469.7446 -1679.8409 13.5078 permanence_flag 1
0213: 2@ = create_pickup #BODYARMOUR type 15 at 2472.8599 -1687.4352 13.5078
032B: 3@ = create_weapon_pickup #MINIGUN group 15 ammo 6000000000000 at 2469.7446 -1679.8409 13.5078
0187: 4@ = create_marker_above_actor $IVKA
0188: 5@ = create_marker_above_object $OBJECT
0186: 6@ = create_marker_above_car $IFA
03DC: 7@ = create_marker_above_pickup $PICKUP_0001
gosub @MODEL_3

:MARKER
wait 0
if and
075C:   marker 4@ enabled
actor.Dead($IVKA)
jf @MARKER
wait 100
0164: disable_marker 4@
0164: disable_marker 5@
0164: disable_marker 6@
0164: disable_marker 7@
jump @MODEL

:MODEL_1
model.Load(#SWAT)
model.Load(#INFERNUS)
038B: load_requested_models

:MODEL_2
wait 0
if and
model.Available(#SWAT)
model.Available(#INFERNUS)
jf @MODEL_2
return

:MODEL_3
model.Destroy(#SWAT)
model.Destroy(#INFERNUS)
return

Dyabda
Пользователи
22.09.17 08:25
Offline
Как же я не внимателен. Спасибо, что нашли ошибку.
Но тут у меня вновь возникла проблема:

Код

:MARKER
wait 0
if
actor.Dead($IVKA)
jf @MARKER_1
0164: disable_marker 4@
jump @MODEL_END

:MARKER_1
wait 0
if
0119: car $IFA wrecked
jf @MARKER_2
0164: disable_marker 6@
jump @MODEL_END

:MARKER_2
wait 0
if
0214:  pickup 2@ picked_up
jf @MARKER_3
0164: disable_marker 7@
jump @MODEL_END

:MARKER_3
wait 0
if
023B:   actor $PLAYER_ACTOR colliding_with_object $OBJECT
jf @MARKER_4
0164: disable_marker 5@
jump @MODEL_END

:MARKER_4
wait 0
if
075C:   marker 8@ enabled
jf @MARKER_4
wait 20000
0164: disable_marker 8@
jump @MODEL_END

:MODEL_END
wait 0
jump @MODEL


Я всё не могу понять, как сделать, чтобы проверялся каждый маркер, а не по одному. К примеру, чтобы
если вначале умер актёр, то убирался маркер актёра, а остальные не трогались, или же если я вначале уничтожу авто, то убирался маркер авто, а так же чтобы проверка из метки :MARKER_4 работала не смотря на то, уничтожено ли авто, или нет, в общем, чтобы все эти проверки работали одновременно.

Добавлено (22.09.17, 08:25)
---------------------------------------------
И ещё один вопрос про условия:

Код

:MARKER
wait 0
if and
car.Wrecked($IFA)
actor.Dead($IVKA)
075C: marker 7@ enabled
075C: marker 8@ enabled
023B:   actor $PLAYER_ACTOR colliding_with_object $OBJECT
jf @MARKER
0164: disable_marker 4@
0164: disable_marker 5@
0164: disable_marker 6@
0164: disable_marker 7@
0164: disable_marker 8@

:MODEL_END
wait 0
jump @MODEL


Как видно, маркеры будут удаляться, если: актёр мёртв, авто уничтожено, до объекта коснулись и маркеры существуют для пикапов. Но дело в том, что если эти операции не завершатся, новую порцию актёров и авто я заспавнить не смогу.
Можно ли сделать так, чтобы работали условия и одновременно можно было спавнить актёров? (Метка MODEL_END)

wmysterio
Администраторы
Скриптер
22.09.17 10:11
Offline
Цитата Dyabda ()
Я всё не могу понять, как сделать, чтобы проверялся каждый маркер, а не по одному
Думаю, Вам надо прочитать статью о Cleo-миссии. Там я реализовал такую штуку.
Цитата Dyabda ()
Можно ли сделать так, чтобы работали условия и одновременно можно было спавнить актёров?
Читайте статьи о циклах и условиях. На их основе и делайте скрипт, так как делать кусками сложнее.

Dyabda
Пользователи
22.09.17 12:13
Offline
Спасибо, почитаю про первую миссию (Ведь это следующий урок, который я буду проходить).

Решил доделать свой скрипт, но случилась беда.

Код

:WIND
wait 50
08D4: $WINDPANEL = create_panel_with_title 'WEATIM' position 29.0 170.0 width 180.0 columns 2 interactive 1 background 1 alignment 0  
08DB: set_panel $WINDPANEL column 0 header 'WDSCTA' data 'WDWATXA' 'WDWATYA' 'WDWATZA' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY'  
08D6: set_panel $WINDPANEL column 0 alignment 1
08D6: set_panel $WINDPANEL column 1 alignment 0
09DB: set_panel $WINDPANEL column 0 width 100
09DB: set_panel $WINDPANEL column 1 width 100
090E: set_panel $WINDPANEL active_row $WEATWD

:WIND_0
08EE: set_panel $Panel column 1 row 0 text_1number GXT 'DOLLAR' number 4@
08EE: set_panel $Panel column 1 row 1 text_1number GXT 'DOLLAR' number 7@
08EE: set_panel $Panel column 1 row 2 text_1number GXT 'DOLLAR' number 10@
if
00E1:   player 0 pressed_key 0x10
jf @WIND_3
08D7: $WEATWD = panel $WINDPANEL active_row
if
$WEATWD == 0
jf @WIND_1
jump @WIND_0_0

:WIND_0_0
wait 0
0006: 2@ = 0xC813E0
0A8C: write_memory 2@ size 4 value 3@ virtual_protect 0
if or
0AB0:   key_pressed 39
0AB0:   key_pressed 68
then
if
not 3@ == 1000.0
then
wait 0
4@ += 1
3@ += 1.0
end
end
if or
0AB0:   key_pressed 37
0AB0:   key_pressed 65
then
if
not 3@ == 0
then
wait 0
4@ -= 1
3@ -= 1.0
end
end
jump @WIND_0
  
:WIND_1
wait 0
08EE: set_panel $Panel column 1 row 1 text_1number GXT 'DOLLAR' number 7@
if
$WEATWD == 1
jf @WIND_2
jump @WIND_1_0

:WIND_1_0
wait 0
0006: 5@ = 0xC813E4
0A8C: write_memory 5@ size 4 value 6@ virtual_protect 0
if or
0AB0:   key_pressed 39
0AB0:   key_pressed 68
then
if
not 6@ == 1000.0
then
wait 0
7@ += 1
6@ += 1.0
end
end
if or
0AB0:   key_pressed 37
0AB0:   key_pressed 65
then
if
not 6@ == 0
then
wait 0
7@ -= 1
6@ -= 1.0
end
end
jump @WIND_1

:WIND_2
wait 0
08EE: set_panel $Panel column 1 row 2 text_1number GXT 'DOLLAR' number 10@
if
$WEATWD == 2
jump @WIND_2_0

:WIND_2_0
wait 0
0006: 8@ = 0xC813E8
0A8C: write_memory 8@ size 4 value 9@ virtual_protect 0
if or
0AB0:   key_pressed 39
0AB0:   key_pressed 68
then
if
not 9@ == 1000.0
then
wait 0
9@ += 1
10@ += 1.0
end
end
if or
0AB0:   key_pressed 37
0AB0:   key_pressed 65
then
if
not 9@ == 0
then
wait 0
9@ -= 1
10@ -= 1.0
end
end
jump @WIND_2

:WIND_3
wait 0
if
00E1:   player 0 pressed_key 0xF
jf @WIND_0  
wait 50
08DA: remove_panel $WINDPANEL
jump @PANEL_1


1. Как можно убрать эти знаки $? Если поставить DUMMY, то они исчезнут вместе с цифрами, а мне нужно чтобы были лишь цифры.

2. Ветер по оси X ( WIND_0 ) меняется и работает, если я зажимаю пробел, как сделать, чтобы работало и менялось без зажатия пробела?

3. Если выбрать ветер по оси Y ( WIND_1 ) то другие оси уже не изменить, а ещё он мерцает.

Что нужно изменить, для того, чтобы, если я выберу нужную ось, я смог бы поменять предыдущую или следующую без всяких ошибок, чтобы при нажатии ENTER был прыжок на метку :PANEL_1 ? Просто я впервые работаю с адресами памяти в панелях.
Отредактировал Dyabda - Пятница, 22.09.17, 12:16

wmysterio
Администраторы
Скриптер
22.09.17 15:55
Offline
Dyabda, 1) заменить GXT-ключ 'DOLLAR' на другой, где нет символа $.

Цитата Dyabda ()
Просто я впервые работаю с адресами памяти в панелях.
Ну Вы спрашиваете в статьях вещи, которые легко находятся в справке. А тут сразу к памяти перешли. Рановато пока. Если чесно, то я и сам в ней не очень разбираюсь, хоть и занимаюсь скриптингом уже почти 8 лет.

z_chel
Пользователи
01.11.17 11:05
Offline
После миссии Deconstruction на стройплощадке Doherty появляется вот такое здание My WebPage, так вот мне нужно поставить для него Lod. Такой вариант редактирования main.scm:

не работает(вылетает миссия).
Как можно скриптом проверить выполнение определенной миссии и, если она выполнена, скриптом поставить объект (Lod) на карту, или может еще есть варианты?
Отредактировал z_chel - Среда, 01.11.17, 11:11

wmysterio
Администраторы
Скриптер
01.11.17 17:30
Offline
Цитата z_chel ()
#LODhubhole4_sfse
Это что за модель? Нужно указывать ID модели ( число ), так как в SB конвертировать её в число мне не удалось.

Детали по вашим опкодам:
03B6 - не работает с LOD-ами как таковыми. Просто заменяет один объект другим, которая может являться LOD.
0363 - не работает с LOD-ами как таковыми. Позволяет указать видимость модели, которая может являться LOD.

Чтобы достичь эффекта, как в оригинале, Вы должны иметь 4 модельки - 2 модели объектов в стиле "До" и "После" ( целое и разрушенное здание, например ) и 2 модели с LOD для них. Далее можете использовать в скрипте их так:
// Включить целое здание и отключить разрушенное
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_NORMAL visibility 1
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_NORMAL_LOD visibility 1
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_DEFLATE visibility 0
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_DEFLATE_LOD visibility 0
// Включить разрушенное здание и отключить целое
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_NORMAL visibility 0
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_NORMAL_LOD visibility 0
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_DEFLATE visibility 1
0363: create_static_object_at -2166.86 -236.5 40.86 radius 40.0 model #BUILDING_DEFLATE_LOD visibility 1
Единственное, что меня пока беспокоит - как такую модельку создать, ведь за этим принципом мне не удалось заменить какие-то другие модели, отличные от группы "CRACK" и подобных ( загружаются опкодом 0776 ).

Slivkin-Sergey
Модераторы
10.12.17 15:24
Offline
Привет. Возобновил работу над своим проектом, по которому уже столько вопросов задавал. Теперь вот не получается через память поменять координаты актёра (да, надо именно через память):
Код
2@ = 0
0A96: 2@ = actor 0@ struct
0A8E: 3@ = 2@ + 0x44
0A8C: write_memory 3@ size 4 value 1787.0306 virtual_protect 0
0A8E: 2@ = 3@ + 0x4
0A8C: write_memory 2@ size 4 value -1361.368 virtual_protect 0
0A8E: 3@ = 2@ + 0x4
0A8C: write_memory 3@ size 4 value 15.7578 virtual_protect 0

Код приобрёл такой дурацкий вид в ходе экспериментов, но суть, думаю, ясна. Так вот, координаты при этом не меняются. Несколько раз сверял смещения по базе адресов, но ошибок не нашёл. Что не так?

wmysterio
Администраторы
Скриптер
10.12.17 15:49
Offline
Цитата Slivkin-Sergey ()
Что не так?
Думаю, что нужно вызывать метод "PutAt" по адресу, а не вбивать значения напрямую. Адресок метода нужно поискать.

Slivkin-Sergey
Модераторы
10.12.17 15:58
Offline
Цитата wmysterio ()
Думаю, что нужно вызывать метод "PutAt" по адресу, а не вбивать значения напрямую.

У PutAt же смещение по высоте, а мне надо точно. Про опкод no_offset в курсе, но он тоже по-дурацки работает на малых расстояниях.

wmysterio
Администраторы
Скриптер
10.12.17 16:41
Offline
Slivkin-Sergey, тогда нужно искать адрес, скорее всего эти смещения не от позиции.

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