Исправление досадных недоразумений со взятыми на абордаж кораблями
X3 Terran Conflict / X3 Земной конфликт
 
X3 Terran conflict  
 

На сайте онлайн (человек): 72



 



Исправление досадных недоразумений со взятыми на абордаж кораблями

Форумы: Terran Conflict (X3TC) / X3 Земной конфликт / Скрипты и моды для X3 Terran Conflict / Исправление досадных недоразумений со взятыми на абордаж кораблямиВойти
Тема устарела

Количество: 3
1
Исправление досадных недоразумений со взятыми на абордаж кораблями
27.08.2010 21:19:17
Алан

Репутация: 940
Сообщений: 77
Регистрация: 26.08.2010
Здравствуйте, уважаемые завсегдатаи форума! Большинство из вас, конечно же, встречало в игре ситуации, вызывающие недоумение и раздражение. Вот два примера, связанные со взятыми на абордаж кораблями:
  1. Если захватить TL, который перевозит станцию (см., например, тут.), то он продолжает следовать заложенной в него программе "лететь в такой-то сектор и построить там станцию". Им очень трудно управлять, потому что прежняя программа постоянно берет на себя контроль.
  2. В миссии на убийство можно захватить корабль, пилотируемый указанной жертвой, и миссия будет засчитана. Однако этот корабль через небольшое время будет  уничтожен игрой, так что приходится его быстренько продавать.
Обе эти ситуации я считаю недоработкой: захваченный корабль должен принадлежать игроку, как любой другой, и не должен выполнять никаких прежних скриптовых  команд, не должен и удаляться. Возникает вопрос: можно ли "исправить" игру самостоятельно? Покопался немного - вот что получается.

1. Захваченный TL, перевозящий станцию. Управление производится стандартным скриптом !god.tl.deliver.factory После того, как скрипт сымитировал полет к верфи и покупку станции, она появляется в грузовом отсеке, и вызывается скрипт !move.movetosector для полета к тому сектору, где должна быть построена станция. По прибытии в сектор главный скрипт снова получает управление и вызывает скрипт !move.movetoposition, чтобы подлететь к будущему месту расположения станции. Станция удаляется из трюма, скрипт дает TL команду "нет команд", ну а строится станция уже вне скрипта.
Игроки идут на большие ухищрения: либо прыгнуть на TL со станцией в свой сектор и быстренько построить ее, а потом пускай корабль летит, куда ему надо, либо пристыковать TL к своему доку оборудования, выгрузить станцию на него, а позже перегрузить ее в другой TL. Первый способ не всегда удобен, поскольку станцию лучше строить, когда удобно тебе, а не когда вынуждают. Второй способ труден  в исполнении из-за "сумасшествия" автопилота TL, да и док оборудования требуется. К тому же игра может и зависнуть, как сообщали игроки.

У меня версия игры 2.7.1. Я для себя реализовал третий способ - путем редактирования стандартного скрипта
!god.tl.deliver.factory В двух местах, а именно после вызова !move.movetosector

 Код:
  1. 0045
    	
    skip if [SECTOR] == $target.sector
  2. 0046
    	
      = [THIS]->call script '!move.movetosector' : targetsector=$target.sector
 

и после вызова !move.movetoposition (в районе строки 0083 исходного скрипта) я вставил одинаковые блоки команд:

 Код:
  1. $TL.race = [THIS]->get owner race
  2. if $TL.race == {Player}
  3.   [THIS]->set command: {COMMAND_NONE 0}
  4.   $TL.name = [THIS]->get name
  5.   $TL.sector = [THIS]->get sector
  6.   $TL.msg = sprintf: fmt='%s докладывает: прибыл в сектор %s, готов к службе.', $TL.name, $TL.sector, null, null, null
  7.   = wait 200 ms
  8.   send incoming message $TL.msg to player: display it=[FALSE]
  9.   return [FALSE]
  10. end
 

Работает это так. Игрок, как обычно, берет на абордаж TL, после чего оставляет его в покое и отправляется по своим делам. Ну, можно выделить TL сопровождение. TL летит по заданной программе в нужный сектор (поскольку !move.movetosector продолжает выполняться), а вот там останавливается и рапортует игроку "готов!". По сектору он уже не летит, станцию не "строит", она остается в трюме. Если же игрок захватил TL в секторе назначения, тот продолжает лететь к месту установки станции (под управлением скрипта !move.movetoposition), а вот там уже рапортует. Корабль со станцией в трюме теперь полностью ваш, и больше никаких глюков.
Можно еще после абордажа перебросить на TL прыжковый двигатель, навигационный программный модуль и батареи и выставить в командной консоли Автопрыжок. Лучше пусть сам по скрипту прыгнет, команду на прыжок отдавать не стоит (насчет последнего еще потестировать бы, но вот если не вмешиваться, все будет в ажуре).
Я считаю, что такой способ гораздо удобнее тех, которые вынужденно применяют игроки сейчас, чертыхаясь налево и направо. Разумеется, замена стандартного скрипта вызывает надпись "modified" в игре.
Наверняка существуют более элегантные способы, прошу опытных людей высказаться.
Могу предположить, попробовать вешать на TL при абордаже какую-то локальную переменную, которая затем бы проверялась в !move.movetosector и вызывала его останов. Хотя, конечно, "портить" такой ходовой скрипт не хотелось бы. Или вообще можно при успешном абордаже остановить все скрипты, под которыми находится корабль? Если можно, то почему разработчики так не сделали?
В общем, мой способ работает, и этим он хорош. Но можно ведь сделать лучше?

2. Миссия на убийство. Предполагаю, что проблема в 11.cat\director\0.1 Assassinate 1.pck Там есть проверки перед удалением кораблей сопровождения главной цели, не были ли они захвачены игроком. Почему-то главная цель, в отличие от сопровождения, все равно удаляется. Я пока не очень разобрался, в чем там дело. Может быть, кто-то подскажет и, таким образом, можно будет избавиться от этой досадной проблемы?

Спасибо за внимание всем, кто дочитал.

Редактировалось 2 раз (а). Последний раз 28.08.2010 16:32:31.

28.08.2010 08:20:35
X3m

Репутация: 0
Сообщений: 38
Регистрация: 13.07.2010
2. Я так понимаю в "миссии по убийству" ты имеешь в виду 1-ую миссию за корпорацию Атрея?Если не ошибаюсь там надо уничтожить Паранидский м1?Так вот до взятия этой миссии, именно этот корабль не существует, а после взятия задания на его уничтожение он появляется,и при этом не надо забывать что на миссию отведено время и если при этом захватить корабль и не успеть отогнать его на верфь то он просто исчезнет.А если самому сидеть за штурвалом в это время то получишь странный баг.(частично использована информация с форума).
У меня была эта проблема только сдесь,за Атрею, в остальных захватах TL и других кораблей проблем не было вообще.
28.08.2010 16:05:08
Алан

Репутация: 940
Сообщений: 77
Регистрация: 26.08.2010
 X3m писал(а):
2. Я так понимаю в "миссии по убийству" ты имеешь в виду 1-ую миссию за корпорацию Атрея?
 

Я имею в виду любую миссию, где заказано убийство определенного лица. В частности, подобные миссии дают корпорации. Да, корабль не существует, затем появляется, а по истечении времени миссии исчезает. Речь как раз о том, чтобы, будучи захвачен игроком, он не исчезал. Раз уж миссия засчитывается не только при уничтожении корабля, но и при абордаже, ничего незаконного в таком желании нет. Я расцениваю исчезновение захваченного корабля как недоработку Egosoft, если хотите - баг.

 X3m писал(а):
У меня была эта проблема только сдесь,за Атрею, в остальных захватах TL и других кораблей проблем не было вообще.
 

Проблемы бывают с захваченным игроком TL, который перевозит в трюме станцию и выполняет команду "Восстановить станцию". Это особый случай, довольно редкий на практике (если не охотиться за перевозимыми станциями специально), но проблемы там есть всегда.

Редактировалось 2 раз (а). Последний раз 28.08.2010 16:30:12.

1


Список игр