_Призрак_ 11 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 Тут не все так просто. Если просто передавать позицию и применять ее то движения будут дерганными из-за задержки сети. Для того чтобы это заработало так как нужно, нужно ковырять как в классе CActor реализована интерполяция (файл Actor_Network.cpp). Скорее всего ее можно будет ±копипастой применить к обычным НПС. Freedom Ссылка на комментарий
drksnc 14 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 @_Призрак_ да, что интерполяцию надо будет подключить - понятно. Но я имею ввиду конкретно способ передачи позиции от сервера к клиенту. Нужно же как-то сначала передавать позицию, а потом применять интерполяцию на клиенте. А вот как именно передавать - я хз. Ссылка на комментарий
Romann 623 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 (изменено) 2 часа назад, jargon сказал: минимальное перестроение По xоду это не решение. Уже по времени компилит столько же, сколько без этого, а до конца сборки - ещё как до Шанxая босиком, т.е. сборка будет ещё дольше... Скомпилит первый раз Так уже ведь был компиль. Изменено 14 Ноября 2017 пользователем 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. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
jargon 4 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 Только что, Romann сказал: По xоду это не решение. Уже по времени компилит столько же, сколько без этого, а до конца сборки - ещё как до Шанxая босиком, т.е. сборка будет ещё дольше... Скомпилит первый раз, после чего будет компилить по мере изменения кода. Ссылка на комментарий
dsh 3 824 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 23 hours ago, Winsor said: CRegistryHelperProcess помогает записать/прочитать в сейв А это что за процесс такой? Не нахожу такого в исходниках движка. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
dsh 3 824 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 Есть у меня элементарный вопрос. Вот делаем мы local v = vector() Чему должны быть равны x, y, и z этого вектора? nil, 0, случайное значение? Если 0, то почему? Я не могу найти в движке инициализацию в нулевые значения. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
krop 11 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 5 часов назад, dsh сказал: Если 0, то почему? Потому что динамическая типизация Lua. В статических языках ты бы исключение словил. А тут, если чего-то нету, то nullptr. Ссылка на комментарий
dsh 3 824 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 @krop не, все равно не понятно. Вот сделал я local v = vector() и передал эту v в какую-нибудь движковую функцию. Т.е. там это будет Fvector v, да? Но какие x, y, z у этого вектора будут в движке, 0? Тогда не могу понять почему. В конструкторе, в _vector3d.h эти поля не инициализируются, следовательно их значения не определены, т.е. что будет лежать в памяти, такие значения и будут, так? Каким образом, попадая в lua, когда я делаю local v = vector(), эти неопределенные значения превращаются в 0? Или все это как-то по другому? dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
dsh 3 824 Опубликовано 14 Ноября 2017 Поделиться Опубликовано 14 Ноября 2017 К предыдущему. Вот я беру и выполняю следующий код, используя 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 и выполняю то же самое. Вижу, что все значения случайные. Есть и нули, а есть и не нули. Вот меня и интересует, где в старом движке делается эта инициализация. В каком месте это чинить нужно? dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
drksnc 14 Опубликовано 15 Ноября 2017 Поделиться Опубликовано 15 Ноября 2017 Почему клиент только два раза получает серверную координату в самом начале? Я вроде бы один в один переписал код с 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]); } Ссылка на комментарий
drksnc 14 Опубликовано 16 Ноября 2017 Поделиться Опубликовано 16 Ноября 2017 (изменено) И ещё вопрос вдогонку. Вот этот код означает что в метод PHGetSyncItem класса EntityAlive в кач-ве аргумента передаётся 0? if(pEntityAlive__PHGetSyncItem) { // get sync item _asm { push 0 mov ecx, pClass call pEntityAlive__PHGetSyncItem mov PHCharacter, eax }; Изменено 16 Ноября 2017 пользователем drksnc Ссылка на комментарий
_Призрак_ 11 Опубликовано 16 Ноября 2017 Поделиться Опубликовано 16 Ноября 2017 @dsh vector() 1 в 1 транслируется в вызов конструктора FVector (ну или какой там класс). Если в конструкторе по умолчанию (т.е. FVector()) не инициализируются поля то значит там в любом случае будет мусор, хоть ты создал вектор через C++, хоть через Lua. А то что у тебя на одном движке нули, а на другом случайные числа то это легко объяснить - в обоих случаях у тебя мусор в переменных, просто в одном случае у тебя повезло словить 3 нуля, а в другом нет. Или на одном была отключена оптимизация (в этом случае все переменные инициализируются нулем). Почему могло получиться случайно 3 нуля? Потому что если посмотреть на память приложения, то количество нулевых байт будет в сотни раз больше чем любых других из-за специфики программ @drksnc Да, асемблерная вставка означает: pClass->PHGetSyncItem(0) 1 Freedom Ссылка на комментарий
dsh 3 824 Опубликовано 16 Ноября 2017 Поделиться Опубликовано 16 Ноября 2017 4 hours ago, _Призрак_ said: Или на одном была отключена оптимизация (в этом случае все переменные инициализируются нулем). Ага, скорее всего именно в этом дело. Наверное оригинальный движок с отключённой оптимизацией был собран. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
krop 11 Опубликовано 16 Ноября 2017 Поделиться Опубликовано 16 Ноября 2017 4 часа назад, dsh сказал: Наверное оригинальный движок с отключённой оптимизацией был собран. Кто-то в Debug версию не играл, раз так говорит. Ссылка на комментарий
dsh 3 824 Опубликовано 16 Ноября 2017 Поделиться Опубликовано 16 Ноября 2017 Может кто-нибудь сталкивался с такой проблемой. В X-10 нет миникарты - это нормально, т.к. для этой локации не указаны texture и bound_rect в game_maps_single.ltx. Перехожу из X-10 на поверхность и миникарта по прежнему пустая. Если перезапустить игру и загрузить автосейв перехода, то миникарта этой локации есть. Не могу сообразить, где проблему искать. Если для X-10 подсунуть texture и bound_rect от другой локации, то при переходе на Радар миникарта Радара есть, но не соответствует позиции актора. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Zagolski 74 Опубликовано 17 Ноября 2017 Поделиться Опубликовано 17 Ноября 2017 7 часов назад, dsh сказал: т.к. для этой локации не указаны texture и bound_rect в game_maps_single.ltx Вообще как-то странно переход происходит из катакомб на улицу. Практически мгновенно, как будто наружная лока уже загружена. Или когда заходишь в подземелье она не выгружается... Возможно из-за этого какие-то косяки происходят. К слову, они в любом случае назначаются, даже если не указаны. Если не указаны, текстурой назначается пустышка ui_nomap2, а bound_rect как (-10000.0f,-10000.0f,10000.0f,10000.0f). Но нельзя назначать текстуру без bound_rect. Ссылка на комментарий
drksnc 14 Опубликовано 17 Ноября 2017 Поделиться Опубликовано 17 Ноября 2017 В 16.11.2017 в 03:56, drksnc сказал: Почему клиент только два раза получает серверную координату в самом начале? Клиент получает её один раз, просто сталкеров было двое . Причем у клиента координата оказывается в классе 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 Ссылка на комментарий
drksnc 14 Опубликовано 17 Ноября 2017 Поделиться Опубликовано 17 Ноября 2017 Цитата current_state 5 next_state 5 item_sect wpn_ak74_up2 H_Parent stalker А, нет. это сообщения от PHGetSyncItem(0). Но почему их ТАК много. Ссылка на комментарий
Zagolski 74 Опубликовано 17 Ноября 2017 Поделиться Опубликовано 17 Ноября 2017 (изменено) В скролл-баре (на ЧН) обнаружил некую особенность, что для широкоформатного разрешения габариты (ширина) этого самого бара и его подложки изменяются в конфиге текстуры только тогда, если она обозначена с окончанием на _16. В противном случае изменение размеров текстуры в конфиге изменений не внесет, похоже двиг их вообще в этом случае не считывает и применяет какие-то базовые. Я не про файл .xml который _16 и который цепляется автоматом на 16:9, а про указанное в нем название текстуры. И почему-то только для скролл-бара это происходит. И никак концы не найду, все перекопал. Кто-нибудь знает, что за чудеса? Изменено 17 Ноября 2017 пользователем Zagolski Ссылка на комментарий
Zagolski 74 Опубликовано 17 Ноября 2017 Поделиться Опубликовано 17 Ноября 2017 Сегодня разобрался с проблемой в скроллбаре. Там никакой фантастики оказывается не было, просто как оказалось, эти две текстуры уже были определены в конфиге, т.е. читались те, которые определены выше, а не те, которые я изменял. Вот что значит с уставшей головой сидеть... Мда. 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти