Так, решил заняться: вторая ошибка - используешь глобальные переменные типа $POLICE1 , $COP3 и т.д. В CLEO можно использовать только локальные переменные - 1@ 2@ 0@ и т.п.
хм... в тройке тока с простыми переменными пашет, от локальных вылетает. Тоже самое было и в вайсе, когда сажал твой скрипт пассажира на локальные переменные в клео, поэтому юзал такие простые
фигасе, мб паленый санни буилдер? или клео старая.. Но на форуме СБ написано, что тут, как и в клео на СА, надо юхать только локальные, т.к. другие крашут мэйн - совпадение ID переменных Текущие проекты: Шучу. Вот: https://trello.com/b/mL79JcX1/shagge-actual-gta-projects
фигасе, мб паленый санни буилдер? или клео старая.. Но на форуме СБ написано, что тут, как и в клео на СА, надо юхать только локальные, т.к. другие крашут мэйн - совпадение ID переменных
Вроде бы нет. Прогляди скрипт для тройки - там всё сделано на простых переменных. Я сначала использовал глобальные переменные и не мог понять - почему у меня игра крошится при нажатии клавиши, потом решил поэксперементировать и поставил простые переменные. Результат - игра стало стабильно пахать без крешов - всё как рукой сняло. Тоже самое и в вайсе.
П.С.: клео вроде бы последний. Ах да - иногда всё таки глобальные переменные пашут, но в моё скрипте с такими переменными всё норм пашет, за исключением того бага с авто.
локальных переменных с меткой @ можно использовать только 33 штуки(от 0 до 32), другие значения не компилятся со скриптом, и могут вести к багам глобальные, с меткой $ - по-идее вмешиваются в основной код мэйна, именно поэтому в клео скриптинге их не используют. Это долго обьяснять, но это очень важно, поэтому - Цитаты из туториала по Санни Билдеру:
Не используйте в CLEO-скрипте собственные глобальные переменные ($car, $blahblah и т.д.), иначе скрипт будет работать неправильно. Вы можете использовать только некоторые глобальные переменные (см. ниже).
Когда мы компилируем main.scm вместе со всеми миссиями и скриптами, все глобальные переменные получают свой ID (порядковый номер). Часть из них получает ID всегда один и тот же (например, $PLAYER_CHAR компилируется как $2, $PLAYER_ACTOR - $3 и т.п.). Это справедливо для всех глобальных переменных, которые определены в CustomVariables.ini
Этот порядковый номер означает номер ячейки в памяти игры, где хранится значение переменной. Понятное дело, этот номер должен быть уникальным для каждой переменной. Иными словами, каждая переменная должна быть скомпилирована с уникальным ID.
Все остальные переменные компилируются следующих образом. Если имя переменной не найдено в CustomVariables.ini, то она компилируется с номером, который идет следом за наибольшей использованной переменной в скрипте. Звучит сложновато, поэтому пояcню на примере:
Простой скрипт из 2х строк:
Code
$PLAYER_CHAR = 1 $MYVAR = 1
$PLAYER_CHAR компилируется как $2. Значит, переменная $MYVAR, которая не содержится в CustomVariables.ini и имя которой не числовое, будет скомпилирована как $3. (на самом деле там будет не $3, потому что $3 зарезервировано для $PLAYER_ACTOR, поэтому $MYVAR получит первое свободное имя - $4
Другой пример
Code
$PLAYER_CHAR = 1 $MYVAR = 1 $100 = 1
Наибольшая переменная в скрипте теперь $100, поэтому $MYVAR станет $101.
Такой механизм позволяет присвоить каждой переменной свое уникальное имя.
В main.scm все новые переменные получают имена при компиляции начиная с $10948, т.к. $10947 наибольшая переменная, использованная в оригинальном main.scm.
Теперь вернемся к CLEO-скриптам. Каждый раз, когда мы компилируем новый скрипт, компилятор не знает ничегошеньки про состояние main.scm и сколько переменных в нем использовалось. Он именует переменные с нуля каждый раз. Это значит, что если ты сделаешь два скрипта, в которых будет:
в одном скрипте
Code
$MYVAR = 1
в другом скрипте
Code
$MYVAR1 = 1
то обе переменные будут скомпилированы как:
Code
$4 = 1
несмотря на то, что имена у них разные. И каждый раз компилятор будет в новом клео-скрипте именовать переменные, начиная с $4. Эффект, думаю, ясен. Переменные будут использовать одну и ту же ячейку памяти и менять значения друг друга. Если ты в одном скрипте запишешь актера в $MYVAR, а в другом в $MYVAR1 = 0, то когда первый скрипт обратится к $MYVAR, он прочитает не актера, а 0, т.к. обе переменные используют 4-ю ячейку памяти.
Другая ситуация - это выход за пределы памяти для глобальных переменных. Например, обычный stripped имеет размер памяти для глобальных переменных в 409 ячеек, поскольку наибольшая использованная переменная $ONMISSION это $409. Предположим, мы создали клео-скрипт:
Code
$ONMISSION = 1 $MYVAR = 0
Как будет скомпилирована переменная $MYVAR, если вы поняли, о чем я говорил выше ? Правильный ответ $411. $ONMISSION это $409, поэтому переменная должна бы стать $410, но этот ID уже зарезервирован для $Help_SprayCan_Shown (см. CustomVariables.ini). Поэтому первый свободный номер это $411.
Вернемся теперь к stripped. Размер памяти-то у него так и остался - 409 (если бы $MYVAR = 0 компилировалась в майне, то память была бы увеличена до 411). Поэтому когда клео-скрипт будет работать с переменной $MYVAR, ее значения будут читаться и писаться за пределами дозволенной области памяти. В худшем случае, такие переменные будут менять код самого main.scm (опкоды и параметры), что неминуемо повлечет вылет.
А также:
Глобальные переменные ($) вообще не рекомендуется использовать в CLEO-скриптах, не важно, каким способом их называть. Есть только 2 исключения: 1) это общераспространенные переменные типа $PLAYER_CHAR, $PLAYER_GROUP, $ONMISSION и 2) неиспользуемые переменные типа $30, $56. В любом случае к использованию глобальных переменных нужно подходить очень осторожно, иначе не минуемы различные глюки в игре.
Зато СВОБОДНО, БЕЗ ОГРАНИЧЕНИЙ можно пользоваться локальными переменными. Мало 32-х переменных? Есть масса способов как обойти ограничение (начиная от простой оптимизации, заканчивая использованием scm-функций - 0AB1, 0AB2).
Если неудобно пользоваться локальными переменными из-за их имени (согласен, 1@ не всегда явно выражает смысл переменной), пользуйтесь конструкцией CONST..END Пара строк
Code
const TRAIN_MODEL = 1@ end
позволяет использовать в скрипте слово TRAIN_MODEL, которое на самом деле будет обозначать локальную переменную и компилироваться соответственно. Например, TRAIN_MODEL = 400 - это в переменную 1@ записали число 400. И все, больше никаких проблем из-за глобальных переменных.
Возможно это покажется сложным, но вывод один - лучше не юзать глоб. переменные в клео скриптах И хоть текст выше и писался для Сан Андреас, для вайса остаются те же правила. LEX, когда закончу тебе скрипт, выложу сразу готовый работающий код
Шег, это то ясно, но факт остаётся фактом - вылеты были именно от глобал переменных. А так по возможности я всегда пытаюсь скриптить с глобал переменными) П.С.: заранее спс за код)
Извиняюсь, в то не многое время, что отводил на гта, занимался artificial intelligence, был сильно этим увлечен) К слову, клео скрипты с этим как раз и планирую выложить перед добавлением ограничения на скачивание
Итак, сегодня окончательно решил заняться скриптом и сделал, но другим способом, более оптимизированным:
Code
// This file was decompiled using vicescm.ini published by http://gtag.gtagaming.com/opcode-database on 10.9.2010
{$VERSION 2.1.1000} {$CLEO .cs}
//-------------MAIN--------------- 0000:
:NONAME_2 wait 50 if and Player.Defined($PLAYER_CHAR) Player.WantedLevel($PLAYER_CHAR) > 1 jf @NONAME_2
:NONAME_29 wait 0 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 45.75 45.75 0.0 04C4: create_coordinate 4@ 5@ 6@ from_actor $PLAYER_ACTOR offset -45.7499 -45.7499 0.0 053E: 0@ = get_random_car_with_actors -1 in_area 1@ 2@ 4@ 5@ if not 0@ == -1 // integer values jf @NONAME_29 046C: 7@ = car 0@ driver if and not 7@ == -1 // integer values 80DC: not player $PLAYER_CHAR driving 0@ jf @NONAME_29 if or Actor.DrivingVehicleType(7@, #POLICE) Actor.DrivingVehicleType(7@, #VICECHEE) jf @NONAME_29 Model.Load(#UZI) Model.Load(#COP) 038B: load_requested_models
:NONAME_200 wait 0 if and Model.Available(#COP) Model.Available(#UZI) jf @NONAME_200 8@ = Actor.Create(CivMale, #COP, 0.0, 0.0, 2500.0) 01B2: give_actor 8@ weapon 23 ammo 9999 // Load the weapon model before using this 02E2: set_actor 8@ weapon_accuracy_to 63 022D: set_actor 8@ to_look_at_player $PLAYER_CHAR 0464: put_actor 8@ into_turret_on_car 0@ at_car_offset 0.4242 -0.0679 0.8 position 3 angle 360.0 with_weapon 23 01CA: actor 8@ kill_player $PLAYER_CHAR Model.Destroy(#COP) Model.Destroy(#UZI)
:NONAME_313 wait 0 if not Actor.Dead(8@) jf @NONAME_397 if and 00FB: player $PLAYER_CHAR 0 8@ radius 70.0 70.0 50.0 Player.WantedLevel($PLAYER_CHAR) > 1 jf @NONAME_442 if 856C: not actor 7@ driving_police_vehicle jf @NONAME_313 0465: remove_actor 8@ from_turret_mode
:NONAME_397 wait 0 if or Actor.Dead(8@) 80FB: not player $PLAYER_CHAR 0 8@ radius 60.0 60.0 50.0 jf @NONAME_397
Принцип такой: Если уровень розыска >1, то в приближающился к вам POLICE и VICECHEE автомобилях спавнятся копы-турретчики(или туррелльщики??). Если водитель авто выходит из него, турретч(лльщ)ик тоже выходит и начинает мочить игрока просто, не из машины. Если же игрок отьехал от этого турре..эмм...чувака далеко(дальше 70-75 метров), тот исчезает, и скрипт начинается заного. Также происходит рестарт скрипта если чувак умер. В общем, весело) Ах да, точность чувака 63% .Вроде всё..
Скринссс:
Если копов в авто 2, то видно, что чувак стоит на еко коленях(про то, что он выглядывает сквозь крышу, помолчим )
На последнем скрине видно, что положение чувака в авто не айс, но тут уж сам настроешь
В общем ты там подправь что нужно, но: не ставь глоб. переменные, юзай только локальные, как в коде выше, я на всякий случай прикрепляю готовый скрипт - если он у тебя не работает, значит скачивай другую версию клео - эта паленка. Или санни билдер не тот.У меня версия 3.04 от 17.08.08
Если хочешь, чтобы при разных уровнях розыска были разные копы с разным оружием - просто вначале нужную проверку c опкодами 010F: player $PLAYER_CHAR wanted_level > 0 и 810F: not player $PLAYER_CHAR wanted_level > 0 , ставь какую нужно, вместо старой, и также там где проверяется модель авто, ставь то, что требуется, с получатся разные скрипты. Хотя если помуDиться, то наверное можно и в 1 скрипт пихнуть, но он будет медленнее работать, так что...как хочешь Одна просьба: когда будешь выкладывать, в названии сделай пометку [AI], типа "[AI]CopDown" или "[AI]CopLand" и т.д. Просто я скоро зарелизю еще несколько скриптов, подправляющие ии персов в игре, и хотелось бы, чтобы это было типа серии скриптов [AI] от нашего сайта. В общем, как хочешь
Всем хай) Извиняюсь что так долго, но у меня были проблемы с инетом) На счёт скрипта - не поверишь, но код с рандомным авто у меня почти такой же как и у тебя, но косяки я выяснил по твоему образцу)) На досуге как нить буду переписывать код туррета для вайса и заодно допилю ментов)
Прохожий из Тюмени, в мейне просто убираешь лишние пакеты и связанные с ними бонусы. Ещё нужно GXT подредактировать вроде. Что именно у тебя не получается? новые эффекты, новые текстуры зданий, новые острава и остравки (!) где будут ездить машины и ходить люди (!)
Прохожий из ???, Находишь сто подобных строчек подряд:
Code
02EC: put_hidden_package_at X Y Й
, удаляешь лишние, оставляя например, 15; затем находишь вначале мейна строчку:
Code
02ED: set_total_hidden_packages_to 100
меняешь 100 напирмер, на 15. Ах да, координаты X Y Й меняй на те, что удобны тебе. Бонусы менять или удалять необязательно, но можно, если ты сам там разберешься. Текущие проекты: Шучу. Вот: https://trello.com/b/mL79JcX1/shagge-actual-gta-projects
Это в виде клеоскриптов мне нужно: 1Как сделать что оружие стреляло водой как фаертрак?Просто очень хочу портативную водяную пушку. 2Как заполнить водой любое место? 3Как изменить банду в более агессивную и менее трусливую сторону?Может быть через 0592: unknown_gang 2 flag 1
update
Нашёл команду которая меняет поведение людей и банд думаю кому-нибудь пригодится Первая цифра вид людей, вторая цифра абилка Абилка всегда бьёт в ответ 03F1: pedtype 14 add_threat 1 Абилка предательство:гасят друг друга 03F1: pedtype 14 add_threat 16384 Остальные абилки показались мне не интересными
Сообщение отредактировал xyzer - Пятница, 25.03.2011, 04:14
1) В вайсе никак, в Сан андреас не знаю, но навряд ли 2) редактированием DATA\water.dat 2) в DATA\pedstats.dat понизить у нужной банды параметр D (Fear) и повысить E (Temper) . Лучше сразу поставить 0 и 100 соответственно.
Насчет 0592: точно сказать не могу, я пока с этим не экспериментировал, и примеров резкого изменения темперамента банды в ориг. игре не помню..так что помочь не смогу. Но 011A: set actor $40E flags 16 делает конкретного актера агрессивным, но тебе это похоже не нужно...