1. Для общения на форуме, в чате или личной переписке наличие аватара ОБЯЗАТЕЛЬНО!

Показометр (ака "котик")

Тема в разделе "Диетическая Солянка 2016", создана пользователем Dennis Chikin, 15 мар 2019.

  1. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Поскольку изначально был соляночным инструментом, пущай будет здесь.
    Текущая версия: https://drive.google.com/open?id=1o62K-KPVjcJNFwAjG76pK9ogVzXHOcsa (2019-03-24)
    В диетсоли оно называется cheat.script + test_tools.script (и, да, спавнер в ем тоже есть, только без менюшек красивых).

    Сам файл независимый, то есть, подключать его можно в любой мод в любое место, изменения надо будет вносить под конкретные конфиги, и под конкретный движок (у ОГСЕ и его клонов сдвинуты clsid относительно оригинала). Какие-либо файлы не затрагиваются, кроме тех, откуда вы сами будете добавлять вызов.

    В текущем виде сделан специально так, чтобы можно было жать кнопки (или еще что) в любом состоянии игры, сработает только если уже можно. Если нельзя - просто ничего не произойдет (но и ничего не сломается).

    Подробности буду разбирать в следующих постах (на этой неделе у меня состояние полного нестояния.
     
    Последнее редактирование: 23 мар 2019
  2. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Важно: в распространенных в настоящее время сборках вызов осуществляется не вполне корректно.
    То есть, если используется, скажем, ui_main_menu.script, то после вызовов вида
    elseif dik == DIK_keys.DIK_P then
    pokazometr.show_actor_position()
    следует дописать, к примеру
    if game_is_running() then console:execute( "main_menu off" ) end
    - чтобы менюшка сама закрывалось, и не было двойных нажатий.

    А то Петренка, например, таким случайным двойным нажатием был испуган на столько, что котами аэрофлота летать теперь отказывается категорически. ;)
     
    basil нравится это.
  3. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Котик обновлен до актуальной рабочей версии.

    Обещанный разбор, что там к чему, и как куда прикручивать:

    function enable( v ) -- разрешает/запрещает динамически сообщения, в настоящее время нужно для показа координат и реального fps. Вызывать из актора при net_spawn() с параметром true, из net_destroy() - false.
    Если не вызвать enable( true ) - показ координат будет однократным, если вызвать enable( true ) и не сделать при переходе между локациями/перезагрузке enable( false ) - будет вылет с невменяемым логом.

    Увы, возможность создания универсального для любых модов скрипта, не требующего изменений в прочие файлы - наглухо заблокирована создателями этих самых "любых" модов. Пошел по пути ограничения функционала без таких изменений.

    function reinit() -- опять же надо для универсальности и независимости от "неправильного момента вызова". Вызывается из всех прочих функций, которым это надо.
    Если игра не стартовала - ни она, ни все остальные функции ничего не делают. Если игра запущена - частично сбрасывает ранее накопивщийся "мусор" и перезаписывает данные, которые будут нужны для остальных функций (часть которых может быть получена только после старта игры).
    Внутри необходимо заполнить соответствие мнемоник и классов, меток, партиклов и прочего, а также имена секций и уникальные имена нужных Вам объектов в с соответствии с конкретным модом и используемой версией движка.
    В ипостаси "котика", которая Pokazometr.script, все заполнено для ОП2.1; как получить значения классов - см. далее. Имена меток и партиклов можно найти в конфигах мода.

    clear_bad_objects() - в main_menu.script для ОП2.1 привязана к конопке F2. Можете переделать так, как Вам нравится.
    В настоящее время это сканнер классов объектов, объектов с кривыми именами и дублей.
    Выдает найденное в лог, удаляет ОП2.1 объекты с кривыми именами, помечает на карте и партиклами эти самые кривые объекты.

    В логе будут следующие записи:
    1. после строки clsid: - соответствие классов и имен секций. по имени секции в общем случае можно получить представление о классе, так, например, из строки 129: wpn_g36 можно сделать вывод, что 129 - класс автоматического оружия с подствольниками и прицелами, из строк вида 34: ros_bandit_respawn_3 и 34: bar_stalker_respawn_1 - то, что 34 - это сталкеры....
    Используйте для заполнения значений в reinit() для Вашего мода.

    2. bad gvid: - имена, классы и id объектов с кривыми координатами. Их необходимо удалить, если это не, к примеру, квестовые неписи. Иначе будете иметь странные вылеты. С неписями/монстрами все сложно - оставлять их в таком виде нельзя, удалять тоже нельзя. Попробуйте дождаться на локациях, где вылетов нет, пока они не попадут в более адекватные места.

    3. bad name: с объектом что-то явное не то, и лучше бы его удалить. Собственно, таки удаляются сразу, если сканнер не обнаружил потенциальную проблему от удаления.

    4. dup: - дубликаты объектов. Чреваты вылетами типа приснопамятного вылета в лабиринте в Мертвом Городе НС2010. Выдается имя, секция, класс, id и локация. Что с такими объектами делать - решайте сами. Возможно, допилю автоматическое удаление тех, для которых это выглядит безопасно.

    Продолжение следует.
     
    Последнее редактирование: 24 мар 2019
  4. solnmaks

    solnmaks Новичок

    9
    0
    16 сен 2019
    Мужской
    Есть вопрос по показу тайников.
    Выводятся тайники только в онлайне, что крайне неудобно, если локация сравнительно большая, а тайник может заспавниться в разных местах, как тайники коллекционера, например. Приходится бегать по всей локации и периодически в разных местах жать на Показометр.

    Я не большой спец, но похоже дело в том, что функция level.object_by_id() перечисляет все стационарные тайники на локации, а вот забираемые рюкзаки перечисляет только в том случае, если они находятся в онлайне.
    Как работает в этом плане функция :is_inv_box_empty() мне неясно.

    Есть ли возможность показывать все тайники с хабаром на локации вне зависимости от того, в онлайне они или нет?
     
  5. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Ага, сорри, начал писать, а потом все руки не доходили.

    :is_inv_box_empty() - собственно проверяет, если ли в этом тайнике что-нибудь, или он пустой. Работает только с онлайновыми. Соответственно:
    Код:
                   if gg:valid_vertex_id( gvid ) then
                       if gg:vertex( gvid ):level_id() == level_id then
    
                           local box = lobj_by_id( i )   -- только те, что в онлайне
                           if box and not box:is_inv_box_empty() then   -- и с хабаром
                               t_labels[i] = "habar_location"
                               add_spot( i, "habar_location",
                                   string.format( "%s y: %.03f",
                                   obj:name(), obj.position.y ) )
                           else
                               t_labels[i] = "habar_clear_location"
                               add_spot( i, "habar_clear_location",
                                   string.format( "%s y: %.03f",
                                   obj:name(), obj.position.y ) )
                           end
                   end   end
    
    Метка одного типа ставится на то, что удалось проверить, и в них что-то есть, метка другого типа - на все остальные.
    Устраивать перебор всех объектов на предмет принадлежности тайникам - это довольно медленно и печально, особенно в ОПе.

    Ну и если тайника на данный момент ВООБЩЕ нет - то его нет, метки ставить просто не на что.
     
  6. solnmaks

    solnmaks Новичок

    9
    0
    16 сен 2019
    Мужской
    Нет. Так не работает - показывает все тайники, как пустые.
    Попробовал так:
    Код:
    if gg:valid_vertex_id( gvid ) then
                      if gg:vertex( gvid ):level_id() == level_id then
    
                          local box = lobj_by_id( i )   -- только те, что в онлайне
                          if box then
                               if not box:is_inv_box_empty() then   -- и с хабаром
                                   t_labels = "habar_location"
                                   add_spot( i, "habar_location",
                                   string.format( "%s y: %.03f",
                                   obj:name(), obj.position.y ) )
                                else
                                   t_labels = "habar_clear_location"
                                   add_spot( i, "habar_clear_location",
                                   string.format( "%s y: %.03f",
                                   obj:name(), obj.position.y ) )
                                end
                          end
                  end   end
    Но тогда показывает только стационарные, как как пустые
     
    Последнее редактирование: 16 сен 2019
  7. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Еще раз: local box = lobj_by_id( i ) - получаем ОНЛАЙНОВЫЙ объект. ТОЛЬКО к нему можно применять
    box:is_inv_box_empty()

    Для проверки содержимого тайника, которого нет в онлайне, надо запускать повторный перебор всех объектов ИГРЫ, и проверять на принадлежность к тайнику. Других способов нет.
     
  8. solnmaks

    solnmaks Новичок

    9
    0
    16 сен 2019
    Мужской
    Это я понимаю. Перебор только онлайновых объектов в моем случае и приводит к тому, что неонлайновые не отображаются.

    Ваш код ставит метки хабара на полные тайники, находящиеся в онлайне, а на все остальные существующие - метки пустых. Это тоже неприменимо.
    [​IMG]

    Либо оставлять, как было - показывать только полные в онлайне и бегать по всей локации, сканируя периодически на предмет наличия тайников, либо делать то, о чем вы сказали (... довольно медленно и печально ...), не представляю, правда как.
     
    Последнее редактирование: 16 сен 2019
  9. solnmaks

    solnmaks Новичок

    9
    0
    16 сен 2019
    Мужской
    Вы решили более не заниматься этой проблемой?
     
  10. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Ну так а что еще надо? По мне - и так куча лишнего.
    Плюс каждый по аналогии может добавить еще что-то свое, если уж не совсем странное.
     
    Последнее редактирование: 18 сен 2019

Поделиться этой страницей