|
|
|
Канал X3: Terran Conflict »
X3: Farnham's Legacy: «[ДИСКУС] Вопросы и помощь в написании скриптов и модов» |
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
Карта Скорпа в X3 Farnham's Legacy не показывает апгрейды на доках.
Команда get tradeable ware array from station похоже теперь на добавляет апгрейды в массив, только товары.
Попробовал поправить скрипт ace.service.assembly.inf.stat
Cкрытый текст (кликните здесь для просмотра)
Код: |
025 |$msg=$msg + $race.station + $new.string
026 * --------------------------------------------------------------------------------
027 *$array.ware=$station -> get tradeable ware array from station
028 *$m=size of array $array.ware
029 * --------------------------------------------------------------------------------
030 * ================================================================================
031 |$array.ware=$station ->get products table: include equipment=[TRUE]
032 |$ware=get next key: table=$array.ware key=[NULL]
033 |while$ware
034 * ================================================================================
035 * --------------------------------------------------------------------------------
036 *while$m
037 *dec $m=
038 *$ware=$array.ware[$m]
039 * --------------------------------------------------------------------------------
040 ||$price.ware=$station -> get price of ware $ware
041 ||$amount.ware=$station -> get amount of ware $ware in cargo bay
042 ||$free.amount.ware=$station -> get free amount of ware $ware in cargo bay
043 ||$maintype.ware=get maintype of ware $ware
044 ||$string='+' + $ware + '; ' + $price.ware + '; ' + $amount.ware + '; ' + $free.amount.ware + '; ' + $maintype.ware
045 ||$msg=$msg + $string + $new.string
046 * ================================================================================
047 ||$ware=get next key: table=$array.ware key=$ware
048 * ================================================================================
049 |end |
|
между * ====== добавленные команды
между * ------ закомментированы старые
вроде работает
p.s. только не понял почему в таблицах один ключ всегда null, пришлось исключать проверкой. решено, код обновил.
======================================================
Библиотека необходимых утилит - для мододелов
======================================================
Последний раз редактировалось: alexalsp (09:57 22-05-2024), всего редактировалось 2 раз(а) Последний раз редактировалось: gav622007 (15:37 06-06-2021), всего редактировалось 4 раз(а) |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1053) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
gav622007 : |
p.s. только не понял почему в таблицах один ключ всегда null
|
А для чего лишние телодвижения с get next key и перебором всей таблицы делал, вот так разве не проще и не будет никаких нулей.
Код: |
$table.ware=$station ->get products table: include equipment=[TRUE]
$keys = get keys: table= $table.ware
$size = size of array $keys
while $size
dec $size
$ware = $keys [$size]
end |
_________________ Очевидное-невероятное |
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
я до такого не додумался, это типа из таблицы массив получаем?
была такая мысль, но не понял как сделать.
спасибо попробую
|
|
|
longreed
96 EGP
 Рейтинг канала: 5(211) Репутация: 6 Сообщения: 165
Зарегистрирован: 19.02.2020
 |
|
У вас происходит обращение к несуществующему элементу <ключ><значение>, которое вы потом обрабатываете, а его не надо, так как цикл while должен завершаться. Если используете такую конструкцию нужно:
Код: |
$array.ware=$station ->get products table: include equipment=[TRUE]
*-- Получить первый элемент в таблице --
$ware=get next key: table=$array.ware key=[NULL]
while $ware
*-- Обработать элемент ---
* ........ тут вы создаете свой $msg .....
* -------------------------------
* -- Перейти к следующему, если он не существует, то цикл завершится ---
$ware=get next key: table=$array.ware key=$ware
end |
|
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1053) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
gav622007 : |
это типа из таблицы массив получаем?
|
Нет, здесь получаем массив ключей данной таблицы, коими являются товары.
_________________ Очевидное-невероятное |
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
DNA78, longreed, спасибо за помощь, выбрал вариант longreed (короче) .
Код в своём посте обновил, может кому пригодится.
DNA78 : |
Нет, здесь получаем массив ключей данной таблицы, коими являются товары.
|
я это и имел ввиду, может неправильно выразился
Последний раз редактировалось: gav622007 (15:18 06-06-2021), всего редактировалось 1 раз |
|
|
longreed
96 EGP
 Рейтинг канала: 5(211) Репутация: 6 Сообщения: 165
Зарегистрирован: 19.02.2020
 |
|
gav622007 : |
DNA78, longreed, спасибо за помощь, выбрал вариант longreed (короче) .
Код в своём посте обновил, может кому пригодится.
|
Тут оба варианта корректны и оба будете использовать, в зависимости от ситуации:
Мой вариант предполагает типичное использование DATATYPE_TABLE. Но этот тип данных имеет ряд серьезных ограничений. Одно из которых, невозможность менять порядок элементов.
По этой причине, если вам нужен измененный порядок элементов, вам необходимо преобразовать DATATYPE_TABLE в DATATYPE_ARRAY, и уже работать с ним как с массивом, что как раз ярко демонстрирует пример DNA78, в котором используется обратный порядок ключей.
|
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
я думаю в данном случае это не критично, выбрал вариант попроще
главное, что карта теперь всё показывает
Последний раз редактировалось: gav622007 (15:36 06-06-2021), всего редактировалось 1 раз |
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
Как скриптом узнать куда направляется корабль (в какой сектор)? Перебрал все команды, не получается. Ещё и раскидали по разделам, запаришься искать, со старым SE мне было проще.
|
|
|
longreed
96 EGP
 Рейтинг канала: 5(211) Репутация: 6 Сообщения: 165
Зарегистрирован: 19.02.2020
 |
|
gav622007 : |
Как скриптом узнать куда направляется корабль (в какой сектор)? Перебрал все команды, не получается. Ещё и раскидали по разделам, запаришься искать, со старым SE мне было проще.
|
Это не простой вопрос, по крайней мере для меня. Ни когда этого не делал, но по всей видимости можно через команду $Ship -> get command. Вернет текущую команду которую выполняет корабль в таком виде, например:
COMMAND_DOCKAT
И в зависимости от выполняемой команды, нужно запрашивать цель target или target2
Если корабль стыкуется со станцией(COMMAND_DOCKAT) то сектор можно получить:
Код: |
$ShipTarget = $Ship -> get command target
$Sector = $ShipTarget -> get sector |
Но если корабль летит что то закупать(COMMAND_GET_WARE), то тут уже нужно через target2, так как target содержит товар:
Код: |
$ShipTarget = $Ship -> get command target2
$Sector = $ShipTarget -> get sector |
При этом корабль может лететь в сектор(COMMAND_MOVE_SECTOR), тогда target будет содержать, непосредственно сектор:
Код: |
$Sector = $Ship -> get command target |
Как видите, этот способ(если вообще его так можно назвать) далеко не универсален и не удобен, если точно неизвестно какую команду будет выполнять целевой корабль. Возможно кто то предложит вам более нормальный способ
|
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
Спасибо за ответ, эти варианты я пробовал
$Ship -> get command показывает COMMAND_STATION_REBUILD
$ShipTarget = $Ship -> get command target
$Sector = $ShipTarget -> get sector
и
$ShipTarget = $Ship -> get command target2
$Sector = $ShipTarget -> get sector
выдают null
вот я и застрял, может тут вообще варианта нет?
Последний раз редактировалось: gav622007 (18:22 08-06-2021), всего редактировалось 1 раз |
|
|
longreed
96 EGP
 Рейтинг канала: 5(211) Репутация: 6 Сообщения: 165
Зарегистрирован: 19.02.2020
 |
|
С этой командой все сложнее, она устанавливается в скрипте !god.tl.deliver.factory без параметров, соответственно target и target2 всегда будут возвращать значение null. Проблема заключается в том, что команда set command носит просто информативный характер, и параметры в ней необязательны.
К сожалению, я больше не знаю способа, как вытащить закрытые переменные, в частности сектор назначения из скрипта. Возможно он есть, просто я его не знаю.
|
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
это уже подсказка, надо поковырять этот скрипт, может добавить туда лок. переменную с сектором, и из неё получать?
спасибо за помощь
|
|
|
longreed
96 EGP
 Рейтинг канала: 5(211) Репутация: 6 Сообщения: 165
Зарегистрирован: 19.02.2020
 |
|
gav622007 : |
это уже подсказка, надо поковырять этот скрипт, может добавить туда лок. переменную с сектором, и из неё получать?
спасибо за помощь
|
Это самый простой способ и нежелательный Я имел ввиду без вмешательства.
В действительности, в скрипт передается массив который состоит из позиции X,Y,Z и сектор назначения.
Последний раз редактировалось: longreed (20:23 08-06-2021), всего редактировалось 1 раз |
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
вот оттуда и надо попробовать выдернуть без вмешательства
|
|
|
longreed
96 EGP
 Рейтинг канала: 5(211) Репутация: 6 Сообщения: 165
Зарегистрирован: 19.02.2020
 |
|
gav622007 : |
вот оттуда и надо попробовать выдернуть без вмешательства
|
Я не нашел пока, от куда передаются аргументы в скрипт, но это похоже и не нужно. Так как в !god.tl.deliver.factory происходит проверка, годится ли TL для установки станции и после дается команда на ее установку.
Поэтому, после проверки, уже точно зная что TL ее получит, можно и выдернуть сектор назначения.
Последний раз редактировалось: longreed (20:35 08-06-2021), всего редактировалось 1 раз |
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
да, я смотрю этот скрипт, но локальных переменных там нет, только добавлять
вот есть массив
046 * TL flies to target sector
047 $target.sector = $target.position[3]
но как его получить без этого скрипта?
Последний раз редактировалось: gav622007 (20:55 08-06-2021), всего редактировалось 1 раз |
|
|
longreed
96 EGP
 Рейтинг канала: 5(211) Репутация: 6 Сообщения: 165
Зарегистрирован: 19.02.2020
 |
|
gav622007 : |
да, я смотрю этот скрипт, но локальных переменных там нет, только добавлять
|
Там все переменные локальные, они же и закрыты в скрипте. Глобальных нету. Тут только править скрипт, добавляя свой код, поэтому этот способ и нежелательный.
Получить можно по-разному, добавить свою глобальную переменную, либо вызвать свой скрипт, передав ему в качестве аргументов, все нужные переменные. Дело в том, что я не представляю полную картину, для чего вы хотите получить сектор и что потом будите делать с ним, мне трудно сказать как это можно реализовать.
Последний раз редактировалось: longreed (21:01 08-06-2021), всего редактировалось 1 раз |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1053) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Есть у кого нибудь опыт работы с visual studio 2008? А то я тут с кодом X-Studio воюю и ни как не могу победить одну хрень:
Код: |
typedef BOOL (*CHANGE_WINDOWS_MESSAGE_FILTER_EX)(HWND, UINT, DWORD, CHANGEFILTERSTRUCT*); |
на этой строке выдаёт ошибку - error C2061: синтаксическая ошибка: идентификатор "CHANGEFILTERSTRUCT",
но что самое интересное в visual studio 2019 этой ошибки нет. Как мне это победить в visual studio 2008?
_________________ Очевидное-невероятное
Последний раз редактировалось: DNA78 (19:17 19-06-2021), всего редактировалось 3 раз(а) |
|
|
gav622007
73 EGP
 Рейтинг канала: 5(142) Репутация: 22 Сообщения: 186 Откуда: Советский союз Зарегистрирован: 22.09.2007
 |
|
Есть такая команда:
%0get script argument pardef: scriptname=%1, argument=%2
если я правильно понял, возвращает аргумент %2 из скрипта %1, а как получить в переменную %1, скрипт, который выполняется на объекте, если это возможно?
|
|
|
|
|
|
Канал X3: Terran Conflict ->
X3: Farnham's Legacy: «[ДИСКУС] Вопросы и помощь в написании скриптов и модов» |
|