-
Число публикаций
1 659 -
Регистрация
-
Последнее посещение
-
Дней в топе
34 -
AMKoin
18,261 [Подарить AMKoin]
Весь контент пользователя Kirgudu
-
[SoC] Ковыряемся в файлах
Kirgudu ответил на тему форума автора Halford в Скрипты / конфиги / движок
Тоже не знаю. Убирал флаги перехода в оффлайн у БТР, сбрасывал какие-то флаги у физ. объектов - проблем не было. НПС спавнить в воздухе в голову не приходило. -
[SoC] Ковыряемся в файлах
Kirgudu ответил на тему форума автора Halford в Скрипты / конфиги / движок
Может и так, не проверял. Правда, внутри самого модуля она в шапке не упомянута. @Zander_driver, кстати, там level.add_call под капотом, см. do_switchings и execute_switchings. Так что очень может быть, что заработает. Не нужно. При изменении абстрактной части нет-пакета модуль проделывает необходимые манипуляции автоматически, как и написано в readme. Если интересно, см. упомянутые выше функции модуля do_switchings и execute_switchings, там всё уже есть. Для NPC - скорее se_stalker.script Не уверен, что подействует на живой объект, но можно попробовать при спавне НПС снять флаг use_ai_locations = 128 (привязка к сетке). Делается это в том же модуле m_netpk, примеры есть на форуме, например этот из свежих: В общем, дальше надо экспериментировать. -
[SoC] Ковыряемся в файлах
Kirgudu ответил на тему форума автора Halford в Скрипты / конфиги / движок
@div, нет, я писал про пункты 1), 2) и 3) чуть пониже процитированной строки. Но это действительно может быть совершенно не важно. Речь-то, как справедливо тут заметили, о версии 1.0004, а я на это не обратил внимания. Модуль Артоса предназначен для 1.0006. -
[SoC] Ковыряемся в файлах
Kirgudu ответил на тему форума автора Halford в Скрипты / конфиги / движок
@div, в readme_m_netpk.txt есть раздел "Про специальный нет-пакет 'abstract'". Инструкции из него выполнены? -
[SoC] Ковыряемся в файлах
Kirgudu ответил на тему форума автора Halford в Скрипты / конфиги / движок
@div, изменив нужное свойство в абстрактной части нет-пакета объекта. Например, можно воспользоваться модулем m_netpk от Артоса (если мы говорим о ванильном движке; в модифицированных это, возможно, сделать куда проще). Модуль можно взять здесь: Авторский пример изменения координат см. в описании внутри архива с модулем. -
@Norman Eisenherz не лучше и не хуже, просто работают по-разному. Это примерно как разница между while do и repeat until. В add_call функция fx2 будет запущена только в том случае, если функция fx1 вернёт true (я бы сказал, что с оговорками аналог while ... do ...). А в set_fastcall функция fx будет выполнена в любом случае (repeat ... until ...).
-
@Norman Eisenherz скорее всего, дело в типе и размерности промежуточных переменных. 69 год - это (примерно) ёмкость int. Я бы предположил, что ограничение начинает работать где-то в строке "local ms = ...", поскольку diffSec сама по себе возвращает вполне вместимый float результат. Но это надо проверять. Только зачем превращать сохраняемое значение в миллисекунды? Сохранять и восстанавливать можно непосредственно результат diffSec без промежуточных умножений и делений. Ну а лично я сохранял бы в сейве все составляющие даты: local year, month, day, hour, min, sec, ms = ct:get() и восстанавливал потом также из всех: local ct1 = game.CTime() ct1:set(year, month, day, hour, min, sec, ms)
-
Скриптовый парсер XML https://disk.yandex.ru/d/1ecmI-oPY5b11A Может пригодиться тем, кто, во-первых, хочет иметь возможность читать и понимать в игре файлы xml формата, а во-вторых, по ряду причин не хочет или не может пользоваться другими механизмами, в том числе модифицированными движками. @Zander_driver, если думаешь, что тема мертва и реанимировать её не стоит, попросим модераторов перенести пост куда-нибудь ещё.
-
@Stalkersof разумеется, так и будет, поскольку при каждой загрузке из сохранения твоя строка в начале скрипта выполняется заново, и переменная приобретает первоначальное значение. Чтобы этого не происходило, значение переменной нужно не просто присваивать, но также сохранять в сейве (и читать оттуда при загрузке). Примеров достаточно на любой вкус, даже в оригинале: см. xr_logic.pstor_store / xr_logic.pstor_retrieve (но это не лучший из вариантов, разве что для единичного использования).
-
@Murarius да, имею в виду окно браузера, причём на ПК. У меня режим редактора вполне себе переключается на лету при переходе общей ширины окна через значение 915 пикселей.
-
@mole venomous Это у тебя сокращённая форма для нешироких областей редактирования. Расширишь - и эта, и несколько других кнопок появятся.
-
@Norman Eisenherz я б сказал, что родительский объект не успевает получить информацию об этой привязке. Сама привязка существует уже в момент спавна; достаточно после выхода нового объекта в онлайн проверить свойство parent_id (серверное) - оно будет равным id контейнера (актора). Но это единственное свойство, которое изменяется при помещении одного объекта внутрь другого. Поскольку методы поиска дочернего объекта (:object(), :iterate_inventory() и :inventory_for_each()) работают не со всеми объектами игры - это было бы неоправданно долго, а с динамической коллекцией подчинённых объектов контейнера, требуется, чтобы эта коллекция также обновилась на клиенте. А это происходит, очевидно, на апдейте уже после выхода созданного дочернего объекта в онлайн. Если требуется проверить, что объект создан внутри контейнера, можно посмотреть parent_id или подождать апдейт-другой.
-
@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
-
Подтверждаю то, что написал @WinCap
-
Например, сняв искомый флаг в нет-пакете объекта с помощью модуля 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
-
Не должно. Для этого достаточно сделать не абсолютные ссылки <link ... href="/foz-logo16.png">, а относительные <link ... href="foz-logo16.png">. Уверен. Подступался к загрузке данных в 2 захода: сначала поленился и свалил всё в кучу, после чего получил ошибки и написал пункты 1 и 2, очистил БД (написав попутно рекомендательный пункт 1 ) и уже не торопясь, внимательно, собрал мод и файлы оригинала с соблюдением иерархии и загрузил весь пакет заново. После того, как ошибки воспроизвелись, ещё раз всё перепроверил - нет, ничего не забыл, всё на своих местах и всё загружено в БД. Ну да это не важно в данном случае, всё равно получился вполне рабочий инструмент. Более того, автор упомянутого выше мода сейчас активно им пользуется, внося правки в скрипты и конфиги по результатам анализа. ЗЫ: С когнитивным диссонансом при сравнении ожиданий и реальности я сталкиваюсь регулярно, когда у нас идёт взаимодействие разрабов и тестировщиков. Казалось бы, предусмотрено практически всё, ан нет! Получи багом по мягкому месту. И хорошо, если это происходит заранее, а не во время приёмки заказчиком.
- 13 ответов
-
- 2
-
-
-
- инструментарий
- моддинг
- (и еще 5 )
-
Запустил таки инструмент на своём NAS. Это оказалось не так уж и сложно, просто за прошедшие несколько лет я забыл кое-какие детали взаимной настройки PHP и MySQL в пакетах. Ничего не скажешь, штука хорошая. Такое приложение лет эдак 10 назад, в разгар сталкерского модопроизводства, пригодилось бы очень многим, да и сейчас может принести пользу. Например, смотреть иерархию и искать все места использования того или иного значения становится действительно удобно, а результат нагляден и не требует того, чтобы держать всё в голове или блокноте. Точно знаю, что если б в далёком 2012 году при работе над OGSM CS у меня в руках был похожий инструмент, я бы пользовался им постоянно. Собственно, на примере OGSM CS, точнее его наследнике, я и попробовал оценить результат трудов автора. Если позволите, далее под спойлером мои оценки, замечания, предложения и прочие мысли. А в целом, @Zander_driver, спасибо! Это был увлекательный и полезный опыт. Даже немножко жаль, что мой брачный период энтузиазма уже позади. @7.9 Скажу прямо: признаваться в том, что с чем-то заморачиваться в лом (то есть в принципе способен, но лень), но при этом просить сопоставимую по трудозатратам работу от других - ну как-то не очень.
- 13 ответов
-
- 7
-
-
-
-
- инструментарий
- моддинг
- (и еще 5 )
-
Из него самого. В своё время я спокойно запустил у себя таким же образом копию форума для экспериментов, а сейчас что-то не выходит. Видимо, придётся так и сделать, уж очень хочется сабж оценить.
- 13 ответов
-
- 2
-
-
- инструментарий
- моддинг
- (и еще 5 )
-
Немножко оффтоп, но по теме: никому не доводилось ставить 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
- 13 ответов
-
- инструментарий
- моддинг
- (и еще 5 )
-
@Black_Raven_03 и снова ты не понял, что именно я тебе пытался показать. Посмотри на строку 5 своего кода, где длинное условие, не помещающееся на экране. Там в самом конце часть условия "and distance_between_safe(...) < 900", которое никогда не выполнится, а значит, ты не попадёшь внутрь к удалению аномалий. Почему - расписал выше.
-
@imcrazyhoudini тогда, возможно, так: ; игнор, если враг имеет story_id = 26 и он не находится в двух смартах combat_ignore_cond = {=check_fighting(26) !enemy_gulag(yan_zombied:yan_zombied_attack)}
-
@imcrazyhoudini в смысле чтобы требовалось выполнение любого из двух условий, но не обязательно двух сразу? Тогда логику надо переписать примерно так: combat_ignore_cond = {=check_fighting(26)} true, {=enemy_gulag(yan_zombied:yan_zombied_attack)} true
-
@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. Очевидно, что-то не выполняется.
-
@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... не знаю, может какие-то функции и модифицированы, но всё равно код выглядит ошибочным.
-
@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 = "" Но зачем вообще вопрос и желание - непонятно. Академический интерес?
УЧИМСЯ МОДДИНГУ
ИГРАЕМ В МОДЫ НА ТЧ
ИГРАЕМ В МОДЫ НА ЧН И ЗП
- [ЧН] OGSM CS 1.8 CE Fixes
- [ЧН] HARDWARMOD 3.2
- [ЗП] The Long Road
- [ЧН] New vision of War
- [ЧН] Old Good Stalker Mod - Clear Sky
- [ЗП] Unofficial Patch
- [ЗП] Смерти вопреки
- [ЗП] Контракт на хорошую жизнь
- [ЗП] Shoker Weapon Mod 2.1
- [ЗП] Hardcore pack for SGM 2.2
- [ЗП] Контракт Синдиката
- [ЗП] Клондайк 2.0
- ...и другие моды
ПОЛЕЗНОЕ И РАЗНОЕ