HLFX.Ru Forum
Показать все 160 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Лажа со стрейфами (https://hlfx.ru/forum/showthread.php?threadid=3495)


Отправлено ONeiLL 22-06-2012 в 14:18:

Лажа со стрейфами

Ужасно выглядят стрейфы в присядку, слишком сильно модель в сторону клонит

Подскажите пожалуйста, как подправить

Добавлено 22-06-2012 в 17:18:

Да и не в присядку тоже ужасно


Отправлено Дядя Миша 22-06-2012 в 15:09:

ONeiLL а ты 9-way blending заюзал? Апопробуй, кстати.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ONeiLL 22-06-2012 в 15:25:

Дядя Миша , гадость, это 9-way blending. Все хитбоксы уехали, не годится он. Надо по другому


Отправлено Дядя Миша 22-06-2012 в 15:42:

Цитата:
ONeiLL писал:
Все хитбоксы уехали, не годится он

Плохому программисту - и студия мешает.
Нормальные челы добавляют его же на сервере, поскольку там специальный интерфейс предусмотрен для этого дела: SV_StudioGetBlendingInterface. Но конечно сказать "гадость" проще всего.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ONeiLL 22-06-2012 в 15:55:

Дядя Миша , а другого способа, кроме этого бленда нету?


Отправлено Дядя Миша 22-06-2012 в 16:39:

Наверное есть. Но его сперва следует придумать.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено HAWK0044 22-06-2012 в 17:37:

Дядя Миша
это ж хл обычный, там вот так вот крутяться боунконтроллеры, надо курить в ту сторону.


Отправлено Дядя Миша 22-06-2012 в 17:47:

Я же говорю, чтобы не съезжали физ.боксы надо написать ответную часть для 9-way blending-а на сервере. И подключить через вышеупомянутый интерфейс. Именно так и сделано в вашей любимой контре. Через боне-контроллеры реалистичного движения не добешься нипочём. Они же линейные.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено qpAHToMAS 22-06-2012 в 17:53:

Это еще ничего. У нас как-то в CS один вообще руку сломал:


Отправлено Дядя Миша 22-06-2012 в 18:00:

Лишь бы брат не умер

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 22-06-2012 в 18:00:

Цитата:
qpAHToMAS писал:
Это еще ничего. У нас как-то в CS один вообще руку сломал:

в скелете кости для пальцев удалены просто.


Отправлено qpAHToMAS 22-06-2012 в 18:18:

Цитата:
marikcool писал:
в скелете кости для пальцев удалены просто.

Не знаю, по-моему просто накосячили в анимации когда игрок сидит.


Отправлено marikcool 22-06-2012 в 18:56:

Цитата:
qpAHToMAS писал:
Не знаю, по-моему просто накосячили в анимации когда игрок сидит.

походу да, надо глянуть старые модели с 1.1 например. в 1.6 все время думал что кости для пальцев не допилили и они так глючить стали.


Отправлено Дядя Миша 22-06-2012 в 19:00:

Цитата:
qpAHToMAS писал:
Не знаю, по-моему просто накосячили в анимации когда игрок сидит.

Именно так. Причём сидит в какую-то одну сторону (влево или вправо).

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено HAWK0044 22-06-2012 в 19:30:

Дядя Миша
ему же на 2-вэй бленд надо, хл же


Отправлено Ku2zoff 22-06-2012 в 21:50:

Цитата:
Дядя Миша писал:
Нормальные челы добавляют его же на сервере, поскольку там специальный интерфейс предусмотрен для этого дела: SV_StudioGetBlendingInterface.

Дядя Миша можно поподробнее? Поиск по файлам не дал результата. Интерфейс недокументированный что ли?


Отправлено marikcool 23-06-2012 в 04:52:

все что имеем:
http://www.mail-archive.com/hlcoder...m/msg19351.html

в целом нужно взять код клиентку и портануть на сервак.

легкие пути через доп подгрузки mp.dll и установка SV_StudioSetupBones с mp.dll из cs 1.6 рушит сервер, а также пробовал версии с передачей newdllfunc и убиранием из экспорта entapi2 и передача указателей из той же mp.dll тоже крашит сервер.

остается потихой сидеть да портировать клиентский код.


Отправлено Дядя Миша 23-06-2012 в 05:41:

Цитата:
Ku2zoff писал:
Поиск по файлам не дал результата. Интерфейс недокументированный что ли?

r_studioint.h кури - там всё. Ну и в ксаше ответную часть смотри.
Он не то чтобы недокументированный. Он слабо документированный.
Цитата:
marikcool писал:
легкие пути через доп подгрузки mp.dll и установка SV_StudioSetupBones с mp.dll из cs 1.6 рушит сервер

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 23-06-2012 в 06:02:

Цитата:
Дядя Миша писал:
будь уверен что ты умеешь работать с указателями, в которых более одной звездочки.

брал 3 готовых решений, результат одинаковый.


Отправлено Дядя Миша 23-06-2012 в 06:06:

То-то у меня в ксаш-моде всё работает

Добавлено 23-06-2012 в 10:06:

ЗЫ. там есть указатель на эдикт - его использовать нельзя ни в коем случае.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 23-06-2012 в 06:51:

C++ Source Code:
1
typedef int (*SERVER_GETBLENDINGINTERFACE) (int, struct sv_blending_interface_s **, struct engine_studio_api_s *, float (*)[3][4], float (*)[MAXSTUDIOBONES][3][4]);
2
extern "C" int __declspec( dllexport ) Server_GetBlendingInterface( int version, struct sv_blending_interface_s **ppinterface, struct engine_studio_api_s *pstudio, float (*rotationmatrix)[3][4], float (*bonetransform)[MAXSTUDIOBONES][3][4] )
3
{
4
  HMODULE h_Library;
5
  h_Library = LoadLibrary("mp.dll");
6
  if ( !h_Library)
7
  {
8
    MessageBox( 0, "mp.DLL Not Found", "Error", MB_OK );
9
  }
10
  static SERVER_GETBLENDINGINTERFACE other_Server_GetBlendingInterface = NULL;
11
  static bool missing = FALSE;
12
  // if the blending interface has been formerly reported as missing, give up
13
    if (missing)
14
      return (FALSE);
15
    // do we NOT know if the blending interface is provided ? if so, look for its address
16
      if (other_Server_GetBlendingInterface == NULL)
17
        other_Server_GetBlendingInterface = (SERVER_GETBLENDINGINTERFACE) GetProcAddress (h_Library, "Server_GetBlendingInterface");
18
      // have we NOT found it ?
19
      if (!other_Server_GetBlendingInterface) {
20
        missing = TRUE; // then mark it as missing, no use to look for it again in the future
21
        return (FALSE); // and give up
22
      }
23
      // else call the function that provides the blending interface on request
24
        return ((other_Server_GetBlendingInterface) (version, ppinterface, pstudio, rotationmatrix, bonetransform));
25
    }


Отправлено Дядя Миша 23-06-2012 в 17:09:

Зачем это мне?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 23-06-2012 в 18:41:

Цитата:
Дядя Миша писал:
Зачем это мне?

может узришь грабли и поможешь простым смертным)


Отправлено XaeroX 23-06-2012 в 18:45:

Ну я, например, узреваю факт отсутствия вызова GiveFnptrsToDll.

__________________

xaerox on Vivino


Отправлено marikcool 23-06-2012 в 18:48:

Цитата:
XaeroX писал:
Ну я, например, узреваю факт отсутствия вызова GiveFnptrsToDll.

она же отдельным экспортом идет, выше кусочек он в h_export.cpp hlsdk добавляется


Отправлено XaeroX 23-06-2012 в 18:50:

marikcool
И что? Ты можешь дать мне слово коммуниста, что этот экспорт не юзает в своём таинственном внутреннем коде g_engfuncs?

__________________

xaerox on Vivino


Отправлено Дядя Миша 23-06-2012 в 18:52:

Цитата:
marikcool писал:
и поможешь простым смертным)

опять песня про сложного-бессмертного?
Под ксашем загрузи. Если снова вылетит - проблема 100% у тебя.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 23-06-2012 в 20:20:

Цитата:
XaeroX писал:
marikcool
И что? Ты можешь дать мне слово коммуниста, что этот экспорт не юзает в своём таинственном внутреннем коде g_engfuncs?

затупил я, извините, счас буду передовать g_engfuncs в mp.dll, посмотрю че выйдет.

Добавлено 24-06-2012 в 00:20:

передал енгфанкс в контру, проверил результат сервербленда от кс длл получил 0, заработало, по крайне мере на монстрах кости с хитбоксами на месте, завтра проверю по сети че с игроками стало.


Отправлено qpAHToMAS 24-06-2012 в 00:48:

Цитата:
marikcool писал:
завтра проверю по сети че с игроками стало.

А можно видео? Где изменения отчетливо видны.
Я просто не совсем понимаю о чем идет речь.

Цитата:
Дядя Миша писал:
Причём сидит в какую-то одну сторону (влево или вправо).

Вот кстати анимация в "даке" очень фатальна при стрейфах игрока:

На гифке: простые нажатия на A и D (влево-вправо).
Это одна из вещей, которую бы я изменил, если бы делал свой CS.
Source на сколько я знаю таким не страдает, да и Promode тоже.


Отправлено Дядя Миша 24-06-2012 в 07:24:

Цитата:
qpAHToMAS писал:
Это одна из вещей, которую бы я изменил, если бы делал свой CS.

это чисто проблемы модельки.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 24-06-2012 в 07:57:

Цитата:
Дядя Миша писал:
Я же говорю, чтобы не съезжали физ.боксы надо написать ответную часть для 9-way blending-а на сервере.

Это не в animation.cpp случаем?


Отправлено Дядя Миша 24-06-2012 в 08:11:

Цитата:
Ku2zoff писал:
Это не в animation.cpp случаем?

да без разницы где. Вон марик пример показал.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 24-06-2012 в 15:06:

Я не совсем понял... Это вроде проверки, чтобы движок знал, присутствует новый интерфейс или нет? Или надо ещё какие-то манипуляции провести, функции на сервере изменить?


Отправлено Дядя Миша 24-06-2012 в 17:59:

ну там каллбэк корочи SV_StudioSetupBones.
Надо туда сунуть функцию установки костей, согласно 9-way блендингу.
Т.е. такая копипаста с клиента, попутно выкинув весь код, который отвечает за интерполятсыю, поскольку на сервере её нет и быть неможет.
Ну можно пример в движке посмотреть, как трасса устроена.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 24-06-2012 в 19:12:

То есть, должна быть копия функции SetupBones для сервера? Но тогда почему в хл и модах, использующих обычный блендинг, ничего такого нет, и настройка костей на сервере не производится? Или производится, но другим способом?


Отправлено Дядя Миша 24-06-2012 в 19:24:

Цитата:
Ku2zoff писал:
Но тогда почему в хл и модах, использующих обычный блендинг, ничего такого нет, и настройка костей на сервере не производится?

Дык она уже в движке есть дефолтная
К слову сказать, халфа и ксаш прекрасно обходятся без клиентского рендера моделей. Например в опфоре его нету совсем.
Тут скорее эффект популяризации имеет место быть. Клиентский рендер моделей пихали в SDK, а функцию установки костей на сервере - нет (просто за ненадобностью). Вот оно так и сложилось.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 24-06-2012 в 19:33:

Понятно... Хоть бы пример реализации увидеть в каком-нибудь опенсорс-моде, чтобы было на что ориентироваться. А то пожно набыдлокодить чего-нибудь...


Отправлено Дядя Миша 24-06-2012 в 19:40:

Я думал в ксаше подключить, но это пришлось бы тащить модельки соответствующие, а у меня концепция - минимум ресурсов.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 24-06-2012 в 20:11:

начал потихой портировать код с клиентки. маневр с mp.dll дает тот же результат что и дефалтный SV_StudioSetupBones.
как без хаков можно получить движковый SV_StudioSetupBones чтобы юзать его для энтитей не игрока?


Отправлено Дядя Миша 24-06-2012 в 20:21:

marikcool ты умеешь восстанавливать вью-англе из англес?

Добавлено 25-06-2012 в 00:21:

А, и питч не забудь инвертировать %)

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 24-06-2012 в 22:11:

Цитата:
Дядя Миша писал:
marikcool ты умеешь восстанавливать вью-англе из англес?

Добавлено сегодня в 00:21:

А, и питч не забудь инвертировать %)

гдето вроде тутор есть))
питч это да) я помню бленды местами поменял в моделе)))

Добавлено 25-06-2012 в 02:11:

gaitframe нету, ноги чтоли бегают на сервере?


Отправлено Ku2zoff 25-06-2012 в 09:51:

Нашёл на просторах интернета этот код. МБ поможет )


Отправлено Дядя Миша 25-06-2012 в 10:32:

DisplayBones убил напрочь

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 25-06-2012 в 10:45:

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


Отправлено Дядя Миша 25-06-2012 в 12:26:

Цитата:
marikcool писал:
зато автор кода рагдолы прикрутил))

Это автор Half-Life: Enchanced?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 25-06-2012 в 12:34:

Цитата:
Дядя Миша писал:
Это автор Half-Life: Enchanced?

ага, тут http://homepage.ntlworld.com/pr.searle/testns/
кстати hlmv с отображение рэгдола которые грузит rag файлы) так побаловаться посмотреть)


Отправлено Ku2zoff 25-06-2012 в 12:42:

Вот ещё кое-что по теме серверной настройки костей:
http://forums.bots-united.com/showthread.php?t=8090


Отправлено marikcool 25-06-2012 в 12:54:

кто бы запилил, готов проспонсировать на пиво)


Отправлено Дядя Миша 25-06-2012 в 12:56:

Судя по картинке автор до сих пор не слез с Win 3.11
Это печально.


Добавлено 25-06-2012 в 16:56:

Цитата:
marikcool писал:
кто бы запилил, готов проспонсировать на пиво)

Ой-ей-ей! И это говорит проффесионал, у которого в сигнатуре на AMX-форуме написано "пишу плагины, дорого" ?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 25-06-2012 в 12:59:

Цитата:
Дядя Миша писал:
Судя по картинке автор до сих пор не слез с Win 3.11
Это печально.

забавно, но судя по иконке это скин win3.11 для XP )

Добавлено 25-06-2012 в 16:59:

Цитата:
Дядя Миша писал:
Ой-ей-ей! И это говорит проффесионал, у которого в сигнатуре на AMX-форуме написано "пишу плагины, дорого" ?

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


Отправлено Дядя Миша 25-06-2012 в 13:08:

Вот штука хорошая: http://homepage.ntlworld.com/pr.sea...tns/studio_v9.h
космобайкеров-гномов грузить. Больше там нет ничего интересного.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 25-06-2012 в 15:21:

Цитата:
Дядя Миша писал:
космобайкеров-гномов грузить.

Это модельку doctor.mdl? Там версия студиомодели старая, ведь так? HLMV вылетает при попытке открыть.


Отправлено Дядя Миша 25-06-2012 в 16:40:

Цитата:
Ku2zoff писал:
Там версия студиомодели старая, ведь так?

девятая версия. Вот жеж хидер подправленный, с учётом изменений.
ну как подправлен - фичи десятой версии закоменчены.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 25-06-2012 в 17:04:

Сейчас поглядел внимательно код 9ти-направленного блендинга, что на форуме Арранжевого Мента выложен. По-моему, там лишнего кода много, навроде функций, работающих с локальными анимациями. Это что-то типа предиктинга для модели локального игрока? Как я понял, для реализации этого блендинга нужны следующие функции:

C++ Source Code:
StudioSetupBones - настраивает по-новомодному косточки игрока
StudioProcessGait - проигрывает гэйт-анимации, почти не отличается от оригинала, из неё вызываются следующие две
CalculateYawBlend - считает бленд по горизонтали
CalculatePitchBlend - считает бленд по вертикали
LookupAnimation - вызывается из StudioSetupBones, как я понял, находит нужный из 9ти блендов в каждой анимации
Поправьте, если ошибаюсь, может быть какую-нибудь важную функцию упустил.


Отправлено Дядя Миша 25-06-2012 в 17:21:

Цитата:
Ku2zoff писал:
По-моему, там лишнего кода много

слава богу, хоть кто-то заметил.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 25-06-2012 в 17:35:

Цитата:
Дядя Миша писал:
слава богу, хоть кто-то заметил.

Может быть не я один Но, похоже, только я написал об этом. Сдаётся мне, что какие-нибудь товарищи умудрились подменить в своих исходникак все файлы теми, что любезно даны в архиве Хотя, для того, чтобы блендинг зафурычил, достаточно подменить GameStudioModelRenderer.cpp и GameStudioModelRenderer.h. Ну а по-хорошему, надо только лишь заменить StudioSetupBones, StudioProcessGait и добавить расчёты и поиск блендов.

З.Ы. Мне интересно, почему в коде настройки костей есть место, где анимация ходьбы хаком поворачивается на 26 градусов? Неужели и в КС так же?


Отправлено marikcool 25-06-2012 в 18:50:

Ku2zoff если занимаешься по данному вопросу стукни в аську 344388533

Добавлено 25-06-2012 в 22:50:

может ли cs 1.6 блендинг дергать что либо из DLL_FUNCTIONS, т.к он не активируется, работает старый.?


Отправлено pRoxxx 25-06-2012 в 19:23:

Цитата:
Дядя Миша писал:
Ой-ей-ей! И это говорит проффесионал, у которого в сигнатуре на AMX-форуме написано "пишу плагины, дорого" ?

Ну дык пиво это и есть дорого. (=


Отправлено marikcool 25-06-2012 в 22:01:

приложил код, работает но увы тоже 2way.
h_export.cpp :

C++ Source Code:
1
/***
2
*
3
*	Copyright © 1996-2002, Valve LLC. All rights reserved.
4
*
5
*	This product contains software technology licensed from Id
6
*	Software, Inc. ("Id Technology").  Id Technology © 1996 Id Software, Inc.
7
*	All Rights Reserved.
8
*
9
*   Use, distribution, and modification of this source code and/or resulting
10
*   object code is restricted to non-commercial enhancements to products from
11
*   Valve LLC.  All other use, distribution, or modification is prohibited
12
*   without written permission from Valve LLC.
13
*
14
****/
15
/*
16
 
17
===== h_export.cpp ========================================================
18
 
19
  Entity classes exported by Halflife.
20
 
21
*/
22
 
23
#include "extdll.h"
24
#include "util.h"
25
 
26
#include "cbase.h"
27
 
28
// Holds engine functionality callbacks
29
enginefuncs_t g_engfuncs;
30
globalvars_t  *gpGlobals;
31
 
32
 
33
#ifdef _WIN32
34
//extern void Mod_InitStudioAPI( void );
35
// Required DLL entry point
36
BOOL WINAPI DllMain(
37
HINSTANCE hinstDLL,
38
DWORD fdwReason,
39
LPVOID lpvReserved)
40
{
41
  if      (fdwReason == DLL_PROCESS_ATTACH)
42
  {
43
    /*
44
    			HMODULE mpDLL;
45
    			mpDLL = LoadLibrary("mp.dll");
46
    			if ( !mpDLL)
47
    			{
48
    				MessageBox( 0, "mp.DLL Not Found", "Error", MB_OK );
49
    			}
50
    			*/
51
    //Mod_InitStudioAPI( ); //mcc cs 16 hook
52
  }
53
  else if (fdwReason == DLL_PROCESS_DETACH)
54
  {
55
  }
56
  return TRUE;
57
}
58
 
59
#include "extdll.h"
60
//#include "util.h"
61
#include "com_model.h"
62
#include "r_studioint.h"
63
#include "studio.h"
64
#include "dll.h"
65
typedef int (*GETBLENDINGAPI)( int, void**, void*,  float (*transform)[3][4], float (*bones)[MAXSTUDIOBONES][3][4] );
66
typedef int (FAR *GETENTITYAPI)(DLL_FUNCTIONS *, int);
67
typedef int (FAR *GETNEWDLLFUNCTIONS)(NEW_DLL_FUNCTIONS *, int *);
68
typedef void (DLLEXPORT *GIVEFNPTRSTODLL)(enginefuncs_t *, globalvars_t *);
69
GIVEFNPTRSTODLL g_pfnGiveFnptrsToDll;
70
GETENTITYAPI g_pfnGetEntityAPI;
71
GETNEWDLLFUNCTIONS g_pfnGetNewEntityAPI;
72
GETBLENDINGAPI g_pfnServerBlendingAPI;
73
HMODULE g_hGameLib=NULL;
74
void DLLEXPORT GiveFnptrsToDll(	enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals )
75
{
76
  memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
77
  gpGlobals = pGlobals;
78
  if(!g_hGameLib)
79
    g_hGameLib = LoadLibrary("mp.dll");
80
  if (!g_hGameLib)
81
  {
82
    MessageBox( 0, "mp.dll load error", "[!]", MB_OK );
83
    return;
84
  }
85
  g_pfnGetEntityAPI = (GETENTITYAPI)GetProcAddress (g_hGameLib, "GetEntityAPI");
86
  g_pfnGiveFnptrsToDll = (GIVEFNPTRSTODLL)GetProcAddress (g_hGameLib, "GiveFnptrsToDll");
87
  g_pfnServerBlendingAPI = (GETBLENDINGAPI)GetProcAddress (g_hGameLib, "Server_GetBlendingInterface");
88
  g_pfnGetNewEntityAPI = (GETNEWDLLFUNCTIONS)GetProcAddress (g_hGameLib, "GetNewDLLFunctions");
89
  if (!g_pfnGetEntityAPI)	{MessageBox( 0, "pfnGetEntityAPI load error", "[!]", MB_OK ); return;}
90
    if (!g_pfnGiveFnptrsToDll)	{MessageBox( 0, "pfnGiveFnptrsToDll load error", "[!]", MB_OK ); return;}
91
      if (!g_pfnServerBlendingAPI)  {MessageBox( 0, "pfnServerBlendingAPI load error", "[!]", MB_OK ); return;}
92
        if (!g_pfnGetNewEntityAPI)	{MessageBox( 0, "GetNewDLLFunctions load error", "[!]", MB_OK ); return;}
93
 
94
  (*g_pfnGiveFnptrsToDll)(pengfuncsFromEngine, pGlobals);
95
  g_engfuncs.pfnServerPrint("g_pfnGiveFnptrsToDll -> mp.dll READY\n");
96
}
97
 
98
extern "C" int __declspec( dllexport ) Server_GetBlendingInterface (int version, void **ppinterface, void *pstudio, float (*rotationmatrix)[3][4], float (*bonetransform)[128][3][4])
99
{
100
  // this function synchronizes the studio model animation blending interface (i.e, what parts
101
  // of the body move, which bones, which hitboxes and how) between the server and the game DLL.
102
  // some MODs can be using a different hitbox scheme than the standard one.
103
  if (g_pfnServerBlendingAPI == NULL) return false;
104
 
105
  if (!(*g_pfnServerBlendingAPI) (version, ppinterface, pstudio, rotationmatrix, bonetransform))
106
  {
107
    MessageBox( 0, "ServerBlendingAPI ERROR FROM mp.dll!", "[!]", MB_OK );
108
    return false;
109
  }
110
  g_engfuncs.pfnServerPrint("ServerBlendingAPI -> mp.dll READY\n");
111
  return true;
112
}
113
/*
114
extern "C" int __declspec( dllexport ) GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion)
115
{
116
   // it appears that an extra function table has been added in the engine to gamedll interface
117
   // since the date where the first enginefuncs table standard was frozen. These ones are
118
   // facultative and we don't hook them, but since some MODs might be featuring it, we have to
119
   // pass them too, else the DLL interfacing wouldn't be complete and the game possibly wouldn't
120
   // run properly.
121
   if (g_pfnGetNewEntityAPI == NULL) return false;
122
 
123
   if (!(*g_pfnGetNewEntityAPI) (pFunctionTable, interfaceVersion))
124
   {
125
      //LogToFile (true, LOG_CRITICAL, "GetNewDLLFunctions: ERROR - Not Initialized.");
126
	  MessageBox( 0, "GetNewDLLFunctions ERROR FROM mp.dll!", "[!]", MB_OK );
127
      return false;
128
   }
129
   g_engfuncs.pfnServerPrint("GetNewDLLFunctions -> mp.dll READY\n");
130
   return true;
131
}
132
*/
133
#else
134
 
135
extern "C" {
136
 
137
  void GiveFnptrsToDll(	enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals )
138
  {
139
    memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
140
    gpGlobals = pGlobals;
141
  }
142
 
143
}
144
 
145
#endif


Добавлено 26-06-2012 в 01:30:

что интересно, раз в контровском ServerBlendingAPI тоже самое что и в движке, надыбал через гугл оффсеты с серверной дллки.
C++ Source Code:
CBasePlayer::CalculatePitchBlend(void)                                                                                      000EF720
CBasePlayer::CalculateYawBlend(void)                                                                                        000EB5D0
CBasePlayer::StudioPlayerBlend(int *,float *)

получается гдето в тхинке CBasePlayer и стоит переключатель бленда.

Добавлено 26-06-2012 в 02:01:

C++ Source Code:
1
500(505) : m_iGaitSequence          CBasePlayer::Spawn(), CBasePlayer::PostThink(), GetPlayerGaitsequence()
2
 
3
501(506) : m_flGaitFrame            CBasePlayer::Spawn(), CBasePlayer::StudioProcessGait()
4
 
5
502(507) : m_flGaitYaw              CBasePlayer::Spawn(), CBasePlayer::StudioEstimateGait(), CBasePlayer::CalculateYawBlend(), UTIL_GetPlayerGaitYaw()
6
 
7
503(508) : m_flPrevGaitOrigin_x     CBasePlayer::Spawn(), CBasePlayer::StudioEstimateGait()
8
 
9
504(509) : m_flPrevGaitOrigin_y     CBasePlayer::Spawn(), CBasePlayer::StudioEstimateGait()
10
 
11
505(510) : m_flPrevGaitOrigin_z     CBasePlayer::Spawn(), CBasePlayer::StudioEstimateGait()
12
 
13
506(511) : m_flPitch                CBasePlayer::StudioProcessGait(), CBasePlayer::CalculatePitchBlend(), GetPlayerPitch()
14
 
15
507(512) : m_flYaw                  CBasePlayer::CalculateYawBlend(), GetPlayerYaw()
16
 
17
508(513) : m_flGaitMovement         CBasePlayer::Spawn(), CBasePlayer::StudioEstimateGait(), CBasePlayer::CalculateYawBlend(), CBasePlayer::StudioProcessGait()
18
 
19
509(514) : m_fAutoWeaponSwitch      CBasePlayer::SetPrefsFromUserinfo(), CHalfLifeMultiplay::FShouldSwitchWeapon()
20
 
21
510(515) : m_iUserPrefs             CBasePlayer::SetPrefsFromUserinfo(), CHalfLifeTraining::PlayerThink(), CHalfLifeTraining::PlayerSpawn(), ClientCommand(), ShowVGUIMenu()
22
 
23
510 m_iUserPrefs - setinfo _vgui_menus (1<<0), _ah (1<<8), uses_shield (1<<16), has_shield (1<<24)
24
 
25
511(516) : m_bObserverHasTarget     CBasePlayer::Observer_CheckTarget(), CBasePlayer::Observer_SetMode()
26
 
27
512(517) : m_flFindNextPlayerTime   CBasePlayer::Observer_FindNextPlayer()
28
 
29
513(518) : m_flDtMultiplier         CBasePlayer::StudioEstimateGait() ( 3.5 or 0.05 )
30
 
31
 
32
 
33
500 - 505 ->  CBasePlayer:: StudioEstimateGait()

список используемых функций:
C++ Source Code:
1
CBasePlayer::CalculatePitchBlend(void)
2
CBasePlayer::CalculateYawBlend(void)
3
CBasePlayer::StudioEstimateGait(void)
4
CBasePlayer::StudioPlayerBlend(int *,float *)
5
CBasePlayer::StudioProcessGait(void)


Отправлено Ku2zoff 26-06-2012 в 04:28:

Дядя Миша на сервере нужна только новая функция SetupBones или что-то ещё?
marikcool ой-ой-ёй, ещё и в код игрока лезть придётся... Но там слишком много функций, мне кажется, будет достаточно тех, которые необходимы на клиенте, то есть

C++ Source Code:
StudioSetupBones - отдельная
StudioProcessGait - в коде игрока
CalculateYawBlend - в коде игрока
CalculatePitchBlend - в коде игрока
У меня мозгов не хватает как это вместе связать... Не может быть, чтобы в SV_SetupBones было тоже, что и в движке.


Отправлено marikcool 26-06-2012 в 05:58:

да гейт можно срезать нафиг

Добавлено 26-06-2012 в 09:58:

функции из кода игрока:

C++ Source Code:
1
CbasePlayer::PostThink
2
{
3
  ...
4
  CBasePlayer::StudioProcessGait(value);
5
}
6
 
7
CBasePlayer::StudioProcessGait(int a1)
8
{
9
  CBasePlayer::CalculateYawBlend(a1);
10
  ...
11
}
12
 
13
CBasePlayer::StudioEstimateGait(a1)
14
{
15
 
16
 
17
 
18
}

функции используемые в SV_StudioSetupBones
C++ Source Code:
1
// 7949C: using guessed type _DWORD __cdecl AngleMatrix(_DWORD, _DWORD);
2
// 7A88C: using guessed type _DWORD __cdecl StudioCalcBonePosition(_DWORD, float, _DWORD, _DWORD, _DWORD, _DWORD);
3
// 7B7CC: using guessed type _DWORD __cdecl GetPlayerYaw(_DWORD);
4
// 7BA6C: using guessed type _DWORD __cdecl GetPlayerGaitsequence(_DWORD);
5
// 7BF9C: using guessed type _DWORD __cdecl QuaternionMatrix(_DWORD, _DWORD);
6
// 7BFEC: using guessed type _DWORD __cdecl StudioCalcBoneQuaterion(_DWORD, float, _DWORD, _DWORD, _DWORD, _DWORD);
7
// 7CE8C: using guessed type _DWORD __cdecl ConcatTransforms(_DWORD, _DWORD, _DWORD);
8
// 7CF1C: using guessed type _DWORD __cdecl StudioSlerpBones(_DWORD, _DWORD, _DWORD, _DWORD, float);
9
// 7D13C: using guessed type _DWORD __cdecl UTIL_GetPlayerGaitYaw(_DWORD);
10
// 7E2FC: using guessed type _DWORD __cdecl StudioCalcBoneAdj(float, _DWORD, _DWORD, _DWORD, char);
11
// 7EF0C: using guessed type _DWORD __cdecl GetPlayerPitch(_DWORD);
12
// 1E9110: using guessed type int g_pstudiohdr;
13
// 1E9114: using guessed type int g_pRotationMatrix;
14
// 1E9118: using guessed type int g_pBoneTransform;
15
// 82CD4: using guessed type int var_250[128];


получаются углы про которые говорил Дядя Миша собераются в тхинке игрока, и используются в SV_StudioSetupBones, поэтому контровская дллка не дает никаких эффектов т.к переменные в классе CBasePlayer в mp.dll никак не заполняются.


Отправлено Ku2zoff 26-06-2012 в 16:58:

Вроде бы сделал серверный расчёт костей (но только для 2-way блендинга, то есть стандартный). ХЗ работает или нет, не знаю как проверить.

Добавлено 26-06-2012 в 23:58:

Вообще мне сдаётся, что код-пример, который я взял за основу, не работает. А вот сами функции должны работать.


Отправлено Ku2zoff 28-06-2012 в 17:18:

Цитата:
Дядя Миша писал:
Я думал в ксаше подключить, но это пришлось бы тащить модельки соответствующие, а у меня концепция - минимум ресурсов.

А если кто-нибудь сделает одну модельку игрока. Для ксашмода? Скелеты у них всё равно одинаковые, делов-то, заменить анимации.


Отправлено Дядя Миша 28-06-2012 в 18:35:

А если бы они сначала закончили конкурс карт под ксаш-мод, а не пазорно потерялись, так это было бы воще отлично!

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 03-07-2012 в 21:18:

кто дальше будет ковыряться приложил декомпил sv_studiosetupbones от контры.


Отправлено Ku2zoff 04-07-2012 в 04:53:

Это всё конечно интесесно, но как проверить, заработает ли код, если не отрисовать хотя бы кости на сервере?


Отправлено marikcool 04-07-2012 в 05:08:

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


Отправлено Ku2zoff 04-07-2012 в 05:29:

marikcool вот делать мне больше нечего как вертеть модель одного игрока и стрелять по ней другим игроком. Намного лучше было бы нарисовть на местах костей спрайтовые лучи.


Отправлено marikcool 04-07-2012 в 05:45:

если вообще в модель попадает код работает, в других случая обычно у модели хитбоксы в раза 4 больше нормы и это сразу видно стреляя в метре над головой попадаешь.
тестить можно на любом монстре.


Отправлено HAWK0044 04-07-2012 в 06:49:

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


Отправлено Ku2zoff 04-07-2012 в 07:39:

HAWK0044 неплохой вариант... Но опять же, надо лишнюю модель, в которую целиться.


Отправлено marikcool 04-07-2012 в 08:22:

Цитата:
HAWK0044 писал:
marikcool
сколько раз я тебе говорил, ну запихни ты трассировку в апдейтстатус бар и смотри какой хитбокс выцеливаеться с прицела.

я так и сделал, ты кутузову ее скинь.


Отправлено marikcool 18-09-2012 в 18:35:

почему в голдсорсе в ibone падает мусор?

C++ Source Code:
1
[sv_ssb] orgiBone 97353076 iBone: 0 numbones: 1/24 pseqdesc->numblends 1
2
[sv_ssb] orgiBone 97353076 iBone: 0 numbones: 1/24 pseqdesc->numblends 1
3
[sv_ssb] orgiBone 97353076 iBone: 0 numbones: 1/24 pseqdesc->numblends 1
4
[sv_ssb] orgiBone 97353076 iBone: 0 numbones: 1/24 pseqdesc->numblends 1
5
[sv_ssb] orgiBone 74893760 iBone: 0 numbones: 1/24 pseqdesc->numblends 1
6
[sv_ssb] orgiBone 97319308 iBone: 0 numbones: 1/50 pseqdesc->numblends 2
7
[sv_ssb] orgiBone 97445536 iBone: 0 numbones: 1/13 pseqdesc->numb

__________________
vk.com/skullcapstudios


Отправлено marikcool 22-09-2012 в 21:57:

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

но если функция не переопределена с клиентки, в движке входящие данные для соотвественно sv_studiosetupbones корректны.

пока решением остается перехватить оригинальный sv_studiosetupbones, без импорта функций с клиентки. (это чтобы все варианты блендингов работали)

__________________
vk.com/skullcapstudios


Отправлено marikcool 23-09-2012 в 18:21:

и так перехватить удалось оригинальную sv_studiosetupbones, если кому надо то адресс функции GetModuleHandle("hw.dll")+0x96350

далее имеем такие же глюки что и с импортной функцией, следовательно был сделан вывод что неправильные аргументы. последнии 2 аргумента нужно поменять местами.
счас разбераюсь с origin и angles.

пока что юзаю такой вариант, позже обновлю пост.
SV_StudioSetupBones( struct model_s *pModel, float frame, int sequence, const vec3_t angles, const vec3_t origin, const byte *pcontroller, const byte *pblending,
edict_t *pEdict, signed int a8 );

__________________
vk.com/skullcapstudios


Отправлено marikcool 12-10-2012 в 12:43:

проблема с серверными костями пришла и в ксго!
http://www.youtube.com/watch?featur...rSEm1DUXc#t=83s

__________________
vk.com/skullcapstudios


Отправлено Дядя Миша 12-10-2012 в 13:37:

суддя по тому как он лупит мимо игрока и серавно попадает, там не хитбоксы а ббокс.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено qpAHToMAS 12-10-2012 в 13:51:

Цитата:
Дядя Миша писал:
проблема с серверными костями

А что это за проблема?

Цитата:
Дядя Миша писал:
суддя

Хах, я тоже задумался .

Цитата:
Дядя Миша писал:
там не хитбоксы а ббокс.

Надеюсь, что до "Q3'шной капсулы" дело не дойдет .


Отправлено Дядя Миша 12-10-2012 в 15:13:

Подумаешь - капсула. Рельса - наше всио

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 12-10-2012 в 17:17:

Чем вам не нравится ку3шная капсула?

__________________

xaerox on Vivino


Отправлено Дядя Миша 12-10-2012 в 17:20:

они просто не понимают, что можно заменить хитбоксы хит-капуслами, что даст даже лутьший эффект.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 12-10-2012 в 17:43:

на башню хит капсулу было бы круто!
хотя в контре они специально хитбоксы увеличивают.

__________________
vk.com/skullcapstudios


Отправлено Дядя Миша 12-10-2012 в 18:25:

marikcool да будет тебе известно, что капусла - суть две сферы.
а башня, следовательно одна сфера.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 07-12-2012 в 15:37:

Снова вернулся к этой проблеме... Нашёл какой-то код в интернете, вставил в проект, скомпилил - всё работает и вызывается, алерты в консоли есть. Визуально проверить пока не смог. Подумал, вот какой-то хороший человек сделал-таки, притом код чистый, без мусора И тут решил свой код из файлика sv_blending, что в этой теме в аттаче, посмотреть и сравнить. Бац! А этот скачанный - мой код Я и забыл как он выглядит. Щас под ксашем потестю, может правильно работает, я сам не проверял...

Добавлено 07-12-2012 в 22:37:

Не работает, SV _StudioSetupBones корявая. Буду пилить...


Отправлено Дядя Миша 07-12-2012 в 15:42:

Цитата:
Ku2zoff писал:
Не работает, SV _StudioSetupBones корявая. Буду пилить...

я уже переправил в новых версиях. Теперь всё правильно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 07-12-2012 в 18:01:

Дядя Миша что именно исправлено? Ответная часть в движке, или импорт интерфейса движком?


Отправлено Дядя Миша 07-12-2012 в 18:32:

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 07-12-2012 в 19:20:

Дядя Миша в исходниках билда 2015 уже исправлено? Если нет, будь добр, скинь исправленный sv_studio.c


Отправлено Дядя Миша 07-12-2012 в 20:08:

Терпите до 13-го декабря, будит йубилейный билд
8 лет со дня рождения ксаша

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 11-12-2012 в 05:09:

Сегодня немного поработал в направлении серверного блендинга - портировал код с клиентки (тот, что 9-way). Портировал не полностью, т.к. торопился, некоторые функции закомментил. Но разница уже ощутима. Если при полном отсутствии серверного интерфейса в игрока попасть возможно только в упор или монтировкой, то теперь можно и издалека. И при попадании в модельку летит кровь. Хотя хитбоксы всё ещё большие, и можно убить игрока, выстрелив у него над головой. Через несколько часов снова займусь этим делом, если повезёт, то сделаю. Надеюсь.


Отправлено Ku2zoff 14-12-2012 в 06:16:

Назрел вопрос: что делает этот кусок кода?

C++ Source Code:
1
for (i = 0; i < m_pStudioHeader->numbones; i++)
2
{
3
  QuaternionMatrix( q[i], bonematrix );
4
 
5
  bonematrix[0][3] = pos[i][0];
6
  bonematrix[1][3] = pos[i][1];
7
  bonematrix[2][3] = pos[i][2];
8
 
9
  if (pbones[i].parent == -1)
10
  {
11
    if ( IEngineStudio.IsHardware() )
12
    {
13
      ConcatTransforms ((*m_protationmatrix), bonematrix, (*m_pbonetransform)[i]);
14
 
15
      // MatrixCopy should be faster...
16
      //ConcatTransforms ((*m_protationmatrix), bonematrix, (*m_plighttransform)[i]);
17
      MatrixCopy( (*m_pbonetransform)[i], (*m_plighttransform)[i] );
18
    }
19
    else
20
    {
21
      ConcatTransforms ((*m_paliastransform), bonematrix, (*m_pbonetransform)[i]);
22
      ConcatTransforms ((*m_protationmatrix), bonematrix, (*m_plighttransform)[i]);
23
    }
24
 
25
    // Apply client-side effects to the transformation matrix
26
    StudioFxTransform( m_pCurrentEntity, (*m_pbonetransform)[i] );
27
  }
28
  else
29
  {
30
    ConcatTransforms ((*m_pbonetransform)[pbones[i].parent], bonematrix, (*m_pbonetransform)[i]);
31
    ConcatTransforms ((*m_plighttransform)[pbones[i].parent], bonematrix, (*m_plighttransform)[i]);
32
  }
33
}

Про FX-траснформацию мне всё ясно, она на сервере не нужна. m_plighttransform это для освещения? Если да, то тоже нафиг не нужно на сервере.

StudioSlerpBones что именно интерполирует? Нужно ли это на сервере?


Отправлено Дядя Миша 14-12-2012 в 15:07:

Цитата:
Ku2zoff писал:
m_plighttransform это для освещения?

да
Цитата:
Ku2zoff писал:
StudioSlerpBones что именно интерполирует?

положение между прошлым и новым кадром.
Цитата:
Ku2zoff писал:
Нужно ли это на сервере?

Народу это не нужно. Народу плезиозавры нужны. Причём позарез.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 15-12-2012 в 05:22:

Дядя Миша спасибо, прояснил ситуацию


Отправлено Ku2zoff 15-12-2012 в 14:13:

Нифга не получается. Ни портированный код с клиентки не фурычит, не перенесённый из ксаша. Причём под ксашем игра умудряется ещё и вылетать при обращении к pEdict. В исходниках движка ДМ оставил комментарий: Warning, pEdict is unused. Под GoldSRC не вылетает, но хитбоксы всё равно на полкарты. ЧЯДНТ?


Отправлено Дядя Миша 15-12-2012 в 14:42:

Ну почему у дяди Мишы всё прекрасно получается несколько раз и туда и обратно и бамп выдернули и на место вставили, а вы, толпой в пять человек уже четвертый год не можете решить ПРОСТЕЙШУЮ ПРОБЛЕМУ, почему, я не понимаю? Вам неприятно понимать что вы делаете? Вам интереснее тыкать наугад, пока не повезет или что?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 15-12-2012 в 14:50:

Вроде же всё как надо делаю. Есть SV_StudioSetupBones с выкинутыми интерполяцией между анимациями и проигрыванием гейт-секвенций. Из неё вызываются ещё функции, они тоже есть. Studio Header я задаю прямо в теле SV_StudioSetupBones. bonetransform и rotationmatrix беру из движка, как и на клиенте делается. blending тоже из движка, его на сервере считать не надо. (Для стандартного халфовского блендинга).


Отправлено Дядя Миша 15-12-2012 в 14:53:

Цитата:
Ku2zoff писал:
Вроде же всё как надо делаю

engine\common\mod_studio.c - готовая рабочая реализация на классический халфовский блендинг. Для начала перенеси в игровую библиотеку её. А потом расширь до 9-way.
Я уже молчал-молчал, думал догадаются. Но куда там! В стену головой долбится куда интереснее.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 15-12-2012 в 14:57:

Цитата:
Дядя Миша писал:
Вам интереснее тыкать наугад

По аналогии с клиентом сделал. Ну если нет документации, как я узнаю, что нужен ещё один таинственный вызов таинственной функции откуда-нибудь из кода серверной дллки? Я StudioPlayerBlend на сервере не делал. Ну он же не повлияет на хитбоксы? Он ведь за наклоны игрока отвечает.

Добавлено 15-12-2012 в 21:57:

Цитата:
Дядя Миша писал:
engine\common\mod_studio.c - готовая рабочая реализация на классический халфовский блендинг.

Я думал, нафига этот файл вообще нужен? В sv_studio то же самое. Или я невнимательно смотрел.


Отправлено marikcool 15-12-2012 в 14:59:

ты параметры у себя в SV_StudioSetupBones местами поменял?

__________________
vk.com/skullcapstudios


Отправлено Дядя Миша 15-12-2012 в 15:03:

Цитата:
Ku2zoff писал:
Я думал, нафига этот файл вообще нужен? В sv_studio то же самое

не совсем. sv_studio.c уже полгода как валяется там неподключенный.
Это наследие.
Цитата:
marikcool писал:
ты параметры у себя в SV_StudioSetupBones местами поменял?

поменял, но сорцев пока нету. Как и говорил - после ревизии.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 15-12-2012 в 19:44:

Цитата:
marikcool писал:
ты параметры у себя в SV_StudioSetupBones местами поменял?

После того как поменял, начало вылетать и под Goldsrc при обращении к pEdict.

Добавлено 16-12-2012 в 02:44:

Цитата:
Дядя Миша писал:
Для начала перенеси в игровую библиотеку её.

Переносится без проблем, только не работает. То ли дело в неправильных аргументах SV_StudioSetupBones, то ли в том, что вместо float'ов в ксашдвижке используется matrix3x4.


Отправлено Ku2zoff 23-01-2014 в 08:11:

Простите, что поднимаю старую тему. Но несколько дней возни терять зря не хочется. На меня в последние дни что-то нашло, и я сделал ответную часть StudioSetupBones для 9-way blending'а на сервере. Благо, у нас теперь есть хоть какие-то исходники контр-страйка, и в них можно кое-что подглядеть
Ошибка была в том, что для 9-way нужен, как бы это сказать, более продвинутый рассчёт угла поворота игрока по YAW. На данный момент всё работает, но не очень точно. То есть хитбоксы располагаются правильно и меняют положение в зависимости от направления взгляда игрока, только серверная часть не совсем совпадает с клиентской. Скорее всего, дело в каких-то переменных на серверной стороне. Я в подробности не вдавался и не сравнивал. Как бы то ни было, есть база для дальнейшей работы.
В туторы не пишу, потому что это не тутор, а копипаста.

Шаг первый: клиентская сторона.

Тырим код отсюдова, адаптируем код из исходников сервера контры (я делал так, но решил, что лучше перенести с клиента на сервер, а не наоборот), или пишем свой. Компилим клиент, подменяем player.mdl и нужную модельку игрока, корректируем анимации - вуаля! На клиенте у нас есть всё, что нужно.

Шаг второй: серверная сторона. Рассчёт углов поворота и прочей ереси игрока.

Открываем player.cpp и копипастим туда в самый низ файла вот этот код:

C++ Source Code:
1
#include "studio.h"
2
 
3
void CBasePlayer::StudioProcessGait(void)
4
{
5
  mstudioseqdesc_t *pseqdesc;
6
  float dt = gpGlobals->frametime;
7
 
8
  if (dt < 0)
9
    dt = 0;
10
  else if (dt > 1.0)
11
    dt = 1;
12
 
13
  CalculateYawBlend();
14
  CalculatePitchBlend();
15
 
16
  void *model = GET_MODEL_PTR(ENT(pev));
17
 
18
  if (!model)
19
    return;
20
 
21
  studiohdr_t *pstudiohdr = (studiohdr_t *)model;
22
 
23
  pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + pev->gaitsequence;
24
 
25
  if (pseqdesc->linearmovement[0] > 0)
26
    m_flGaitframe += (m_flGaitMovement / pseqdesc->linearmovement[0]) * pseqdesc->numframes;
27
  else
28
    m_flGaitframe += pseqdesc->fps * dt * pev->framerate;
29
 
30
  m_flGaitframe -= (int)(m_flGaitframe / pseqdesc->numframes) * pseqdesc->numframes;
31
 
32
  if (m_flGaitframe < 0)
33
    m_flGaitframe += pseqdesc->numframes;
34
 
35
  //	ALERT(at_notice, "Player sv_yaw: %f\n", m_flYaw);
36
  //	ALERT(at_notice, "Player sv_pitch: %f\n", m_flPitch);
37
  //	ALERT(at_notice, "Player sv_gaityaw: %f\n", m_flGaityaw);
38
}
39
 
40
void CBasePlayer::StudioEstimateGait(void)
41
{
42
  float dt;
43
  vec3_t est_velocity;
44
 
45
  dt = gpGlobals->frametime;
46
 
47
  if (dt < 0)
48
    dt = 0;
49
  else if (dt > 1)
50
    dt = 1;
51
 
52
  if (dt == 0)
53
  {
54
    m_flGaitMovement = 0;
55
    return;
56
  }
57
 
58
  est_velocity[0] = pev->origin[0] - m_prevgaitorigin[0];
59
  est_velocity[1] = pev->origin[1] - m_prevgaitorigin[1];
60
  est_velocity[2] = pev->origin[2] - m_prevgaitorigin[2];
61
  m_prevgaitorigin[0] = pev->origin[0];
62
  m_prevgaitorigin[1] = pev->origin[1];
63
  m_prevgaitorigin[2] = pev->origin[2];
64
  m_flGaitMovement = sqrt(est_velocity[0] * est_velocity[0] + est_velocity[1] * est_velocity[1] + est_velocity[2] * est_velocity[2]);
65
 
66
  if (dt <= 0 || m_flGaitMovement / dt < 5)
67
  {
68
    m_flGaitMovement = 0;
69
    est_velocity[0] = est_velocity[1] = 0;
70
  }
71
 
72
  if (est_velocity[0] == 0 && est_velocity[1] == 0)
73
  {
74
    float flYawDiff = pev->angles[1] - m_flGaityaw;
75
    float flYaw = flYawDiff;
76
    flYawDiff = flYawDiff - (int)(flYawDiff / 360) * 360;
77
 
78
    if (flYawDiff > 180)
79
      flYawDiff -= 360;
80
 
81
    if (flYawDiff < -180)
82
      flYawDiff += 360;
83
 
84
    if (flYaw < -180)
85
      flYaw += 360;
86
    else if (flYaw > 180)
87
      flYaw -= 360;
88
 
89
    if (flYaw > -5 && flYaw < 5)
90
      m_flYawModifier = 0.05;
91
 
92
    if (flYaw < -90 || flYaw > 90)
93
      m_flYawModifier = 3.5;
94
 
95
    if (dt < 0.25)
96
      flYawDiff *= dt * m_flYawModifier;
97
    else
98
      flYawDiff *= dt;
99
 
100
    if (abs(flYawDiff) < 0.1)
101
      flYawDiff = 0;
102
 
103
    m_flGaityaw += flYawDiff;
104
    m_flGaityaw -= (int)(m_flGaityaw / 360) * 360;
105
    m_flGaitMovement = 0;
106
  }
107
  else
108
  {
109
    m_flGaityaw = (atan2(est_velocity[1], est_velocity[0]) * 180 / M_PI);
110
 
111
    if (m_flGaityaw > 180)
112
      m_flGaityaw = 180;
113
 
114
    if (m_flGaityaw < -180)
115
      m_flGaityaw = -180;
116
  }
117
}
118
 
119
void CBasePlayer::CalculateYawBlend(void)
120
{
121
  float dt;
122
  float flYaw;
123
  float maxyaw;
124
  float blend_yaw;
125
 
126
  dt = gpGlobals->frametime;
127
 
128
  if (dt < 0)
129
    dt = 0;
130
  else if (dt > 1)
131
    dt = 1;
132
 
133
  StudioEstimateGait();
134
 
135
  maxyaw = 255.0;
136
  flYaw = pev->angles[1] - m_flGaityaw;
137
 
138
  if (flYaw < -180)
139
    flYaw += 360;
140
  else if (flYaw > 180)
141
    flYaw -= 360;
142
 
143
  if (m_flGaitMovement != 0)
144
  {
145
    if (flYaw > 120)
146
    {
147
      m_flGaityaw -= 180;
148
      m_flGaitMovement = -m_flGaitMovement;
149
      flYaw -= 180;
150
    }
151
    else if (flYaw < -120)
152
    {
153
      m_flGaityaw += 180;
154
      m_flGaitMovement = -m_flGaitMovement;
155
      flYaw += 180;
156
    }
157
  }
158
 
159
  flYaw = (flYaw / 90) * 128.0 + 127.0;
160
 
161
  if (flYaw > 255)
162
    flYaw = 255;
163
  else if (flYaw < 0)
164
    flYaw = 0;
165
 
166
  blend_yaw = maxyaw - flYaw;
167
  pev->blending[0] = (int)(blend_yaw);
168
  m_flYaw = blend_yaw;
169
}
170
 
171
void CBasePlayer::CalculatePitchBlend(void)
172
{
173
  int iBlend;
174
  float temp;
175
 
176
  temp = (int)(pev->angles[0] * 3);
177
 
178
  if (temp <= -45)
179
    iBlend = 255;
180
  else if (temp < 45)
181
    iBlend = ((45.0 - temp) / (45.0 + 45)) * 255;
182
  else
183
    iBlend = 0;
184
 
185
  pev->blending[1] = iBlend;
186
  m_flPitch = iBlend;
187
}
188
 
189
float GetPlayerYaw(const edict_t *pEdict)
190
{
191
  entvars_t *pev = VARS((edict_t *)pEdict);
192
  CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance(pev);
193
 
194
  if (!pPlayer)
195
    return 0;
196
 
197
  return pPlayer->m_flYaw;
198
}
199
 
200
float GetPlayerPitch(const edict_t *pEdict)
201
{
202
  entvars_t *pev = VARS((edict_t *)pEdict);
203
  CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance(pev);
204
 
205
  if (!pPlayer)
206
    return 0;
207
 
208
  return pPlayer->m_flPitch;
209
}
210
 
211
int GetPlayerGaitsequence(const edict_t *pEdict)
212
{
213
  entvars_t *pev = VARS((edict_t *)pEdict);
214
  CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance(pev);
215
 
216
  if (!pPlayer)
217
    return 0;
218
 
219
  return pPlayer->m_iGaitsequence;
220
}
221
 
222
float GetPlayerGaitframe(const edict_t *pEdict)
223
{
224
  entvars_t *pev = VARS((edict_t *)pEdict);
225
  CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance(pev);
226
 
227
  if (!pPlayer)
228
    return 0;
229
 
230
  return pPlayer->m_flGaitframe;
231
}
232
 
233
float GetPlayerGaitYaw(int playerIndex)
234
{
235
  CBasePlayer *pPlayer = NULL;
236
 
237
  if (playerIndex > 0 && playerIndex <= gpGlobals->maxClients)
238
  {
239
    edict_t *pPlayerEdict = INDEXENT(playerIndex);
240
 
241
    if (pPlayerEdict && !pPlayerEdict->free)
242
    {
243
      pPlayer = (CBasePlayer *)CBaseEntity::Instance(pPlayerEdict);
244
 
245
      if (pPlayer)
246
        return pPlayer->m_flGaityaw;
247
    }
248
  }
249
 
250
  return 0;
251
}
Кто разобрался с клиентской частью, тот поймёт, что здесь для чего. Далее открываем player.h и добавляем в класс игрока заголовки новых функций и новые переменные:
C++ Source Code:
1
void StudioProcessGait( void );
2
void StudioEstimateGait( void );
3
void CalculateYawBlend( void );
4
void CalculatePitchBlend( void );
5
 
6
float m_flYaw;
7
float m_flPitch;
8
float m_flGaitMovement;
9
float m_flGaitframe;
10
float m_flGaityaw;
11
float m_flYawModifier;
12
int m_iGaitsequence;
13
vec3_t m_prevgaitorigin;

Компилим, если без ошибок - всё сделали правильно. Теперь находим в player.cpp функцию void CBasePlayer::PostThink() и в самый её низ вставляем:
C++ Source Code:
m_iGaitsequence = pev->gaitsequence;
StudioProcessGait();

Надо же откуда-то вызывать все эти новые рассчёты, верно?
Далее, идём в функцию Spawn игрока, она находится ниже. В самое её начало засовываем:
C++ Source Code:
m_flGaitMovement = 0;
m_flGaitframe = 0;
m_flGaityaw = 0;
m_iGaitsequence = 0;
m_prevgaitorigin = Vector(0, 0, 0);

Чтобы новые переменные обнулялись при спавне. Компилим. Без ошибок - молодцы!

Шаг третий: серверная сторона. Собственно, ответная часть блендинга.

Сразу скажу, что на правильность работы этот код не претендует, т.к. я только-только начал более или менее разбираться в механизме работы студиомодельрендерера. Но, судя по моим нескольким тестам, он работает, хоть и не совсем точно.

Открываем animation.cpp (да, копипастить удобнее в него, потому что почти всё нужные заголовки уже подключены), в самый низ вставляем вот этот код:
C++ Source Code:
1
#include <assert.h>
2
#include "r_studioint.h"
3
#include "com_model.h"
4
 
5
#ifndef M_PI
6
#define M_PI 3.14159265358979323846
7
#endif
8
 
9
void SV_StudioSetupBones( struct model_s *pModel, float frame, int sequence, const vec3_t angles, const	vec3_t origin, const byte *pcontroller, const byte *pblending, int iBone, const edict_t *pEdict );
10
 
11
server_studio_api_t IEngineStudio;
12
studiohdr_t			*g_pStudioHeader;
13
 
14
float (*g_pRotationMatrix)[3][4];
15
float (*g_pBoneTransform)[MAXSTUDIOBONES][3][4];
16
 
17
sv_blending_interface_t sv_blending =
18
{
19
  SV_BLENDING_INTERFACE_VERSION,
20
  SV_StudioSetupBones
21
};
22
 
23
extern "C" _declspec(dllexport) int Server_GetBlendingInterface( int version, sv_blending_interface_t **pinterface, server_studio_api_t *pstudio, float ***rotationmatrix, float ****bonetransform )
24
{
25
  if (version != SV_BLENDING_INTERFACE_VERSION)
26
    return 0;
27
 
28
  *pinterface = &sv_blending;
29
 
30
  IEngineStudio.Mem_Calloc = pstudio->Mem_Calloc;
31
  IEngineStudio.Cache_Check = pstudio->Cache_Check;
32
  IEngineStudio.LoadCacheFile = pstudio->LoadCacheFile;
33
  IEngineStudio.Mod_Extradata = pstudio->Mod_Extradata;
34
 
35
  g_pRotationMatrix = (float (*)[3][4])rotationmatrix;
36
  g_pBoneTransform = (float (*)[MAXSTUDIOBONES][3][4])bonetransform;
37
 
38
  ALERT(at_console, "Server_GetBlendingInterface exported.\n");
39
 
40
  return 1;
41
}

Это недостающие заголовки и определения, а также код экспорта интерфейса. Ниже вставляем математические функции:
C++ Source Code:
1
void ConcatTransforms(const float in1[3][4], const float in2[3][4], float out[3][4])
2
{
3
  out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + in1[0][2] * in2[2][0];
4
  out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + in1[0][2] * in2[2][1];
5
  out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + in1[0][2] * in2[2][2];
6
  out[0][3] = in1[0][0] * in2[0][3] + in1[0][1] * in2[1][3] + in1[0][2] * in2[2][3] + in1[0][3];
7
  out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + in1[1][2] * in2[2][0];
8
  out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + in1[1][2] * in2[2][1];
9
  out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + in1[1][2] * in2[2][2];
10
  out[1][3] = in1[1][0] * in2[0][3] + in1[1][1] * in2[1][3] + in1[1][2] * in2[2][3] + in1[1][3];
11
  out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + in1[2][2] * in2[2][0];
12
  out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + in1[2][2] * in2[2][1];
13
  out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
14
  out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] + in1[2][2] * in2[2][3] + in1[2][3];
15
}
16
 
17
void AngleQuaternion(const vec3_t angles, vec4_t quaternion)
18
{
19
  float angle;
20
  float sr, sp, sy, cr, cp, cy;
21
 
22
  angle = angles[2] * 0.5;
23
  sy = sin(angle);
24
  cy = cos(angle);
25
  angle = angles[1] * 0.5;
26
  sp = sin(angle);
27
  cp = cos(angle);
28
  angle = angles[0] * 0.5;
29
  sr = sin(angle);
30
  cr = cos(angle);
31
 
32
  quaternion[0] = sr * cp * cy - cr * sp * sy;
33
  quaternion[1] = cr * sp * cy + sr * cp * sy;
34
  quaternion[2] = cr * cp * sy - sr * sp * cy;
35
  quaternion[3] = cr * cp * cy + sr * sp * sy;
36
}
37
 
38
void QuaternionSlerp(const vec4_t p, vec4_t q, float t, vec4_t qt)
39
{
40
  int i;
41
  float omega, cosom, sinom, sclp, sclq;
42
  float a = 0;
43
  float b = 0;
44
 
45
  for (i = 0; i < 4; i++)
46
  {
47
    a += (p[i]-q[i]) * (p[i]-q[i]);
48
    b += (p[i]+q[i]) * (p[i]+q[i]);
49
  }
50
 
51
  if (a > b)
52
  {
53
    for (i = 0; i < 4; i++)
54
      q[i] = -q[i];
55
  }
56
 
57
  cosom = p[0] * q[0] + p[1] * q[1] + p[2] * q[2] + p[3] * q[3];
58
 
59
  if ((1.0 + cosom) > 0.00000001)
60
  {
61
    if ((1.0 - cosom) > 0.00000001)
62
    {
63
      omega = acos(cosom);
64
      sinom = sin(omega);
65
      sclp = sin((1.0 - t) * omega) / sinom;
66
      sclq = sin(t * omega) / sinom;
67
    }
68
    else
69
    {
70
      sclp = 1.0 - t;
71
      sclq = t;
72
    }
73
 
74
    for (i = 0; i < 4; i++)
75
      qt[i] = sclp * p[i] + sclq * q[i];
76
  }
77
  else
78
  {
79
    qt[0] = -p[1];
80
    qt[1] = p[0];
81
    qt[2] = -p[3];
82
    qt[3] = p[2];
83
    sclp = sin((1.0 - t) * 0.5 * M_PI);
84
    sclq = sin(t * 0.5 * M_PI);
85
 
86
    for (i = 0; i < 3; i++)
87
      qt[i] = sclp * p[i] + sclq * qt[i];
88
  }
89
}
90
 
91
void QuaternionMatrix(const vec4_t quaternion, float (*matrix)[4])
92
{
93
  matrix[0][0] = 1.0 - 2.0 * quaternion[1] * quaternion[1] - 2.0 * quaternion[2] * quaternion[2];
94
  matrix[1][0] = 2.0 * quaternion[0] * quaternion[1] + 2.0 * quaternion[3] * quaternion[2];
95
  matrix[2][0] = 2.0 * quaternion[0] * quaternion[2] - 2.0 * quaternion[3] * quaternion[1];
96
  matrix[0][1] = 2.0 * quaternion[0] * quaternion[1] - 2.0 * quaternion[3] * quaternion[2];
97
  matrix[1][1] = 1.0 - 2.0 * quaternion[0] * quaternion[0] - 2.0 * quaternion[2] * quaternion[2];
98
  matrix[2][1] = 2.0 * quaternion[1] * quaternion[2] + 2.0 * quaternion[3] * quaternion[0];
99
  matrix[0][2] = 2.0 * quaternion[0] * quaternion[2] + 2.0 * quaternion[3] * quaternion[1];
100
  matrix[1][2] = 2.0 * quaternion[1] * quaternion[2] - 2.0 * quaternion[3] * quaternion[0];
101
  matrix[2][2] = 1.0 - 2.0 * quaternion[0] * quaternion[0] - 2.0 * quaternion[1] * quaternion[1];
102
}

Их можно без изменений упереть из клиентской части.
А теперь очередь функций настройки костей. В чистом виде с клиента их не перенесёшь, нужна модификация. Но можно взять из ксашдвижка, что я и сделал. Вставляем ниже:
C++ Source Code:
1
void StudioCalcBoneAdj( float *adj, const byte *pcontroller )
2
{
3
  int			i, j;
4
  float			value;
5
  mstudiobonecontroller_t	*pbonecontroller;
6
 
7
  pbonecontroller = (mstudiobonecontroller_t *)((byte *)g_pStudioHeader + g_pStudioHeader->bonecontrollerindex);
8
 
9
  for( j = 0; j < g_pStudioHeader->numbonecontrollers; j++ )
10
  {
11
    i = pbonecontroller[j].index;
12
 
13
    //		if( i == STUDIO_MOUTH )
14
    //			continue; // ignore mouth
15
 
16
    if( i <= MAXSTUDIOCONTROLLERS )
17
    {
18
      // check for 360% wrapping
19
      if( pbonecontroller[j].type & STUDIO_RLOOP )
20
      {
21
        value = pcontroller[i] * (360.0f / 256.0f) + pbonecontroller[j].start;
22
      }
23
      else
24
      {
25
        value = pcontroller[i] / 255.0f;
26
        if (value < 0.0f) value = 0.0f;
27
        if (value > 1.0f) value = 1.0f;
28
        value = (1.0f - value) * pbonecontroller[j].start + value * pbonecontroller[j].end;
29
      }
30
    }
31
 
32
    switch( pbonecontroller[j].type & STUDIO_TYPES )
33
    {
34
    case STUDIO_XR:
35
      case STUDIO_YR:
36
        case STUDIO_ZR:
37
            adj[j] = value * (M_PI / 180.0f);
38
          break;
39
        case STUDIO_X:
40
          case STUDIO_Y:
41
            case STUDIO_Z:
42
                adj[j] = value;
43
              break;
44
            }
45
        }
46
    }
47
 
48
void StudioCalcBoneQuaterion( int frame, float s, mstudiobone_t *pbone, mstudioanim_t *panim, float *adj, float *q )
49
{
50
  int		j, k;
51
  vec4_t		q1, q2;
52
  vec3_t		angle1, angle2;
53
  mstudioanimvalue_t	*panimvalue;
54
 
55
  for( j = 0; j < 3; j++ )
56
  {
57
    if( panim->offset[j+3] == 0 )
58
    {
59
      angle2[j] = angle1[j] = pbone->value[j+3]; // default;
60
    }
61
    else
62
    {
63
      panimvalue = (mstudioanimvalue_t *)((byte *)panim + panim->offset[j+3]);
64
      k = frame;
65
 
66
      // debug
67
      if( panimvalue->num.total < panimvalue->num.valid )
68
        k = 0;
69
 
70
      while( panimvalue->num.total <= k )
71
      {
72
        k -= panimvalue->num.total;
73
        panimvalue += panimvalue->num.valid + 1;
74
        // DEBUG
75
        if( panimvalue->num.total < panimvalue->num.valid )
76
          k = 0;
77
      }
78
      // Bah, missing blend!
79
      if( panimvalue->num.valid > k )
80
      {
81
        angle1[j] = panimvalue[k+1].value;
82
 
83
        if( panimvalue->num.valid > k + 1 )
84
        {
85
          angle2[j] = panimvalue[k+2].value;
86
        }
87
        else
88
        {
89
          if( panimvalue->num.total > k + 1 )
90
            angle2[j] = angle1[j];
91
          else angle2[j] = panimvalue[panimvalue->num.valid+2].value;
92
        }
93
      }
94
      else
95
      {
96
        angle1[j] = panimvalue[panimvalue->num.valid].value;
97
        if( panimvalue->num.total > k + 1 )
98
        {
99
          angle2[j] = angle1[j];
100
        }
101
        else
102
        {
103
          angle2[j] = panimvalue[panimvalue->num.valid + 2].value;
104
        }
105
      }
106
      angle1[j] = pbone->value[j+3] + angle1[j] * pbone->scale[j+3];
107
      angle2[j] = pbone->value[j+3] + angle2[j] * pbone->scale[j+3];
108
    }
109
 
110
    if( pbone->bonecontroller[j+3] != -1 )
111
    {
112
      angle1[j] += adj[pbone->bonecontroller[j+3]];
113
      angle2[j] += adj[pbone->bonecontroller[j+3]];
114
    }
115
  }
116
 
117
  if( !VectorCompare( angle1, angle2 ))
118
  {
119
    AngleQuaternion( angle1, q1 );
120
    AngleQuaternion( angle2, q2 );
121
    QuaternionSlerp( q1, q2, s, q );
122
  }
123
  else
124
  {
125
    AngleQuaternion( angle1, q );
126
  }
127
}
128
 
129
void StudioCalcBonePosition( int frame, float s, mstudiobone_t *pbone, mstudioanim_t *panim, float *adj, float *pos )
130
{
131
  int		j, k;
132
  mstudioanimvalue_t	*panimvalue;
133
 
134
  for( j = 0; j < 3; j++ )
135
  {
136
    pos[j] = pbone->value[j]; // default;
137
    if( panim->offset[j] != 0.0f )
138
    {
139
      panimvalue = (mstudioanimvalue_t *)((byte *)panim + panim->offset[j]);
140
 
141
      k = frame;
142
 
143
      // debug
144
      if( panimvalue->num.total < panimvalue->num.valid )
145
        k = 0;
146
 
147
      // find span of values that includes the frame we want
148
      while( panimvalue->num.total <= k )
149
      {
150
        k -= panimvalue->num.total;
151
        panimvalue += panimvalue->num.valid + 1;
152
 
153
        // DEBUG
154
        if( panimvalue->num.total < panimvalue->num.valid )
155
          k = 0;
156
      }
157
 
158
      // if we're inside the span
159
        if( panimvalue->num.valid > k )
160
        {
161
          // and there's more data in the span
162
          if( panimvalue->num.valid > k + 1 )
163
          {
164
            pos[j] += (panimvalue[k+1].value * (1.0f - s) + s * panimvalue[k+2].value) * pbone->scale[j];
165
          }
166
        else
167
        {
168
          pos[j] += panimvalue[k+1].value * pbone->scale[j];
169
        }
170
      }
171
      else
172
      {
173
        // are we at the end of the repeating values section and there's another section with data?
174
        if( panimvalue->num.total <= k + 1 )
175
        {
176
          pos[j] += (panimvalue[panimvalue->num.valid].value * (1.0f - s) + s * panimvalue[panimvalue->num.valid + 2].value) * pbone->scale[j];
177
        }
178
        else
179
        {
180
          pos[j] += panimvalue[panimvalue->num.valid].value * pbone->scale[j];
181
        }
182
      }
183
    }
184
 
185
    if( pbone->bonecontroller[j] != -1 && adj )
186
    {
187
      pos[j] += adj[pbone->bonecontroller[j]];
188
    }
189
  }
190
}
191
 
192
mstudioanim_t *StudioGetAnim(model_t *model, mstudioseqdesc_t *pseqdesc)
193
{
194
  mstudioseqgroup_t *pseqgroup = (mstudioseqgroup_t *)((byte *)g_pStudioHeader + g_pStudioHeader->seqgroupindex) + pseqdesc->seqgroup;
195
 
196
  if (!pseqdesc->seqgroup)
197
    return (mstudioanim_t *)((byte *)g_pStudioHeader + pseqdesc->animindex);
198
 
199
  cache_user_t *paSequences = (cache_user_t *)model->submodels;
200
 
201
  if (!paSequences)
202
  {
203
    paSequences = (cache_user_t *)IEngineStudio.Mem_Calloc(16, sizeof(cache_user_t));
204
    model->submodels = (dmodel_t *)paSequences;
205
  }
206
 
207
  if (!IEngineStudio.Cache_Check(&paSequences[pseqdesc->seqgroup]))
208
    IEngineStudio.LoadCacheFile(pseqgroup->name, &paSequences[pseqdesc->seqgroup]);
209
 
210
  return (mstudioanim_t *)((byte *)paSequences[pseqdesc->seqgroup].data + pseqdesc->animindex);
211
}
212
 
213
float StudioEstimateFrame( float frame, mstudioseqdesc_t *pseqdesc )
214
{
215
  double	f;
216
 
217
  if( pseqdesc->numframes <= 1 )
218
    f = 0.0f;
219
  else f = ( frame * ( pseqdesc->numframes - 1 )) / 256.0f;
220
 
221
  if( pseqdesc->flags & STUDIO_LOOPING )
222
  {
223
    if( pseqdesc->numframes > 1 )
224
      f -= (int)(f / (pseqdesc->numframes - 1)) *  (pseqdesc->numframes - 1);
225
    if( f < 0.0f ) f += (pseqdesc->numframes - 1);
226
  }
227
  else
228
  {
229
    if( f >= pseqdesc->numframes - 1.001f )
230
      f = pseqdesc->numframes - 1.001f;
231
    if( f < 0.0f )  f = 0.0f;
232
  }
233
 
234
  return f;
235
}
236
 
237
void StudioCalcRotations( int boneused[], int numbones, const byte *pcontroller, float pos[][3], vec4_t *q, mstudioseqdesc_t *pseqdesc, mstudioanim_t *panim, float f )
238
{
239
  int		i, j, frame;
240
  mstudiobone_t	*pbone;
241
  float		adj[MAXSTUDIOCONTROLLERS];
242
  float		s;
243
 
244
  if( f > pseqdesc->numframes - 1 )
245
    f = 0.0f;
246
  else if( f < -0.01f )
247
    f = -0.01f;
248
 
249
  frame = (int)f;
250
  s = (f - frame);
251
 
252
  // add in programtic controllers
253
  pbone = (mstudiobone_t *)((byte *)g_pStudioHeader + g_pStudioHeader->boneindex);
254
 
255
  StudioCalcBoneAdj( adj, pcontroller );
256
 
257
  for( j = numbones - 1; j >= 0; j-- )
258
  {
259
    i = boneused[j];
260
    StudioCalcBoneQuaterion( frame, s, &pbone[i], &panim[i], adj, q[i] );
261
    StudioCalcBonePosition( frame, s, &pbone[i], &panim[i], adj, pos[i] );
262
  }
263
 
264
  if( pseqdesc->motiontype & STUDIO_X ) pos[pseqdesc->motionbone][0] = 0.0f;
265
  if( pseqdesc->motiontype & STUDIO_Y ) pos[pseqdesc->motionbone][1] = 0.0f;
266
  if( pseqdesc->motiontype & STUDIO_Z ) pos[pseqdesc->motionbone][2] = 0.0f;
267
}
268
 
269
void StudioSlerpBones( vec4_t q1[], float pos1[][3], vec4_t q2[], float pos2[][3], float s )
270
{
271
  int	i;
272
  vec4_t	q3;
273
  float	s1;
274
 
275
  if (s < 0.0f) s = 0.0f;
276
  else if (s > 1.0f) s = 1.0f;
277
  s1 = 1.0f - s;
278
 
279
  for( i = 0; i < g_pStudioHeader->numbones; i++ )
280
  {
281
    QuaternionSlerp( q1[i], q2[i], s, q3 );
282
    q1[i][0] = q3[0];
283
    q1[i][1] = q3[1];
284
    q1[i][2] = q3[2];
285
    q1[i][3] = q3[3];
286
    pos1[i][0] = pos1[i][0] * s1 + pos2[i][0] * s;
287
    pos1[i][1] = pos1[i][1] * s1 + pos2[i][1] * s;
288
    pos1[i][2] = pos1[i][2] * s1 + pos2[i][2] * s;
289
  }
290
}
291
 
292
/*
293
====================
294
LookupAnimation
295
->index starts at 0 for the first set of bones
296
====================
297
*/
298
mstudioanim_t* LookupAnimation( model_t *pModel, mstudioseqdesc_t *pseqdesc, int index )
299
{
300
  mstudioanim_t *panim = NULL;
301
 
302
  panim = StudioGetAnim( pModel, pseqdesc );
303
 
304
  assert( panim );
305
 
306
  if ( index < 0 )
307
  {
308
    return panim;
309
  }
310
 
311
  if ( index > ( pseqdesc->numblends - 1 ) )
312
  {
313
    return panim;
314
  }
315
 
316
  panim += index * g_pStudioHeader->numbones;
317
 
318
  return panim;
319
}


Остальное напишу потом, ибо просто не влазит в сообщение Не пугайтесь

Напишите уже кто-нибудь что-нибудь, а то сообщение редактируется, а не добавляется новое.


Отправлено Ku2zoff 23-01-2014 в 13:08:

Ниже вставляете саму настройку костей:

C++ Source Code:
1
void SV_StudioSetupBones_HL( struct model_s *pModel, float frame, int sequence, const vec3_t angles, const	vec3_t origin, const byte *pcontroller, const byte *pblending, int iBone, const edict_t *pEdict )
2
{
3
  int		i, j, numbones = 0;
4
  int		boneused[MAXSTUDIOBONES];
5
  double	f;
6
 
7
  mstudiobone_t		*pbones;
8
  mstudioseqdesc_t	*pseqdesc;
9
  mstudioanim_t		*panim;
10
 
11
  static float	pos[MAXSTUDIOBONES][3];
12
  static vec4_t	q[MAXSTUDIOBONES];
13
  float			bonematrix[3][4];
14
 
15
  static float	pos2[MAXSTUDIOBONES][3];
16
  static vec4_t	q2[MAXSTUDIOBONES];
17
  static float	pos3[MAXSTUDIOBONES][3];
18
  static vec4_t	q3[MAXSTUDIOBONES];
19
  static float	pos4[MAXSTUDIOBONES][3];
20
  static vec4_t	q4[MAXSTUDIOBONES];
21
 
22
  g_pStudioHeader = (studiohdr_t *)IEngineStudio.Mod_Extradata(pModel);
23
 
24
  if( sequence < 0 || sequence >= g_pStudioHeader->numseq )
25
  {
26
    ALERT( at_notice, "SV_StudioSetupBones: sequence %i/%i out of range for model %s\n", sequence, g_pStudioHeader->numseq, g_pStudioHeader->name );
27
    sequence = 0;
28
  }
29
 
30
  pseqdesc = (mstudioseqdesc_t *)((byte *)g_pStudioHeader + g_pStudioHeader->seqindex) + sequence;
31
  pbones = (mstudiobone_t *)((byte *)g_pStudioHeader + g_pStudioHeader->boneindex);
32
  panim = StudioGetAnim( pModel, pseqdesc );
33
 
34
  if( iBone < -1 || iBone >= g_pStudioHeader->numbones )
35
    iBone = 0;
36
 
37
  if( iBone == -1 )
38
  {
39
    numbones = g_pStudioHeader->numbones;
40
    for( i = 0; i < g_pStudioHeader->numbones; i++ )
41
      boneused[(numbones - i) - 1] = i;
42
  }
43
  else
44
  {
45
    // only the parent bones
46
    for( i = iBone; i != -1; i = pbones[i].parent )
47
      boneused[numbones++] = i;
48
  }
49
 
50
  f = StudioEstimateFrame( frame, pseqdesc );
51
  StudioCalcRotations( boneused, numbones, pcontroller, pos, q, pseqdesc, panim, f );
52
 
53
  if( pseqdesc->numblends > 1 )
54
  {
55
    float	s;
56
 
57
    panim += g_pStudioHeader->numbones;
58
    StudioCalcRotations( boneused, numbones, pcontroller, pos2, q2, pseqdesc, panim, f );
59
 
60
    s = (float)pblending[0] / 255.0f;
61
 
62
    StudioSlerpBones( q, pos, q2, pos2, s );
63
 
64
    if( pseqdesc->numblends == 4 )
65
    {
66
      panim += g_pStudioHeader->numbones;
67
      StudioCalcRotations( boneused, numbones, pcontroller, pos3, q3, pseqdesc, panim, f );
68
 
69
      panim += g_pStudioHeader->numbones;
70
      StudioCalcRotations( boneused, numbones, pcontroller, pos4, q4, pseqdesc, panim, f );
71
 
72
      s = (float)pblending[0] / 255.0f;
73
      StudioSlerpBones( q3, pos3, q4, pos4, s );
74
 
75
      s = (float)pblending[1] / 255.0f;
76
      StudioSlerpBones( q, pos, q3, pos3, s );
77
    }
78
  }
79
 
80
  AngleMatrix(angles, (*g_pRotationMatrix));
81
 
82
  (*g_pRotationMatrix)[0][3] = origin[0];
83
  (*g_pRotationMatrix)[1][3] = origin[1];
84
  (*g_pRotationMatrix)[2][3] = origin[2];
85
 
86
  for( j = numbones - 1; j >= 0; j-- )
87
  {
88
    i = boneused[j];
89
 
90
    QuaternionMatrix(q[i], bonematrix);
91
 
92
    bonematrix[0][3] = pos[i][0];
93
    bonematrix[1][3] = pos[i][1];
94
    bonematrix[2][3] = pos[i][2];
95
 
96
    if( pbones[i].parent == -1 )
97
      ConcatTransforms((*g_pRotationMatrix), bonematrix, (*g_pBoneTransform)[i]);
98
    else
99
      ConcatTransforms((*g_pBoneTransform)[pbones[i].parent], bonematrix, (*g_pBoneTransform)[i]);
100
  }
101
 
102
  ALERT(at_notice, "SV_StudioSetupBones_HL processing.\n");
103
}

Это функция для 2-way блендинга, если вам нужно, чтобы правильно работали монстры.
C++ Source Code:
1
#define ANIM_SWIM_1					10
2
#define ANIM_SWIM_2					11
3
#define ANIM_FIRST_DEATH_SEQUENCE	30
4
 
5
float GetPlayerYaw(const edict_t *pEdict);
6
float GetPlayerPitch(const edict_t *pEdict);
7
int GetPlayerGaitsequence(const edict_t *pEdict);
8
float GetPlayerGaitframe(const edict_t *pEdict);
9
float GetPlayerGaitYaw(int playerIndex);
10
 
11
void SV_StudioSetupBones( struct model_s *pModel, float frame, int sequence, const vec3_t angles, const	vec3_t origin, const byte *pcontroller, const byte *pblending, int iBone, const edict_t *pEdict )
12
{
13
  int		i, j, numbones = 0;
14
  int		boneused[MAXSTUDIOBONES];
15
  double	f;
16
 
17
  mstudiobone_t		*pbones;
18
  mstudioseqdesc_t	*pseqdesc;
19
  mstudioanim_t		*panim;
20
 
21
  static float	pos[MAXSTUDIOBONES][3];
22
  static vec4_t	q[MAXSTUDIOBONES];
23
  float			bonematrix[3][4];
24
 
25
  static float	pos2[MAXSTUDIOBONES][3];
26
  static vec4_t	q2[MAXSTUDIOBONES];
27
  static float	pos3[MAXSTUDIOBONES][3];
28
  static vec4_t	q3[MAXSTUDIOBONES];
29
  static float	pos4[MAXSTUDIOBONES][3];
30
  static vec4_t	q4[MAXSTUDIOBONES];
31
 
32
  vec3_t temp_angles;
33
 
34
  if ((pEdict && !(pEdict->v.flags & FL_CLIENT)) || !pEdict)
35
  {
36
    SV_StudioSetupBones_HL( pModel, frame, sequence, angles, origin, pcontroller, pblending, iBone, pEdict );
37
    return;
38
  }
39
 
40
  g_pStudioHeader = (studiohdr_t *)IEngineStudio.Mod_Extradata(pModel);
41
 
42
  if( sequence < 0 || sequence >= g_pStudioHeader->numseq )
43
  {
44
    ALERT( at_notice, "SV_StudioSetupBones: sequence %i/%i out of range for model %s\n", sequence, g_pStudioHeader->numseq, g_pStudioHeader->name );
45
    sequence = 0;
46
  }
47
 
48
  pseqdesc = (mstudioseqdesc_t *)((byte *)g_pStudioHeader + g_pStudioHeader->seqindex) + sequence;
49
  pbones = (mstudiobone_t *)((byte *)g_pStudioHeader + g_pStudioHeader->boneindex);
50
  panim = StudioGetAnim( pModel, pseqdesc );
51
 
52
  if( iBone < -1 || iBone >= g_pStudioHeader->numbones )
53
    iBone = 0;
54
 
55
  if( iBone == -1 )
56
  {
57
    numbones = g_pStudioHeader->numbones;
58
    for( i = 0; i < g_pStudioHeader->numbones; i++ )
59
      boneused[(numbones - i) - 1] = i;
60
  }
61
  else
62
  {
63
    // only the parent bones
64
    for( i = iBone; i != -1; i = pbones[i].parent )
65
      boneused[numbones++] = i;
66
  }
67
 
68
  f = StudioEstimateFrame( frame, pseqdesc );
69
 
70
  if ( pseqdesc->numblends == 9 )
71
  {
72
    float s = GetPlayerYaw(pEdict);	// yaw (left -> right)
73
    float t = GetPlayerPitch(pEdict);	// pitch (top -> bottom)
74
 
75
    // nine-way blends are done left -> right, top -> bottom
76
 
77
    /***********************
78
 
79
    			0	-	1	-	2
80
 
81
    			|	\	|	/	|
82
 
83
    			3	-	4	-	5
84
 
85
    			|	/	|	\	|
86
 
87
    			6	-	7	-	8
88
 
89
    		 ***********************/
90
 
91
    // Blending is 0-127 == Left to Middle, 128 to 255 == Middle to Right
92
    if ( s <= 127.0 )
93
    {
94
      // Scale 0-127 blending up to 0-255
95
      s = ( s * 2.0 );
96
 
97
      if ( t <= 127.0 )
98
      {
99
        // Blending is 0-127 == Top to Middle, 128 to 255 == Middle to Bottom
100
        t = ( t * 2.0 );
101
 
102
        // need to blend 0 - 1 - 3 - 4
103
 
104
        StudioCalcRotations( boneused, numbones, pcontroller, pos, q, pseqdesc, panim, f );
105
        panim = LookupAnimation( pModel, pseqdesc, 1 );
106
        StudioCalcRotations( boneused, numbones, pcontroller, pos2, q2, pseqdesc, panim, f );
107
        panim = LookupAnimation( pModel, pseqdesc, 3 );
108
        StudioCalcRotations( boneused, numbones, pcontroller, pos3, q3, pseqdesc, panim, f );
109
        panim = LookupAnimation( pModel, pseqdesc, 4 );
110
        StudioCalcRotations( boneused, numbones, pcontroller, pos4, q4, pseqdesc, panim, f );
111
      }
112
      else
113
      {
114
        // Scale 128-255 blending up to 0-255
115
        t = 2.0 * ( t - 127.0 );
116
 
117
        // need to blend 3 - 4 - 6 - 7
118
 
119
        panim = LookupAnimation( pModel, pseqdesc, 3 );
120
        StudioCalcRotations( boneused, numbones, pcontroller, pos, q, pseqdesc, panim, f );
121
        panim = LookupAnimation( pModel, pseqdesc, 4 );
122
        StudioCalcRotations( boneused, numbones, pcontroller, pos2, q2, pseqdesc, panim, f );
123
        panim = LookupAnimation( pModel, pseqdesc, 6 );
124
        StudioCalcRotations( boneused, numbones, pcontroller, pos3, q3, pseqdesc, panim, f );
125
        panim = LookupAnimation( pModel, pseqdesc, 7 );
126
        StudioCalcRotations( boneused, numbones, pcontroller, pos4, q4, pseqdesc, panim, f );
127
      }
128
    }
129
    else
130
    {
131
      // Scale 127-255 blending up to 0-255
132
      s = 2.0 * ( s - 127.0 );
133
 
134
      if ( t <= 127.0 )
135
      {
136
        // Blending is 0-127 == Top to Middle, 128 to 255 == Middle to Bottom
137
        t = ( t * 2.0 );
138
 
139
        // need to blend 1 - 2 - 4 - 5
140
 
141
        panim = LookupAnimation( pModel, pseqdesc, 1 );
142
        StudioCalcRotations( boneused, numbones, pcontroller, pos, q, pseqdesc, panim, f );
143
        panim = LookupAnimation( pModel, pseqdesc, 2 );
144
        StudioCalcRotations( boneused, numbones, pcontroller, pos2, q2, pseqdesc, panim, f );
145
        panim = LookupAnimation( pModel, pseqdesc, 4 );
146
        StudioCalcRotations( boneused, numbones, pcontroller, pos3, q3, pseqdesc, panim, f );
147
        panim = LookupAnimation( pModel, pseqdesc, 5 );
148
        StudioCalcRotations( boneused, numbones, pcontroller, pos4, q4, pseqdesc, panim, f );
149
      }
150
      else
151
      {
152
        // Scale 128-255 blending up to 0-255
153
        t = 2.0 * ( t - 127.0 );
154
 
155
        // need to blend 4 - 5 - 7 - 8
156
 
157
        panim = LookupAnimation( pModel, pseqdesc, 4 );
158
        StudioCalcRotations( boneused, numbones, pcontroller, pos, q, pseqdesc, panim, f );
159
        panim = LookupAnimation( pModel, pseqdesc, 5 );
160
        StudioCalcRotations( boneused, numbones, pcontroller, pos2, q2, pseqdesc, panim, f );
161
        panim = LookupAnimation( pModel, pseqdesc, 7 );
162
        StudioCalcRotations( boneused, numbones, pcontroller, pos3, q3, pseqdesc, panim, f );
163
        panim = LookupAnimation( pModel, pseqdesc, 8 );
164
        StudioCalcRotations( boneused, numbones, pcontroller, pos4, q4, pseqdesc, panim, f );
165
      }
166
    }
167
 
168
    // Normalize interpolants
169
    s /= 255.0;
170
    t /= 255.0;
171
 
172
    // Spherically interpolate the bones
173
    StudioSlerpBones( q, pos, q2, pos2, s );
174
    StudioSlerpBones( q3, pos3, q4, pos4, s );
175
 
176
    StudioSlerpBones( q, pos, q3, pos3, t );
177
  }
178
  else
179
  {
180
    StudioCalcRotations( boneused, numbones, pcontroller, pos, q, pseqdesc, panim, f );
181
  }
182
 
183
  // calc gait animation
184
  // death sequences are last in the list of sequences, and we don't do gait for those
185
  // ANIM_FIRST_DEATH_SEQUENCE marks the first death sequence
186
  if ( pEdict &&
187
  sequence < ANIM_FIRST_DEATH_SEQUENCE &&
188
  sequence != ANIM_SWIM_1 &&
189
  sequence != ANIM_SWIM_2 )
190
  {
191
    int copy = 1;
192
 
193
    int gaitsequence = GetPlayerGaitsequence(pEdict);
194
 
195
    if (gaitsequence >= g_pStudioHeader->numseq)
196
      gaitsequence = 0;
197
 
198
    if (gaitsequence < 0)
199
      gaitsequence = 0;
200
 
201
    pseqdesc = (mstudioseqdesc_t *)( (byte *)g_pStudioHeader + g_pStudioHeader->seqindex ) + gaitsequence;
202
 
203
    panim = StudioGetAnim( pModel, pseqdesc );
204
    StudioCalcRotations( boneused, numbones, pcontroller, pos2, q2, pseqdesc, panim, GetPlayerGaitframe(pEdict) );
205
 
206
    for ( i = 0; i < g_pStudioHeader->numbones; i++ )
207
    {
208
      if ( !strcmp( pbones[i].name, "Bip01 Spine" ) )
209
      {
210
        copy = 0;
211
      }
212
      else if ( !strcmp( pbones[ pbones[i].parent ].name, "Bip01 Pelvis" ) )
213
      {
214
        copy = 1;
215
      }
216
 
217
      if ( copy )
218
      {
219
        memcpy( pos[i], pos2[i], sizeof( pos[i] ) );
220
        memcpy( q[i], q2[i], sizeof( q[i] ) );
221
      }
222
    }
223
  }
224
 
225
  VectorCopy(angles, temp_angles);
226
 
227
  if (pEdict)
228
  {
229
    temp_angles[1] = GetPlayerGaitYaw(g_engfuncs.pfnIndexOfEdict(pEdict));
230
 
231
    if (temp_angles[1] < 0)
232
      temp_angles[1] += 360;
233
  }
234
 
235
  AngleMatrix(temp_angles, (*g_pRotationMatrix));
236
 
237
  (*g_pRotationMatrix)[0][3] = origin[0];
238
  (*g_pRotationMatrix)[1][3] = origin[1];
239
  (*g_pRotationMatrix)[2][3] = origin[2];
240
 
241
  for( j = numbones - 1; j >= 0; j-- )
242
  {
243
    i = boneused[j];
244
 
245
    QuaternionMatrix(q[i], bonematrix);
246
 
247
    bonematrix[0][3] = pos[i][0];
248
    bonematrix[1][3] = pos[i][1];
249
    bonematrix[2][3] = pos[i][2];
250
 
251
    if( pbones[i].parent == -1 )
252
      ConcatTransforms((*g_pRotationMatrix), bonematrix, (*g_pBoneTransform)[i]);
253
    else
254
      ConcatTransforms((*g_pBoneTransform)[pbones[i].parent], bonematrix, (*g_pBoneTransform)[i]);
255
  }
256
 
257
  ALERT(at_notice, "SV_StudioSetupBones processing.\n");
258
}

А это 9-way. При необходимости можете убрать проверку на игрока и не использовать функцию для 2-way. Вот и всё.


Отправлено Дядя Миша 23-01-2014 в 15:43:

Ну вы поглядите на него! Вроде опытный учаснег, а всю ветку каким-то говно-кодом заспамил. Ребяты, так не годится. Если ты пишешь тутор, значит к каждому кусочку кода делай пояснение что это и зачем. Но ты этого сделать не в состоянии, поскольку и сам толком не понимаешь, как это работает. Значит бери и клади в аттач, всё равно оттуда удобнее копировать, чем эти простыни из постов.

Добавлено 23-01-2014 в 19:43:

Поглядел код. Ну навскидку - лерпинг надо убрать к чертям, на сервере он не нужен. И самое главное - pEdict всё-таки последний аргумент или iBone? Кто кого обманывает? Valve или maricool?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 23-01-2014 в 16:04:

Дядя Миша я же написал, что это пока не тутор. Я понял, как работает StudioSetupBones, а в остальную прочую математику не вдавался, потому что со школы её терпеть не могу. Лерпинг вырежу, когда оформлю в виде тутора. Тогда кстати, сможешь затереть эти два моих поста. Ну или оставить в назидание другим, как хочешь. Я кстати разобрался, почему хитбоксы на сервере не совпадали с клиентскими и уже это поправил.

Цитата:
Дядя Миша писал:
И самое главное - pEdict всё-таки последний аргумент или iBone? Кто кого обманывает? Valve или maricool?

Когда аргументы располагаются как у Valve, то всё работает. Стоит поменять местами - вылетает под голдсорсом. Под ксашем наоборот, но началось это после того, как ты поменял аргументы местами в движке. А вообще, эдикт приходит верный, иначе yaw/pitch игрока невозможно было бы получить. И ещё - я делал в новом СДК, что в репозитарии валяется, не думаю, что Valve оставили бы код с такой ошибкой, учитывая, что там кусок контры в виде ботов имеется.


Отправлено Дядя Миша 23-01-2014 в 16:20:

Цитата:
Ku2zoff писал:
Я кстати разобрался, почему хитбоксы на сервере не совпадали с клиентскими и уже это поправил.

Питч инвертировал?
Цитата:
Ku2zoff писал:
Под ксашем наоборот, но началось это после того, как ты поменял аргументы местами в движке

Я поменял, потому что мне один товарищ все ухи прожужжал - поменяй, да поменяй. То есть обманул, получается?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено marikcool 23-01-2014 в 16:50:

Я хук вешал и смотрел что падает, вообщел что видел то и написал. Углы помоему v_angles юзаются с бейсплеера а не angles с эдикта.

__________________
vk.com/skullcapstudios


Отправлено Ku2zoff 23-01-2014 в 16:55:

Цитата:
Дядя Миша писал:
Питч инвертировал?

Всё гораздо проще. В клиентском коде с форума арранжевого мента сделано так: сначала берётся значение curstate.angles[PITCH] у текущей энтити, на основе его меняется curstate.blending[1], а потом curstate.angles[PITCH] делается равным нулю. На выходе имеем что моделька игрока не наклоняется вперёд/назад как в халфе (ноги игрока остаются на земле, спина перпендикулярна полу) и меняются только бленды на основе значения curstate.blending[1]. Ну я взял и сделал обнуление питча на сервере. И моделька (серверная, которую не видно) перестала наклоняться, хитбоксы почти совпадают, есть кое-какие несходжения, но по сравнению с тем, что было раньше - пустяк.
Цитата:
Дядя Миша писал:
То есть обманул, получается?

Видимо да. С помощью эдикта я прекрасно получаю из КБейсПлеера yaw и pitch для смены блендов. Аргументы стоят как у Валвэ.

Добавлено 23-01-2014 в 23:55:

Цитата:
marikcool писал:
Углы помоему v_angles юзаются с бейсплеера а не angles с эдикта.

Эдикт используется как указатель на игрока, чтобы получить доступ к переменным его класса, таким как питч, йау, гэйтсиквенс, гэйтфрейм. Которые в свою очередь вычисляются в коде игрока более точно, чем их можно получить от эдикта.


Отправлено Ku2zoff 30-04-2014 в 17:11:

Снова копал эту тему. Сделал расчёты углов поворота и наклона на сервере, передал на клиент - увидел, почему не совпадают серверные и клиентские кости.
Во-первых, на сервере модель игрока по горизонтали вертится с опозданием. Если игрок стоит на месте, она может повернуться в направление взгляда только тогда, когда разница между реальным и видимым углом примерно 45 градусов, или ещё сколько то, зависит от того, как быстро вертишь мышкой.
Во-вторых, модель игрока наклоняется по вертикали, как в оригинальной халфе, хотя, если делать расчёты на клиенте, то там наклоняться не будет.
Попытался поправить - не вышло, мож я не догоняю чего. Главное - избавиться от вертикальных наклонов, из-за них все проблемы. А горизонталь хоть и опаздывает, но только когда игрок стоит. Если бежать, то вертится норм.
Может посоветуете чего путного?


Отправлено ILZM 30-04-2014 в 17:26:

Ku2zoff, а как увидеть хитбоксы и проверять?


Отправлено tolerance 30-04-2014 в 18:40:

Цитата:
ILZM писал:
Ku2zoff, а как увидеть хитбоксы и проверять?

Может r_drawentities 2 или 3 (sv_cheats надо).


Отправлено Ku2zoff 30-04-2014 в 18:45:

Цитата:
ILZM писал:
а как увидеть хитбоксы и проверять?

Никак, нету встроенного механизма для сервера. Я это обошёл, отправив углы поворота с сервера, и используя на клиенте именно серверные, чтобы видеть, как на сервере ведёт себя модель. Всё оказалось как я и предполагал: несовпадение по горизонтали и ненужный наклон по вертикали.


Отправлено ~ X ~ 30-04-2014 в 18:46:

Это ж только клиентские. По серверным только лучами стрелять

Интересная темка, как-то я этим тоже заморачивался. Ещё взбесило отражение оси поворота PITCH... Халва-говно, вобщем. Если что придумаете, готов проверить/дополнить, но только летом.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Ku2zoff 30-04-2014 в 18:55:

Цитата:
~ X ~ писал:
Если что придумаете

Да в общем-то, надо сделать так, чтобы модель игрока на сервере по горизонтали поворачивалась своевременно не только когда игрок движется, но и когда стоит (когда gaitmovement равен нулю). Ну и зафиксировать её по вертикали, чтобы не наклонялась, а только менялись бленды. Тогда будет соответствовать клиентской реализации, и хитбоксы будут на месте. Возможно, скоро решу этот вопрос.


Отправлено Дядя Миша 30-04-2014 в 19:04:

Цитата:
Ku2zoff писал:
Никак, нету встроенного механизма для сервера

Ну делай под ксашем, там триапи есть встроенный на сервере.
Специально для таких случаев.
Я же и уроки физики под ксашем отлаживал, визуально, так сказать.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 01-05-2014 в 01:16:

Дядя Миша под ксашем не делаю потому, что предиктинг не работает как следует. Тестирование по мультиплееру превращается в нервотрёпку из-за дёрганья игроков при передвижении.


Отправлено KiQ 01-05-2014 в 08:07:

если поковырять конфиги сети, то все довольно плавно, в общем-то

__________________
-Brain is dead-


Отправлено Ku2zoff 01-05-2014 в 08:12:

KiQ кинь тогда настройки, пригодятся. Хотя, боюсь, что ксаш не прожуёт дллки от нового хлсдк.


Отправлено Дядя Миша 01-05-2014 в 11:19:

Цитата:
Ku2zoff писал:
Хотя, боюсь, что ксаш не прожуёт дллки от нового хлсдк.

зря я что ли интерфейсы апдейтил?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ILZM 01-05-2014 в 14:42:

Как это код одинаковый, но модель ведёт себя по-другому и поворачивается не одинаково?


Отправлено Ku2zoff 02-05-2014 в 04:15:

Цитата:
ILZM писал:
Как это код одинаковый, но модель ведёт себя по-другому и поворачивается не одинаково?

Да вот так. Код выполняет одни и те же функции, но он не одинаковый. На клиенте в коде студиомодельрендерера есть доступ к разным параметрам энтити и инфе игрока, всё обновляется оперативно, каждый кадр. На сервере часть параметров из движка получить невозможно, насколько я увидел по коду из исходников КС. Например, тот же gaitmovement вычисляется непосредственно в коде игрока. Gaityaw тоже надо считать самому. Ну и ещё кое-что по мелочи. Попробую написать свои механизмы вычисления, основываясь на клиентском коде. Как только доведу до ума и протестирую, сделаю полноценный тутор с объяснениями.

Добавлено 02-05-2014 в 11:15:

А надо ли это кому?


Отправлено ILZM 02-05-2014 в 06:06:

Ku2zoff, например, мне)


Отправлено ~ X ~ 02-05-2014 в 08:28:

Цитата:
Ku2zoff писал:
когда стоит (когда gaitmovement равен нулю)

не обязательно, у меня, вроде, для idle gaitsequence == sequence.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Дядя Миша 02-05-2014 в 10:12:

Цитата:
Ku2zoff писал:
На сервере часть параметров из движка получить невозможно, насколько я увидел по коду из исходников КС

У тебя доступ к эдикту есть. А значит и к классу доступ тоже.
Цитата:
Ku2zoff писал:
Например, тот же gaitmovement вычисляется непосредственно в коде игрока. Gaityaw тоже надо считать самому

гейт не от хорошей жизни, это потому что велосити на клиент не приходит.
А на сервере считать гейт не надо.
Достаточно сделать вот так:
C++ Source Code:
est_velocity = pplayer->velocity;
m_flGaitMovement = est_velocity.Length() * dt;

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

Добавлено 02-05-2014 в 14:12:

Цитата:
Ku2zoff писал:
Попробую написать свои механизмы вычисления, основываясь на клиентском коде

Ну вон в ксаше mod_studio.c - полноценная имплементация, бери да суй на сервер. Что мешает?
Заметь, 100% рабочая, иначе бы давно уже завалили багрепортами.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ~ X ~ 02-05-2014 в 10:21:

Цитата:
Дядя Миша писал:
А на сервере считать гейт не надо.

лолшто? gaitsequence?
я немного потерял нить, о чём вы говорите. От уклона перешли к гайтам. Вообще, имхо, код передвижения в халве - КГ. В скайриме сделано единственно правильно (выставление ног на неровные поверхности). Но это для хохлолвы слишком круто... Хотя, я об этом ещё году в 2004ом думал...

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Дядя Миша 02-05-2014 в 10:23:

ЗЫ, на сервере гейт считать вообще не надо. Халфа его не считает, он не нужен.

Добавлено 02-05-2014 в 14:23:

Цитата:
~ X ~ писал:
В скайриме сделано единственно правильно (выставление ног на неровные поверхности).

Это называется "инверсная кинематика". Запиши в блокнотек, чтобы не забыть.
Цитата:
~ X ~ писал:
Но это для хохлолвы слишком круто...

Можно сделать. Надо только немного дополнить формат mdl.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ILZM 02-05-2014 в 10:41:

Дядя Миша, объясните сам принцип ИК. Это типа трассировка с ноги на поверхность идёт?


Отправлено Дядя Миша 02-05-2014 в 10:51:

Принцип очень простой. Находим точку и нормаль поверхности и тянем к ней ногу, т.е. конечную дочернюю кость. А она уже влияет на колено и тазобедренный сустав (в конкретном примере для ноги).
Потому-то кинематика и называется инверсной, что не родительская кость задаёт положение дочерних, а наоборот. В принципе там без разницы куда идёт импульс, но зачастую - от дочерних к родительским.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 02-05-2014 в 17:26:

Цитата:
Дядя Миша писал:
Ну вон в ксаше mod_studio.c - полноценная имплементация, бери да суй на сервер. Что мешает?

Всё что надо, я оттуда уже взял. Проблему я описал выше: Клиентская модель уже повернулась, а серверная ещё нет, она как бы "догоняет" рывками каждые N градусов, если игрок не движется. Может даже "перегнать", если мышью шевелить резко. Ну и гадские наклоны по оси Pitch, которые можно заблокировать в коде SV_StudioSetupBones.


Отправлено Дядя Миша 02-05-2014 в 17:45:

Хех. Ну как ты узнаешь, что серверная модель "догоняет" ?
Ты ведь не можешь её увидеть.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 02-05-2014 в 17:51:

Цитата:
Дядя Миша писал:
Ты ведь не можешь её увидеть.

А я pitch и yaw (которые вычисляются на сервере и юзаются в SV_StudioSetupBones) отправил на клиент, и там подхватил в клиентском StudioSetupBones. Вот и увидел. А про наклоны по picth - в модифицированной для 9-way блендинга функции StudioPlayerBlend эти наклоны обнуляются, моделька не наклоняется. На сервере тоже так сделал - хитбоксы почти стали совпадать, осталось несхождение из-за "догонялок".


Отправлено Дядя Миша 02-05-2014 в 17:57:

Нет, ты ерунду увидел, на самом-то деле.
Ты же не забывай, что этот рассинхрон - нормальное явление, поскольку моделька игрока вертится сразу же на клиенте, вслед за мышкой, а потом результаты уходят на сервер, чтобы их могла использовать трасса.
Т.е. это нормальный лаг, ты его не победишь и не заборешь никоим образом.
Так и должно быть. *здесь картинка с малышевой*

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 02-05-2014 в 18:09:

Я видео если что залью потом. Это наверное не рассинхрон, а что-то другое. Рассинхрон он по времени, а тут можно хоть полдня прождать, моделька не повернётся, пока не сдвинешь игрока с места, или пока не повернёшь мышью дальше.


Отправлено Ku2zoff 03-05-2014 в 11:25:

Разобрался, почему модель опаздывает. Запустил кс в одиночном режиме, сделал вид от 3-го лица. Там модель тоже поворачивается с опозданием. Значит, серверный код это действительно предусматривает. Надо либо заставить модель вертеться вовремя, либо завтавить модель на клиенте опаздывать.

Добавлено 03-05-2014 в 18:25:

Эх нет. Опаздывает только тогда, когда у игрока нет оружия. Стоит взять ствол, параметр sequence меняется, и всё норм.


Отправлено ~ X ~ 03-05-2014 в 18:37:

У меня голова кружится... Так что, галактика уже не опасносте? А то я чуть не ринулся спасать XDM от багов поворота модели!

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Ku2zoff 05-05-2014 в 10:08:

Разобрался наконец Нашёл способ отрисовать серверные хитбоксы, увидел различия, и пофиксил несоответсвия серверных и клиентских костей. Проблема была не только в серверной, но и в клиентской части. Причём те догадки, которые я строил вслепую, оказались верными и нашли подтверждение при визуализации хитбоксов.
При отрисовке серверные хитбоксы отстают от модели игрока, когда тот бежит, но думаю, это всего лишь проблема метода их отрисовки (не каждый кадр, а когда вызывается SV_StudioSetupBones).
В общем, сырой вариант выглядит правильно, даже gait-анимации ногам делаются. Осталось протестировать, а потом ждите подробный тутор.
Воистину, попытки копипасты кода без понимания принципов его работы могут растянуть решение простой задачи с пары дней на... Ну вы поняли, когда была открыта эта тема Не буду утверждать, что сейчас досконально разбираюсь в механизмах студиомодельрендерера, но от тупой копипасты в этом направлении я уже ушёл.


Отправлено Дядя Миша 05-05-2014 в 12:59:

Цитата:
Ku2zoff писал:
При отрисовке серверные хитбоксы отстают от модели игрока, когда тот бежит, но думаю, это всего лишь проблема метода их отрисовки

Естественно. Я не знаю, как ты рисуешь на сервере, но в мультиплеере они будут отставать, т.к. сервер тчинкает реже клиента. Можешь принудительно ограничить клиенту фпс в раёне 30, тогда думаю отставать не будет.

Добавлено 05-05-2014 в 16:59:

Цитата:
Ku2zoff писал:
Воистину, попытки копипасты кода без понимания принципов его работы могут растянуть решение простой задачи с пары дней на...

Я вам это давно говорю. Исключение составляют те случаи, когда вариантов перебора всего-то 3-4 штуки.
Ну например зеркало неправильно отражает, опа сделал проверку на SURF_PLANEBACK - заработало правильно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 19-05-2014 в 19:02:

Торжественно заявляю, что зеркало функций StudioModelRenderer'а на сервере мною доделано и функционирует синхронно с клиентом, как и должно быть. Маленькие отставания визуализированных хитбоксов связаны скорее всего со скоростью тчинканья сервера и в сетевой игре незаметны, пульки попадают куда надо. Было несколько неприятных моментов, которые я долго не мог пофиксить, некоторые из-за моей невнимательности, некоторые из-за предоставления ложной информации от участников форума. Есть некоторая неэстетичность в реализации, как то: игрок поворачивается немного дёрганно, но это опять же результат медленного тчинканья сервера. Попытка реализации сглаженных поворотов на клиенте провалилась, т.к. идентичный по константам с сервером код(что имеем в оригинальных исходниках клиентской части с форума арранжевого мента), вертит ноги игрока вместе с торсом. При попытке сгладить повороты на сервере я получил то же, что и на клиенте - ноги поворачиваются вслед за торсом когда ещё не должны. Но это и не важно, потому что моей задачей была именно серверная сторона, а клиент уже давно сделан. Если мне не будет лениво, в ближайшее время оформлю в виде тутора с комментариями того, что я понимаю в этом коде. А пока вот вам видео для затравки:


Отправлено Ku2zoff 22-05-2014 в 13:48:

Граждане-товарищи, тутор хотите?

Добавлено 22-05-2014 в 20:48:

Если хотите, будет в течение недели.


Отправлено Chyvachok 22-05-2014 в 13:51:

Как я понял это что-то вроде сглаженых анимаций? Тутор было бы неплохо, полезная вещь будет.


Отправлено Ku2zoff 22-05-2014 в 14:00:

Цитата:
Chyvachok писал:
это что-то вроде сглаженых анимаций?

Нет. Это зеркало CStudioModelRenderer::StudioSetupBones на сервере. Специально для 9-way блендинга, как в КС, ДоД и ещё некоторых мультиплеерных модах.


Отправлено Дядя Миша 22-05-2014 в 14:23:

Ku2zoff никогда не спрашивай, хотят ли товарищи тутор.
Ты как почтальон Печкин - у меня для вас посылка, только я вам её не отдам.
Есть чем поделиться с народом - выкладывай, нет - не спрашивай.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Cybermax 22-05-2014 в 14:43:

Цитата:
Ku2zoff писал:
Граждане-товарищи, тутор хотите?

Добавлено сегодня в 20:48:

Если хотите, будет в течение недели.


Да я хочу. Мне он будет полезен.

Цитата:
Дядя Миша писал:
Есть чем поделиться с народом - выкладывай, нет - не спрашивай.


Ну а может он хочет узнать нужно ли народу. Может не актуально а тутор писать надо время тратить или может просто хочет чnо бы по уговаривали

__________________


Отправлено Дядя Миша 22-05-2014 в 15:17:

Делай добро и бросай его в воду (с)

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 22-05-2014 в 15:38:

Цитата:
Cybermax писал:
Может не актуально а тутор писать надо время

Время, время... Но насчёт актуальности тоже хотел бы узнать. Сколько вообще народу делает моды с моделями из КС?


Отправлено Cybermax 22-05-2014 в 16:18:

Цитата:
Ku2zoff писал:

Время, время... Но насчёт актуальности тоже хотел бы узнать. Сколько вообще народу делает моды с моделями из КС?


Я может специально ради твоего туториала пересажу модели из Cyber Arena на скелет из контры. Правда не знаю как я это сделаю но вроде гордон HD то есть для контры так что вполне возможно.

__________________


Отправлено PLut 22-05-2014 в 20:32:

Ku2zoff Да, вероятно в бдеф добавлю.

__________________
Base Defense on Steam, ModDB


Отправлено marikcool 23-05-2014 в 04:55:

отличная работа!

__________________
vk.com/skullcapstudios


Отправлено Ku2zoff 25-05-2014 в 02:52:

Работа ещё не совсем закончена. Сейчас работаю над синхронизацией гейт-анимаций на сервере и клиенте. Это последний затык, который остался. Для справки: в КС гейт-анимации сервера и клиента синхронны, и хитбоксы ног в движении находятся там же, где и сами ноги визуально.


Отправлено Ku2zoff 26-05-2014 в 15:52:

В общем так, ребяты. Времени у меня свободного счас мало, кому не терпится, завтра выложу изменённые файлы для нового ХЛСДК (сервер и клиент). Утянуть в ХЛСДК 2.3 нетрудно будет. Комментов в коде немного, в основном то, что я сам для себя менял. Работает норм за исключением гейт-анимаций, они не синхронны, допилить не смог пока что. Ну и кое-какие мелочи в плане интерполяции на клиенте, тоже не допилил. Сразу предупреждаю: анимации игрока стандартные, вам надо будет вносить свои изменения в CBasePlayer::SetAnimation под конкретные модели.

З.Ы. Почему не тутор? А кому он нужен? - раз. Моего кода там почти нету - два. Смысл писать тутор, когда те, кому это надо, сами поймут, как это работает - три.
З.З.Ы. Исходники под 2013 студию, я только ей сейчас пользуюсь Поэтому файлы проектов выкладывать не буду. Сами скопируете в новый ХЛСДК и скомпилите 2010 студией.
З.З.З.Ы. Код полностью рабочий, в игре всё как надо. Вопросов "а почему не компилится?" или "а почему не работает?" быть не должно. Ну эт я шуткую, если что, я в аське.
З.З.З.З.Ы. Ни в коем случае не указывайте меня в авторах, код не мой, я только внёс несколько изменений, чтоб работало как надо мне, в моём моде.


Отправлено Cybermax 26-05-2014 в 17:06:

Цитата:
Ku2zoff писал:
Работает норм за исключением гейт-анимаций

Цитата:
Ku2zoff писал:
мелочи в плане интерполяции на клиенте, тоже не допилил

Цитата:
Ku2zoff писал:
З.Ы. Почему не тутор? А кому он нужен? - раз.


Мне лично не нужно, бесполезно.

__________________


Отправлено ~ X ~ 26-05-2014 в 19:19:

Мне бы пригодился.
Хотя, я малость упустил уже, о чём идёт речь.
Если о более навороченной синхронизации хитбоксов св-цл - Я ОЧЕНЬ ДАЖЕ ЗА! Потому что непопадание стрелы в колено меня очень сильно ЗА-!

И вообще, я ж тяну к себе в мод все самые прогрессивные решения
ЗЫ: 9-путей блямбинг ведь требует новых моделей? Тогда я как-нить буз него

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Cybermax 26-05-2014 в 19:52:

Мне нужен детальный туториал с пошаговой инструкцией и разжевыванием.

__________________


Отправлено Ku2zoff 27-05-2014 в 04:23:

Цитата:
~ X ~ писал:
ЗЫ: 9-путей блямбинг ведь требует новых моделей? Тогда я как-нить буз него

Да, модельки нужны будут с новыми анимациями прицеливания и стрельбы, в которых 9 блендингов, а не 2. Необязательно менять
все анимации, некоторые можно оставить 2-way. Ну и условие завести в StudioSetupBones на этот случай.
Цитата:
~ X ~ писал:
Потому что непопадание стрелы в колено меня очень сильно ЗА-!

ДМ писал, что халфа гейт не считает, возможно, имел в виду именно сервер, потому что клиент считает. Именно поэтому-то стрелы у тебя и не попадают в ноги в движеннии. Можно сделать зеркало функций на сервере для стандартных моделей, чтобы считать гейт.
Весь затык в том, что я не нашёл нормального способа рисовать серверные хитбоксы, чтобы можно было без сторонней утилиты и добавления SV_StudioSetupBones их увидеть. Если кто это сделает для простой халфы, он очень облегчит мне задачу.

Добавлено 27-05-2014 в 11:21:

Кому надо, вот код 2-way как в движке. Только гейт не считает, как и должно быть. Если научить его правильно считать гейт копипастой с клиента, то хитбоксы ног будут совпадать.

Добавлено 27-05-2014 в 11:23:

По поводу 9-way: синхронизировал гейт на сервере с клиентским. Правда иногда случается рассинхрон. Надо выяснить, когда это происходит, и обнулять гейтфрейм игрока (на сервере) в этот момент. В общем, всё.


Отправлено Cybermax 24-06-2015 в 10:02:

Напомните, как можно решить проблему, если модель игрока не правильно проигрывает анимации на лицензионной хл.

__________________


Отправлено ~ X ~ 24-06-2015 в 10:33:

Ku2zoff
какие-нибудь подвижки есть в этой области?

Cybermax вы о чём?

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Cybermax 24-06-2015 в 11:05:

Цитата:
~ X ~ писал:
Cybermax вы о чём?

Не о чем, уже разобрался. Особенность в том что надо соблюдать порядок мешей в qc файле. Для того что бы увидеть о чем я говорю скачать архив, раскидать модель игрока в паку, запустить хл в консоле thunderperson, создать сервер и выбрать игрока gina наслаждаться.

Добавлено 24-06-2015 в 14:05:

Цитата:
Cybermax писал:
Этот файл был скачан 100 раз.

Что? 0.o

__________________


Отправлено Ku2zoff 24-06-2015 в 14:11:

Цитата:
~ X ~ писал:
какие-нибудь подвижки есть в этой области?

У меня в текущей версии мода всё сделано и работает. И для игроков, и для монстров. Исправлено несколько несоответствий серверного зеркала с клиентской частью, которые приводили к неправильному положению серверных хитбоксов при резких поворотах игрока. Единственное, что пока ещё не заборол - неправильные yaw и gaityaw при спавне игрока. Кажется, на клиенте gaityaw после спавна рассчитывается всегда относительно yaw. А на сервере почему-то не хочет, и расчёт костей использует те значения, которые указываются в Spawn() игрока. Но это не критично, т.к. стоит игроку сдвинуться с места, и на сервере происходит правильный расчёт. Поковырял немного эту проблему, и ничего толком не добившись, забросил, т.к. в кс точно так же.
Тутор писать не охота, потому что я ещё не до конца понимаю механизм работы модельрендерера, и некоторые моменты расписать не могу. Но если прям кому-то очень надо, сделаю в том виде, в каком есть сейчас.


Отправлено ~ X ~ 24-06-2015 в 21:50:

Я не понял про зеркало, но да не суть важно.
Мне бы чисто пофиксить баги ХЛ1 в области моделей - на фичи у меня уже сил нет (я на этой неделе и так уже пофиксил 9000 всего что можно было). Т.е. синхронизацию хитбоксов. Я у себя передачу gaitsequence малость изменил просто - ещё адаптировать...

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Ku2zoff 26-06-2015 в 04:33:

Цитата:
~ X ~ писал:
Т.е. синхронизацию хитбоксов. Я у себя передачу gaitsequence малость изменил просто - ещё адаптировать...

В чём проблема? Бери восстановленные сорцы серверной дллки кс, дёргай оттуда StudioProcessGait, StudioEstimateGait, StudioPlayerBlend. Доводи до соответствия с халфовскими (теми, что на клиенте). Ну и SV_StudioSetupBones бери тот, что я выше выкладывал в аттаче, добавляй в него поддержку gait-анимаций. И всё.


Временная зона GMT. Текущее время 10:15.
Показать все 160 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024