Я сейчас работаю над созданием продвинутого непися, способного непрерывно гоняться за игроком по всему Моровинду, несмотря на застревания в кустах и прочие тупые выходки AI...
Сколько крови это у меня выпило - не счесть, начиная с отсутствия функции "переместить объект к игроку" (PlaceAtPC создаёт новый экземпляр), и кончая некультурным поведением объектных скриптов, которые тихо отключаются когда игрок переходит на соседнюю клеточку, тем самым "замораживая" объект, и не позволяя гарантировать реакцию на ускользание игрока...
Пока что, я нашёл следующий обход:
создаём (Н) непися, (О) класс непися-охотника, (А) объект-активатор, (Г) глобальный скрипт. Все классы объектов со своими скриптами.
(А) нужен только для того, чтобы в своём скрипте хранить счётчик созданных охотников СЧ и критерий тайм-аута ТА: к переменным глобального скрипта объекты обращаться не могут.
Итак, вся эта система в работе:
(Н), если атакован, запускает (Г), который гарантированно будет работать, на сколько бы клеток игрок ни ушёл. На этом роль скрипта (Н) заканчивается... Ах да, ещё при смерти (Н) останавливает (Г).
(Г) состоит из команд:
- если (Н) включён, далеко от игрока и не видит его, то: отключить (Н), установить (А).СЧ в 1, и при помощи PlaceAtPC создать у игрока за спиной (О)
- увеличить ТА на время, прошедшее с предыдущего кадра
- если ТА больше контрольного интервала, значит (О) "замёрз", надо создавать нового. Если при этом удовлетворяются некие сложные {условия случайной задержки преследования}, то увеличить (А).СЧ на 1 и создать у игрока за спиной (О).
Скрипт (О):
- при создании однократно: записать в собственный ИД (А).СЧ
- если собственный ИД не равен (А).СЧ, то выключить себя и выйти (например, игрок вернулся в клеточку, где торчал замёрзший (О), и его скрипт снова запустился, но за это время уже был создан следующий. Нам ведь не нужно, чтобы они размножались?.. Старый должен исчезнуть)
- каждый кадр сбрасывать (А).ТА в 0, чтобы показать (Г), что скрипт работает (иных способов я не нашёл)
- если игрок меняет клеточку, проверять расстояние. Если оно больше 2000000000, значит игрок перешёл между Exterior и Interior, и надо выключить себя.
- если игрок дальше 1000 и не виден (GetLOS, Player == 0), то выключить себя: велика вероятность, что мы просто застряли в кустах
Уф... Надеюсь, что у меня есть шансы, что вся эта порнография заработает-таки... Если кто знает менее извращённые способы заставить неписей гоняться за игроком и не отставать - милости прошу поделиться, а то у меня от борьбы с этими скриптами уже мозги в трубочку загибаются...
Сколько крови это у меня выпило - не счесть, начиная с отсутствия функции "переместить объект к игроку" (PlaceAtPC создаёт новый экземпляр), и кончая некультурным поведением объектных скриптов, которые тихо отключаются когда игрок переходит на соседнюю клеточку, тем самым "замораживая" объект, и не позволяя гарантировать реакцию на ускользание игрока...
Пока что, я нашёл следующий обход:
создаём (Н) непися, (О) класс непися-охотника, (А) объект-активатор, (Г) глобальный скрипт. Все классы объектов со своими скриптами.
(А) нужен только для того, чтобы в своём скрипте хранить счётчик созданных охотников СЧ и критерий тайм-аута ТА: к переменным глобального скрипта объекты обращаться не могут.
Итак, вся эта система в работе:
(Н), если атакован, запускает (Г), который гарантированно будет работать, на сколько бы клеток игрок ни ушёл. На этом роль скрипта (Н) заканчивается... Ах да, ещё при смерти (Н) останавливает (Г).
(Г) состоит из команд:
- если (Н) включён, далеко от игрока и не видит его, то: отключить (Н), установить (А).СЧ в 1, и при помощи PlaceAtPC создать у игрока за спиной (О)
- увеличить ТА на время, прошедшее с предыдущего кадра
- если ТА больше контрольного интервала, значит (О) "замёрз", надо создавать нового. Если при этом удовлетворяются некие сложные {условия случайной задержки преследования}, то увеличить (А).СЧ на 1 и создать у игрока за спиной (О).
Скрипт (О):
- при создании однократно: записать в собственный ИД (А).СЧ
- если собственный ИД не равен (А).СЧ, то выключить себя и выйти (например, игрок вернулся в клеточку, где торчал замёрзший (О), и его скрипт снова запустился, но за это время уже был создан следующий. Нам ведь не нужно, чтобы они размножались?.. Старый должен исчезнуть)
- каждый кадр сбрасывать (А).ТА в 0, чтобы показать (Г), что скрипт работает (иных способов я не нашёл)
- если игрок меняет клеточку, проверять расстояние. Если оно больше 2000000000, значит игрок перешёл между Exterior и Interior, и надо выключить себя.
- если игрок дальше 1000 и не виден (GetLOS, Player == 0), то выключить себя: велика вероятность, что мы просто застряли в кустах
Уф... Надеюсь, что у меня есть шансы, что вся эта порнография заработает-таки... Если кто знает менее извращённые способы заставить неписей гоняться за игроком и не отставать - милости прошу поделиться, а то у меня от борьбы с этими скриптами уже мозги в трубочку загибаются...