Дата: Понедельник, 02.01.2012, 19:05 | Сообщение # 1126
Группа: Проверенные
Сообщений: 206
Статус: Offline
Аксиома,
при присоединении объекта используются не координаты частей тела, а смещение от центра этой кости. Например, ты выбираешь кость руки, представляешь в мозгах и мысленно смотришь, на сколько надо сместиться по осям X Y Z, чтобы получить желаемый результат. Например, тебе надо чуть ниже и левее какой-то кости. Ты берешь смещение -0.5 (Z) и -0.2 (X).
А теперь мой вопрос. Почему игра вылетает на вот этом кусочке кода (я точно рассчитал, что именно здесь, так как текст не выводится, значит вылетает здесь) Вот часть кода, где происходит вылет.
Code
0208: 2@ = random_float_in_ranges -1750.0 1750.0 0208: 3@ = random_float_in_ranges -1500.0 1500.0 02C0: store_to 2@ 3@ 4@ ped_path_coords_closest_to 2@ 3@ 0.0 4@ += 0.2 0209: 5@ = random_int_in_ranges 175 500 5@ *= 10 02E1: 6@ = create_cash_pickup 5@ at 2@ 3@ 4@ permanence_flag 1 0843: get_zone_at 2@ 3@ 4@ nameA_to 7@s //скорее всего здесь. я пробовал и 7@s, и s$NAME, везде вылет. Еще пробовал опкод [b]08F1[/b], результат тот же 0513: show_text_box_1number 'EMONEY' number 7@s //текст не успевает выводиться, следовательно вылет происходит из-за более ранних команд 31@ = 0
Дата: Понедельник, 02.01.2012, 19:17 | Сообщение # 1127
Группа: Заблокированные
Сообщений: 81
Статус: Offline
Vital, Но если я хочу вывести эффект, например у ширинки Карла допустим как узнать X Y Z
Добавлено (02.01.2012, 19:17) --------------------------------------------- И вот вопрос
Вот если я написал такой скрипт допустим что при нажатий клавиши игрок превращается в другого актёра (Модель: #MALE01) и при нажатий клавиши он снова становиться игроком.(Модель: #NULL) И вот как такую сделать проверку если сейчас игрок в модели #MALE01 то как такую проверку сделать если игрок в модели #MALE01 ?
Дата: Понедельник, 02.01.2012, 19:55 | Сообщение # 1128
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Quote (Vital)
А теперь мой вопрос. Почему игра вылетает на вот этом кусочке кода (я точно рассчитал, что именно здесь, так как текст не выводится, значит вылетает здесь)
Я ошибок не вижу. Надо точно узнать, на какой команде происходит вылет. Проще всего воспользоваться ScmLog, но можно применить и другие методы - например, вставить перед подозрительной командой присвоение игроку денег и задержку - если деньги не присваиваются, значит вылет происходит ещё раньше.
Дата: Понедельник, 02.01.2012, 21:12 | Сообщение # 1130
Группа: Проверенные
Сообщений: 206
Статус: Offline
Аксиома,
а где создание актера 0@(или нахождение)? Как можно проверять что-то, относящееся к несуществующему актеру? Сначала его надо создать или найти. Странно... Или это не весь код? Еще кое-что в начале не надо писать // 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}, этого достаточно. По вопросу об эффектах на актере. Здесь берется смещение относительно центра актера. То есть представь, что центр человека (живот, грубо говоря) - это начало координат (X,Y,Z = 0,0,0) Чтобы прицепить эффект, надо писать значения этих координат, это и есть смещение от центра актера (объекта, машины и других вещей). Допустим, делаем эффект примерно на голове актера 0669: 1@ = attach_particle "FIRE" to_actor $PLAYER_ACTOR offset 0.0 0.0 0.5 1 //берем смещение 0.5 по Z (высота) от центра - это примерно голова
Den_spb, судя по проверке (вставлял звуки после подозрительных команд). В итоге вышло, что виной вывод текста. Можно ли в тексте в качестве параметра (в текстах ~1~) использовать текст? А именно - название района. Или вывод нужно осуществлять отдельно? Я, конечно, сперва сам попробую, если все будет нормально, скажу. SCRIPTER
:NONAME_44 0001: wait 0 ms 00D6: if and 056D: actor 0@ defined 0118: actor 0@ dead 004D: jump_if_false @NONAME_44 0002: jump @NONAME_76
:NONAME_76 0001: wait 0 ms 00D6: if or 02F2: actor 0@ model == #LAPD1 02F2: actor 0@ model == #FAM1 02F2: actor 0@ model == #FAM2 004D: jump_if_false @NONAME_76 00A0: store_actor 0@ position_to 1@ 2@ 3@ 020C: create_explosion_with_radius 1 at 1@ 2@ 3@ 0948: create_explosion_at 1@ 2@ 3@ type 5 camera_shake 1 0001: wait 900 ms 0002: jump @NONAME_4
Дата: Понедельник, 02.01.2012, 22:18 | Сообщение # 1133
Группа: Проверенные
Сообщений: 206
Статус: Offline
Попробуй так:
Code
{$CLEO .cs}
//-------------MAIN---------------
:NONAME_4 wait 0 0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 1@ closest_ped_to 0@ car.removereferences(1@) //убираем сведения, чтобы не глючило if // так короче и это одно и то же, опкод целиком можно не писать 0@ <> -1 //не равняется -1 jf @NONAME_4 //тоже короче и легче 0002: jump @NONAME_76
:NONAME_76 wait 0 if or 02F2: actor 0@ model == #LAPD1 02F2: actor 0@ model == #FAM1 02F2: actor 0@ model == #FAM2 jf @NONAME_77 //не надо прыгать на эту же метку, конечно ничего не будет работать actor.storepos(0@,1@,2@,3@) //просто другой вариант 020C: create_explosion_with_radius 1 at 1@ 2@ 3@ 0948: create_explosion_at 1@ 2@ 3@ type 5 camera_shake 1 actor.removereferences(0@) //убираем сведения, чтобы не было глюков wait 900 jump @NONAME_4 //пишем короче
:NONAME_77 //эта метка удаляем сведения и прыгает на начало wait 0 actor.removereferences(0@) jump to @NONAME_4 //на начало
Теперь поясню. В начале берем случайного актера. Если его не нашли, или он убит, идем заново. Потом проверяем модель. Если проверка идет нормально, взрываем актера и удаляем из памяти сведения о нем, чтобы не было глюков. Если проверка не проходит удачно, идем в специальную метку, где удаляем сведения об актере и идем в самое начало, чтобы искать новых актеров для действий. Символом // в программе (это после текста каждого опкода) пишутся комментарии, пояснения и т.п. Они не учитываются программой, так что, если они не нужны, их можно удалить. (только //и текст после этих двух фигней)
Den_spb, Все в порядке, скрипт работает, исправил. SCRIPTER
Дата: Понедельник, 02.01.2012, 22:28 | Сообщение # 1134
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Одно замечание - 0AB5 не делает машину или актёра уникальным, поэтому команды removereferences можно убрать. И после каждой метки не обязательно писать wait - достаточно одного wait-а на весь скрипт.
Дата: Понедельник, 02.01.2012, 22:55 | Сообщение # 1136
Группа: Проверенные
Сообщений: 206
Статус: Offline
Аксиома, он имел в виду, что не надо писать повсюду. Перед проверками действительно нужно, а остальное можно убрать. Хотя у меня это уже привычка SCRIPTER
Дата: Понедельник, 02.01.2012, 23:41 | Сообщение # 1137
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Посмотрите исходники моих скриптов. Например, "Оживление компонентов моделей вагонов" - 720 строк, куча проверок, и только один wait на весь код. Скрипт прекрасно работает. Любой скрипт нужно строить так, чтобы в нём иногда выполнялась команда wait - благодаря ей выполнение текущего скрипта приостанавливается, после чего по очереди отрабатывают другие установленные скрипты и нескриптовые процессы игры (отрисовка, проверки нажатия клавиш и т.д.). Если wait никогда не выполняется, то не работают и нескриптовые процессы - в результате игра зависает.
Дата: Вторник, 03.01.2012, 13:28 | Сообщение # 1138
Группа: Заблокированные
Сообщений: 81
Статус: Offline
Вот такой вопрос с миссиями Я делал миссий из одной статьи
Quote
Как запустить файл .cm(Создание триггера).
Сначала создаём обычный файл .cs В нём пишем условия, при которых должна начаться миссия, например
Code :NONAME_11 wait 0 if Player.Defined($PLAYER_CHAR) else_jump @NONAME_11 wait 0 if $ONMISSION == 0 else_jump @NONAME_11 if 0102: actor $PLAYER_ACTOR in_sphere 24.9859 2346.989 24.1347 radius 2.0 2.0 1.0 sphere 1 stopped_on_foot else_jump @NONAME_11
$ONMISSION – это глобальная переменная, отвечающая за режим игры. Если $ONMISSION == 0, то это обычный режим, если $ONMISSION == 1, то это режим миссии.
Итак, если условия выполнены, запускаем миссию. Включаем режим миссии командой
Code $ONMISSION = 1
и активируем файл с миссией. Допустим, этот файл называется «Missia». Тогда надо написать так
Code
0A94: start_custom_mission "Missia"
Понятно, что в кавычках название файла Далее нужно сделать проверку на законченность миссии. Делаем так
Code :NONAME_15 wait 0 if $ONMISSION == 0 else_jump @NONAME_15
Если условие выполнится, то можно либо вернуть скрипт к началу, либо закончить командой
Code 0A93: end_custom_thread
Теперь перейдём к файлу .cm
Code {$CLEO .cm} //Указываем директиву
thread 'missia' //Пишем название
Далее пишем команду
Code increment_mission_attempts
Можно ещё раз написать Code $ONMISSION = 1
Далее сама миссия. Можно сделать любую миссию. Например создать актёра, которого нужно убить, или машину, которую нужно угнать и привезти куда-то.
Делаем проверку, выполнено ли то, что задумано в миссии, и выключаем режим миссии
Code $ONMISSION = 0
Когда эта команда выполнится, файл .cs, который мы создали в начале, продолжит работу. Теперь завершаем поток в файле .cm командами
Code mission_cleanup end_thread
Всё получается но даже если поставить в конце end_thread что миссия закончилась на всегда то если сохраниться и загрузить игру то можно заново пройти миссию как это исправить, и если можете то покажите как писать миссию в main что бы не грузить Cleo
Дата: Вторник, 03.01.2012, 13:32 | Сообщение # 1139
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Заведи какую-нибудь глобальную переменную, в которую будет записываться определённое значение при успешном прохождении миссии. В стартере миссии проверяй значение этой переменной.
Дата: Вторник, 03.01.2012, 17:23 | Сообщение # 1140
Группа: Проверенные
Сообщений: 206
Статус: Offline
Den_spb, так ведь в cleo не рекомендуется использовать глобальные переменные? Можно двумя другими путями: 1) Взять какую-нибудь неиспользуемую игрой статистику и менять ее значени (0-миссия не начата, 1-миссия пройдена) и считывать значение, проверять его. 2) Если есть CLEO 4, можно создать .ini файл, куда можно записать значение переменной, отвечающей за прохождение миссии --- Хотя, стойте. Ведь, чтобы скрипт сохранял свое состояние (именно стартер, ведь миссия .cm запускается по нему) перед кодом скрипта нужно поставить опкод 0A95: enable_thread_saving И тогда (вроде бы) скрипт будет сохранять свое состояние в папке cleo_saves (или как-то так). Если скрипт завершен, то при следующей загрузке игры он не будет повторяться. SCRIPTER