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

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


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

Тут не все так просто. Если просто передавать позицию и применять ее то движения будут дерганными из-за задержки сети. Для того чтобы это заработало так как нужно, нужно ковырять как в классе CActor реализована интерполяция (файл Actor_Network.cpp). Скорее всего ее можно будет ±копипастой применить к обычным НПС.

Freedom

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

@_Призрак_ да, что интерполяцию надо будет подключить - понятно. Но я имею ввиду конкретно способ передачи позиции от сервера к клиенту. Нужно же как-то сначала передавать позицию, а потом применять интерполяцию на клиенте. А вот как именно передавать - я хз.

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

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

По xоду это не решение:cray5:. Уже по времени компилит столько же, сколько без этого, а до конца сборки - ещё как до Шанxая босиком, т.е. сборка будет ещё дольше...:dash3:

Скомпилит первый раз

Так уже ведь был компиль.:blink:

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

Мать: 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.

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

Ссылка на комментарий
Только что, Romann сказал:

По xоду это не решение:cray5:. Уже по времени компилит столько же, сколько без этого, а до конца сборки - ещё как до Шанxая босиком, т.е. сборка будет ещё дольше...:dash3:

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

Ссылка на комментарий
23 hours ago, Winsor said:

CRegistryHelperProcess помогает записать/прочитать в сейв

А это что за процесс такой? Не нахожу такого в исходниках движка.

 

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

Есть у меня элементарный вопрос. Вот делаем мы

local v = vector()

Чему должны быть равны x, y, и z этого вектора? nil, 0, случайное значение? Если 0, то почему? Я не могу найти в движке инициализацию в нулевые значения.

 

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

Если 0, то почему?

Потому что динамическая типизация Lua. В статических языках ты бы исключение словил. А тут, если чего-то нету, то nullptr. 

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

@krop не, все равно не понятно. Вот сделал я local v = vector() и передал эту v в какую-нибудь движковую функцию. Т.е. там это будет Fvector v, да? Но какие x, y, z у этого вектора будут в движке, 0? Тогда не могу понять почему. В конструкторе, в _vector3d.h эти поля не инициализируются, следовательно их значения не определены, т.е. что будет лежать в памяти, такие значения и будут, так? Каким образом, попадая в lua, когда я делаю local v = vector(), эти неопределенные значения превращаются в 0? Или все это как-то по другому?

 

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

К предыдущему. Вот я беру и выполняю следующий код, используя x-ray extensions:

for i = 1, 10 do
  local v = vector()
  log3( "dsh: %s: %s, %s, %s", i, v.x, v.y, v.z )
end

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

 

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

Почему клиент только два раза получает серверную координату в самом начале? Я вроде бы один в один переписал код с soProject.

Клиентский ai_stalker.cpp

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

void CAI_Stalker::net_Import(NET_Packet& P) 
{ 
CStalkerAnimationManager* AnimationManager; 
CInventory* Inventory; 
CMovementManager* Movement; 

float position[3]; 
float direction[3]; 
float heading; 
float head_orientation[2]; 
u16 CurrentWeapon; 

P.r(&position, sizeof(&position)); 
Msg("SIZE CL: %f", sizeof(position)); 

Position().x = position[0]; 
Position().y = position[1]; 
Position().z = position[2]; 

Direction().x = direction[0]; 
Direction().y = direction[1]; 
Direction().z = direction[2]; 

SPHNetState NetState; 
NetState.position.x = position[0]; 
NetState.position.y = position[1]; 
NetState.position.z = position[2]; 

CEntityAlive* CEA; 
CEA->PHGetSyncItem(0); 

CPHCharacter* Char; 
Char->set_State(NetState); 

setVisible(TRUE); 
setEnabled(TRUE); 

}

void CAI_Stalker::net_Export(NET_Packet& P) 
{ 
CStalkerAnimationManager* AnimationManager; 
CInventory* Inventory; 
CMovementManager* Movement; 
float m_state_holder_state[35]; 
float position[3]; 
float direction[3]; 
float heading; 
float head_orientation[2]; 
u16 CurrentWeapon; 

if (Inventory) CurrentWeapon = (u16)Inventory->GetActiveSlot(); 

position[0] = Position().x; 
position[1] = Position().y; 
position[2] = Position().z; 

direction[0] = Direction().x; 
direction[1] = Direction().y; 
direction[2] = Direction().z; 

P.w(&position, sizeof(&position)); 
Msg("POS CL: %f", &position); 

}

 

 

CSE_AlifeHumanStalker

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

void CSE_ALifeHumanStalker::UPDATE_Write(NET_Packet &tNetPacket) 
{ 
// inherited1::UPDATE_Write(tNetPacket); 
// inherited2::UPDATE_Write(tNetPacket); 
// tNetPacket.w_stringZ(m_start_dialog); 

u16 objectid = object_id(); 

tNetPacket.w(&position, sizeof(&position)); 
Msg("SIZE SV: %d", sizeof(&sync_buffer->position)); 
} 

void CSE_ALifeHumanStalker::UPDATE_Read(NET_Packet &tNetPacket) 
{ 
// inherited1::UPDATE_Write(tNetPacket); 
// inherited2::UPDATE_Write(tNetPacket); 
// tNetPacket.r_stringZ(m_start_dialog); 

tNetPacket.r(&position, sizeof(&position)); 
Msg("POS SV: %f", position[0]); 

}

 

 

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

И ещё вопрос вдогонку. Вот этот код означает что в метод PHGetSyncItem класса EntityAlive в кач-ве аргумента передаётся 0?

    if(pEntityAlive__PHGetSyncItem)
    {
        // get sync item
        _asm
        {
            push 0
            mov ecx, pClass
            call pEntityAlive__PHGetSyncItem
            mov PHCharacter, eax
        };

 

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

@dsh vector() 1 в 1 транслируется в вызов конструктора FVector (ну или какой там класс). Если в конструкторе по умолчанию (т.е. FVector()) не инициализируются поля то значит там в любом случае будет мусор, хоть ты создал вектор через C++, хоть через Lua. А то что у тебя на одном движке нули, а на другом случайные числа то это легко объяснить - в обоих случаях у тебя мусор в переменных, просто в одном случае у тебя повезло словить 3 нуля, а в другом нет. Или на одном была отключена оптимизация (в этом случае все переменные инициализируются нулем). Почему могло получиться случайно 3 нуля? Потому что если посмотреть на память приложения, то количество нулевых байт будет в сотни раз больше чем любых других из-за специфики программ

 

@drksnc 

Да, асемблерная вставка означает: pClass->PHGetSyncItem(0)

 

  • Спасибо 1

Freedom

Ссылка на комментарий
4 hours ago, _Призрак_ said:

Или на одном была отключена оптимизация (в этом случае все переменные инициализируются нулем).

Ага, скорее всего именно в этом дело. Наверное оригинальный движок с отключённой оптимизацией был собран.

 

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

Наверное оригинальный движок с отключённой оптимизацией был собран.

Кто-то в Debug версию не играл, раз так говорит. :) 

 

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

Может кто-нибудь сталкивался с такой проблемой. В X-10 нет миникарты - это нормально, т.к. для этой локации не указаны texture и bound_rect в game_maps_single.ltx. Перехожу из X-10 на поверхность и миникарта по прежнему пустая. Если перезапустить игру и загрузить автосейв перехода, то миникарта этой локации есть. Не могу сообразить, где проблему искать. Если для X-10 подсунуть texture и bound_rect от другой локации, то при переходе на Радар миникарта Радара есть, но не соответствует позиции актора.

 

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

т.к. для этой локации не указаны texture и bound_rect в game_maps_single.ltx

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

К слову, они в любом случае назначаются, даже если не указаны. Если не указаны, текстурой назначается пустышка ui_nomap2, а bound_rect как (-10000.0f,-10000.0f,10000.0f,10000.0f). Но нельзя назначать текстуру без bound_rect.

Ссылка на комментарий
В 16.11.2017 в 03:56, drksnc сказал:

Почему клиент только два раза получает серверную координату в самом начале?

Клиент получает её один раз, просто сталкеров было двое :biggrin:. Причем у клиента координата оказывается в классе CSE_AlifeHumanStalker. Откуда она там берётся, если как я понял, в сопроджекте, откуда я скопипастил весь код, серверный клиент получает позицию из CAI_Stalker, отправляет её в CSE_AlifeHumanStalker, а тот в свою очередь раскидывает пакет нелокальным клиентам, данные из которых должны применяться в их CAI_Stalker. Причем клиент похоже делает успешный Set_state с этими данными вот здесь:

CPHCharacter* Char; 
Char->set_State(NetState); 

потому что в консоли клиента куча таких сообщений

current_state 5
next_state 5
item_sect wpn_ak74_up2
H_Parent stalker

:angry:

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

В скролл-баре (на ЧН) обнаружил некую особенность, что для широкоформатного разрешения габариты (ширина) этого самого бара и его подложки изменяются в конфиге текстуры только тогда, если она обозначена с окончанием на _16. В противном случае изменение размеров текстуры в конфиге изменений не внесет, похоже двиг их вообще в этом случае не считывает и применяет какие-то базовые. Я не про файл .xml который _16 и который цепляется автоматом на 16:9, а про указанное в нем название текстуры. И почему-то только для скролл-бара это происходит. И никак концы не найду, все перекопал. Кто-нибудь знает, что за чудеса?

 

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

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

  • Нравится 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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