[ Новые сообщения · Участники · Правила форума · Поиск · 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
Администраторы
Скриптер
19.01.15 01:52
Offline
Цитата Vital ()
то результат будет равен нулю, если активен, то в переменную будет записан адрес потока
Совершенно верно. Скрипт
Код
{$CLEO}

0ADF: add_dynamic_GXT_entry "_TEST1" text "~1~"
0ADF: add_dynamic_GXT_entry "_TEST2" text "NO"

while true
wait 0
       if
       0AAA: 0@ = thread 'PLCHUTE' pointer
       then
       01E4: show_text_1number_lowpriority GXT '_TEST1' number 0@ time 1 flag 1     
       else
       00BC: show_text_highpriority GXT '_TEST2' time 1000 flag 1
       end
end

0A93: end_custom_thread
показал, что текст "_TEST1" выводился только тогда, когда был активым внешний скрипт парашюта(выводит поинтер на поток). В других случаях возвращал "NO". Хоть и поток был в мейне, опкод будет искать только по активным потокам, в том числе миссий и внешних скриптов.
Цитата Vital ()
'OTB' это именно имя потока, заданное 03A4: name_thread 'MAIN'?
Да, имя потока.
Цитата Vital ()
В связи с этим мне нужно знать, не выполняется ли этот поток сейчас, чтобы не вызывать его два раза.
Попробуй так:
Код
DEFINE OBJECTS 0

DEFINE MISSIONS 0

DEFINE EXTERNAL_SCRIPTS 0

DEFINE UNKNOWN_EMPTY_SEGMENT 0

DEFINE UNKNOWN_THREADS_MEMORY 574

//-------------MAIN---------------

var
$LABELS: array 3 of integer
$THREADNAME: array 3 of string
end

thread 'MAIN'    
fade 0 0    
0629: change_integer_stat 181 to 4    
04E4: refresh_game_renderer_at 2488.562 -1666.864    
Camera.SetAtPos(2488.562, -1666.864, 13.3757)
$PLAYER_CHAR = Player.Create(0, 2488.562, -1666.864, 12.8757)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
07AF: $PLAYER_GROUP = player $PLAYER_CHAR group    
0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here    
Player.SetClothes($PLAYER_CHAR, "VEST", "VEST", Torso)
Player.SetClothes($PLAYER_CHAR, "JEANSDENIM", "JEANS", Legs)
Player.SetClothes($PLAYER_CHAR, "SNEAKERBINCBLK", "SNEAKER", Shoes)
Player.SetClothes($PLAYER_CHAR, "PLAYER_FACE", "HEAD", Head)
Player.Build($PLAYER_CHAR)
0793: save_player_clothes    
Actor.Angle($PLAYER_ACTOR) = 262.0
Camera.SetBehindPlayer
Player.CanMove($PLAYER_CHAR) = True
01B7: release_weather    
Player.Money($PLAYER_CHAR) += 25000
016C: restart_if_wasted_at 1180.85 -1325.57 12.58 angle 271.4 town_number 0    
016D: restart_if_busted_at 1550.68 -1675.49 14.51 angle 90.0 town_number 0    
fade 1 1000
wait 1000
03E6: remove_text_box

$LABELS[0] = @THREAD_1
$LABELS[1] = @THREAD_2
$LABELS[2] = @THREAD_3

s$THREADNAME[0] = 'THREAD_1'
s$THREADNAME[1] = 'THREAD_2'
s$THREADNAME[2] = 'THREAD_3'

create_thread @RUNNER
end_thread

:RUNNER
thread 'RUNNER'
1@ = 250

while true
wait 1@
       0209: 0@ = random_int_in_ranges -1 4
       0209: 1@ = random_int_in_ranges 0 5000
       if and
       0@ > -1
       3 > 0@
       then
       0ACE: show_formatted_text_box "OK"
           if
           0AAA: 2@ = thread $THREADNAME[0@] pointer
           then
           0AD1: show_formatted_text_highpriority "NO" time 1@
           else
           create_thread $LABELS[0@]
           end
       end
end

:THREAD_1
thread 'THREAD_1'
0AD1: show_formatted_text_highpriority "Thread 1 active" time 5000
wait 5000
end_thread

:THREAD_2
thread 'THREAD_2'
0AD1: show_formatted_text_highpriority "Thread 2 active" time 4000
wait 4000
end_thread

:THREAD_3
thread 'THREAD_3'
0AD1: show_formatted_text_highpriority "Thread 3 active" time 3000
wait 3000
end_thread
По-другому вряд ли получится. Этот код мейна в течении случайного промежутка времени запускает случайный поток, если тот не активный. Сохранялся - работает как нужно, без вылетов.

Vital
Модераторы
Скриптер
21.01.15 01:13
Offline
Спасибо большое! Так и поступлю, это самый пока что лучший вариант. Если всё сработает, буду дополнительно делать один секретный проект вместо старого секретного проекта. wink

Добавлено (21.01.15, 00:13)
---------------------------------------------
Возник ещё вопрос, который я уже очень давно никак не задам. Если я использую actor/car/object.Destroy, то после уничтожения писать RemoveReferences уже не нужно? Я привык, хотя это скорее неверно, писать оба опкода.


BoPoH
Друзья
22.01.15 15:52
Offline
Цитата Vital ()
Если я использую actor/car/object.Destroy, то после уничтожения писать RemoveReferences уже не нужно?
В майне, кажется, удаляются референсы. Следовательно, это необходимо.

Vital
Модераторы
Скриптер
22.01.15 23:22
Offline
BoPoH, вот поэтому мне нужно, чтобы кто-то, кто разбирается в памяти, мог точно сказать, нужно ли это. Сомнения всё ещё есть, но вот одна вещь: я создал актёра, который не реагирует ни на какие внешние воздействия (не убегает и т.п.), но после destroywithfade он при звуках стрельбы резко начинает убегать, как будто сведения были удалены.

BoPoH
Друзья
23.01.15 01:00
Offline
Vital, покопавшись пару минут в майне, я понял, что удалять референсы нужно только в том случае, если ты получил хэндл случайного прохожего/машины, которая создана игрой. Когда ты получаешь хендл такого педа, то, судя по всему, игра не станет его удалять, как делает это обычно, если игрок удалился на определённое расстояние. Скриптовый движок вешает на него "пометку", что он используется скриптом и что его не нужно уничтожать. RemoveReferences предназначен для того, чтобы убрать эту самую пометку с педа, что позволяет игре удалить его в дальнейшем. Следовательно, удалять референсы за педами, которых ты создаёшь и удаляешь сам, не нужно.

Vital
Модераторы
Скриптер
23.01.15 17:24
Offline
BoPoH, спасибо большое за исследование, стало спокойнее. wink

SINGER
Проверенные
05.02.15 21:38
Offline
Всем привет!
Был бы очень благодарен, если бы кто-то создал мод, который заставляет оружие и деньги не летать в воздухе, а лежать на земле, как в реальной жизни. (Подобный мод есть на GTA 3).
И еще: очень нужен мод, который ограничит перенос оружия ГГ до трех единиц. (А то СЖ носит целый арсенал!) К примеру можно взять пистолет, автомат и снайперку. Больше ничего не поместится! Или можно взять АК-47, М4 и Миниган.  Можно взять Дигл, Кольт и Пистолет с глушаком или нож, цветы и биту. То есть три любых вида оружия. (Но не больше!!!)
Жду ответа.
Отредактировал SINGER - Четверг, 05.02.15, 21:39

BoPoH
Друзья
06.02.15 02:11
Offline
Цитата SINGER ()
Был бы очень благодарен, если бы кто-то создал мод, который заставляет оружие и деньги не летать в воздухе, а лежать на земле, как в реальной жизни. (Подобный мод есть на GTA 3).
Если я не ошибаюсь, DK22Pac делал такой мод.

SINGER
Проверенные
06.02.15 03:58
Offline
Цитата BoPoH ()
Если я не ошибаюсь, DK22Pac делал такой мод.
Я как-то не встречал подобного мода для СА. Хотя был один, что можно положить оружие на землю, но ложилось только то, которое было в руках, остальное вертелось в воздухе.

artem_panov
Пользователи
11.02.15 21:14
Offline
Не отображаются буквы в панели. Помогите.
// $PLAYER_ACTOR $PLAYER_GROUP $ONMISSION
{$CLEO}
0000:
while true //1
wait 0
if //2
player.Defined(0)
then
if and //3
not actor.Dead($PLAYER_ACTOR)
not actor.Driving($PLAYER_ACTOR)
0ADC: test_cheat "PANEL"
then
player.CanMove(0,0)
0ADF: add_dynamic_GXT_entry "T_ON" text "‹kž."
0ADF: add_dynamic_GXT_entry "TOFF" text "‹¨kž."
08D4: 0@ = create_panel_with_title 'DUMMY' position 250.0 170.0 width 70.0 columns 1 interactive 1 background 1 alignment 1
08DB: set_panel 0@ column 0 header 'DUMMY' data 'T_ON' 'TOFF' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 
while true //4
wait 0
if or //5
actor.Dead($PLAYER_ACTOR)
0741: actor $PLAYER_ACTOR busted
00E1: player 0 pressed_key 15
then
break
else
if //6
00E1: player 0 pressed_key 16
then
08D7: 1@ = panel 0@ active_row
if or
1@ == 0
1@ == 1
then
break
end 
end //6
end //5
end //4
08DA: remove_panel 0@
player.CanMove(0,1)
end //3
end //2
end //1

wmysterio
Администраторы
Скриптер
12.02.15 04:57
Offline
Цитата
Не отображаются буквы в панели. Помогите.
Проверил. Буквы отображаются, только кодировка в них непонятно какая.

mfisto
Друзья
20.02.15 10:17
Offline
Ладно, напишу здесь тогда. Чтоб сделать так, что пикапы лежали на земле, надо вырубить функцию вращения, затем пройтись по пулу пикапов и всем поменять уровень Z. Вот и все, и тогда можно будет сделать даже как в IV. Добавить корону к пикапу красную, скажем, а для денег зеленую. И будет неплохо смотреться. Можно будет еще повернуть пикап, чтоб он красиво лежал. НО меня останавливает сделать - это лишь функция вращения, я просто не знаю ее адрес, а не что-то там еще.
А что касается 3 видов оружия, тут лучше делать с помощью плагина, а не CLEO. Плагины я писать не умею, может кто-нибудь поможет товарищу из программистов на сайте, там надо перехватить переключение оружия и сделать только три на выбор. Вынести в ini файл допустим номера оружий в каждой группе, ну и самое вкусное сделать, как у Риосаке в плагине по ношению оружия на теле.

Добавлено (19.02.15, 12:39)
---------------------------------------------
Так ну вроде нашел. Попытаюсь сделать пикапы как в IV)

Добавлено (20.02.15, 09:17)
---------------------------------------------
Так ну я сделал пока вот так, цветные кружочки не всегда рисуются, потом исправлю, для нетерпеливых выкладываю ->

Код
{$CLEO}
0A8C: write_memory 0x00454E80 size 1 value 0xC3 virtual_protect 1
0A8C: write_memory 0x00455720 size 1 value 0xC3 virtual_protect 1

while true
     wait 0
     for 0@ = 0x009788C0 to 0x0097D620 step 0x20
         0085: 31@ = 0@ // (int)
         31@ += 4
         0A8D: 30@ = read_memory 31@ size 4 virtual_protect 0
         if
             30@ == 0
         then
             continue
         end
         31@ += 0x14
         0A8D: 29@ = read_memory 31@ size 2 virtual_protect 0
         0AEC: 30@ = object_struct 30@ handle
         if or
             29@ == 321
             29@ == 322
             29@ == 323
             29@ == 324
             29@ == 325
             29@ == 326
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if
             29@ == 331
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 333
             29@ == 334
             29@ == 335
             29@ == 336
             29@ == 337
             29@ == 338
             29@ == 339
             29@ == 341
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 342
             29@ == 343
             29@ == 344
         then
             0453: set_object 30@ XY_rotation -3.0 -90.0 angle -93.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 346
             29@ == 347
             29@ == 348
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 349
             29@ == 350
             29@ == 351
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 352
             29@ == 353
             29@ == 372
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 355
             29@ == 356
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 357
             29@ == 358
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 359
             29@ == 360
             29@ == 361
             29@ == 362
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if
             29@ == 363
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if
             29@ == 364
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 365
             29@ == 366
             29@ == 367
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if or
             29@ == 368
             29@ == 369
             29@ == 371
         then
             0453: set_object 30@ XY_rotation 85.0 -90.0 angle -90.0
             1@ = 255
             2@ = 0
             3@ = 0
             jump @0
         end
         if
             29@ == #money
         then
             0453: set_object 30@ XY_rotation 0.0 0.0 angle 0.0
             1@ = 0
             2@ = 255
             3@ = 0
             jump @0
         end
         0453: set_object 30@ XY_rotation 90.0 -90.0 angle -90.0
         1@ = 0
         2@ = 0
         3@ = 0
         :0
         0AA6: call_method 0x4549A0 struct 0@ num_params 1 pop 0 26@v
         if
             not Player.Defined($player_char)
         then
             continue
         end
         if
             80FE:   not actor $PLAYER_ACTOR sphere 0 in_sphere 26@ 27@ 28@ radius 100.0 100.0 100.0
         then
             continue
         end
         02CE: 25@ = ground_z_at 26@ 27@ 28@
         0063: 25@ -= 28@  // (float)
         0097: make 25@ absolute_float
         if
             25@ > 2.0
         then
             continue
         end
         02CE: 28@ = ground_z_at 26@ 27@ 28@
         28@ += 0.125
         0AA6: call_method 0x454960 struct 0@ num_params 3 pop 0 28@ 27@ 26@
         016F: create_particle 3 rotation_factor 0.0 size 0.5 intensity 255 flags 1@ 2@ 3@ at 26@ 27@ 28@
     end
end


Я немного исправил скрипт, теперь пикапы появляются всегда. Но кружочек появляется только на земле, надо что-то другое придумать.
Отредактировал mfisto - Пятница, 20.02.15, 15:15

SINGER
Проверенные
20.02.15 19:31
Offline
Странно, пытаюсь скомпилировать в Санни, пишет неизвестная команда Wait. Поставил перед ней 0001:, так теперь ругается на команду jump. У меня Sanny Builder 3.2.2.
И кстати, что нужно удались или исправить, чтобы цветных сфер не было? Просто оружие и деньги, без каких либо сфер?
Отредактировал SINGER - Пятница, 20.02.15, 19:38

mfisto
Друзья
20.02.15 21:12
Offline
просто убрать опкод 016f

SINGER
Проверенные
20.02.15 21:25
Offline
Ага, понятно. А что с jump'ом делать. Санька, сволочь, компилировать не хочет!

mfisto
Друзья
20.02.15 21:35
Offline
замени опкодом 0002

SINGER
Проверенные
20.02.15 22:07
Offline
Да, с jump'ом сработало, но теперь требует указать код команды для Player.Defined($player_char).

Добавлено (20.02.15, 21:07)
---------------------------------------------
Это, походу, будет последняя команда на которую ругается Sanny


mfisto
Друзья
20.02.15 22:18
Offline
8256:   not player $PLAYER_CHAR defined

wmysterio
Администраторы
Скриптер
20.02.15 23:33
Offline
Цитата
для нетерпеливых выкладываю
Ого, отлично! Возможно это глюк моей игры, но некоторые объекты сами по себе подсвечиваются.  Например очень яркий зелёный свет надписи бара, що у Гэнтона.

Возможно стоит пикап, что убирает звезду розыска оставить обычной?

mfisto
Друзья
20.02.15 23:42
Offline
Ну можно, я просто вообще все пикапы сделал на земле)

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