Скрипты для GTA от dim1988 aka d88

Главная | Регистрация | Вход

Приветствую Вас Гость | RSS
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Скрипты » Всё о клео скриптах » Вопросы по созданию скриптов
Вопросы по созданию скриптов
dim1988 Дата: Воскресенье, 19.07.2009, 18:43 | Сообщение # 1
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: Offline
Ответы на самые часто задаваемые вопросы

Как сохранить (компилировать) скрипт?
Почему не следует использовать в клео скриптах глобальные переменные?
Как узнать координаты мест, через какую прогу?
Как поместить игрока в интерьер?
Опкод, который открывает все дома в СА
Запись в переменную ближайшего педа и проверка его модели
Как заставить актёров ходить по определённым координатам
Проверка нажатия определённой клавиши
Пак пути с анимацией
Как сделать так, чтоб 2 миссии следовали друг за другом?
Как актёру дать оружие?
Как создать транспорт
Как создать жёлтый маркер для входа в интерьер?
При компиляции выдаёт ошибку перехода на нулевой оффсет,что это и как исправить?
Как транспорту присвоить определённый цвет?
Что делать если пишет ожидалось 'x' параметров?
Как написать цветной текст?
Номера костей актёра
Что такое gosub?
Опкоды, связанные с созданием огня
Как изменить оружие банд?
Образец добавления в игру объектов
Проверка нажатия клавиши в игре и список значений
Путь или scmpath
Как изменить цвет затемнения экрана?
Как записать в переменную случайное число из интервала
Список стилей боя
Как привязать эффект к кости актёра?
Как произвести действия, над педами, созданными игрой
Как заменить модель игрока
Как заставить актёра поднять руки, как при аресте
Сброс анимации
Как метнуть объект?
Как из одного скрипта запустить другой?

+ файл от пользователя нашего сайта Absolute . Здесь перечислены все вопросы из этой этой темы и ответы на них. Скачать
 
 
Colt_8 Дата: Воскресенье, 27.02.2011, 14:31 | Сообщение # 2101
Красавчик
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
всё верно. клео4 качал у вас.
ну лан, я разберусь.

Главная проблема вот:

Code

// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007

{$VERSION 3.1.0027}
{$CLEO .CS}

//-------------MAIN---------------
0000: NOP  
thread 'xxx'

:xxx_1
wait 0  
if and
Player.Defined($PLAYER_CHAR)
0AB0:   key_pressed 8
jf @xxx_1  
077E: 2@ = active_interior  

:xxx_6
wait 0  
if and
2@ == 0
jf @xxx_1
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
08E5: get_actor_in_sphere 4@ 5@ 6@ radius 20.0 handle_as 0@  
wait 0
if and
056D:   actor 0@ defined
not Actor.Driving(0@)    
jf @xxx_1
if
03A3:   actor 0@ male  
jf @xxx_1

:xxx_5
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
08E5: get_actor_in_sphere 4@ 5@ 6@ radius 20.0 handle_as 1@  
wait 0
if and
056D:   actor 1@ defined  
not Actor.Driving(1@)
jf @xxx_5
if
83A3:   not actor 1@ male  
jf @xxx_5
04ED: load_animation "KISSING"  

:xxx_2
wait 0  
if
04EE:   animation "PED" loaded
04EE:   animation "KISSING" loaded
jf @xxx_2
0605: actor 1@ perform_animation_sequence "WOMAN_IDLESTANCE" IFP_file "PED" 4.0 loop 0 0 0 1 time -1 // versionA  
wait 100
04C4: store_coords_to 4@ 5@ 6@ from_actor 1@ with_offset 0.0 1.0 0.0  
05F5: AS_actor 0@ goto_point 4@ 5@ 6@ mode 4 9000 ms // versionB  

:xxx_3
wait 0  
if  
00FE:   actor 0@ sphere 0 in_sphere 4@ 5@ 6@ radius 1.0 1.0 1.0   
jf @xxx_4
0605: actor 0@ perform_animation_sequence "IDLE_STANCE" IFP_file "PED" 4.0 loop 0 0 0 1 time -1 // versionA  
wait 100
0639: AS_actor 0@ rotate_to_actor 1@  
0639: AS_actor 1@ rotate_to_actor 0@  
wait 500
0605: actor 1@ perform_animation_sequence "GRLFRD_KISS_03" IFP_file "KISSING" 4.0 loop 0 0 0 0 time -1 // versionA  
0605: actor 0@ perform_animation_sequence "PLAYA_KISS_03" IFP_file "KISSING" 4.0 loop 0 0 0 0 time -1 // versionA  
wait 5000
04EF: release_animation "KISSING"  
Actor.RemoveReferences(0@)
Actor.RemoveReferences(1@)
jump @xxx_1

:xxx_4
wait 0  
if or
Actor.Dead(0@)
Actor.Dead(1@)
Actor.Dead($PLAYER_ACTOR)
jf @xxx_3
Actor.RemoveReferences(0@)
Actor.RemoveReferences(1@)
jump @xxx_1

Когда CJ в интерьере улица и нажата кнопка Backspace в переменные записывает ближайший актер и актриса haha , и актер идет к актрисе целоваться. Но проблема в том, что выкидывает из игры, когда убрать нажатие клавиши и рядом нет педов. Есть ли какие-то проверки, на педов рядом? Помогите пожалуйста вобщем.


 
 
Den_spb Дата: Воскресенье, 27.02.2011, 17:43 | Сообщение # 2102
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Грубая ошибка:
Code
if and  
056D:   actor 1@ defined   
not Actor.Driving(1@)  
jf @xxx_5
Проверку на существование нельзя совмещать с другими проверками, относящимися к данному объекту, т.к. если данный объект не существует, то при проведении второй проверки игра вылетит. Сначала надо проверить, существует ли объект, а потом, если он существует, производить действия над ним или другие проверки.
 
 
Colt_8 Дата: Вторник, 01.03.2011, 00:37 | Сообщение # 2103
Красавчик
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
а если это касается игрока?

 
 
Den_spb Дата: Вторник, 01.03.2011, 02:04 | Сообщение # 2104
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Проверку на существование игрока тоже надо писать отдельно.
 
 
HAUS Дата: Четверг, 03.03.2011, 20:15 | Сообщение # 2105
Группа: Проверенные
Сообщений: 191
Замечания: 0%
Статус: Offline
Скажите пожалуйста какой опкод проверяет что перед вами стоит определеная модель человека

Главный герой GTA 5 чел из красной тачки!!!
 
 
DK22Pac Дата: Четверг, 03.03.2011, 20:46 | Сообщение # 2106
Группа: Проверенные
Сообщений: 205
Замечания: 0%
Статус: Offline
Запиши в переменную хэндл ближайшего педа, а дальше юзай проверку
Code
02F2: actor 0@ model == #LAPD1


Мои скрипты
Grand Theft Auto III HD Development Team
 
 
Absolute Дата: Четверг, 03.03.2011, 20:55 | Сообщение # 2107
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline
Всем игроделателям пламенный привет!

Прежде всего хочу сказать спасибо помогающим советами. Эти советы пригождаются не только тем, кто задает вопросы, но и сотням других людей, которые ничего не пишут, но читают. Вот как я до сего момента. smile

А вопрос такой. Нигде не мог найти такую инфу. Когда игру сохраняешь, то ко времени прибавляется 6 часов. Это можно скриптом или настройками как-то изменить (чтобы не прибавлялось) или же это зашито в exe?

На мой взгляд, совершенно неудобно, что сохранение увязано с тем, что CJ будто бы в это время спит. Если делать что-то такое более реалистичное, то обязательно надо развести эти два действия: спать и savegame.

Или если просто вычесть 6 часов после сохранения игры, то все процессы будут нормально работать? А время будто бы и не менялось.

И еще второй вопрос, помельче. Когда я применяю вот этот код:

0633: AS_actor $PLAYER_ACTOR exit_car

то CJ, если едет пассажиром, на ходу не выходит. Он дожидается, когда машина остановится, и только тогда неспешно выходит, даже если нажать кнопку, чтобы выпрыгивал на ходу. Есть ли какой-то другой работающий код, чтобы выбрасываться на ходу пассажиру? Те, которые нашел, не срабатывают.

Что-то похожее есть в первой миссии, когда копы выкидывают CJ'я из полицейской машины и уезжают.

 
 
HAUS Дата: Четверг, 03.03.2011, 22:00 | Сообщение # 2108
Группа: Проверенные
Сообщений: 191
Замечания: 0%
Статус: Offline
Absolute я на счет первого вопроса может можно просто проверить сохраняется ли игрок и потом отнять 6 часов smile

Главный герой GTA 5 чел из красной тачки!!!
 
 
Absolute Дата: Четверг, 03.03.2011, 22:23 | Сообщение # 2109
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline
Quote (muhtar)
Absolute я на счет первого вопроса может можно просто проверить сохраняется ли игрок и потом отнять 6 часов

Наверное, так и буду делать.
Скорее всего, игра при сохранении просто тупо делает hour = hour + 6. Тогда можно и сделать "минус 6".

Если бы игра что-то в эти шесть часов еще просчитывала, было бы хуже. Но вряд ли что-то делается кроме прибавления часов. smile

 
 
dim1988 Дата: Пятница, 04.03.2011, 13:43 | Сообщение # 2110
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: Offline
Quote (Absolute)
И еще второй вопрос, помельче. Когда я применяю вот этот код:
0633: AS_actor $PLAYER_ACTOR exit_car
то CJ, если едет пассажиром, на ходу не выходит. Он дожидается, когда машина остановится, и только тогда неспешно выходит, даже если нажать кнопку, чтобы выпрыгивал на ходу. Есть ли какой-то другой работающий код, чтобы выбрасываться на ходу пассажиру? Те, которые нашел, не срабатывают.

Ну не знаю, есть опкод, но он телепортирует актёра из машины

Code
0362: remove_actor $PLAYER_ACTOR from_car_and_place_at 2239.367 -1261.939 22.9375  


Mortal Kombat Conquest for GTA SA V2.0
GTA Invasion V2.0
Частная собственность
 
 
Absolute Дата: Пятница, 04.03.2011, 19:51 | Сообщение # 2111
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline
Quote (dim1988)
Ну не знаю, есть опкод, но он телепортирует актёра из машины
Code
0362: remove_actor $PLAYER_ACTOR from_car_and_place_at 2239.367 -1261.939 22.9375  

О! Спасибо, dim1988.
Можно телепортировать и (необязательно) положить на землю. Или даже не класть.
Хочу сделать так, чтобы выходить из транспорта можно было бы и на ходу, но при этом будет даваться 1 звезда. Типа за нарушение общественного порядка и ПДД. smile

Добавлено (04.03.2011, 19:51)
---------------------------------------------
А, еще можно (как вариант) телепортировать из транспорта, при этом затемнять экран на 1 сек и чуть-чуть отнимать жизнь.

В общем, главное чтобы выбирался, а там уже много вариантов. smile

 
 
Colt_8 Дата: Суббота, 05.03.2011, 10:50 | Сообщение # 2112
Красавчик
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Здравствуйте, снова проблемы.

Я рэндом нахожу какие-нибудь координаты вокруг игрока и спауню педа в тех координатах.
Но спауню я его возле холмистой местности и поэтому координата Z на ровне с Карлом, и пед оказывается под холмом/скалой, так вот, как сделать так, чтоб пед был на земле?




Сообщение отредактировал Colt_8 - Суббота, 05.03.2011, 10:52
 
 
Absolute Дата: Суббота, 05.03.2011, 14:54 | Сообщение # 2113
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline
Quote (Colt_8)
Здравствуйте, снова проблемы.
Я рэндом нахожу какие-нибудь координаты вокруг игрока и спауню педа в тех координатах.
Но спауню я его возле холмистой местности и поэтому координата Z на ровне с Карлом, и пед оказывается под холмом/скалой, так вот, как сделать так, чтоб пед был на земле?

Может быть так (хотя способ не очень красивый, мне он не очень нравится, но всё же):

спаунить педа за спиной CJ (чтобы он не видел в общем), и координату Z давать на метр выше. Пед будет создаваться в воздухе и шлепаться на землю. Только минус при этом - пед когда шлепается об землю, ойкает.

Добавлено (05.03.2011, 14:54)
---------------------------------------------
А так, наверное, есть какая-то функция (опкод, т.е. в терминах GTA), которая возвращает уровень земли в точке X, Y. Только я не знаю, опыта маловато в скриптинге GTA.

 
 
Colt_8 Дата: Суббота, 05.03.2011, 16:12 | Сообщение # 2114
Красавчик
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Не Absolute, так не пойдёт. Пед создаётся за десятки метров от Игрока. А высоты там до 200 метров от обычного уровня. Поэтому это не вриант. Нужен опкод какой-то который ставит именно на землю.
---------------------------------------------------------------------------------------------
Я пробывал проверку делать на дистанцию актёра к земле и мол телепортировать его каждый раз на метр выше, пока не попадёт на землю но тоже не прокатило почему-то.




Сообщение отредактировал Colt_8 - Суббота, 05.03.2011, 16:14
 
 
Den_spb Дата: Суббота, 05.03.2011, 17:28 | Сообщение # 2115
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Quote (Absolute)
А так, наверное, есть какая-то функция (опкод, т.е. в терминах GTA), которая возвращает уровень земли в точке X, Y.

02CE: 16@ = ground_z_at 2@ 3@ 4@
 
 
Colt_8 Дата: Суббота, 05.03.2011, 23:51 | Сообщение # 2116
Красавчик
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Quote (Den_spb)
02CE: 16@ = ground_z_at 2@ 3@ 4@

В поиске я его видел, по слову граунд.

Но как им пользоваться? И что, за что отвечает?


 
 
Den_spb Дата: Воскресенье, 06.03.2011, 01:05 | Сообщение # 2117
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
В 2@ и 3@ надо записать X и Y точки, в которой надо создать педа. А в 4@ надо записать Z координату игрока. После этого в 16@ автоматически запишется высота поверхности карты в точке с заданными координатами X и Y. Если в данной точке X,Y несколько поверхностей (например, пол в туннеле и улица над туннелем), то будет получена высота поверхности, ближайшая к заданному значению Z.
 
 
Colt_8 Дата: Воскресенье, 06.03.2011, 11:56 | Сообщение # 2118
Красавчик
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Супер! clap Спасибо огромное! +2 respect



Сообщение отредактировал Colt_8 - Воскресенье, 06.03.2011, 11:57
 
 
HAUS Дата: Воскресенье, 06.03.2011, 14:04 | Сообщение # 2119
Группа: Проверенные
Сообщений: 191
Замечания: 0%
Статус: Offline
Как заставить гг. Сесть в машину и ехать в заданые кардинаты

Главный герой GTA 5 чел из красной тачки!!!
 
 
gtacleo Дата: Воскресенье, 06.03.2011, 14:36 | Сообщение # 2120
Группа: Проверенные
Сообщений: 157
Замечания: 0%
Статус: Offline
Здравствуйте!Вот появился вопрос со скриптом для vice city.
Вот почему неробит:

Code
:NONAME_1
wait 0
if
Player.Defined($PLAYER_CHAR)
jump @NONAME_1
02D7: player $PLAYER_CHAR currentweapon == 0
00E1: key_pressed 0 17
jump @NONAME_1_309
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 13.0 -1.0
020C: create_explosion_with_radius 8 at 1@ 2@ 3@
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 26.0 -1.0
020C: create_explosion_with_radius 8 at 1@ 2@ 3@
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 39.0 -1.0
020C: create_explosion_with_radius 8 at 1@ 2@ 3@
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 52.0 -1.0
020C: create_explosion_with_radius 8 at 1@ 2@ 3@
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 65.0 -1.0
020C: create_explosion_with_radius 8 at 1@ 2@ 3@
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 78.0 -1.0
020C: create_explosion_with_radius 8 at 1@ 2@ 3@
wait 250

:NONAME_1_309
if and
00E1: key_pressed 0 4
80E0: not player $PLAYER_CHAR driving
jump @NONAME_1_600
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 0.0 -1.0
04C4: create_coordinate 10@ 11@ 12@ from_actor $PLAYER_ACTOR offset 0.0 0.0 20.0
020C: create_explosion_with_radius 1 at 1@ 2@ 3@
Camera.SetPosition(10@, 11@, 12@, 0.0, 0.0, 0.0)
Camera.PointAt(1@, 2@, 3@, 2)
4@ = 0.0 // floating-point values

:NONAME_1_451
wait 0
02F6: 5@ = cosine 4@ // sinus swapped with cosine
5@ *= 10.0 // floating-point values (never used in VC or GTA 3)
02F7: 6@ = sinus 4@ // cosine swapped with sinus
6@ *= 10.0 // floating-point values (never used in VC or GTA 3)
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 5@ 6@ -1.0
020C: create_explosion_with_radius 1 at 1@ 2@ 3@
4@ += 20.0 // floating-point values
if
4@ > 340.0 // floating-point values
jump @NONAME_1_451
16@ = 0 // integer values

:NONAME_1_567
wait 0
0222: set_player $PLAYER_CHAR health_to 200
if
16@ > 2000 // integer values
jump @NONAME_1_567
Camera.Restore_WithJumpCut

:NONAME_1_600
if and
80E0: not player $PLAYER_CHAR driving
00E1: key_pressed 0 14
jump @NONAME_1_841
Actor.LockInCurrentPosition($PLAYER_ACTOR) = True

:NONAME_1_629
wait 0
if
Player.Defined($PLAYER_CHAR)
jump @NONAME_1
0222: set_player $PLAYER_CHAR health_to 200
if
00E1: key_pressed 0 14
jump @NONAME_1_811
0054: store_player $PLAYER_CHAR position_to 0@ 1@ 2@
if or
0@ > 1480.0 // floating-point values
-2280.0 > 0@ // floating-point values
1@ > 1880.0 // floating-point values
-1880.0 > 1@ // floating-point values
jump @NONAME_1_759
0055: put_player $PLAYER_CHAR at 0.0 0.0 -100.0

:NONAME_1_759
04C4: create_coordinate 5@ 6@ 7@ from_actor $PLAYER_ACTOR offset 0.0 10.0 -1.0
0055: put_player $PLAYER_CHAR at 5@ 6@ 90.0
jump @NONAME_1_629

:NONAME_1_811
0055: put_player $PLAYER_CHAR at 5@ 6@ -100.0
Actor.LockInCurrentPosition($PLAYER_ACTOR) = False
jump @NONAME_1

:NONAME_1_841
if and
80E0: not player $PLAYER_CHAR driving
00E1: key_pressed 0 18
jump @NONAME_1_1082
Actor.LockInCurrentPosition($PLAYER_ACTOR) = True

:NONAME_1_870
wait 0
if
Player.Defined($PLAYER_CHAR)
jump @NONAME_1
0222: set_player $PLAYER_CHAR health_to 200
if
00E1: key_pressed 0 18
jump @NONAME_1_1052
0054: store_player $PLAYER_CHAR position_to 0@ 1@ 2@
if or
0@ > 1480.0 // floating-point values
-2280.0 > 0@ // floating-point values
1@ > 1880.0 // floating-point values
-1880.0 > 1@ // floating-point values
jump @NONAME_1_1000
0055: put_player $PLAYER_CHAR at 0.0 0.0 -100.0

:NONAME_1_1000
04C4: create_coordinate 5@ 6@ 7@ from_actor $PLAYER_ACTOR offset 0.0 10.0 -1.0
0055: put_player $PLAYER_CHAR at 5@ 6@ -40.0
jump @NONAME_1_870

:NONAME_1_1052
0055: put_player $PLAYER_CHAR at 5@ 6@ -100.0
Actor.LockInCurrentPosition($PLAYER_ACTOR) = False
jump @NONAME_1

:NONAME_1_1082

jump @NONAME_1




Сообщение отредактировал gtacleo - Воскресенье, 06.03.2011, 14:37
 
 
Absolute Дата: Воскресенье, 06.03.2011, 16:32 | Сообщение # 2121
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline
Quote (muhtar)
Как заставить гг. Сесть в машину и ехать в заданые кардинаты

Попробуй такие действия:

05CB: AS_actor $PLAYER_ACTOR enter_car 1@ as_driver -1 ms - посадить актера за руль машины 1@
Car.DriveTo(1@, 2@, 3@, 4@) - послать машину 1@ ехатьв точку с координатами 2@ 3@ 4@

Возможно, машина будет очень медленно ползти. Я не знаю, баг это или так задумано. Тогда после того, как актер сядет в машину, надо задать её максимальную скорость:

Car.SetMaxSpeed(1@, 10.0)

Скорость измеряется непонятно в чем. 10.0 - это такая нормальная скорость, не очень высокая. При этом водитель будет ехать более-менее аккуратно. Скорость = 20.0 - это примерно 80км/ч (на глазок). И аккуратности при вождении гораздо меньше.

 
 
Den_spb Дата: Воскресенье, 06.03.2011, 16:36 | Сообщение # 2122
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Единица измерения скорости - метр в секунду.
 
 
HAUS Дата: Воскресенье, 06.03.2011, 17:04 | Сообщение # 2123
Группа: Проверенные
Сообщений: 191
Замечания: 0%
Статус: Offline
Спасибо absolute

Главный герой GTA 5 чел из красной тачки!!!
 
 
Absolute Дата: Понедельник, 07.03.2011, 17:30 | Сообщение # 2124
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline
Quote (Den_spb)
Единица измерения скорости - метр в секунду.

А, понятно. Спасибо.

Получается,
10.0 = 36км/ч
13.9 = 50км/ч
16.67 = 60км/ч
20.0 = 72км/ч
22.23 = 80км/ч
25 = 90км/ч
33.34 = 120км/ч

А я в первый раз думал, что это километры в час, запустил автобус со скоростью =40.0 по узкой улице. smile Ну он не все столбы сшиб, нет. Оставил где-то треть столбов. biggrin

Притормаживал, конечно, но старался выйти за заданную скорость даже там, где этого делать не надо. В общем, тупой искусственный интеллект у водил в GTA. smile

Добавлено (06.03.2011, 21:09)
---------------------------------------------

Quote (muhtar)
Спасибо absolute

Пожалста! smile Там еще надо проверки делать, конечно. Сел ли за руль чувак или нет. А то машина уедет и без него.

Добавлено (07.03.2011, 17:30)
---------------------------------------------
Вот в каком-то мануале (и здесь на форуме) было написано, что в CLEO-скриптах есть жесткое ограничение по количеству переменных - что-то вроде не больше 30-ти, что ли. Ужасно мало.

Я хотел уточнить, а массив в этом ограничении считается за одну переменную, или каждая ячейка массива - считается за одну переменную? То есть, если верно второе, то массив из 50-ти элементов или двумерный массив из 25-ти элементов вообще невозможно построить?!

Пока пишу скрипт в MAIN.SCM (там таких проблем, естественно, нет), но с расчетом в дальнейшем адаптировать его под CLEO. Поэтому этот вопрос и возник.

 
 
DK22Pac Дата: Понедельник, 07.03.2011, 18:10 | Сообщение # 2125
Группа: Проверенные
Сообщений: 205
Замечания: 0%
Статус: Offline
Quote
Я хотел уточнить, а массив в этом ограничении считается за одну переменную, или каждая ячейка массива - считается за одну переменную? То есть, если верно второе, то массив из 50-ти элементов или двумерный массив из 25-ти элементов вообще невозможно построить?!

Не только в CLEO, но и вообще в потоках доступно только 32 локальные переменные + 2 переменные-таймеры (32@ и 33@)
Так что массив из 50-ти элементов не получится сделать.
Quote
каждая ячейка массива

Верно.
31@ = 10
0@(31@,15i) - это то же, что и 10@.
Quote
двумерный массив

Нет, такое нельзя сделать.


Мои скрипты
Grand Theft Auto III HD Development Team


Сообщение отредактировал DK22Pac - Понедельник, 07.03.2011, 18:11
 
 
Den_spb Дата: Понедельник, 07.03.2011, 18:15 | Сообщение # 2126
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Для каждого потока main.scm (как и для CLEO-скрипта) выделяется блок в 32 локальные переменные (0@ - 31@) + 2 переменные-таймера 32@ и 33@. Для миссий выделен один блок в 1024 переменные, поэтому в любой момент времени может быть запущена только одна миссия.
Если учесть, что размер локальной переменной - 4 байта, то несложно подсчитать общий размер памяти блока: 4*32 = 128 байт. В случае использования массива или стринговых переменных, на каждую ячейку массива (или стринговую переменную) будет выделяться память из общего блока, т.е. одна ячейка массива "считается за одну переменную".
Для большинства скриптов 32 переменных более, чем достаточно, т.к. использовав переменную по одному назначению, можно сразу использовать её по другому назначению (если, конечно, старые данные, записанные в переменную, больше не нужны). Пример:
Code
{$CLEO}
0@v = "Hello!"                     
0ACD: show_text_highpriority 0@v time 7000
1@ = 0
0@(1@,4i) = 2000
0@ += 3000
while true
      wait 0
      03F0: enable_text_draw 1   
      045A: draw_text_1number 300.0 200.0 GXT 'NUMBER' number 0@  // ~1~
end
Здесь переменная 0@ сначала используется как часть стринговой переменной 0@v для хранения текста (размер такой переменной - 16 байт, т.е. в данном случае используются переменные 0@ - 3@). Далее переменная 0@ используется как ячейка массива, а затем как обычная локальная переменная. На экран будет выведено число 2000 + 3000 = 5000.
Если всё-таки локальных переменных не хватает и оптимизировать код не удаётся, то можно воспользоваться различными приёмами: битовые флаги, hex-буфер и др.


Сообщение отредактировал Den_spb - Понедельник, 07.03.2011, 18:19
 
 
Absolute Дата: Понедельник, 07.03.2011, 21:47 | Сообщение # 2127
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline
Quote (DK22Pac)
Не только в CLEO, но и вообще в потоках доступно только 32 локальные переменные + 2 переменные-таймеры (32@ и 33@)

Но программируя для майна можно пользоваться глобальными переменными. Для cleo-скриптов же это категорически противопоказано, т.к. как я понял, переменная просто будет использовать ячейку памяти от какой-то другой переменной.

Quote (DK22Pac)

Так что массив из 50-ти элементов не получится сделать.

Жаль.

Добавлено (07.03.2011, 19:15)
---------------------------------------------

Quote (DK22Pac)

Quote

двумерный массив

Нет, такое нельзя сделать.

Ну вот, это нельзя. Другое тоже нельзя. smile
Как в таких условиях программировать... smile

Добавлено (07.03.2011, 19:37)
---------------------------------------------

Quote (Den_spb)
Для каждого потока main.scm (как и для CLEO-скрипта) выделяется блок в 32 локальные переменные (0@ - 31@) + 2 переменные-таймера 32@ и 33@. Для миссий выделен один блок в 1024 переменные, поэтому в любой момент времени может быть запущена только одна миссия.

Я так предполагаю, у этих ограничений "ноги растут" от того, что GTA изначально игра приставочная. И там, видимо, совсем туго с памятью... Потому что совсем непонятно, отчего такие жесткие ограничения времен чуть ли не ZX-Spectrum'а, если не Альтаира. smile

Quote (Den_spb)

Если учесть, что размер локальной переменной - 4 байта, то несложно подсчитать общий размер памяти блока: 4*32 = 128 байт.

В куркуляторе памяти и то больше. smile

Quote (Den_spb)

В случае использования массива или стринговых переменных, на каждую ячейку массива (или стринговую переменную) будет выделяться память из общего блока, т.е. одна ячейка массива "считается за одну переменную".

Понятно. Спасибо. smile
Я надеялся, что ограничения связаны как-то с именами переменных в cleo, а не с памятью.

Quote (Den_spb)

Для большинства скриптов 32 переменных более, чем достаточно, т.к. использовав переменную по одному назначению, можно сразу использовать её по другому назначению (если, конечно, старые данные, записанные в переменную, больше не нужны). Пример:

Ну, оптимизация - это, конечно, хорошо. Но на 32 переменных не сделать что-то такое ЭТАКОЕ. Например, много машин, которые в реальном времени ездят по городу для какой-то цели, автобусные маршруты. Или много магазинов с индивидуальными параметрами (ценами, ассортиментом), доступные для работы вакансии по всему штату и т.д. То есть всё то, что требует памяти для хранения чего-то не временного.

У меня, например, была задумка сделать автобусное сообщение по всему штату с кучей маршрутов. Но ограничения по памяти для cleo-скриптов дадут создать только весьма урезанную версию этой задумки.

Если делать глобальный мод (переделывая main.scm), то никаких проблем создания этого я не вижу. А в cleo-скрипте невозможно. Либо придется делать много cleo-скриптов, но тогда выползает ограничение по количеству потоков.

Quote (Den_spb)

Если всё-таки локальных переменных не хватает и оптимизировать код не удаётся, то можно воспользоваться различными приёмами: битовые флаги, hex-буфер и др.

Тут много не выгадаешь...

Спасибо за информацию! smile

Добавлено (07.03.2011, 21:47)
---------------------------------------------
А как можно скриптом сделать все машины более разбиваемыми? Поиск опкодов по словам "car" и "damage" ничего толкового не дал. Можно, конечно, подредактировать все машины, но это блин долго. smile

 
 
Den_spb Дата: Вторник, 08.03.2011, 00:44 | Сообщение # 2128
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Quote (Absolute)
Ну вот, это нельзя. Другое тоже нельзя.
Синтаксис SCM не поддерживает двухмерные массивы. Но можно поступить так:
Code
{$CLEO}
var
         0@: array 25 of Integer
         25@: Integer
         26@: Integer
end
const
         Array = 0@
         i = 25@
         j = 26@
end
for i = 0 to 4
         for j = 0 to 4
             i *= 5
             005A: j += i // (int)      
             Array[j] = 100
             0062: j -= i // (int)      
             i /= 5
         end
end
0A93:
Пример запишет во все элементы двухмерного массива 5х5 число 100.

Quote (Absolute)
Но на 32 переменных не сделать что-то такое ЭТАКОЕ. Например, много машин, которые в реальном времени ездят по городу для какой-то цели, автобусные маршруты.
В случае создания машин, актёров и т.д. желательно соблюдать правило - существовать должно только то, что находится рядом с камерой или в пределах её видимости. Если создать достаточно много машин, то не будут создаваться машины стандартного траффика.

Quote (Absolute)
Тут много не выгадаешь...
Почему же? Если, например, создать буфер на 128 байт, то он будет эквивалентен 32 дополнительным локальным переменным:
Code
{$CLEO}
0AC6: 0@ = label @hex_buffer offset
0A8C: write_memory 0@ size 4 value 3.14 virtual_protect 0
0@ += 4
0A8C: write_memory 0@ size 4 value 2.71828 virtual_protect 0
0A93:

:hex_buffer
hex
00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00
00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00
00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00
00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00

00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00
00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00
00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00
00 00 00 00     00 00 00 00     00 00 00 00     00 00 00 00
end
Пример запишет в первые 4 байта буфера число 3.14, а во вторые 4 байта - 2.71828. Читать память можно опкодом 0A8D.

Quote (Absolute)
А как можно скриптом сделать все машины более разбиваемыми? Поиск опкодов по словам "car" и "damage" ничего толкового не дал. Можно, конечно, подредактировать все машины, но это блин долго.
"Разбиваемость" машин зависит от их моделей (разбитые детали являются отдельными моделями, входящими в состав основной модели).


Сообщение отредактировал Den_spb - Вторник, 08.03.2011, 01:01
 
 
HAUS Дата: Среда, 09.03.2011, 12:33 | Сообщение # 2129
Группа: Проверенные
Сообщений: 191
Замечания: 0%
Статус: Offline
Люди научити да меня пользоватся "адресами памяти"

Добавлено (09.03.2011, 12:33)
---------------------------------------------
И еще скажи те опкод который приклипляет человека к машине и или к другим транспортным средствам


Главный герой GTA 5 чел из красной тачки!!!
 
 
Den_spb Дата: Среда, 09.03.2011, 18:33 | Сообщение # 2130
Мастер по скриптингу
Группа: Проверенные
Сообщений: 295
Замечания: 0%
Статус: Offline
Quote (muhtar)
Люди научити да меня пользоватся "адресами памяти"

Учиться надо самостоятельно. Если будут конкретные вопросы, то задавай - отвечу.
Quote (muhtar)
И еще скажи те опкод который приклипляет человека к машине и или к другим транспортным средствам

Смотри через Поиск опкодов по слову attach.
П.С. Проверяй текст сообщения перед отправкой, хотя бы с помощью Word.
 
 
Форум » Скрипты » Всё о клео скриптах » Вопросы по созданию скриптов
Поиск:

Copyright dim1988 aka d88 © 2024
Сайт управляется системой uCoz