HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Xash3D (https://hlfx.ru/forum/forumdisplay.php?forumid=14)
-- Немного о том, почему ксаш никогда не будет иметь полной поддержки халфовских дллок (https://hlfx.ru/forum/showthread.php?threadid=2188)
Отправлено Дядя Миша 21-05-2010 в 09:26:
Немного о том, почему ксаш никогда не будет иметь полной поддержки халфовских дллок
Те, кто успел поработать с движок, наверняка заметили, что ксаш ипользует в качестве игровых дллок обычный SDK от Half-Life, но полной совместимости (т.е. возможности подключать уже скомпилированные библиотеки) там нету. Те товарищи, которые надеялись таким образом подключить свой любимый контер-страйк или опфор, ессно пролетают.
И мне переодически пишут о том, как было бы неплохо замутить прямо-таки совершенно полную поддержку. В ответ на такие просьбы хотелось бы изложить все свои соображения, почему лично я считаю такую поддержку нецелесообразной а в определенных случаях - и невозможной.
Итак:
1. Ксаш поддерживает до 16 бонеконтроллеров и до 16 блендингов анимаций. Эти значения на сервере хранятся в entvars_t, где в оригинале отведено всего по 4 ячейки для каждого. Таким образом сохранить совместимость здесь - просто убить дополнительные возможности.
2. Ксаш использует практически идентичные структуры эдиктов как на клиенте, так и на сервере (благо в ксаше имеется локальный клиентский мир, во многом идентичный серверному, позволяющий осуществлять трасинг как на сервере), в хл1 - костыль, многократная передекларация различных physent_t, cl_entity_t что сбивает с толку начинающих кодеров, да и более опытным не очень удобно. Из-за этого безусловно нарушается совместимость с PM_Move в частности и с кодом всего клиента - вообще.
3. Из-за расширенных возможностей TriAPI (в ксаше это не просто обёртка над вызовов gl-функций), был практически полностью переписан код большинства клиентских эффектов - в частности на клиент были перенесены: весь код темп-энтить, весь код лучей, код создания большинства эффектов через флаги EF_ (партиклы, фонарик).
Разумеется всё это открыло много новых возможностей для кодеров (например добавление новых типов лучей и темп-энтить), но напрочь убило совместимость клиентов.
4. В любом случае я имею крайне смутное представление о генерации WonID и SteamID - без исходников самого Half-Life, я вряд ли бы смог воссоздать их работу, как того требуют библиотеки.
5. Сетевые протоколы ксаша и half-life в любом случае несовместимы.
И не только потому, что я не смог их воссоздать. Ксаш использует более эффективный и экономный протокол, в частности более совершенную модель обмена состоянием энтить, передачи класснеймов по сети (что в свою очередь даёт возможность работы FindEntityByClassname на клиенте).
6. Механизм отсева невидимых энтить на сервере обязан учитывать энтити, видимые сквозь порталы. В любом случае эту функцию придётся немного видоизменить для корректной работы.
7. В оригинальном half-life есть один подлый хак, который определяет тип игры и в зависимости от этого включает те или иные фичи. Для опфора - одно, для натурал селекшен - другое, для контер страйка - третье.
Для того же Decay в engfuncs была добавлена целая пачка новых функций. В любой случае выяснять как работает этот механизм и уж тем более пихать в ксаш чужие хаки (и не факт что это всё еще и заработает правильно), у меня нет никакого желания.
------------------
Таким образом определенная несовместимость - это просто результат эволюции и нововведений и сознательного отказа от некоторых пережитков прошлого прежде всего, а не отказ удовлетворить чьи-то потребности на ровном месте.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 21-05-2010 в 10:36:
Цитата:
Дядя Миша писал:
В оригинальном half-life есть один подлый хак, который определяет тип игры и в зависимости от этого включает те или иные фичи. Для опфора - одно, для натурал селекшен - другое, для контер страйка - третье.
Эээ... Какие основания так утверждать? Пример привести можешь? 
__________________
Отправлено Дядя Миша 21-05-2010 в 11:43:
Цитата:
XaeroX писал:
Эээ... Какие основания так утверждать? Пример привести можешь?
Надо пнуть фиэктру - он мне давал сцылочку на один буржуйский форум, где был код на эту тему, видимо полученный ревер-инженерингом.
Я сам чуть не попутал.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено CrazyRussian 21-05-2010 в 11:47:
Цитата:
Дядя Миша писал:
В оригинальном half-life есть один подлый хак, который определяет тип игры и в зависимости от этого включает те или иные фичи. Для опфора - одно, для натурал селекшен - другое, для контер страйка - третье.
Единственное что я видел из похожих вещей - в мануале мода "Public enemy" (как то так он назывался) ребята написали что попросили вальве увеличить значение w_poly при котором игра начинала тормозить, но я читал это несколько лет назад и может быть я что нибудь путаю, может быть они попросили их оптимитизацию какую нибудь сделать, мода того у меня нету, поэтому поглядеть и точно сказать не могу.__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов
Отправлено XaeroX 21-05-2010 в 11:54:
Цитата:
Дядя Миша писал:
Надо пнуть фиэктру - он мне давал сцылочку на один буржуйский форум, где был код на эту тему, видимо полученный ревер-инженерингом.
Ок, жду.
Цитата:
CrazyRussian писал:
ребята написали что попросили вальве увеличить значение w_poly при котором игра начинала тормозить
Вальве, разумеется, даже не удостоила такую идиотскую просьбу ответом?
Добавлено 21-05-2010 в 18:54:
Все, сажусь писать письмо в вальв, с просьбой прикрутить бамп и отражения для моего мода "хлфх".
__________________
Отправлено Government-Man 21-05-2010 в 12:43:
Цитата:
CrazyRussian писал:
попросили вальве увеличить значение w_poly при котором игра начинала тормозить
C++ Source Code:
1 | // a point where lags begin |
2 | #define WPOLY_LAG_LIMIT 3000 |
7 | if ( wPoly >= WPOLY_LAG_LIMIT ) |
Отправлено XaeroX 21-05-2010 в 13:25:
Government-Man 
__________________
Отправлено FiEctro 21-05-2010 в 14:18:
Дядя Миша
Ты про это?
C++ Source Code:
1 | // edit: rewritten and optimized. |
2 | // works with: cs1.6, cz, dod, hl1, tfc, dmc, ts, dmc, ns. |
5 | while( !FindWindow( "Valve001", NULL ) ) { Sleep( 50 ); } // no game window? |
6 | Sleep( 2000 ); // let the game initialize |
8 | HMODULE hmHW = GetModuleHandle( "hw.dll" ); |
11 | hmHW = GetModuleHandle( "sw.dll" ); |
14 | MessageBox( NULL, "Your in Software mode.\nCare to switch to opengl?", "SimpleBaseIII", MB_OK | MB_ICONERROR ); |
17 | MessageBox( NULL, "Are you using Non-Steam?\nBuy the game!", "SimpleBaseIII", MB_OK | MB_ICONERROR ); |
21 | DWORD dwClientRef = g_Utils.dwFindPattern( (DWORD)hmHW, 0x0122A000, (BYTE*)"\x56\x8B\x74\x24\x00\x56\xE8\x00\x00\x00\x00\x83\xC4\x00\xA3\x00\x00\x00\x00\x85\xC0\x75\x00", "xxxx?xx????xx?x????xxx" ); |
23 | exporttable_t *pExport = (exporttable_t*)*(DWORD*)dwClientRef; |
24 | while( !pExport->Initialize || !pExport->HUD_GetStudioModelInterface ) { Sleep( 50 ); } // avoid crash |
26 | cl_enginefunc_t *pEngine = NULL; |
27 | engine_studio_api_t *pStudio = NULL; |
28 | DWORD dwEngineOfs = NULL, dwStudioOfs = NULL; |
29 | switch( g_Utils.m_iGame ) |
51 | pEngine = (cl_enginefunc_t*)*(DWORD*)( (DWORD)*pExport->Initialize + dwEngineOfs ); |
52 | pStudio = (engine_studio_api_t*)*(DWORD*)( (DWORD)*pExport->HUD_GetStudioModelInterface + dwStudioOfs ); |
53 | while( !pEngine->pfnHookEvent || !pStudio->Mem_Calloc ) { Sleep( 50 ); } // avoid crash |
55 | HookClient( pExport ); |
56 | HookEngine( pEngine ); |
57 | HookStudio( pStudio ); |
>> WonID и SteamID
Это что такое?__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено XaeroX 21-05-2010 в 14:25:
FiEctro
Откуда этот код? Только не говорите опять про реверс инженеринг, это не смешно.
Цитата:
FiEctro писал:
Это что такое?
Это идентификаторы, по которым Headcrab Frenzy идентифицирует тебя при занесении в таблицу статистики.__________________
Отправлено FiEctro 21-05-2010 в 14:30:
>> Откуда этот код?
От буржуев.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено XaeroX 21-05-2010 в 14:38:
FiEctro
Спасибо, Адмирал Я.Х., а подробнее?
__________________
Отправлено FiEctro 21-05-2010 в 14:44:
XaeroX
Подробнее больше там ничего нет. Ну разве еще это:
C++ Source Code:
2 | void* m_pEngfuncs = NULL; |
5 | void* m_ppinterface = NULL; |
6 | void* m_pPreS_DynamicSound = NULL; |
9 | bool getstuff_halflife(void) |
11 | char engine_sig[] = "\x89\x74\x24\x5C\x89\x74\x24\x60\x89\x74\x24\x64\x89\x74\x24\x68\x89\x74\x24\x6C\x89\x74\x24\x70\x89\x74\x24\x74\x89\x74\x24\x78\x89\x74\x24\x7C\0"; |
12 | for(char* engine = (char*)0x01D00000; (DWORD)engine < 0x2D60000/*ftw*/; engine++) |
14 | // if( *(PBYTE)(engine) == 0x68 && |
15 | // *(PBYTE)(engine + 0x05) == 0xE8 && |
16 | // *(PBYTE)(engine + 0x0A) == 0x6A && |
17 | // *(PBYTE)(engine + 0x0B) == 0x07 && |
18 | // *(PBYTE)(engine + 0x0C) == 0x68 && |
19 | // *(PBYTE)(engine + 0x11) == 0xFF && |
20 | // *(PBYTE)(engine + 0x12) == 0x15 && |
21 | // *(PBYTE)(engine + 0x17) == 0x68) |
23 | // *(byte**)&m_pEngfuncs = (void*)*(DWORD*)(engine + 0x0D); |
24 | // LOG_RET(m_pEngfuncs); |
26 | if( *(PBYTE)(engine) == 0x68 && |
27 | *(PBYTE)(engine + 0x05) == 0x68 && |
28 | *(PBYTE)(engine + 0x0A) == 0x6A && |
29 | *(PBYTE)(engine + 0x0B) == 0x01 && |
30 | *(PBYTE)(engine + 0x0C) == 0xFF && |
31 | *(PBYTE)(engine + 0x0D) == 0xD0 && |
32 | *(PBYTE)(engine + 0x0E) == 0x83 && |
33 | *(PBYTE)(engine + 0x27) == 0xC3) |
35 | //*(byte**)&m_pStudio = (void*)*(DWORD*)(engine + 0x01); |
36 | *(byte**)&m_ppinterface = (byte*)*(DWORD*)(engine + 0x06); |
38 | if( !memcmp(engine,engine_sig,hack_func->_string->_strlen(engine_sig)) ) |
40 | *(byte**)&m_pSlots = (byte*)(*(DWORD*)(engine - 0x74)); |
41 | *(byte**)&m_pEngfuncs = reinterpret_cast<byte*>((DWORD)engine + (DWORD)0x13417D); |
42 | *(byte**)&m_pStudio = reinterpret_cast<byte*>((DWORD)engine + (DWORD)0x15064D); |
43 | *(byte**)&m_pPreS_DynamicSound = reinterpret_cast<byte*>((DWORD)engine + (DWORD)0x349ED); |
44 | *(byte**)&m_pPmove = reinterpret_cast<byte*>((DWORD)engine + (DWORD)0xFEB69D); |
46 | hack_func->add_log_to_file("m_pSlots 0x%X", m_pSlots); |
47 | hack_func->add_log_to_file("m_pEngfuncs 0x%X", m_pEngfuncs); |
48 | hack_func->add_log_to_file("m_pStudio 0x%X", m_pStudio); |
49 | hack_func->add_log_to_file("m_pPreS_DynamicSound 0x%X", m_pPreS_DynamicSound); |
50 | hack_func->add_log_to_file("m_pPmove 0x%X", m_pPmove); |
51 | hack_func->add_log_to_file("m_ppinterface 0x%X", m_ppinterface); |
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено XaeroX 21-05-2010 в 14:47:
FiEctro
Ты скажи, откуда конкретно взял код? Что за сайт, что за люди? Может, это вообще из разряда Дзугаровских недоков?
__________________
Отправлено FiEctro 21-05-2010 в 14:50:
XaeroX
С тебя демка волатилы
.
http://forum.gamedeception.net/thre...for-DoD-HL1-TFC
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено XaeroX 21-05-2010 в 15:15:
Скорее всего, этот код вовсе не говорит о том, что для модов сделаны хаки. На это есть две причины - очевидная и логическая.
1) Очевидная. Для HL и DMC разные оффсеты, исходники есть для обоих модов. Сравните их таблицы экспорта (можете не париться и сравнивать, хедеры у них в СДК общие).
2) Логическая. Все эти оффсеты - для клиентских дллок, а они у каждого мода разные.
Хотя конечно, я смутно себе представляю, как это работает (а именно - как мы от адреса функции в таблице экспорта дллки перешли к адресу ее параметра путем прибавления довольно странного оффсета).
__________________