|
|
|
Канал X2: The Threat: «Учебник по скриптам» |
|
Пишете ли Вы скрипты к X2? |
Уже пишу |
|
26% |
[ 31 ] |
Еще нет, но буду |
|
19% |
[ 23 ] |
Хотел бы, но не хватает знаний |
|
44% |
[ 52 ] |
Лучше скачаю готовые |
|
6% |
[ 7 ] |
Скрипты вообще не нужны |
|
2% |
[ 3 ] |
|
Всего проголосовало : 116 |
|
|
|
Grey Wolf
500 EGP
    Рейтинг канала: 2(17) Репутация: 115 Сообщения: 1677 Откуда: Ростов-на-Дону Зарегистрирован: 31.03.2003
 |
|
Получить реальный размер объекта в метрах можно, если результат функции get size of object разделить на тот же самый коэффициент 222.
_________________ Быстро выпитая рюмка не считается налитой |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Вроде уже знаю скриптовый движек как свои пять пальцев, но по сей день не перестаю удивляться
Как вы думаете, если где-то в скрипте употребляется [THIS], то он выдает объект, на котором исполняется этот скрипт? А ничего подобного!
При вызове какого-либо скрипта командами call script и другими, [THIS] - это параметр, переданный этому скрипту из вызвавшего! И вовсе не обязательно объект, на котором этот скрипт запустится. Пример:
@ = <RefObj> call script <Script Name>: <Parameter>
Так вот, если не используется префикс START, то независимо от значения <RefObj>, скрипт будет запущен в текущем стеке текущего объекта. Но при этом, внутри этого вызванного скрипта [THIS] всегда будет возвращать корректно именно указанный в call script <RefObj>, а вовсе не объект, где скрипт запущен. А на <RefObj> на самом деле ничего не запустится. Также, если к примеру <RefObj> - корабль и он уничтожен, то скрипт, из которого был вызов, может повиснуть.
<RetVar/IF><RefObj> find ship: class or type= <Value> race= <Var/Race> flags= <Var/Number> refobj= <Value> maxnum= <Var/Number> with homebase= <Value>
Возвращает массив кораблей, находящихся на/в <RefObj> имеющих расу "race", у которых база приписки "homebase", отсортированных и выбранных в соответсвии с параметрами "flags" и объектом "refobj". Максимальное количество кораблей в возвращаемом массиве определяется параметром "maxnum".
Имейте ввиду, что в качестве "race" допустимо лишь указание конкретных рас и null (что означает любая раса). Для поиска врагов/нейтральных/друзей используйте соответствующие флаги и указывайте в качестве "refobj" объект по отношению к которому и будут определяться враг/друг.
А вот <RefObj> обязан быть либо сектором, либо станцией, либо кэрриером. В противном случае команда вернет null.
И еще, абсолютно все команды поиска кораблей в секторе, никогда не возвращают корабли, пристыкованные к чему-либо, даже если эти корабли находятся в этом секторе!
|
|
|
serg-314159
97 EGP
 Репутация: 6 Сообщения: 50
Зарегистрирован: 08.06.2004
 |
|
AKM : |
[THIS] - это параметр, переданный этому скрипту из вызвавшего!
|
если устроит, такая аналогия: [THIS] - аналог this С++ (self в Object Pascal,Delphi). Запуск скрипта в стеке объекта - по той же аналогии соответствует созданию потока и вызову метода.
$ship -> call script $myscript: null // SCE
ship->myscript(null); //c++
ship^.myscript(nul); // Obj Pascal - если что не пинайте, его учил давно, детали мог подзабыть
во всех трех случаях внутри myscript this соответствует ship
Видимо, поэтому у меня и проблем с этим не было
_________________ mail-to: serg-314159@mail.ru |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Все верно. Да и у меня никогда проблем не было Просто если запускаем $ship -> call script 'myscript' на отличном от текущего корабле, то надо не забывать внуртри всех циклов 'myscript' ставить проверку:
skip if [THIS]-> exists
return null
Иначе 'myscript' повиснет, когда $ship убьют. Кстати такие баги наиболее опасны, т.к. проявляются крайне редко лишь при определенном стечении обстоятельств
Поэтому и пишу советы и описание команд с рассчетом на новичков, доступным языком (надеюсь)
|
|
|
serg-314159
97 EGP
 Репутация: 6 Сообщения: 50
Зарегистрирован: 08.06.2004
 |
|
Цитата: |
Поэтому и пишу советы и описание команд с рассчетом на новичков, доступным языком (надеюсь)
|
Для новичков может и понятно (не знаю ), а вот для тех, кто имеет некоторую практику (я, например ) - несколько путанно.
Может, имеет смысл излагать и так, и так?
_________________ mail-to: serg-314159@mail.ru |
|
|
Шамон
|
|
Здравствуйте ! Я извиняюсь , но кто знает где можно скачать учебник по скриптам ? я искал ,но не нашел ((
|
|
|
CooL_SnipeR
615 EGP
   Рейтинг канала: 1(2) Репутация: 214 Сообщения: 4050 Заблокирован Откуда: Ясный-Москва Зарегистрирован: 19.03.2004
 |
|
Шамон : |
Здравствуйте ! Я извиняюсь , но кто знает где можно скачать учебник по скриптам ? я искал ,но не нашел ((
|
http://www.elite-games.ru/_egm_scripts/url.php?action=gotourl&url=/downloads/x2/x2rus.zip
Там есть описание скриптописания
_________________ Никогда не бывает так плохо, после чего не может быть еще хуже... |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
@ <RetVar/IF> <RefObj> move to position x=<Var/Number1> y=<Var/Number2> z=<Var/Number3> with precision <Var/Number4> m
Двигаться объекту <RefObj> в точку с указанными координатами до тех пор, пока удаленность <RefObj> от этой точки не станет менее "точности" <Var/Number4>. Эту удаленность(точность) требуется указывать именно в игровых юнитах, а не метрах, не смотря на наличие m после этого параметра. Т.е. желаемую удаленность требуется сначала умножить на 222, а потом подставлять в данную команду.
А вот в аналогичных командах:
@ <RetVar/IF> <RefObj> follow object <Var/Ship> with precision <Var/Number> m
и
@ <RetVar/IF> <RefObj> follow <Var/Ship> with precision <Var/Number> m: timeout=<Var/Number> ms
под точностью (precision) подразумеваются именно метры. Вот такие вот чудеса
|
|
|
Grey Wolf
500 EGP
    Рейтинг канала: 2(17) Репутация: 115 Сообщения: 1677 Откуда: Ростов-на-Дону Зарегистрирован: 31.03.2003
 |
|
Не используйте конструкцию
массив1=массив2
В тестовых скриптиках эта команда вроде работает. А в реальном скрипте, особенно если эта команда внутри цикла, получаешь какую-то пургу. Надо использовать в этом случае команду
массив1=clone array массив2 ...
_________________ Быстро выпитая рюмка не считается налитой |
|
|
AnrDaemon
864 EGP
        Репутация: 37 Сообщения: 12322
Зарегистрирован: 17.10.2004
 |
|
akm : |
From: Моды - новые модели кораблей
создаешь произвольный "7abcd.xml" и "44abcd.xml", где abcd - 4 цифры. В эти файлы пишешь русские и английские имена и описания кораблей (абсолютно в те же самые page и t id) и создаешь скрипт "!init.произволное.имя", состоящий всего из одной строчки:
load text: id=abcd (команда и з раздела General Commands)
Вот и вся работа
|
Вопрос: в качестве id обязательно использовать цифры, или допустимы буквы?
_________________ Люблю свободный полёт... :) |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Строго цифры, причем строго четыре.
Цитата: |
Не используйте конструкцию
массив1=массив2
|
Имя массива есть указатель на массив! Т.е. я очень часто пользуюсь конструкцией массив1=массив2 и никогда никаких проблем не было. Но надо помнить, что реально содержимое массива 2 не копируется, и если массив 2 изменить каким-либо образом, эти изменения мгновенно отразятся на массиве 1. Но если, например, сделать массив2 = find ship..., то переменная массив2 станет указателем уже на другой массив, что был получен командой find, а массив1 при этом будет продолжать ссылаться на предыдущее содержимое массива 2.
Кстати такой подход чертовски удобен при передаче массива другому скрипту в виде параметра либо через глобальную переменную, т.к. фактически передается только указатель и содержимым одного и того же массива можно манипулировать одновременно из нескольких скриптов. Например, для организации совместной работы нескольких кораблей - это то что доктор прописал (см. массив $SentShips в моем скрипте 'akm.ship.cmd.autoload.carrier' пакета автозагрузки носителя)
|
|
|
Пассажир
|
|
2 АКМ:
Ну вот я тебе приведу конкретный пример, а ты объясни, почему так получалось.
Кусок моего скрипта по созданию карты, конкретно создание торговых станций.
Исходные данные - массив груп секторов каждой расы.
1. создается массив1, в который включаются общие для каждой торговой станции ресурсы: апгрейд мотора, каргоотсека и т.д.
2. цикл по выбору расы и соотв конкретной группы секторов этой расы.
в пределах этого цикла конструкция:
массив2=массив1
добавить в массив2 полицейскую лицензию расы
3. цикл по выбору конкретного сектора в группе
в пределах этого цикла:
массив3=массив2
добавить с некоторым случайным выбором в массив 3 прочие ресурсы - кристаллы, сателиты и т.д.
4. вызов скрипта, создающего станцию с аргументами массив3, сектор, раса и т.д.
5. закончить все циклы
Так вот, первая станция создается, как положено. Затем ресурсы начинают "накапливаться", наконец в массив3 попадают практически ВСЕ ресурсы, которые потенциально могут туда попасть. Кроме этого, при переходе на другую расу, прежние полицейские лицензии не исчезают а тоже остаются в массиве3.
Когда я после вызова скрипта добавил строчку "resize массив3 to 0", наоборот, все лицензии и апгрейды мотора исчезли. Но ведь в массиве 2 они должны были остаться!!! и оттуда при выборе нового сектора перейти в массив3! А хрен там.
А вот стоило мне заменить "=" на функцию clonе array, все проблемы исчезли.
Вот вечер борьбы с этими массивами и породил мой предыдущий пост
|
|
|
Grey Wolf
500 EGP
    Рейтинг канала: 2(17) Репутация: 115 Сообщения: 1677 Откуда: Ростов-на-Дону Зарегистрирован: 31.03.2003
 |
|
Ну ясен пень, это я пассажир
Откуда этот хренов анлогин постоянно? Пишу сообщение залогиненный, а отправляется уже от пассажира
_________________ Быстро выпитая рюмка не считается налитой |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Ну так все правильно, так идолжно все работать, как ты описал Ведь переменная-массив есть всего лишь указатель на массив и операция присвоения массив2=массив1 копирует лишь адрес массива 1 в переменную массив2. В итоге, все операции в различных частях твоего цикла на самом деле производились с одним и тем же массивом, вот ресурсы и накапливались Решение проблемы в твоем примере верное - использовать команду clonе array (либо copy array, либо append value to array).
Только не надо утверждать, что конструкция массив1=массив2 не работает
ЗЫ. А команда "resize массив3 to 0" произвела resize всех трех массивов в 0
|
|
|
Grey Wolf
500 EGP
    Рейтинг канала: 2(17) Репутация: 115 Сообщения: 1677 Откуда: Ростов-на-Дону Зарегистрирован: 31.03.2003
 |
|
2 АКМ: операция "=" с переменными работает-то совсем не так, как с массивами. Вот собсно об этом и спич
Вот еще сведения для учебника:
Чтобы при старте новой игры на новой карте, оказаться в заданном секторе карты и на заданном корабле с определенным барахлем в трюме и нужным кол-вом денег на счете, нужно создать скрипт с именем
galaxy.имя_файла_карты.initplayership
в котором такие строчки:
1. выбрать сектор с нужными координатами
2. plship-> создать в этом секторе корабль, принадлежащий пилоту
3. набить его нужным барахлом и.т.д.
4. return plship
Имя файла карты в имени скрипта ессно указывается без расширения .xml
_________________ Быстро выпитая рюмка не считается налитой |
|
|
AnrDaemon
864 EGP
        Репутация: 37 Сообщения: 12322
Зарегистрирован: 17.10.2004
 |
|
akm : |
Строго цифры, причем строго четыре.
|
Отлично! У меня тут идейка родилась сделать установочный скрипт для модов от разных пилотов. И не только для модов, конечно.
Как родится что-то дельное - скажу.
_________________ Люблю свободный полёт... :) |
|
|
Finist
1817 EGP
              Рейтинг канала: 5(131) Репутация: 391 Сообщения: 12170 Откуда: Рязань РОССИЯ Зарегистрирован: 25.12.2003
 |
|
Обновил хелп-архив по скриптам. Добавил то, что выложено в этой теме. Взять можно здесь
P.S. Модераторам: может перенесёте в соответсвующий раздел?
_________________ Про модераторов сказать можно много разного, вот только написать нельзя... |
|
|
akm
470 EGP
    Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002
 |
|
Finist, извини, но проявил бы хоть немного усердия и отфильтровал материал из данной темы? Зачем народу читать три (!) различных описания ряда команд, тем более что 2 из них ошибочные!?
Подсказка: корректные описания - те, что последние.
И еще маленький совет: в цивилизованном мире принято указывать авторов любого материала. А в твоем архиве нет упоминания даже о Mad Kuzia.
|
|
|
Finist
1817 EGP
              Рейтинг канала: 5(131) Репутация: 391 Сообщения: 12170 Откуда: Рязань РОССИЯ Зарегистрирован: 25.12.2003
 |
|
2 akm
Сделаю в скором времени. Нет проблем. Всё будет в одном файле, с расцветкой как в этой теме.
_________________ Про модераторов сказать можно много разного, вот только написать нельзя... |
|
|
Grey Wolf
500 EGP
    Рейтинг канала: 2(17) Репутация: 115 Сообщения: 1677 Откуда: Ростов-на-Дону Зарегистрирован: 31.03.2003
 |
|
2 Finist:
В хелпе Димакса-Пегасыча тож есть раздел по скриптам. Я туда кое-что в свое время писал, в твоем хелпе этого нет. Если уж делать еще один хелп, имеет смысл в нем свести воедино всю информацию, что счас по разным источникам раскидана.
|
|
|
|
|
|
Канал X2: The Threat: «Учебник по скриптам» |
|