Перейти к контенту

Kirgudu

Жители
  • Число публикаций

    1 494
  • Регистрация

  • Последнее посещение

  • Дней в топе

    16
  • AMKoin

    9,295 [Подарить AMKoin]

Весь контент пользователя Kirgudu

  1. Kirgudu

    Скриптование

    @Norman Eisenherz я не знаток С++, но скорее всего break внутри выполняемой функции работает только в контексте этой функции, а поскольку никакого цикла в ней нет, такая команда приводит к исключению. Более того, поскольку в нет и обработки и возвращаемого из functor значения (можно было бы вернуть true или false для остановки, как это сделано, например, в level.add_call для проверки выполнения условия), то и этот метод не пойдёт. Отсюда ответ - никак. А потому я бы переписал код так, чтобы после первого найденного предмета он сохранял его, не меняя больше: local inv_item = nil db.actor:inventory_for_each(function(item) if inv_item == nil and item:section() == section then inv_item = item end end) if inv_item then db.actor:transfer_item(inv_item, victim) end
  2. Kirgudu

    Скриптование

    Подтверждаю то, что написал @WinCap
  3. Kirgudu

    Скриптование

    Например, сняв искомый флаг в нет-пакете объекта с помощью модуля m_netpk от Артоса: local sobj = alife():create(section, position, lvid, gvid) if sobj then local pk = get_netpk(sobj) if pk:isOk() then local data = pk:get() data.object_flags = bit_and(data.object_flags, bit_not(object_flags.UsedAI_Locations)) -- сброс флага привязки к сетке (128) pk:set(data) end end
  4. Не должно. Для этого достаточно сделать не абсолютные ссылки <link ... href="/foz-logo16.png">, а относительные <link ... href="foz-logo16.png">. Уверен. Подступался к загрузке данных в 2 захода: сначала поленился и свалил всё в кучу, после чего получил ошибки и написал пункты 1 и 2, очистил БД (написав попутно рекомендательный пункт 1 ) и уже не торопясь, внимательно, собрал мод и файлы оригинала с соблюдением иерархии и загрузил весь пакет заново. После того, как ошибки воспроизвелись, ещё раз всё перепроверил - нет, ничего не забыл, всё на своих местах и всё загружено в БД. Ну да это не важно в данном случае, всё равно получился вполне рабочий инструмент. Более того, автор упомянутого выше мода сейчас активно им пользуется, внося правки в скрипты и конфиги по результатам анализа. ЗЫ: С когнитивным диссонансом при сравнении ожиданий и реальности я сталкиваюсь регулярно, когда у нас идёт взаимодействие разрабов и тестировщиков. Казалось бы, предусмотрено практически всё, ан нет! Получи багом по мягкому месту. И хорошо, если это происходит заранее, а не во время приёмки заказчиком.
  5. Запустил таки инструмент на своём NAS. Это оказалось не так уж и сложно, просто за прошедшие несколько лет я забыл кое-какие детали взаимной настройки PHP и MySQL в пакетах. Ничего не скажешь, штука хорошая. Такое приложение лет эдак 10 назад, в разгар сталкерского модопроизводства, пригодилось бы очень многим, да и сейчас может принести пользу. Например, смотреть иерархию и искать все места использования того или иного значения становится действительно удобно, а результат нагляден и не требует того, чтобы держать всё в голове или блокноте. Точно знаю, что если б в далёком 2012 году при работе над OGSM CS у меня в руках был похожий инструмент, я бы пользовался им постоянно. Собственно, на примере OGSM CS, точнее его наследнике, я и попробовал оценить результат трудов автора. Если позволите, далее под спойлером мои оценки, замечания, предложения и прочие мысли. А в целом, @Zander_driver, спасибо! Это был увлекательный и полезный опыт. Даже немножко жаль, что мой брачный период энтузиазма уже позади. @7.9 Скажу прямо: признаваться в том, что с чем-то заморачиваться в лом (то есть в принципе способен, но лень), но при этом просить сопоставимую по трудозатратам работу от других - ну как-то не очень.
  6. Из него самого. В своё время я спокойно запустил у себя таким же образом копию форума для экспериментов, а сейчас что-то не выходит. Видимо, придётся так и сделать, уж очень хочется сабж оценить.
  7. Немножко оффтоп, но по теме: никому не доводилось ставить PHP и MySQL на Synology? Вторую неделю в ленивом режиме пытаюсь настроить и запустить сабж на своём NAS, но хотя с адресами, портами и прочим вроде не ошибся, пока добился только этого: Warning: mysqli::__construct(): (HY000/2002): No such file or directory in /volume1/web/stalker/stmt.php on line 12 Не удалось установить соединение с базой данных: No such file or directory/n
  8. Kirgudu

    Скриптование

    @Black_Raven_03 и снова ты не понял, что именно я тебе пытался показать. Посмотри на строку 5 своего кода, где длинное условие, не помещающееся на экране. Там в самом конце часть условия "and distance_between_safe(...) < 900", которое никогда не выполнится, а значит, ты не попадёшь внутрь к удалению аномалий. Почему - расписал выше.
  9. @imcrazyhoudini тогда, возможно, так: ; игнор, если враг имеет story_id = 26 и он не находится в двух смартах combat_ignore_cond = {=check_fighting(26) !enemy_gulag(yan_zombied:yan_zombied_attack)}
  10. @imcrazyhoudini в смысле чтобы требовалось выполнение любого из двух условий, но не обязательно двух сразу? Тогда логику надо переписать примерно так: combat_ignore_cond = {=check_fighting(26)} true, {=enemy_gulag(yan_zombied:yan_zombied_attack)} true
  11. @Inverter смотри в следующих файлах логики: gamedata\configs\scripts\marsh\mar_intro_camera.ltx - движение камеры gamedata\configs\scripts\marsh\mar_intro_zone.ltx - спавн Шрама, Лебедева и Каланчи, блокировка интерфейса и т. д. В обоих файлах запуск катсцены осуществляется по событию {+mar_intro_start} (выдача одноимённой инфопорции при окончании стартового видео). Для того, чтобы вырезать катсцену, в первом файле достаточно полностью убрать выполнение логики: [logic] active = nil а во втором файле придётся пропустить несколько секций, передав управление сразу на ту, что идёт после катсцены, и при этом выдать то, что выдавалось во время катсцены при штатном течении событий: ; здесь переход на специальную добавленную секцию [logic] active = sr_idle@nointro ; а это сама новая секция, в которой мы делаем всё пропущенное и переходим на стадию после катсцены [sr_idle@nointro] on_info = sr_idle@scene_3_barman_wait_1 %+mar_intro_scene_1_end =stop_cam_effector(1) =stop_cam_effector(2) =stop_cam_effector(3) =stop_cam_effector(4) =update_weather(true) =enable_ui =give_inited_task(storyline:mar_story_talk_with_barman:csky)% Здесь показаны только изменения, остальное содержимое остаётся как есть. И это про "выдрать". Если "редактировать" - тогда изучать, как работает логика, и править в показанных выше местах. @imcrazyhoudini не то чтобы не будут существовать - не вызывают тревогу. Только там, емнип, квадрат расстояния, то есть для твоего примера это будет не 20 метров, а примерно 4 с половиной. combat_ignore_cond = {=check_fighting(26) =enemy_gulag(yan_zombied:yan_zombied_attack)} Тут 2 условия должны совпасть: враг со story_id = 26 должен находиться в одном из смартов yan_zombied или yan_zombied_attack. Очевидно, что-то не выполняется.
  12. Kirgudu

    Скриптование

    @Black_Raven_03 а если говорить непосредственно о коде, то distance_between_safe(lobj, level.vertex_in_direction(nil,vector():set(-45,-2,-85),9)) < 900 где: distance_between_safe вычисляет расстояние между двумя объектами, lobj - клиентский объект аномалии, level.vertex_in_direction(nil,vector():set(-45,-2,-85),9) возвращает номер (число, а не объект) вертекса в некоем направлении и на некоем расстоянии от номера другого вертекса, который в данном случае не передан (параметр nil). В оригинале всё это в лучшем случае приведёт к значению 100000, которое точно больше 900, а значит внутрь условия ты не попадёшь. В OGSR... не знаю, может какие-то функции и модифицированы, но всё равно код выглядит ошибочным.
  13. Kirgudu

    Скриптование

    @Norman Eisenherz Имхо, никак, потому что здесь как раз наследование, инициализация базового класса со всеми его инкапсулированными свойствами и т. д. В цитируемом посте речь, к. м. к., шла о более простом варианте класса, типа такого: class "WeatherManager" function WeatherManager:__init() self.weather_change_day = 0 self.update_time = 0 self.update_level = "" end function WeatherManager:reset() -- ... end function WeatherManager:select_weather(now) -- ... end Который можно было бы переписать как: self = {} function reset() -- содержимое не меняется end function select_weather(now) -- содержимое не меняется end self.weather_change_day = 0 self.update_time = 0 self.update_level = "" Но зачем вообще вопрос и желание - непонятно. Академический интерес?
  14. Kirgudu

    Скриптование

    @Norman Eisenherz не подтверждаю. https://disk.yandex.ru/d/TfcsZSLsZNf9zQ Здесь скрипт (дополнил логом в функциях init, update, load и save), лог и сейвы - до использования уже мёртвой псевдособаки, после, и после загрузки. По логу видны манипуляции с тремя объектами: убитой псевдособакой, Сидоровичем (который, емнип, тоже монстр по биндеру) и, наверное, плотью, которую на старте в аномалию засасывает. Сидоровича использовал во время первого диалога, собаку при обыске, плоть - нет. И до и после загрузки видно 2 положительных флага и один отрицательный, как ожидалось. Возможно, разница в движках; пользуюсь купленной 15 лет назад в Стиме версией игры. @imcrazyhoudini не значит, поскольку для того, чтобы отработало inherited::Load(section), необходимо, чтобы класс CScriptBinder наследовал другой, родительский класс, который в актуальной версии не указан. Возможно, там и было что-то ранее, но вопрос возврата всего явно лежит не в плоскости данной темы.
  15. Kirgudu

    Скриптование

    @phalcor можно попробовать воспользоваться встроенной в модуль функцией автоматического перевода объекта онлайн-оффлайн-онлайн: m_netpk.do_switchings(id) Она в публичный интерфейс автором не выведена, поскольку предназначена в первую очередь для изменения абстрактной части из коллбэка, но дёрнуть её напрямую ничто не мешает.
  16. Kirgudu

    Скриптование

    Не очень понимаю, как такое может сработать, ведь свойства checked_characters нет в оригинальном модуле Артоса для работы с нет-пакетами (который тут, судя по всему, и используется). Воспользоваться аналогичным кодом, но поменять свойство character_name. Это, однако, не поможет, поскольку имя персонажа в журнале, диалогах и при наведении курсора берётся из профиля. Можно, конечно, и профиль на лету поменять - для этого в нетпакете есть свойства specific_character и character_profile, но и они не охватывают всё, к тому же сие чревато другими последствиями, такими как замена визуала и т. п. Имхо, без редактирования движка на все 100 задачу не выполнить.
  17. Забавно. Я недавно с детьми на квест ходил; там надо было в одном углу комнаты дёрнуть за верёвочку, чтобы в другом углу дверка разблокировалась, - очень похоже. И столь же неочевидно.
  18. Кнопка "Больше" не производит никаких действий, по крайней мере для обычных пользователей. В консоли при нажатии тоже пусто. В неавторизованном состоянии кнопка не видна, там норм.
  19. Kirgudu

    Скриптование

    Аналогично, но с советом целиком и полностью согласен. Но я на работе настолько наедаюсь программированием (full stack от БД до фронта), что лезть и в движок Сталкера тупо не хотелось, хотя при нужде могу просто посмотреть, что там в нужном месте написано. Для меня чистые Lua скрипты на ванильном движке - это редкий отдых. @Zander_driver почему бы просто не выложить куда-нибудь в инструментарий мододела? Кому надо - найдёт и возьмёт не сейчас, так позже. Я вот тоже обязательно полюбопытствую, а может и воспользуюсь однажды.
  20. Kirgudu

    Скриптование

    Перебирает все предметы в игре (на всех локациях), помещает уникальные записи оружия в таблицу, затем выводит в новость случайное название из этой таблицы: local weapon_names, weapon_sections, cnt, sini, al = {}, {}, 0, system_ini(), alife() for i=1, 65535 do local obj = al:object(i) if obj and isWeapon(obj) then local section = obj.section_name and obj:section_name() if section and (not weapon_names[section]) and sini:section_exist(section) and sini:line_exist(section, "inv_name") then local name = sini:r_string(section, "inv_name") weapon_names[section] = name table.insert(weapon_sections, section) cnt = cnt + 1 end end end if cnt > 0 then local news_text = "%c[ui_gray_1]"..game.translate_string(weapon_names[weapon_sections[math.random(cnt)]]) db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000) end Вот только затратная это штука благодаря перебору. Куда проще было бы пройтись по всем конфигам и вычитать из них секции с оружием по какому-то признаку, но я так никогда не делал, не могу подсказать способ.
  21. Kirgudu

    Скриптование

    @Colder Вот поэтому и стоит для начала сделать то, о чём писали выше: Нужно получить список имён оружия и вывести его в новости. Какого оружия, где? В слоте? В инвентаре? На уровне? Вообще любого в игре? Передаваемого покупателю/продавцу (если отталкиваться от on_trade? Если берёшь в работу один единственный предмет, который передаётся в параметр item функции on_trade, то о каких множественных строках, перебор которых ты хочешь сделать, может идти речь? И т. д. Цель непонятна, условия непонятны, а гадать, что именно требуется сделать, - неблагодарное занятие.
  22. Kirgudu

    Скриптование

    Оператор #, кстати, вполне успешно вернёт длину строки, но это ничему не поможет. Предположим, что загадочная функция gts - это game.translate_string. Предположим даже, что функция show_news действительно вызывается, но тогда непонятно, как в неё передаётся переменная item, ведь show_news объявлена за пределами on_trade, а область видимости переменной item - внутри on_trade. Скорее всего, как писали выше, передавать item в функцию таки необходимо. Но и это ещё не всё. local name = system_ini():r_string(item:section(), "inv_name") - здесь переменной name присвоится строка. Одна строка. #name отработает и даст длину, math.random(#name) - случайный индекс в пределах длины строки. Однако name[math.random(#name)] вернёт nil, поскольку получить один символ из строки посредством обращения к индексу в Lua нельзя - у символов в строках просто нет индекса. Для этого необходимо использовать функцию string.sub. Но даже если бы удалось получить символ, то после применения загадочной local ww = gts(n) в переменную ww попадёт ровно тот же символ без всякого перевода. Ибо вряд ли в xml с текстами найдутся записи, идентификаторами которых служат одиночные символы латинского алфавита...
  23. Как-то незаметно пропала и сама должность шеф-модератора и её привязка к единственному обладателю. Возможно, оно и правильно - памятников нам и так хватает в жизни, однако чем-то это напоминает уборку немедленно после отъезда гостей... Может, стоит вернуть пост, хотя бы временно?
  24. Юрий Петрович, BFG, я буду тебя помнить. Земля пухом.
  25. Kirgudu

    Скриптование

    local t = {1,2,3,4,5} local m = math.max(unpack(t))

AMK-Team.ru

×
×
  • Создать...