Немного о том, почему ксаш никогда не будет иметь полной поддержки халфовских дллок
Те, кто успел поработать с движок, наверняка заметили, что ксаш ипользует в качестве игровых дллок обычный 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 была добавлена целая пачка новых функций. В любой случае выяснять как работает этот механизм и уж тем более пихать в ксаш чужие хаки (и не факт что это всё еще и заработает правильно), у меня нет никакого желания.
------------------
Таким образом определенная несовместимость - это просто результат эволюции и нововведений и сознательного отказа от некоторых пережитков прошлого прежде всего, а не отказ удовлетворить чьи-то потребности на ровном месте.
Дядя Миша писал: В оригинальном half-life есть один подлый хак, который определяет тип игры и в зависимости от этого включает те или иные фичи. Для опфора - одно, для натурал селекшен - другое, для контер страйка - третье.
Эээ... Какие основания так утверждать? Пример привести можешь?
XaeroX писал: Эээ... Какие основания так утверждать? Пример привести можешь?
Надо пнуть фиэктру - он мне давал сцылочку на один буржуйский форум, где был код на эту тему, видимо полученный ревер-инженерингом.
Я сам чуть не попутал.
Дядя Миша писал: В оригинальном half-life есть один подлый хак, который определяет тип игры и в зависимости от этого включает те или иные фичи. Для опфора - одно, для натурал селекшен - другое, для контер страйка - третье.
Единственное что я видел из похожих вещей - в мануале мода "Public enemy" (как то так он назывался) ребята написали что попросили вальве увеличить значение w_poly при котором игра начинала тормозить, но я читал это несколько лет назад и может быть я что нибудь путаю, может быть они попросили их оптимитизацию какую нибудь сделать, мода того у меня нету, поэтому поглядеть и точно сказать не могу.
__________________
Трагическая новость: Пятеро инженеров Casio умерли от смеха, узнав что Samsung анонсировали часы с заявленным временем работы в 25 часов
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Скорее всего, этот код вовсе не говорит о том, что для модов сделаны хаки. На это есть две причины - очевидная и логическая.
1) Очевидная. Для HL и DMC разные оффсеты, исходники есть для обоих модов. Сравните их таблицы экспорта (можете не париться и сравнивать, хедеры у них в СДК общие).
2) Логическая. Все эти оффсеты - для клиентских дллок, а они у каждого мода разные.
Хотя конечно, я смутно себе представляю, как это работает (а именно - как мы от адреса функции в таблице экспорта дллки перешли к адресу ее параметра путем прибавления довольно странного оффсета).