drksnc 14 Опубликовано 19 Марта 2017 Привет. Visual Studio 2013, X-ray 1.6, качал с какого-то репо, сейчас уже не упомню с какого именно. Не могу скомпилировать xrGame. Debug и Mixed на первом скриншоте, Release - на втором. В Realese сборка идёт не смотря на ошибки, но валится позже, ссылаясь на отсутствие xrCore.lib. Опыт работы со студией у меня почти нулевой, но предполагаю, что дело в каких-то путях. Прошу помощи. Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 19 Марта 2017 19.03.2017 в 10:24, abramcumner сказал: Попробуй сначала собрать xrCore, потом xrGame. Всё получилось, спасибо. OpenXray посмотрю. Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 28 Марта 2017 (изменено) Привет. Кто-нибудь работал с мультиплеером в ЧН-ЗП? Не могу разобраться как добавить rpoints для своего режима. Я так понимаю, что даже не обязательно редактировать исходники ЛевелЭдитора, надо лишь в секции объекта в spawn.part указать нужный game_type Показать [object_3] clsid = 6 co_flags = 3 game_type = 24 //вот это вот name = ah_cta_green_0001 position = 11.912968, 1.000000, -10.582791 rotation = -0.000000, -0.209984, -0.000000 rp_profile = rp_type = 0 scale = 1.000000, 1.000000, 1.000000 team_id = 1 type = 0 version = 23 [object_3] clsid = 6 co_flags = 3 game_type = 24 //вот это вот name = ah_cta_green_0001 position = 11.912968, 1.000000, -10.582791 rotation = -0.000000, -0.209984, -0.000000 rp_profile = rp_type = 0 scale = 1.000000, 1.000000, 1.000000 team_id = 1 type = 0 version = 23 Но я понятия не имею какой game_type присваивается моему режиму и где это можно посмотреть. Изменено 28 Марта 2017 пользователем drksnc Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 31 Марта 2017 Всё таки пришлось дописывать свой режим в исходниках Эдитора. Если кому-то нужно будет добавить только rpoint'ы, то нужно всего лишь добавить чекбокс для своего режима в xrEProps по аналогии со стандартными, там буквально 4 файла. Сам level_editor трогать не надо. 1 Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 4 Апреля 2017 Кто-нибудь знает, alSourcePlay(source) да и вообще другие методы от openal32 работают в Сталкере? Или надо юзать надстройки XRAY? Просто вроде всё по документации делаю, но не получается. Вот и думаю - у меня руки кривые или оно так и должно быть. Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 28 Октября 2017 Никто не знает как в ЧН/ЗП в сетевой игре включить возможность использования камер cam_2 и cam_3? Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 28 Октября 2017 28.10.2017 в 11:37, jargon сказал: Твоё действие: Выпилить этот код с этих двух файлов к чертовой бабушке. А разве простое удаление условия не поможет? Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 31 Октября 2017 (изменено) Ещё один вопрос по поводу мультиплеера. Чистое Небо 1.5.10. Экспериментирую с ai в мультиплеере. Подключил alife и смог заспавнить монстров. Есть несколько проблем, но самая актуальная - клиент валится на синхронизации, последовательность методов такая Показать 0023:049F15A6 xrGame.dll, CQuadTree<moving_object>::insert() + 22 byte(s), c:\xray-dev\cs\engine\xrgame\quadtree_inline.h, line 90 + 18 byte(s) 0023:049F0D6B xrGame.dll, moving_object::moving_object() + 283 byte(s), c:\xray-dev\cs\engine\xrgame\moving_object.cpp, line 27 0023:048C7381 xrGame.dll, CCustomMonster::net_Spawn() + 1185 byte(s), c:\xray-dev\cs\engine\xrgame\custommonster.cpp, line 763 + 26 byte(s) 0023:0484CF56 xrGame.dll, CAI_Stalker::net_Spawn() + 150 byte(s), c:\xray-dev\cs\engine\xrgame\ai\stalker\ai_stalker.cpp, line 352 + 45 byte(s) 0023:049C7798 xrGame.dll, CLevel::g_sv_Spawn() + 88 byte(s), c:\xray-dev\cs\engine\xrgame\level_network_spawn.cpp, line 108 + 16 byte(s) 0023:049C75A9 xrGame.dll, CLevel::cl_Process_Spawn() + 169 byte(s), c:\xray-dev\cs\engine\xrgame\level_network_spawn.cpp, line 40 0023:049B4EF2 xrGame.dll, CLevel::ProcessGameEvents() + 290 byte(s), c:\xray-dev\cs\engine\xrgame\level.cpp, line 465 0023:049B4723 xrGame.dll, CLevel::OnFrame() + 467 byte(s), c:\xray-dev\cs\engine\xrgame\level.cpp, line 603 0023:008D539A xrEngine.exe, CInput::OnFrame() + 154 byte(s), c:\xray-dev\cs\engine\xrengine\xr_input.cpp, line 470 0023:00885400 xrEngine.exe, CRegistrator<pureAppStart>::Process() + 80 byte(s), c:\xray-dev\cs\engine\xrengine\pure.h, line 77 0023:008A69AF xrEngine.exe, CRenderDevice::FrameMove() + 399 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 474 0023:008A6C07 xrEngine.exe, CRenderDevice::on_idle() + 183 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 267 0023:008A6B3A xrEngine.exe, CRenderDevice::message_loop() + 90 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 379 0023:008A6A88 xrEngine.exe, CRenderDevice::Run() + 168 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 423 0023:008DC31A xrEngine.exe, Startup() + 378 byte(s), c:\xray-dev\cs\engine\xrengine\x_ray.cpp, line 335 0023:008DBD88 xrEngine.exe, WinMain_impl() + 1048 byte(s), c:\xray-dev\cs\engine\xrengine\x_ray.cpp, line 496 0023:008DB8F6 xrEngine.exe, WinMain() + 54 byte(s), c:\xray-dev\cs\engine\xrengine\x_ray.cpp, line 521 0023:008A3E39 xrEngine.exe, __tmainCRTStartup() + 293 byte(s), f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c, line 618 + 14 byte(s) 0023:763162C4 KERNEL32.DLL, BaseThreadInitThunk() + 36 byte(s) 0023:77CC0F79 ntdll.dll, RtlSubscribeWnfStateChangeNotification() + 1081 byte(s) 0023:77CC0F44 ntdll.dll, RtlSubscribeWnfStateChangeNotification() + 1028 byte(s) Сразу оговорюсь что я не очень силен в программировании, поэтому может не вижу очевидных вещей. Подскажите куда копать. Изменено 31 Октября 2017 пользователем drksnc Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 14 Ноября 2017 31.10.2017 в 20:55, drksnc сказал: Подскажите куда копать. Сам отвечу на свой вопрос: нужно научить клиента загружать граф и АИ-сетку, дополнив метод GameSpecific_Before класса CLevel. Пример можно увидеть в исходниках soProject. Клиент исправно получает хиты и может убивать NPC и монстров. Вот только с синхронизацией положения и поворотов не могу разобраться - как что откуда и куда надо передавать, исходники soProject не помогают. Единственное предположение - надо передавать tNetPacket.w_vec3 (o_Position) и все остальные данные из нужного класса в xrServer_Objects_Alife_Monsters.cpp, а потом в клиентском классе (напр. CAI_Stalker(?)) делать set_State с этими данными. Но как такое провернуть - не знаю. Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 14 Ноября 2017 @_Призрак_ да, что интерполяцию надо будет подключить - понятно. Но я имею ввиду конкретно способ передачи позиции от сервера к клиенту. Нужно же как-то сначала передавать позицию, а потом применять интерполяцию на клиенте. А вот как именно передавать - я хз. Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 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); } 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]); } 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 (изменено) И ещё вопрос вдогонку. Вот этот код означает что в метод PHGetSyncItem класса EntityAlive в кач-ве аргумента передаётся 0? if(pEntityAlive__PHGetSyncItem) { // get sync item _asm { push 0 mov ecx, pClass call pEntityAlive__PHGetSyncItem mov PHCharacter, eax }; if(pEntityAlive__PHGetSyncItem) { // get sync item _asm { push 0 mov ecx, pClass call pEntityAlive__PHGetSyncItem mov PHCharacter, eax }; Изменено 16 Ноября 2017 пользователем drksnc Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 17 Ноября 2017 15.11.2017 в 23: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 stalkercurrent_state 5 next_state 5 item_sect wpn_ak74_up2 H_Parent stalker Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 17 Ноября 2017 Цитата current_state 5 next_state 5 item_sect wpn_ak74_up2 H_Parent stalker А, нет. это сообщения от PHGetSyncItem(0). Но почему их ТАК много. Поделиться этим сообщением Ссылка на сообщение
drksnc 14 Опубликовано 21 Ноября 2017 (изменено) 17.11.2017 в 02:06, drksnc сказал: Клиент получает её один раз, просто сталкеров было двое . С позицией и поворотами разобрался. Теперь косяк с анимацией - на клиенте после вызова PlayCycle, даже с включеным лупом, анимка останавливается на последнем кадре (вроде), причем на сервере с такими же параметрами все замечательно пашет. Еще есть animation().update(), но результат его работы оставляет желать лучшего Изменено 21 Ноября 2017 пользователем drksnc Поделиться этим сообщением Ссылка на сообщение