Тема: Модульная система. Вопросы и ответы.  (Прочитано 332773 раз)

Ответ #475 25 Августа, 2012, 02:23
0
проверь.
Ответ #476 25 Августа, 2012, 02:35
0
Проверил. Поставил число 5.
Замер одного выполнения: 5.05 секунд
Замер 5 последовательных выполнений: 25,13 секунд.
С учетом человеческого фактора вполне можно сказать, что 5 - это 5 секунд.
Погрешность вычислений составила 2,4% =)
« Последнее редактирование: 25 Августа, 2012, 02:40 от Arantir »
Ответ #477 25 Августа, 2012, 06:41
0
Люди, помогите! Кто нибудь пробовал уменьшить частоту перехода лордов от короля к королю?

Частые перебежчики сильно портят все впечатление от игры, перебегают нереально часто! Пожалуйста посоветуйте-научите как это исправить через МС.
Ответ #478 25 Августа, 2012, 09:04
0
Arantir, дело в том, что мне нужно что бы этот триггер проверялся постоянно, а не только на спауне агента. А ti_on_agent_spawn только так и работает, верно? Или я неправильно знаю?

Легионер, не помогло. Дело в том, что при запуске карты игроков на ней нет. Скрипт же всё равно берёт несуществующее количество игроков, ищет там активных а потом уже смотрит, есть ли у них в руках определённый предмет. Так как агентов-то и нет как таковых до спауна, то эта строка:

(agent_get_wielded_item,":atm",":other",0),

будет ругаться на неверного (несуществующего) агента ":other", да так, что безвозвратно (буквально) загадит чат первому подключившемуся к серверу игроку. Не катастрофа, конечно, учитывая что после спауна никаких проблем не будет, однако...
Ответ #479 25 Августа, 2012, 09:16
0
если проблема только в загаживании, то можно попробывать отключить сообщения. не знаю правда в мульте будет работать, в сингле работает -
(set_show_messages, <value>), #0 disables window messages 1 re-enables them.
До спауна первого игрока
Ответ #480 25 Августа, 2012, 11:18
0
Андреус Ас, твой триггер и так по идее выполняется постоянно, раз за разом.
Ошибка скорее логическая:
Цитировать (выделенное)
(0, 0, 0, [
       (get_max_players, ":num_players"),                   
       (try_for_range, ":player", 0, ":num_players"),
       (ge, ":player", 1),
       (player_is_active, ":player"),
       (player_get_agent_id, ":other", ":player"),
       (agent_get_wielded_item,":atm",":other",0),

Ты делаешь так, как будто ":player" - это уже некий объект, представляющий игрока. но это не так. Это всего лишь переменная, инкрементируемая циклом. В данном случае поочередно принимающая значения 0, 1, 2, ..., ":num_players". Строка "(ge, ":player", 1)" как бы бессмысленна.
В данном случае ":player" - это некий ID игрока из списка игроков. Чтобы проверить, есть ли действительно агент с таким ID, нужно попробовать у этого агента извлечь какое-то значение и проверить его на корректность.
Например, "(player_get_agent_id, ":other", ":player")". Если с ID равным ":player" нету ни одного агента, то, скорее всего, в ":other" попадет значение -1.
Соответственно надо сделать как-то так:
Цитировать (выделенное)
(0, 0, 0, [
       (get_max_players, ":num_players"),                   
       (try_for_range, ":player", 0, ":num_players"),
         (player_is_active, ":player"),
         (player_get_agent_id, ":other", ":player"),
         (ge, ":other", 0), # Агент существует
         (agent_get_wielded_item,":atm",":other",0),

Это только пример, и, возможно, не решение твоей проблемы. Просто найти что-то, что могло бы указывать на то, что агент находится на карте.

Можно, например, вот так:
Цитировать (выделенное)
(ti_on_agent_spawn, 0, 0, [],
  [
    (store_trigger_param_1, ":agent_no"),
    (agent_set_slot, ":agent_no", 999, 1), # set as spawned
  ]),
(0, 0, 0, [
       (get_max_players, ":num_players"),                   
       (try_for_range, ":player", 0, ":num_players"),
         (player_is_active, ":player"),
         (player_get_agent_id, ":other", ":player"),
         (agent_get_slot, ":spawned", ":player", 999),
         (gt, ":spawned", 0),

         (agent_get_wielded_item,":atm",":other",0),
         ...
« Последнее редактирование: 25 Августа, 2012, 11:31 от Arantir »
Ответ #481 25 Августа, 2012, 19:53
0

Третья цифра - через какое время проверяется этот триггер, если он сработал. ti_once фактически означает "больше не проверять".
Ответ #482 25 Августа, 2012, 20:02
0
Третья цифра - через какое время проверяется этот триггер, если он сработал. ti_once фактически означает "больше не проверять".
В другой интерпретации ti_once означает "запустить через ∞ сек.", т.е. никогда. Ну это если сводить все к одной основе (временному интервалу).
Ответ #483 25 Августа, 2012, 20:03
0
Цитировать (выделенное)
Третья цифра - через какое время проверяется этот триггер, если он сработал. ti_once фактически означает "больше не проверять".
согласен...
Ответ #484 25 Августа, 2012, 20:44
0
Ну вас и занесло с этим скриптом :)
Достаточно тупо поставить перед циклом проверку на то что есть один или больше игроков.
Кроме того есть смысл проверять существует ли агент у игрока.
(0, 0, 0, [
       (get_max_players, ":num_players"),                   
       (ge, ":num_players", 1),
       (try_for_range, ":player", 0, ":num_players"),
       (player_is_active, ":player"),
       (player_get_agent_id, ":other", ":player"),
       (ge ":other", 0),
       (agent_get_wielded_item,":atm",":other",0),
Чисто для информации. Комментарий самих разработчиков по поводу времени срабатывания триггера:
Цитировать (выделенное)
(1, 0, 0, [], #do this in every new frame, but not at the same time
Ответ #485 26 Августа, 2012, 13:55
0
Спасибо за подробный разбор триггера! :thumbup:
Ответ #486 28 Августа, 2012, 08:50
0
Всем спасибо за помощь, вроде бы вариант с отключением-включением чата работает.
Ответ #487 27 Сентября, 2012, 12:57
0
Доброго времени суток!

Есть небольшой вопрос по модульке скорее философского, нежели практического характера :) буду рад, если кто поможет.
Насколько я понимаю, в модульке есть возможность использовать пользовательские переменные (слоты). Вот про них и хотелось бы узнать:

1. Как они объявляются, как используются, как уничтожаются (если уничтожаются вообще)?
2. Какой у них срок жизни и область видимости?

Например: можно ли привязать к агенту слот, задать ему значение в триггере, прописанном в module_items.py, а затем уже в module_missions_templates.py проверять значение этого слота? Или можно ли привязать слот к трупсу, задавать его в одной миссии, а проверять в другой?

Если у кого-то еще под рукой окажутся наглядные примеры использования, буду благодарен до конца дней своих.
Ответ #488 27 Сентября, 2012, 13:02
+1
Пояснение понятия Слот.

(автор Dargor, )

Ответ #489 27 Сентября, 2012, 13:09
0
Спасибо огромное! Все понятно и по полочкам. Еще небольшой вопрос.
Можно ли в слот писать не число, а например, позицию, которая, если я правильно понимаю, по сути набор из 6-и чисел.
Ответ #490 27 Сентября, 2012, 18:57
0
Можно записать айди позиции, но это не лучший вариант, так как другие скрипты могут изменить данные которые хранит позиция. Лучше сохранять нужные данные позиции в отдельные слота, это избавит от потенциальных багов.
Ответ #491 27 Сентября, 2012, 21:55
0
Спасибо огромное! Все понятно и по полочкам. Еще небольшой вопрос.
Можно ли в слот писать не число, а например, позицию, которая, если я правильно понимаю, по сути набор из 6-и чисел.
По идее не 6, а 9, там ещё масштабирование есть.
Вытащить все нужные компоненты в fixedpoint (position_get_*, position_get_scale_* , position_get_rotation_around_* ) и записать в слоты.
Более простого способа не знаю.

PS у позиции есть ещё origin, т.е. ещё 3 компоненты, вроде как.
« Последнее редактирование: 27 Сентября, 2012, 22:12 от Rongar »
Ответ #492 28 Сентября, 2012, 00:43
0
Ну мне только трех координат хватит :) Спасибо большое!
Ответ #493 27 Октября, 2012, 12:11
0
Доброго времени суток! У меня вопрос по модульке, а именно по диалогам. Третий день с ними мучаюсь, а толку никакого.

module_dialogs.py (З.Ы.: на текст диалогов не смотрите, я плохо знаю английский.)
  [trp_dhara_soldiers,"start",[],"Hello. Did you need troops?","dhara_soldiers_talk",[]],
  [anyone|plyr,"dhara_soldiers_talk",[],"Yes, I need","dhara_soldiers_yes",[]],
  [anyone|plyr,"dhara_soldiers_talk",[],"No, thank`s","dhara_soldiers_no",[]],
  [anyone,"dhara_soldiers_yes",[],"We very surprised. Ok. We attach to your group","close_window",[
  (troop_join,"trp_dhara_soldiers")]],
  [anyone,"dhara_soldiers_no",[],"Ok. We wait you.","close_window",[]],
module_parties.py
("dhara_soldiers","SOLDIERS",icon_vaegir_knight|pf_limit_members, no_menu, pt_none,fac_neutral,0,ai_bhvr_hold,0,(19, 53),[(trp_dhara_soldiers,54,0)]),
На карте появляются, всё норм, но диалог не срабатывает (точнее срабатывает, но не мой). Срабатывает вот этот:
Цитировать (выделенное)
Чего вы хотиите?
-Сдавайся или умри!
-Ничего. Мы оставим вас в покое.

Подскажите, что нужно сделать чтобы при встрече на карте партии dhara_soldiers, срабатывал мой диалог?
Ответ #494 27 Октября, 2012, 12:14
0
Куда добавлен диалог? В начало, конец, середину?
Срабатывает первый подходящий.
Возможно в этом проблема.
Ответ #495 27 Октября, 2012, 12:18
0
Rongar, в самый конец
 

Добавлено: 27 Октября, 2012, 12:19

Rongar, а куда лучше всего новые диалоги добавлять?
 

Добавлено: 27 Октября, 2012, 12:30

О! Теперь диалог выыводится, воин добавляется, но после всего этого меня бросает в бой с этой партией. =(
« Последнее редактирование: 27 Октября, 2012, 12:30 от Saturn35 »
Ответ #496 27 Октября, 2012, 12:53
0
а куда лучше всего новые диалоги добавлять?
Спроси что-нибудь по-проще. Там в модулке такое рубилово, что ничего конкретного посоветовать невозможно. Правильно может добавлять диалоги только человек, который наизусть знает их всех.

О! Теперь диалог выыводится, воин добавляется, но после всего этого меня бросает в бой с этой партией. =(
Это проблемы того, как это всё работает.
Нужно добавить
(assign, "$g_leave_encounter",1)

[anyone,"dhara_soldiers_yes",[],"We very surprised. Ok. We attach to your group","close_window",[
  (troop_join,"trp_dhara_soldiers"), (assign, "$g_leave_encounter",1)]],

 [anyone,"dhara_soldiers_no",[],"Ok. We wait you.","close_window",[(assign, "$g_leave_encounter",1)]],
« Последнее редактирование: 27 Октября, 2012, 13:52 от Rongar »
Ответ #497 27 Октября, 2012, 13:17
0
Rongar, А что это за переменная
$g_leave_encounter ?
Ответ #498 27 Октября, 2012, 13:53
0
Эта переменная инициализируется то ли в скриптах, когда начинается встреча с другой партией, то ли в game_menu. И потом в game_menu проверяется значение.
Ответ #499 28 Октября, 2012, 12:11
0
А можно ли найти где-нибудь чистую модульку (Без фракций, воинов, диалогов и т.д., только с основными триггерами и скриптами) ?

0 Пользователей и 1 Гость просматривают эту тему.

Теги: