WinCap 316 Опубликовано 19 Февраля 2017 Здравствуйте. Решил заняться редактированием движка ЗП. Использую Visual Studio 2008 и архивы stasvn.7z и engine.vc2008.fixed.rar. Подскажите, пожалуйста: 1. Как правильно делать правки, что бы была возможность отката изменений? 2. Есть какой-нибудь перечень очевидных или общепризнанных ошибок или опечаток разработчиков, которые обязательны к исправлению в исходниках? 3. Можно ли включить или добавить в VS2008 подсветку выделенного символа и парных скобок? S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 14 Марта 2017 В каком месте кода CInifile ? Вот в этом: void CInifile::Load(IReader* F, LPCSTR path ... { . . . if (0!=inherited_names) { VERIFY2 (m_flags.test(eReadOnly),"Allow for readonly mode only."); inherited_names += 2; // в inherited_names содержится строка с родительскими секциями . . . } . . . } S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 10 Июля 2017 Здравствуйте. Подскажите, пожалуйста, можно ли в движке синхронизировать клиентский объект с серверным? Например, если изменить что-то в CSE_ALifeInventoryItem и применить изменения к клиентскому объекту. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 10 Июля 2017 4 часа назад, mortan сказал: получить серверный объект при спавне та ещё морока Тут можно по подробнее? Я думал, что alife():create() возвращает как раз серверный объект. Задача у меня относительно простая, получить доступ к полю condition для любого объекта, например, так: Скрытый текст for id = 1, 65535, 1 do local obj = alife():object(id) if obj ~= nil and (ещё_условия) then obj:set_condition(x) end end В принципе у меня все получилось и если объект не имеет клиентской копии, то всё работает. Но если клиентский объект существует, то понятно, что для изменения condition нужно получить его функцией level.object_by_id(obj.id). Однако есть проблема, при спавне функцией alife():create() существует момент, когда level.object_by_id(obj.id) ещё возвращает nil, а вызывать set_condition для серверного объекта уже поздно, клиент все равно получит condition = 1.0. Не знаю как это происходит. Вот я и хотел принудительно синхронизировать клиент/сервер. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 12 Июля 2017 В 11.07.2017 в 08:11, naxac сказал: используй каллбэк на выход объекта в онлайн Тут есть проблема, а если объект не выйдет в онлайн? Каллбэк пропадает не только при save/load, но и при повторной установке. Я хотел реализовать бесполезную фишку, чтобы оружие валяющееся на локации постепенно портилось и в конце концов исчезало. В принципе мне удалось этого добиться, код теперь будет примерно такой: Скрытый текст for i = 1, 65535, 1 do local sobj = alife():object(i) if sobj ~= nil then if isWeapon(sobj) then local obj = level.object_by_id(sobj.id) or sobj local condition = obj:condition() if condition <= 0.05 then alife():release(sobj, true) else obj:set_condition(condition - 0.05) end end end end Разобрался с функцией alife():create(), может кому пригодится: Скрытый текст Существует три случая вызова функции alife():create(): 1. Без указания parent_id (пятый параметр). 2. Когда parent_id указывает на объект ОФФлайн. 3. Когда parent_id указывает на объект ОНлайн. В первых двух случаях создается только серверный объект независимо от координат спавна, т.е. даже при спавне в радиусе алайфа. При этом можно сразу же изменить любые параметры серверного объекта т.к. создание клиентского объекта произойдет только на следующем апдейте при переходе в онлайн самого объекта или объекта parent_id. В третьем случае создается не только серверный объект, но и клиентский, однако его регистрация в глобальной таблице объектов произойдет только на следующем апдейте. Поэтому немедленный вызов level.object_by_id(id) возвращает nil. 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 12 Июля 2017 @UnLoaded Клиентский объект будет создан, но не сразу, а только на следующем апдейте, когда будет определено, что он находится в радиусе а-лайфа. Файл alife_simulator_script.cpp функция CALifeSimulator__spawn_item2. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 12 Июля 2017 @Zagolski На счет перебора всех объектов согласен, это жестоко. А на счет движка идея хорошая, я подумаю. Только, наверное, настройки снижения надо будет в конфиги вынести. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 25 Июля 2017 @mortan Проблема не в функции "SendEvent_Item2Slot()", а в том как и откуда она вызывается. Если посмотреть все вызовы этой функции, а их не так уж много, то, так или иначе, в параметр slot_id передается базовый слот предмета записанный в конфигах. 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 25 Июля 2017 @mortan Ну, вроде все логично: Переместить предмет в слот можно только из инвентаря. Если предмет находится в другом контейнере, и мы его переносим на место какого-нибудь слота, он перемещается не в слот, а в инвентарь. И уже потом происходит его перемещение в базовый слот, если тот свободен. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 7 Сентября 2017 Здравствуйте. Мне нужно выделить и удалить часть строки заключенную в круглые скобки. Например, строку "abc(def)" разделить на "abc" и "def". У меня получился следующий код: Скрытый текст xr_string str = array_str[i].c_str(); xr_string part; xr_string::size_type bb = str.find( "(" ); xr_string::size_type eb = str.find( ")" ); if ( bb != xr_string::npos && eb != xr_string::npos ) { part = str.substr( bb + 1, eb - bb - 1 ); str.resize ( bb ); } Всё работает, но подскажите, пожалуйста, может, есть более правильный способ или более простой? S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 21 Ноября 2017 @Romann Если я не ошибаюсь, в оригинальном ЗП инициализация главного меню происходит в скрипте "ui_main_menu.script". Там можно и реализовать выбор заставки. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 21 Ноября 2017 @Romann Если в движке, тогда нужно править функцию InitStatic в файле xrGame\ui\UIXmlInit.cpp. А конкретно строчку: InitTexture(xml_doc, path, index, pWnd); В ней используется переданный в функцию параметр index. Нужно добавить проверку на наличие атрибута "random" и при его наличии генерировать новый index, а при отсутствии использовать переданный. 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 28 Ноября 2017 @AndreySol Табуляция не работает на HUD'е игры. Попробуй использовать модификатор ширины, результат будет не очень, но это лучшее, что можно сделать в единой строке. Если хочется добиться идеальной таблицы нужно использовать отдельные статики для каждого столбца. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 2 Мая 2020 @Norman Eisenherz, если значение bSingleInstance = false, то создается новый статик. А если true, то статик с таким id ищется среди уже созданных, если находится - возвращается найденный, нет - создается новый. 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 17 Мая 2020 (изменено) Здравствуйте. Нужен совет профессионала. Для своего мода я использую движок CoP 1.6.0.2, собранный из исходников в VS2008. В него внесено несколько незначительных правок. Поскольку C++ не мой "конёк", а Visual Studio тем более, подскажите, пожалуйста: 1. Есть ли смысл переносить движок в более новую VS, если никаких серьёзных изменений вносить не планируется? 2. В какую версию VS проще всего перенести движок из 2008? (В 2019-ю с "наскока" перенести не получилось) 3. Если перенос в новую версию VS слишком сложен для "дилетанта", может проще перенести несколько собственных правок в другой движок? OpenXRay, например? Изменено 17 Мая 2020 пользователем WinCap S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 1 Ноября 2020 @Romann, за это отвечает параметр "satiety_critical" в actor.ltx. Когда сытость меньше "satiety_critical" - здоровье уменьшается, когда больше - увеличивается. Можно не править движок, а установить "satiety_critical" = 1.0. Или изменить вычисление "satiety_health_koef": float satiety_health_koef = m_fSatiety>=m_fSatietyCritical ? 0.0 : (m_fSatiety-m_fSatietyCritical) / m_fSatietyCritical; 1 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 14 Сентября 2022 Здравствуйте. Подскажите, пожалуйста, как остановить падение Actor'а? Выполнение функции character_physics_support()->movement()->SetVelocity(Fvector().set(0,0,0)) только обнуляет скорость, но падение после этого продолжается, а мне нужно, чтобы Actor завис в воздухе. Движок ЗП 1.6.02. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение
WinCap 316 Опубликовано 6 Декабря 2022 Здравствуйте. Подскажите, пожалуйста, удалось ли кому-нибудь исправить работу “квадратных” аномальных зон в ЗП (1.6.02)? Если сделать аномальную зону не из сферы, а из куба, то она работает не верно. Хит наносится правильно – внутри шейпа, а вот индикаторы на худе и постпроцесс отрабатывают так, будто она круглая. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Поделиться этим сообщением Ссылка на сообщение