Вопросы по созданию скриптов
| |
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 в переменные записывает ближайший актер и актриса , и актер идет к актрисе целоваться. Но проблема в том, что выкидывает из игры, когда убрать нажатие клавиши и рядом нет педов. Есть ли какие-то проверки, на педов рядом? Помогите пожалуйста вобщем.
|
|
| |
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 |
Всем игроделателям пламенный привет! Прежде всего хочу сказать спасибо помогающим советами. Эти советы пригождаются не только тем, кто задает вопросы, но и сотням других людей, которые ничего не пишут, но читают. Вот как я до сего момента. А вопрос такой. Нигде не мог найти такую инфу. Когда игру сохраняешь, то ко времени прибавляется 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 часов
Главный герой GTA 5 чел из красной тачки!!! |
|
| |
Absolute |
Дата: Четверг, 03.03.2011, 22:23 | Сообщение # 2109 |
Группа: Пользователи
Сообщений: 28
Замечания: 0%
Статус: Offline |
Quote (muhtar) Absolute я на счет первого вопроса может можно просто проверить сохраняется ли игрок и потом отнять 6 часов Наверное, так и буду делать. Скорее всего, игра при сохранении просто тупо делает hour = hour + 6. Тогда можно и сделать "минус 6". Если бы игра что-то в эти шесть часов еще просчитывала, было бы хуже. Но вряд ли что-то делается кроме прибавления часов. |
|
| |
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 звезда. Типа за нарушение общественного порядка и ПДД. Добавлено (04.03.2011, 19:51) --------------------------------------------- А, еще можно (как вариант) телепортировать из транспорта, при этом затемнять экран на 1 сек и чуть-чуть отнимать жизнь. В общем, главное чтобы выбирался, а там уже много вариантов. |
|
| |
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 |
Супер! Спасибо огромное! +2
Сообщение отредактировал 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 по узкой улице. Ну он не все столбы сшиб, нет. Оставил где-то треть столбов. Притормаживал, конечно, но старался выйти за заданную скорость даже там, где этого делать не надо. В общем, тупой искусственный интеллект у водил в GTA. Добавлено (06.03.2011, 21:09) ---------------------------------------------
Quote (muhtar) Спасибо absolute Пожалста! Там еще надо проверки делать, конечно. Сел ли за руль чувак или нет. А то машина уедет и без него. Добавлено (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@. Нет, такое нельзя сделать.
Мои скрипты 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) Нет, такое нельзя сделать. Ну вот, это нельзя. Другое тоже нельзя. Как в таких условиях программировать... Добавлено (07.03.2011, 19:37) ---------------------------------------------
Quote (Den_spb) Для каждого потока main.scm (как и для CLEO-скрипта) выделяется блок в 32 локальные переменные (0@ - 31@) + 2 переменные-таймера 32@ и 33@. Для миссий выделен один блок в 1024 переменные, поэтому в любой момент времени может быть запущена только одна миссия. Я так предполагаю, у этих ограничений "ноги растут" от того, что GTA изначально игра приставочная. И там, видимо, совсем туго с памятью... Потому что совсем непонятно, отчего такие жесткие ограничения времен чуть ли не ZX-Spectrum'а, если не Альтаира. Quote (Den_spb) Если учесть, что размер локальной переменной - 4 байта, то несложно подсчитать общий размер памяти блока: 4*32 = 128 байт. В куркуляторе памяти и то больше. Quote (Den_spb) В случае использования массива или стринговых переменных, на каждую ячейку массива (или стринговую переменную) будет выделяться память из общего блока, т.е. одна ячейка массива "считается за одну переменную". Понятно. Спасибо. Я надеялся, что ограничения связаны как-то с именами переменных в cleo, а не с памятью. Quote (Den_spb) Для большинства скриптов 32 переменных более, чем достаточно, т.к. использовав переменную по одному назначению, можно сразу использовать её по другому назначению (если, конечно, старые данные, записанные в переменную, больше не нужны). Пример: Ну, оптимизация - это, конечно, хорошо. Но на 32 переменных не сделать что-то такое ЭТАКОЕ. Например, много машин, которые в реальном времени ездят по городу для какой-то цели, автобусные маршруты. Или много магазинов с индивидуальными параметрами (ценами, ассортиментом), доступные для работы вакансии по всему штату и т.д. То есть всё то, что требует памяти для хранения чего-то не временного. У меня, например, была задумка сделать автобусное сообщение по всему штату с кучей маршрутов. Но ограничения по памяти для cleo-скриптов дадут создать только весьма урезанную версию этой задумки. Если делать глобальный мод (переделывая main.scm), то никаких проблем создания этого я не вижу. А в cleo-скрипте невозможно. Либо придется делать много cleo-скриптов, но тогда выползает ограничение по количеству потоков. Quote (Den_spb) Если всё-таки локальных переменных не хватает и оптимизировать код не удаётся, то можно воспользоваться различными приёмами: битовые флаги, hex-буфер и др. Тут много не выгадаешь... Спасибо за информацию! Добавлено (07.03.2011, 21:47) --------------------------------------------- А как можно скриптом сделать все машины более разбиваемыми? Поиск опкодов по словам "car" и "damage" ничего толкового не дал. Можно, конечно, подредактировать все машины, но это блин долго. |
|
| |
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. |
|
| |
|