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

blackful
Пользователи
23.02.14 20:04
Offline
народ! хочу поинтересоваться, можно ли время игры сделать как в гта 4?
Евгений_Сергеевич

Yurko_UA
Друзья
27.02.14 20:45
Offline
Привіт, в мене деяке питання по зчитуванні параметрів з текстових файлів. Припустимо в мене є текстовий файл з таким змістом:
Код
1 1 0.0 0.0 0.0
1 2 2.0 2.0 2.0                 
2 1 1.0 3.0 4.0
і так далі... Питання: як зчитати саме ті параметри, які знаходяться після перших двох цифр з рядка, наприклад 2 1, нехай 2 1 занесені в змінні 1@ і 2@ ?
Отредактировал Yurko_UA - Четверг, 27.02.14, 20:48

wmysterio
Администраторы
Скриптер
27.02.14 21:28
Offline
Цитата blackful ()
очу поинтересоваться, можно ли время игры сделать как в гта 4?
Это в каком смысле?

Цитата Yurko_UA ()
Питання: як зчитати саме ті параметри, які знаходяться після перших двох цифр з рядка, наприклад 2 1, нехай 2 1 занесені в змінні 1@ і 2@ ?
По ідеї так:
Код
0ADA: 8@ = scan_file 0@ format "%d %d %f %f %f" 1@ 2@ 3@ 4@ 5@
Правда в мене воно так і не считалось. Треба задати парочку серйозних питать автору цеї бібліотеки.

Yurko_UA
Друзья
27.02.14 22:19
Offline
Ти мене, мабуть трохи не так зрозумів. Нехай в мене є 2 змінні 1@ і 2@, там цілі числа. Є в мене деякий текстовий файл з таким вмістом:
Код

1 3 155.3 218.5 3.5
і так далі.
Тобто в мене там багато таких рядків з 5 параметрами. Перші два - цілі числа- чисто технічні. Інші 3 дробові, скажімо, якісь координати. Мені треба записати ті 3 значення, наприклад в змінні, 3@ 4@ 5@ саме з того рядка, де перші два "розпізнавальні" параметра дорівнюють 1@ і 2@ відповідно.

Іншими словами, я хочу зробити типу як оператор WHERE в SQL запитах.

wmysterio
Администраторы
Скриптер
28.02.14 19:10
Offline
Цитата Yurko_UA ()
Ти мене, мабуть трохи не так зрозумів.
Скоріш за все )

По доному прикладі покищо нічого не можу сказати, так як я поки не зрозумів як додавати символи у вказану позицію. Там все по байтах накручено. Постійно проходити рядки якось дико по декілька разів )

Yurko_UA
Друзья
28.02.14 19:25
Offline
Є ще питання по считуванні з текстових файлів:
1) скрипт завжди починає читати інформацію з першого рядка?
2) ось припустимо скрипт зчитав інформацію з одного рядка і після тої операції автоматично переходить на наступний і при наступній операції читає з нього?

wmysterio
Администраторы
Скриптер
28.02.14 19:38
Offline
Цитата Yurko_UA ()
Є ще питання по считуванні з текстових файлів:1) скрипт завжди починає читати інформацію з першого рядка?
2) ось припустимо скрипт зчитав інформацію з одного рядка і після тої операції автоматично переходить на наступний і при наступній операції читає з нього?
Якщо використовувати опкод 0ADA, то зчитування починається з першої стрічки. Стрічкою вважається набір символів, що починаються з першого по останній символи рядка. І так до кінця файлу.

SanKing
Друзья
01.03.14 18:04
Offline
Цитата blackful ()
народ! хочу поинтересоваться, можно ли время игры сделать как в гта 4?
Можно.
Примерно так:
Код
:TIME
00BF: 0@ = current_time_hours, 1@ = current_time_minutes

for 2@ = 0 to 2 step 1
      wait 1000
      00C0: set_current_time 0@ 1@      
end

1@ += 1
00C0: set_current_time 0@ 1@
jump @TIME

Только вот погода каждую секунду меняется.  sad Но это можно исправить, правда, не без кучи проверок на местоположение игрока...
Отредактировал SanKing - Суббота, 01.03.14, 18:10

Slivkin-Sergey
Модераторы
02.03.14 18:21
Offline
У меня возник небольшой, но важный вопрос. Например, переменным с символьными именами можно зарезервировать ячейку в памяти обычным способом - Alloc($VAR, 12). А можно ли сделать так -
Код
Alloc(8@, 16)

? Или при компиляции переменная будет возвращена к 8 байту от начала main'а?

wmysterio
Администраторы
Скриптер
02.03.14 18:49
Offline
Цитата Slivkin-Sergey ()
? Или при компиляции переменная будет возвращена к 8 байту от начала main'а?
Это зависит от того, какой объём ты считаешь с этого буффера. Нужно считывать от начала буффера

Код
{$CLEO}
wait 2000

0AC8: 0@ = allocate_memory_size 8
0A8C: write_memory 0@ size 4 value 20 virtual_protect 0
0085: 3@ = 0@ // (int)
3@ += 4
0A8C: write_memory 3@ size 4 value 45 virtual_protect 0
wait 500
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0
0A8D: 2@ = read_memory 3@ size 4 virtual_protect 0
0AC9: free_allocated_memory 0@
0AD0: show_formatted_text_lowpriority "%d %d" time 4000 1@ 2@ // Выводит: 20 45
0A93: end_custom_thread
Кстати, этим методом выделяется память не в мейне, а в динамической памяти компа, поэтому его нужно очищать опкодом 0AC9.

На счёт строк, то сейчас посмотрю. С ними всегда были проблемы.

Slivkin-Sergey
Модераторы
02.03.14 19:04
Offline
Цитата wmysterio ()
Кстати, этим методом выделяется память не в мейне, а в динамической памяти компа

Что-то я немного запутался... Вроде бы вот так высчитывается адрес "динамической" переменной именно в ехе с учётом смещения от начала майна:
0xA49960 (начало майна) + aN(сама переменная, её номер, точнее) + (iN(индекс элемента массива aN, в моём случае 0) * 4 (размер int))

Получается, 0xA49960 + 8 + (0*4) = 0xA49960 + 8, получается адрес $8 = 0xA49968 = 10787176.

Разве нет?
Отредактировал Slivkin-Sergey - Воскресенье, 02.03.14, 19:08

wmysterio
Администраторы
Скриптер
02.03.14 19:35
Offline
Цитата Slivkin-Sergey ()
Разве нет?
Я не знаю. В описании говорится "выделяет блок памяти", где и как - известно разработчикам. ВОЗМОЖНО это вариант как с hex-буффером
Код
hex
00 00 00 00
end

Факт в том, что начинать читать нужно с того места, где был объявлен буффер
0AC8: 0@ = allocate_memory_size 4
0A8C: write_memory 0@ size 4 value 20 virtual_protect 0
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0

Этот процесс уже реализует Cleo.

DK22Pac
Модераторы
TOP Скриптер
03.03.14 04:44
Offline
Yurko_UA, вот пример построчного чтения из файла:
Прикрепления: vehSetsReading.txt(2.7 Kb)

SanKing
Друзья
05.03.14 17:52
Offline
Есть вопрос. При выполнении опкода
Actor.DestroyWithFade выполняется ли Actor.RemoveReferences, то есть, удаляется ли ссылка на него?

Slivkin-Sergey
Модераторы
05.03.14 18:36
Offline
Цитата SanKing ()
Actor.DestroyWithFade выполняется ли Actor.RemoveReferences, то есть, удаляется ли ссылка на него?

Хм-м, интересно, как ты себе представляешь уничтожение актёра без удаления ссылок?

wmysterio
Администраторы
Скриптер
05.03.14 18:55
Offline
Цитата SanKing ()
Actor.DestroyWithFade выполняется ли Actor.RemoveReferences, то есть, удаляется ли ссылка на него?
Вряд-ли. Под словом УдалениеСсылок подразумевается возвращение актёра к изначальным параметрам, установленных для конкретного типа, тем самым отдать его управление игре, но мы можем вновь обратится к нему по хэндлу. Я думаю, что нет смыла удалять сведения об актёре, если идёт удаление самого объекта, представляющего из себя этого педа. Возможно, процедура сброса сведений встроена в деструктор класса Ped.

JIEXAH949
Пользователи
08.03.14 17:38
Offline
Помогите сделать сохранение ГМ после смерти. А то умер и если он включен то ничего не работает:
Код
0@ = 0  

  :NONAME  
  wait 0  

  if and  
  0@ == 0
  0AB0:  key_pressed 17  
  0AB0:  key_pressed 67
  Player.Defined($PLAYER_ACTOR)   
  then  
  0ACD: show_text_highpriority "Melka ~g~TASHER" time 1500    
  018C: play_sound 1058 at 0 0 0  
  02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1   
  0@ = 1     
  wait 250  
  end  

  if and  
  0@ == 1
  0AB0:  key_pressed 17  
  0AB0:  key_pressed 67   
  then  
  0ACD: show_text_highpriority "Melka ~g~NE TASHER" time 1500    
  018C: play_sound 1058 at 0 0 0    
  02AB: set_actor $PLAYER_ACTOR immunities BP 0 FP 0 EP 0 CP 0 MP 0
  Actor.RemoveReferences($PLAYER_ACTOR)    
  0@ = 0    
  wait 250     
  end  

  jump @NONAME

Михан500
Пользователи
09.03.14 14:44
Offline
Есть одна проблема:Нужно заставить актера будучи заставленным убить игрока, залазить на препятсвия если они ему встретятся.Я сделал это таким способом - координаты между актером и координаты через 3 метра вперед заносил в переменную, одним оппкодом проверял, есть ли между этими точками коллизия, если есть то я заставлял актера прыгать.Все это работает, но из-за этой проверки игра вылетает примерно минут 10.И это еще зависит от количества потоков, в которых есть эта проверка (больше 10 потоков не выдерживает и вылетает).Почему она вылетает?
Может можно как-нибудь по другому заставить актера лазить по стенам кроме оппкода climb?Я вот что заметил, любой актер, добавленный в группу игрока умеет лазать по стенам за игрком.Ну так что, можно как-нибудь решить эту проблему?

JIEXAH949
Пользователи
09.03.14 18:20
Offline
например я не за вод местом и активировал его то меня тпшает на вод. место этого авто на котором я был пассажиром. Вот это я хотел исправить. Спасибо за внимание))
Вот скрипт:
Код
:OPCODEEXE_13
wait 0  
if and
0AB0:   key_pressed 105  
    Actor.Driving($PLAYER_ACTOR)
else_jump @OPCODEEXE_13  
wait 0  
25@ = Actor.CurrentCar($PLAYER_ACTOR)
Actor.StorePos($PLAYER_ACTOR, 0@, 1@, 2@)
Actor.StorePos($PLAYER_ACTOR, 29@, 28@, 27@)
3@ = 100000.0  
gosub @OPCODEEXE_284  
if  
056D:   actor 9@ defined  
else_jump @OPCODEEXE_13  
30@ = Actor.CurrentCar(9@)
036A: put_actor $PLAYER_ACTOR in_car 30@  
036A: put_actor $PLAYER_ACTOR in_car 30@  

:OPCODEEXE_134
wait 0  
07D5: set_car 30@ velocity_in_direction_XYZ 0.0 0.0 0.01 rotation_velocitiesXY 0.0 0.0 unk 0.0  
07DA: set_car 30@ rotation_velocity_XYZ 0.0 0.0 5.3 through_center_of_body  
if  
8AB0:   not key_pressed 105  
else_jump @OPCODEEXE_134  
if  
056E:   car 25@ defined  
else_jump @OPCODEEXE_259  
036A: put_actor $PLAYER_ACTOR in_car 25@  
018C: play_sound 1056 at 0.0 0.0 0.0  
jump @OPCODEEXE_13  

:OPCODEEXE_259
wait 0  
0362: remove_actor $PLAYER_ACTOR from_car_and_place_at 29@ 28@ 27@  
jump @OPCODEEXE_13  

:OPCODEEXE_284
0395: clear_area 1 at 0@ 1@ 2@ radius 100000.0  
16@ = 305868  
5@ = -686  
6@ = 1988  
jump @OPCODEEXE_439  
16@ = 305871  
17@ = -729  
20@ = 412  
16@ = 305869  
17@ = -741  
18@ = -1  
20@ = 2584  
    Player.Defined($PLAYER_CHAR)
else_jump @OPCODEEXE_439  
    Actor.Driving($PLAYER_ACTOR)
else_jump @OPCODEEXE_439  
18@ = Actor.CurrentCar($PLAYER_ACTOR)
jump @OPCODEEXE_439  

:OPCODEEXE_439
008B: 16@ = &0(16@,1i) // (int)  
0AB1: call_scm_func @OPCODEEXE_854 2 16@ 8 7@   
0A8D: 11@ = read_memory 16@ size 4 virtual_protect 0  
9@ = -1  
10@ = 0  

:OPCODEEXE_495
0AB1: call_scm_func @OPCODEEXE_854 2 11@ 20 4@   
    not 4@ == 0  
else_jump @OPCODEEXE_822  
0AB1: call_scm_func @OPCODEEXE_854 2 4@ 48 12@   
0AB1: call_scm_func @OPCODEEXE_854 2 4@ 52 13@   
0AB1: call_scm_func @OPCODEEXE_854 2 4@ 56 14@   
050A: 15@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 12@ 13@ 14@  
0025:   3@ > 15@ // (float)  
else_jump @OPCODEEXE_822  
0085: 9@ = 10@ // (int)  
0AB1: call_scm_func @OPCODEEXE_854 2 16@ 4 4@   
005A: 4@ += 9@ // (int)  
0A8D: 4@ = read_memory 4@ size 1 virtual_protect 0  
9@ *= 256  
005A: 9@ += 4@ // (int)  
jump 5@  
056D:   actor 9@ defined  
else_jump @OPCODEEXE_784  
if or
003C:   $PLAYER_ACTOR == 9@ // (int)  
    Actor.Dead(9@)
else_jump @OPCODEEXE_798  
jump @OPCODEEXE_784  
83CA:   not object 9@ exists  
else_jump @OPCODEEXE_798  
056E:   car 9@ defined  
else_jump @OPCODEEXE_784  
if or
003B:   18@ == 9@ // (int)  
    Car.Wrecked(9@)
else_jump @OPCODEEXE_798  
jump @OPCODEEXE_784  

:OPCODEEXE_784
9@ = -1  
jump @OPCODEEXE_822  

:OPCODEEXE_798
if  
    Actor.Driving(9@)
else_jump @OPCODEEXE_784  
0085: 3@ = 15@ // (int)  

:OPCODEEXE_822
005A: 11@ += 6@ // (int)  
10@ += 1  
002D:   10@ >= 7@ // (int)  
else_jump @OPCODEEXE_495  
return  

:OPCODEEXE_854
0A8E: 0@ = 0@ + 1@ // int  
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0  
0AB2: ret 1 0@

SHooZ
Друзья
10.03.14 00:02
Offline
JIEXAH949, вот пример попроще:
Код
{$CLEO}
0000:
const
     Car = 3@
     PrevDriver = 4@
end
while true
     wait 0
     if
         0AB0: key_pressed 105
     then
         04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 0.0
         if
             0AE2: Car = random_vehicle_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 pass_wrecked 1
         then
             if and
                 not 1@ == FALSE
                 Actor.InCar($PLAYER_ACTOR,Car)
             then
                 046C: PrevDriver = car Car driver
                 0362: remove_actor PrevDriver from_car_and_place_at 0 0 0
                 072A: put_actor $PLAYER_ACTOR into_car Car driverseat
             end
         end
     end
end
0A93:
Отредактировал SHooZ - Понедельник, 10.03.14, 00:11

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