Перейти к содержанию

Etil

Сталкеры
  • Публикаций

    41
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Etil


  1. Всем привет. Появилась необходимость создать в окне (CUIScriptWnd) элемент, где текст - это строковая переменная. Вопрос: как это осуществить?

    Upd: Нашёл решение, выдрал из одного из скриптов Вергаса. Кому интересно:

    Спойлер


        npc_name = CUIStatic()
        npc_name:SetAutoDelete(true) --полагаю, отвечает за удаление элемента при закрытии окна.
        self:AttachChild(npc_name)
        npc_name:SetStretchTexture(true) --Тот самый параметр "stretch" из xml файлов ui.
        npc_name:SetWndRect(110,90,100,20) --X, Y, Width, Height
        npc_name:SetTextColor(225, 0, 0, 0) --R, G, B, Alpha(?)
        npc_name:SetFont(GetFontGraffiti32Russian()) --Шрифт текста.
        npc_name:SetText("TextTextTextText") --Собственно, сам текст.

     


  2. Mass То есть, время до апдейта торговли и прочие параметры, которые сохраняются (должны сохраняться) в функции save(obj, packet), которая вызывается из xr_motivator
    function motivator_binder:save(packet)
        trade_manager.save(self.object, packet)
    end

    - это всё не работает?


  3. N42 Так и планирую сделать: буду записывать значения переменных в строгой последовательности, названия уровней сокращу до номеров, остальное - в бинарном/числовом формате.

    P.S: параметры динамические, присваиваются каждому НПС рандомным образом, потому комбинаций конфигов может быть бесконечное множество.

    P.P.S: надо будет не забыть прописать удаление переменной из se_stor при удалении НПС (можно поставить удаление на смерть НПС, но лучше также прописать проверку в функции удаления обьекта из игры).


  4. N42 Кхм, там... перечень локаций + отношение НПС к каждой из локаций (нравится\не нравится), плюс ещё штук так пять-шесть других параметров. И так для каждого НПС. Полагаю, придётся провести оптимизацию и записывать сокращённую строку в se_stor (там, насколько я помню, тоже есть лимит на длину). На самом деле, так будет даже лучше, т.к. можно будет запросто получить доступ к переменным из других файлов.


  5. Всем привет. Такой вопрос: существует ли ограничение длины строки (или символов, которые можно сохранять) при записи в function save(obj, packet) (скрипт trade_manager) через packet:w_stringZ() ?

    Просто при сохранении строки подобного вида: "текст==текст==текст" (или при считывании записи) игра ломается.


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


  7. Pepel По поводу лечения - это реально. Если будет на днях свободное время - помозгую. Но тут есть нюансы: если не улучшать логику НПС, то доктор ведь буквально под огонь полезет, и запросто может до ГГ живым и не дойти. Поскольку в тч такой системы отрядов, как в зп, нет, можно будет считать отрядом население того же смарт-террейна, к которому приписан доктор. Если док гуляет без смарта - то лечит всех из своей группировки в радиусе, скажем, 80 метров. Ну и ГГ он лечит в любом случае, в том же радиусе.

    По поводу передачи лута - так, в принципе, можно. Есть на уме как минимум один вариант, но он может не очень хорошо сказаться на оптимизации. Функция переноса предмета в инвентарь ГГ есть (я ей пользовался когда черновик скрипта многоприцельности писал), можно прикрутить обработчик событий к разным предметам (и модифицировать у тех, у которых он уже есть), и поставить проверку на расстояние до ГГ. Если ближе чем n метров - то предмет перемещается в инвентарь. Опять же, это очень даже может создать лаги.


    Дополнено 6 минуты спустя

    Pepel в геометрию входят: террейн (земля), деревь, кусты, дома и т.д. Грубо говоря, всё то, с чем нельзя взаимодействовать. Ящики, бочки, аномалии, люди, и т.д. - динамические обьекты. Поскольку изменения вносятся только в спавн, то нужен он и гейм_граф (они связаны). Вроде, ещё нужны левел_граф каждого уровня, level.game каждого уровня, и ещё что-то. Весь список не помню, советую посмотреть уроки по компиляции локации. По крайней мере это так, если не совмещать СДК и игру. Вроде, при сборке локации часть файлов пропадают/заменяются готовыми к компиляции геометрии и на такой локе игра уже действительно не запустится. Поэтому я держу СДК и файлы мода отдельно.

    • Мастер! 1

  8. Pepel Геометрию нужно компилировать только когда ты геометрию редактируешь. При изменении спавна, компилируется левел_граф, гейм_граф и спавн.

    7 минут назад, Pepel сказал:

    Etil я так нпс через аллспавн прикручивал. Не запарился)

    А я тридцать квестовых НПС, переделанные гулаги, километровые патрульные пути и полностью новое заселение локации прикручивал. Надолго меня не хватило)

    • Лайк 1

  9. Delford На скриптах далеко не уедешь. Можно осваивать acdc, но я бы на неё останавливать не советовал. Научился декомпилировать и компилировать спавн - и пошёл изучать СДК. На канале Андрея Непряхина (ссылка) есть уроки по ней, сам по ним учился. Работать исключительно с ACDC можно либо создавая халтуру (мод, полностью или почти полностью основанный на вейпоинтах тч и использующий обекты ТЧ), либо если ты мазохист (я невероятно терпеливый человек, и даже я не выдержал. Переписывание координат со скриншота или копипаста каждой координаты по отдельности из лога - это мука, а их ещё вручную надо снимать). СДК, если не ковырять геометрию локаций, позволяет работать с удовольствием и создавать сложные квесты, постановочные сцены, и т.д, без особых проблем.


    Дополнено 9 минуты спустя

    Pepel Что подразумевается под "лечением наподобие халфлайф"? Лечение через диалог - пожалуйста, без проблем. Спокойно по принципу медиков из зп можно сделать (да и делали уже). Лечение по желанию НПС? Заскриптованое, или нет? Если да - то можно зафиксировать гг на одном месте, заставить НПС подойти к нему, проиграть анимацию, и под её конец хп ГГ будет восстановлено. Если нет - это уже другой разговор. Желание-то лечить ГГ для НПС можно организовать, а нужно ли? При каких условиях оно должно срабатывать, и не повредит ли это игровому балансу?

    И как (в теории) должна работать передача лута без диалоговых окон? Просто спавнить по скрипту? А как понять, какой предмет нужно заспавнить? Вообще не понятно.


  10. N42 Каждая строка является названием секции, в которой находится перечень предметов, вероятность спавна, мин. и макс. количество каждого из них. В большинстве случаев, секции не повторяются, потому прописывать строку в виде "название_секции" = n попросту нет смысла, проще заставить скрипт считывать строку за строкой из пресета и спавнить их по очереди, т.к. в подавляющем большинстве случаев n == 1. Однако, судя по всему, так нельзя, так что пришлось переписать конфиги.


  11. И снова здравствуйте. Есть вопрос по поводу функции line_count, код выглядит примерно так:
                

    Спойлер

    local preset_ini = ini_file("misc\\stash_configs\\presets\\"..community..".ltx")
    for i=1, preset_ini:line_count("название секции") do

          ...

    end

    Если секция в конфигах выглядит так (имеет 3 разные параметра), то спавн происходит нормально:


    [master_weapon_stash_preset_2]
    master_weapon_slot_2
    master_food
    master_medicine

    ---тут кол-во строк == 3

    Но если секция имеет 2 одинаковых параметра, то игра видит (и, в дальнейшем, спавнит) только один из них:


    [master_weapon_stash_preset_3]
    master_weapon_slot_2
    master_food
    master_food

    ---тут кол-во строк == 2, хотя по факту их три

    Правильно ли я понимаю, что line_count() считает только уникальные параметры, и игнорирует дубликаты?


  12. band1tov 

    xr_s.script

    Лично у меня вызов данного скрипта висит только на апдейте (ибо нигде больше и не нужен), вот здесь:


        function actor_binder:update(delta)
        object_binder.update(self, delta)
        xr_s.on_actor_update(delta)

        ...


  13. band1tov Вариант 1 - повесить на :update в bind_stalker. Не рекомендую так делать, т.к. навешивание большого количества лишних проверок отрицательно скажется на производительности. Впрочем, если проверка одна на всю игру - то и так сойдёт.

    Вариант 2 - поставить проверку на апдейт в нужный момент, и убрать по получению инфопоршня. Как это сделать? В ЗП и ЧН есть скрипт xr_s , который (вроде, после должной адаптации) можно использовать как раз для этого. У меня он есть, сейчас гляну, что с ним нужно делать.


  14. Спойлер

    Всем привет. В death_manager.script есть строка:
              result, id, value = death_ini:r_line(v,i,"","")  - где v - секция, i - номер строки.

    Так вот, мне не совсем понятно, что это чудо возвращает, и как этим пользоваться. В оригинале строка имеет такой вид: random_text = 0.5

    В моём случае, строка выглядит так:

    random_text

    Мне нужно считать строку и использовать её имя в дальнейшем в качестве значения переменной, но как id, так и value выдают непредсказуемые результаты (3-8 "true", и, собственно, саму строку). Как правильно использовать r_line()?

    P.S: Мой скрипт сначала считывает кол-во строк, потом уже считывает каждую из них по отдельности. Этого не избежать. Никак.

     

    Разобрался. Все ещё не понимаю, что выдавало миллион 'true', но хоть работает.


  15. Merci Речь о единичном тайнике, или о всех тайниках в ТЧ? Если о всех - то переделать скриптовую схему тайников (и написать свои таблицы с лутом). Не советую, очень геморно. Сам этим занимаюсь. Если речь о единичном тайнике, то тут можно составить таблицу с предметами (названиями секций из конфигов), потом через table.getn("имя_таблицы") получить кол-во позиций в таблице, и при помощи math.random(1, table.getn("имя_таблицы")) определять то, какой предмет выпадет. В итоге, в функции спавна alife():create() вместо секции предмета прописываешь имя_таблицы[math.random(1, table.getn("имя_таблицы"))] . Но, это будет спавнить все предметы с одинаковой вероятностью. Хочешь разный шанс выпадения для разных предметов? Переписывай скриптовую схему тайников, составляй таблицы лута - и будет тебе счастье. Лично у меня на подобный проект ушло часов 16 - и это при условии, что я знал, что я делал. Удовольствие неописуемое.

    • Жму руку 1

  16. band1tov Вариант 1 - выдай НПС другую группировку, и назови её "Сталкеры".

    Вариант 2 - при смерти НПС (через логику смарт террейна, или через xr_motivator (что, однако, значительно хуже)) принудительно измени отношение выбранных нпс к ГГ на "нейтрал", или "друг". Можно ещё воткнуть проверку на случай, если они не заагрятся (чтобы их отношение к гг, которое, скажем, было "друг" не изменилось на нейтрал в ситуации, когда этого можно было бы избежать). Полагаю, есть и другие варианты.

    Upd: по технической части: если все НПС в одном смарте, то можешь сделать так (строка из xr_effects):

    xr_gulag.setGulagNeutral("название_смарта", db.actor)

    Строка в скрипте закомментирована, но аналогичная, делающая всех НПС в гулаге врагами, в игре работает. Так что и тут проблем быть не должно.

    Спойлер

    И ещё, в теории возможен такой вариант, что личное отношение НПС к ГГ будет слишком негативным, до такой степени, что нейтральное отношение смарта не поможет. У меня такое было с маскировкой в Аномали, где при смене брони менялась группировка ГГ, но из-за личной неприязни неписей, они продолжали меня узнавать, вне зависимости от моей группировки (даже если я - представитель группировки, в которой состоял НПС). В таком случае, нужно именно принудительно примирить ГГ и конкретного сталкера. Я не могу с уверенностью сказать, что такое же будет с xr_gulag.setGulagNeutral(), но если вдруг - то ты знаешь, что делать. В выше упомянутом xr_effects есть функция set_friends - она, собственно, это и делает.

    Прописываешь её в логике нужных НПС в смарте через on_info = {+название_инфопоршня_выдаваемого_при_смерти_НПС} %=тут_прописывать_функцию_с_правильными_аргументами%

     


  17. band1tov 

    Спойлер


    function gulag_empty(gulag)
        if xr_gulag.getGulagPopulation("название_смарта") == 0 then
            db.actor:give_info_portion("название_инфопоршня")
        end
    end

    Вообще, в xr_conditions есть полезные функции (gulag_empty, gulag_population_le, gulag_population_ge и прочие). Можно использовать xr_conditions.gulag_empty(название_смарта). Стоит при этом учесть, что если есть респавны и население гулага может респавниться, то их может учитывать, даже если они ещё очень далеко от смарт террейна. Потому, возможно, в таком случае стоит использовать функции по типу xr_conditions.gulag_population_comed_le(название_смарта, количество).

    • Лайк 2

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


  19. Просто хочу кое-что уточнить. Я тут разбирал скрипт death_manager, и нашёл кое-что интересное. Вот так высчитывается вероятность выпадения предмета (с дальнейшим сравнением с math.random(100)):

    item_by_community[таблица][секция_предмета] = 100*tonumber(вероятность_выпадения_прописанная_в_конфигах).

    И тут назревает вопрос: а как быть с оригинальными вероятностями, например 0.005 (такая у "Слюды", или "Души")? Ведь math.random(100) выбирает число в промежутке 1-100, а 100*tonumber("0.005") == 0.5.

    То есть, ни "Слюда", ни "Душа" никогда с трупа не выпадут, хотя вероятность и не нулевая?


  20. И снова здравствуйте. Есть "небольшая" проблема: игра при сохранении не сохраняет брошенные гранаты, а в моём случае (очень) желательно, чтобы сохраняла - на их биндерах вся логика висит, и изменено это не будет. Вопрос: можно ли принудить игру запоминать брошенные гранаты?


  21. M31 Взрываю чтобы убить, но выглядит это довольно странно, когда вызываешь минометный обстрел, отходишь на 100-150 метров, и он не происходит. Потом подходишь на метров 30, вызываешь повторно - и всё работает. По поводу функционала соглашусь, большинство НПС в оригинальной игре постоянно в онлайне не находятся, хотя такие есть (или, как минимум, такая функция). С учётом этого, проще будет симулировать взрыв, если ГГ находится за радиусом алайфа (партиклы + звук, что можно без особых проблем реализовать). За информацию спасибо.