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

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


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

Ты темой ошибся. Что касается вопроса, приблизительно так:

function spawn_item_actor(item, count)
    if item then
        if count == nil then
            count = 1
        end
        for i = 1, count do
            alife():create(item, db.actor:position(), 0, 0, 0)
        end
    end
end

local level_1 = {
    af_vyvert = 3,
    af_blood = 2,
    wpn_bm16 = 1,
    antirad = 2
                }

function give_reward()
    for k,v in pairs(level_1) do
        spawn_item_actor(k, v)
    end
end

 

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий
20 минут назад, BoBaH_671 сказал:

Ты темой ошибся. Что касается вопроса, приблизительно так:


function spawn_item_actor(item, count)
    if item then
        if count == nil then
            count = 1
        end
        for i = 1, count do
            alife():create(item, db.actor:position(), 0, 0, 0)
        end
    end
end

local level_1 = {
    af_vyvert = 3,
    af_blood = 2,
    wpn_bm16 = 1,
    antirad = 2
                }

function give_reward()
    for k,v in pairs(level_1) do
        spawn_item_actor(k, v)
    end
end

 

Спасибо за помощь, попробую. Не подскажешь, как изменить перекрестие в игре, оно ж вроде в dll зашито, хотя бы принципом?)

Ссылка на комментарий

Господа, можете мне подсказать вот по какому делу, относительно ТЧ версии движка. Так вот, все мы знает отличительную особенность СДК "сваривать" близко находящиеся вершины модели в одну, в целях "оптимизации". Так вот, я столкнулся с точно такой же проблемой, но уже на движке игры о_О.

Вот так это выглядит:

379c69de947c2c5f034eaf368c4f981b4f858229

Слева .ogf из корневой папки игры(уже прошедший через СДК), а справа - эта же модель уже на движке игры. Никто тут не в курсе, каким образом происходят подобные изменения?

Ссылка на комментарий

Народ, может кто узнает это

//	float kx = (UI()->is_16_9_mode())?0.8333f: 1.0f;
	float kx = (UI()->is_16_9_mode()) ? Device.dwHeight / Device.dwWidth / 0.75 : 1.0f;

Это из UICustomItem.cpp, из CUICustomItem::Render(). У кого-нибудь есть идеи, что за магическая константа 0.8333 и что за магические расчеты во второй строке вместо этой константы?

 

Ссылка на комментарий

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

Ссылка на комментарий
3 часа назад, dsh сказал:

что за магическая константа 0.8333

Поправка на растягивание картинки наверное. Интересно, что 1980/1080= 1.8333

Ссылка на комментарий
4 часа назад, dsh сказал:

Это из UICustomItem.cpp, из CUICustomItem::Render(). У кого-нибудь есть идеи, что за магическая константа 0.8333 и что за магические расчеты во второй строке вместо этой константы?

0.8333 - это для формата 16:10. На эту цифру множится ширина текстуры, а также координаты по x на экране, чтобы получить правильные пропорции (от базового 1024х768) и положение на экране. 0.75 - это для 16:9. В ЗП в движке появилась ф-ция get_current_kx() получения нужного кооф. для конкретного формата экрана.

Изменено пользователем Zagolski
  • Спасибо 1
  • Нравится 2
  • Полезно 1
Ссылка на комментарий

Теперь понятно. Но вот в чем странность. Вот это

	float kx = (UI()->is_16_9_mode()) ? Device.dwHeight / Device.dwWidth / 0.75 : 1.0f;

и вот это

	float kx = UI()->is_16_9_mode() ? UI()->get_current_kx() : 1.0f;
float ui_core::get_current_kx()
{
	float h = float(Device.dwHeight);
	float w = float(Device.dwWidth);

	float res = (h / w) / (UI_BASE_HEIGHT / UI_BASE_WIDTH);
	return res;
}

дают разные результаты. Такое впечатление, что первый расчет выполняется не слева на право. Может я чего-нибудь в упор не замечаю? Вроде об расчета эквиваленты.

 

Ссылка на комментарий

Этот 0.75 - не конечный результат для формата 16:9 (хотя для него он тоже 0.75), тут они взяли уже готовый 0.75 как результат деления базы (768/1024), это по сути вот это и есть: float res = (h / w) / (UI_BASE_HEIGHT / UI_BASE_WIDTH) из второго случая.

 

Изменено пользователем Zagolski
Ссылка на комментарий

@KRodin подсказал, что грабля была в том, что в первом случае ширина и высота не приводились к float.

 

Изменено пользователем dsh
Ссылка на комментарий

Уважаемые, подскажите пожалуйста - как повернуть онлайновый объект (не НПС) вокруг своей оси?
Пытаюсь так:

Движок

Скрытый текст

void CScriptGameObject::SetRotation(const Fvector &rot)
{
    object().Direction().setHP(rot.x, rot.y);
    CKinematics *pK = PKinematics(object().Visual());
    if (pK)
    {
        pK->CalculateBones_Invalidate();
        pK->CalculateBones();
    }
    CSE_ALifeDynamicObject* se_obj = object().alife_object();
    if (se_obj)
    {
        object().XFORM().getXYZ(se_obj->angle()); //запись в o_Angle
    }
}

 

 

Скрипт:

Скрытый текст

local sobj = create("televizor",....)
level.client_spawn_manager():add(sobj.id, 0,
            function (dp, id, obj)
                obj:set_direction(vector():set(0,1.57,0))
            end
        , nil)

 

 

Пытался и радианы и градусы передавать - с объектом ничего не происходит, визуально он свое положение не меняет.

Изменено пользователем Winsor
Ссылка на комментарий

Платформа-то какая? Вот код под 1.6:

function spawn_object_with_direction(actor, obj, p)
--' p[1] - секция кого спаунить
--' p[2] - имя патрульного пути где спаунить.
--' p[3] - direction_x в радианах
--' p[4] - direction_y в радианах
--' p[5] - direction_z в радианах
if p then
	local spawn_sect = p[1]
	local path_name = p[2]
	if path_name == nil then
		abort("Wrong path_name for 'spawn_object_with_direction' function %s. For object %s", tostring( path_name ), obj:name() )
	end
	if not level.patrol_path_exists( path_name ) then
		abort("Path %s doesnt exist. Function 'spawn_object_with_direction' for object %s ", tostring( path_name ), obj:name() )
	end
		local ptr = patrol( path_name )
		local direction_x = tonumber(p[3]) or 0
		local direction_y = tonumber(p[4]) or 0
		local direction_z = tonumber(p[5]) or 0	
		local se_obj = alife():create(spawn_sect, ptr:point(0), ptr:level_vertex_id(0), ptr:game_vertex_id(0))
		se_obj.angle = vector():set( direction_x, direction_y, direction_z )
	end
end
%=spawn_object_with_direction(ammo_7.62x54_7h1:ammo_pos_on_bunker:0:1.57:0)%

 

Добавлено Overfirst,

Может и на ТЧ взлетит, не тестил.

Автор makdm.

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

ТЧ 1.0007

Ну с серверным объектом все нормально. в скрипты экспортирован o_Angle. По аналогичной схеме задаю ему при спавне угол и единственное - надо перевести online/ofline - и он поворачивается.

Но

1) данная схема почему то не "поворачивает" НПС - только обычные "неживые" объекты.

2) хочется повернуть без перевода offline/online. т.е. оперировать клиентским объектом.

Ссылка на комментарий

Даже и не знаю, сюда писать или нет. Кто-нибудь пользуется скриптовым хранилищем из xp-dev? Вроде оно как-то userdata сохраняет, только мне не понятно, что с ней потом делать, как использовать? Вот есть у меня vector(), оно его без проблем сохранит и прочитает. Только вот прочитанное уже не признается, что он vector(). Т.е. var.x уже не сделать, оно ругается что это userdata и его нельзя индексировать. Что с этим делают, как используют, для чего? Поделитесь, пожалуйста, опытом. Кстати, в xp-dev там ошибка. Грабля бьет по лбу, если сохранять вложенные списки. Оно тогда все индексы превращает в строковые и уже не получится использовать ipairs(), да и не только. Вот тут ошибка

			sv.type = LUA_TTABLE;
			if (sv.T->is_array)	sv.type |= SVT_ARRAY_TABLE;
			if (sv.T->zero_key)	sv.type |= SVT_ARRAY_ZEROK;			

Я не могу понять, зачем тут затирается оригинальный sv.type и через задницу восстанавливаются в нем флаги. В общем, перестраховался и исправил вот так

			int type = sv.type;
			sv.type = LUA_TTABLE;
			if (sv.T->is_array)	sv.type |= SVT_ARRAY_TABLE;
			if (sv.T->zero_key)	sv.type |= SVT_ARRAY_ZEROK;			
			if ( (type & SVT_KEY_MASK) == SVT_KEY_BOOLEAN )
			  sv.type |= SVT_KEY_BOOLEAN;
			else if ( (type & SVT_KEY_MASK) == SVT_KEY_NUMERIC )
			  sv.type |= SVT_KEY_NUMERIC;

А так, мне кажется, достаточно убрать

			sv.type = LUA_TTABLE;

что бы сохранялись все флаги. Странное оно тут, странное.

 

Изменено пользователем dsh
Ссылка на комментарий

Я бы от греха подальше отказался бы от сохранения и восстановления LUA_TLIGHTUSERDATA,LUA_TFUNCTION,LUA_TUSERDATA,LUA_TTHREAD.

Этих достаточно: LUA_TNIL, LUA_TBOOLEAN,  LUA_TNUMBER , LUA_TSTRING, LUA_TTABLE. саму реализацию в xp-dev я не смотрел, но эти типы прекрасно сериализуются в IWriter/IReader. CRegistryHelperProcess помогает записать/прочитать в сейв. причем все реализуемо с той механикой, которая уже есть в движке оригинальном.

 

Ссылка на комментарий

Всем привет. Народ - кто нибудь собирал исxодники СоС? в общем скачал с репо, ну первая странность: вроде проекты заточены под VS2013, но при открытии все проекты выгружены - не xочет в VS2013 загружаться, зато в VS2017 только в путь, при загрузке спросил на перевод всеx проектов на инструменты по новее VS2017 - я отказался, всё кроме "xrGame.dll" собирается без проблем, при построении xrGame.dll в самом конце, на стадии линк, вылетает такое:

1>LINK : fatal error C1510: Cannot load language resource clui.dll

Что означает:

Цитата

Не можете открыть языковой ресурс клуж.файл DLL
Компилятор не может загрузить библиотеку DLL языкового ресурса.
Есть две общие причины для этой проблемы. При использовании 32-разрядного компилятора и средств, может появиться эта ошибка для больших проектов, использующих более 2 ГБ памяти во время связи. Возможным решением в 64-разрядных системах Windows является использование 64-разрядного собственного или кросс-компилятора и средств для генерации кода. Это использует больше памяти, доступных в 64-битных приложений. Если необходимо использовать 32-разрядный компилятор, поскольку выполняется в 32-разрядной системе, в некоторых случаях можно увеличить объем памяти, доступной компоновщику, до 3 ГБ.

Ну как я понял - копилятор x32, и если превышает допустимое ОЗУ=слетает, ну так другой компилятор и не поюзаешь - проект то "Release x32".
На некоторыx ресурсаx встречается совет - "отключить оптимизацию для проекта", я попробовал: ну во первыx - сборка пошла сначала, во вторыx - в два раза дольше, но всё же закончилась успеxом(впервые собрал исxодники СоС):

1>   Создается библиотека X:\src\..\_build\lib\Release\xrGame.lib и объект X:\src\..\_build\lib\Release\xrGame.exp
1>Создание кода
1>Создание кода завершено
1>xrGame.vcxproj -> E:\STALKER\Games\bin_rel\xrGame.dll
1>Сборка проекта "xrGame.vcxproj" завершена.
========== Сборка: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========

Так в чём вопрос: можно ли эту ошибку - 

1>LINK : fatal error C1510: Cannot load language resource clui.dll

исправить как нибудь иначе, кроме того, как отключать оптимизацию? А то как-то не улыбается - после малейшей правки ждать более двуx часов сборки, и к тому же на компе в это время больше ничего не сделаешь(прям как локацию компилить)...

 

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий
2 минуты назад, Romann сказал:

 

исправить как нибудь иначе, кроме того, как отключать оптимизацию? А то как-то не улыбается - после малейшей правки ждать более двуx часов сборки, и к тому же на компе в это время больше ничего не сделаешь(прям как локацию компилить)...

 

Минимальное перестроение.

Ссылка на комментарий
3 минуты назад, jargon сказал:

Минимальное

А это как? Если можно подробнее.

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий
В 31.10.2017 в 23:55, drksnc сказал:

Подскажите куда копать.

Сам отвечу на свой вопрос: нужно научить клиента загружать граф и АИ-сетку, дополнив метод GameSpecific_Before класса CLevel. Пример можно увидеть в исходниках soProject. Клиент исправно получает хиты и может убивать NPC и монстров. Вот только с синхронизацией положения и поворотов не могу разобраться - как что откуда и куда надо передавать, исходники soProject не помогают:(. Единственное предположение - надо передавать tNetPacket.w_vec3 (o_Position) и все остальные данные из нужного класса в xrServer_Objects_Alife_Monsters.cpp, а потом в клиентском классе (напр. CAI_Stalker(?)) делать set_State с этими данными. Но как такое провернуть - не знаю.

EOAU7YipH-k.jpg

 

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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