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

Редактирование движка X-Ray


Rolan

Рекомендуемые сообщения

Здравствуйте.

Решил заняться редактированием движка ЗП. Использую Visual Studio 2008 и архивы stasvn.7z и engine.vc2008.fixed.rar.

Подскажите, пожалуйста:

1. Как правильно делать правки, что бы была возможность отката изменений?

2. Есть какой-нибудь перечень очевидных или общепризнанных ошибок или опечаток разработчиков, которые обязательны к исправлению в исходниках?

3. Можно ли включить или добавить в VS2008 подсветку выделенного символа и парных скобок?

Поделиться этим сообщением


Ссылка на сообщение

В каком месте кода 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  содержится строка с родительскими секциями
      . . .
   }   
   . . .
}

 

 

Поделиться этим сообщением


Ссылка на сообщение

Здравствуйте.

Подскажите, пожалуйста, можно ли в движке синхронизировать клиентский объект с серверным?

Например, если изменить что-то в CSE_ALifeInventoryItem и применить изменения к клиентскому объекту.

Поделиться этим сообщением


Ссылка на сообщение
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. Не знаю как это происходит.

Вот я и хотел принудительно синхронизировать клиент/сервер.

Поделиться этим сообщением


Ссылка на сообщение
В 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

Поделиться этим сообщением


Ссылка на сообщение

@UnLoaded

Клиентский объект будет создан, но не сразу, а только на следующем апдейте, когда  будет определено, что он находится в радиусе а-лайфа. Файл alife_simulator_script.cpp функция CALifeSimulator__spawn_item2.

Поделиться этим сообщением


Ссылка на сообщение

@Zagolski

На счет перебора всех объектов согласен, это жестоко.

А на счет движка идея хорошая, я подумаю. Только, наверное, настройки снижения надо будет в конфиги вынести.

Поделиться этим сообщением


Ссылка на сообщение

@mortan Проблема не в функции "SendEvent_Item2Slot()", а в том как и откуда она вызывается.

Если посмотреть все вызовы этой функции, а их не так уж много, то, так или иначе, в параметр slot_id передается базовый слот предмета записанный в конфигах. 

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@mortan

Ну, вроде все логично: Переместить предмет в слот можно только из инвентаря.

Если предмет находится в другом контейнере, и мы его переносим на место какого-нибудь слота, он перемещается не в слот, а в инвентарь. И уже потом происходит его перемещение в базовый слот, если тот свободен.

Поделиться этим сообщением


Ссылка на сообщение

Здравствуйте.
Мне нужно выделить и удалить часть строки заключенную в круглые скобки. Например, строку "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 );
}

 

Всё работает, но подскажите, пожалуйста, может, есть более правильный способ или более простой?

Поделиться этим сообщением


Ссылка на сообщение

@Romann 

Если я не ошибаюсь, в оригинальном ЗП инициализация главного меню происходит в скрипте "ui_main_menu.script". Там можно и реализовать выбор заставки.

Поделиться этим сообщением


Ссылка на сообщение

@Romann 

Если в движке, тогда нужно править функцию InitStatic в файле xrGame\ui\UIXmlInit.cpp.

А конкретно строчку:

InitTexture(xml_doc, path, index, pWnd);

В ней используется переданный в функцию параметр index. Нужно добавить проверку на наличие атрибута "random" и при его наличии генерировать новый index, а при отсутствии использовать переданный.

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@AndreySol

Табуляция не работает на HUD'е игры.

Попробуй использовать модификатор ширины, результат будет не очень, но это лучшее, что можно сделать в единой строке.

Если хочется добиться идеальной таблицы нужно использовать отдельные статики для каждого столбца.

Поделиться этим сообщением


Ссылка на сообщение

@Norman Eisenherz, если значение bSingleInstance = false, то создается новый статик. А если true, то статик с таким id ищется среди уже созданных, если находится - возвращается найденный, нет - создается новый.

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Здравствуйте.
Нужен совет профессионала. Для своего мода я использую движок CoP 1.6.0.2, собранный из исходников в VS2008. В него внесено несколько незначительных правок.
Поскольку C++ не мой "конёк", а Visual Studio тем более, подскажите, пожалуйста:
1. Есть ли смысл переносить движок в более новую VS, если никаких серьёзных изменений вносить не планируется?
2. В какую версию VS проще всего перенести движок из 2008? (В 2019-ю с "наскока" перенести не получилось)
3. Если перенос в новую версию VS слишком сложен для "дилетанта", может проще перенести несколько собственных правок в другой движок? OpenXRay, например?

Изменено пользователем WinCap

Поделиться этим сообщением


Ссылка на сообщение

@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

Поделиться этим сообщением


Ссылка на сообщение

Здравствуйте.
Подскажите, пожалуйста, как остановить падение Actor'а?


Выполнение функции

character_physics_support()->movement()->SetVelocity(Fvector().set(0,0,0))

только обнуляет скорость, но падение после этого продолжается, а мне нужно, чтобы Actor завис в воздухе.
Движок ЗП 1.6.02.

Поделиться этим сообщением


Ссылка на сообщение

Здравствуйте.

Подскажите, пожалуйста, удалось ли кому-нибудь исправить работу “квадратных” аномальных зон в ЗП (1.6.02)?

Если сделать аномальную зону не из сферы, а из куба, то она работает не верно. Хит наносится правильно – внутри шейпа, а вот индикаторы на худе и постпроцесс отрабатывают так, будто она круглая.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

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