Высота игрока (модели)

iamdss

Участник
Сообщения
126
Реакции
12
Не нашёл здесь и на alliedmods. Как я могу получить высоту модели игрока? У меня разные модели, в том числе немного выше и ниже стандарта, а мне нужно выяснить высоту любой конкретной модели.
 

EPacker2

3D-моделист
Сообщения
1,040
Реакции
759
Модели имеют одинаковый скелет, но каждый автор, по разному привязывает меш. В итоге получается разная высота/толщина.
Стандартный размер, если не ошибаюсь "32", а вот какая единица измерения - не знаю :D
А в прочем, зачем это вам?
 

iamdss

Участник
Сообщения
126
Реакции
12
А в прочем, зачем это вам?

Я объясню. Я пишу плагин, который ловит спаун игрока и определяет, появился ли он НА поверхности, а не в ней (в HL2DM бывают ситуации, когда либо неправильно поставлена info_player_*, либо игрок появляется в предмете, который случайно упал/прилетел на точку спауна). Если игрок появился в чём-то, что блокирует его передвижение, игрок перемещается на это что-то плюс несколько юнитов.

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

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

В итоге получается разная высота/толщина.

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

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Всё куда проще - используйте TR_TraceHull(). Ф-я проверяет объем в пространстве, и если что-то ей мешает, то она сообщает об этом.

C-подобный:
bool:IsClientStuck(iClient)
{
	decl Float:vMin[3], Float:vMax[3], Float:vOrigin[3];
	GetClientMins(iClient, vMin);
	GetClientMaxs(iClient, vMax);
	GetClientAbsOrigin(iClient, vOrigin);
	TR_TraceHullFilter(vOrigin, vOrigin, vMin, vMax, MASK_PLAYERSOLID, TraceRay_DontHitSelf, iClient);
	return TR_DidHit();
}

public bool:TraceRay_DontHitSelf(iEntity, iMask, any:data)
{
	return (iEntity != data);
}
Если вернет true, то игрок застрял в чем угодно - в игроке, в предмете, в мире. Если false - всё хорошо. Для исключения игроков из фильтра нужно изменить
C-подобный:
return (iEntity != data);
на
C-подобный:
return (iEntity > MaxClients || iEntity <= 0);
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ловит спаун игрока и определяет, появился ли он НА поверхности, а не в ней
Проще один раз на карте приподнять все точки респавна (высота - origin[2]).
если что-то ей мешает, то она сообщает об этом
Если краешком застрял, разве правильно сработает?
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Если краешком застрял, разве правильно сработает?
Мне кажется, что она неправильно сработает как раз в противоположном случае, т.к. сверяется объем на столкновение, но если объем больше модели, и как раз он сталкивается, а модель нет, то будет возвращен true, хотя модели ничего не мешает.
 

iamdss

Участник
Сообщения
126
Реакции
12
Проще один раз на карте приподнять все точки респавна (высота - origin[2]).

Отнюдь, мы не знаем, насколько точки опущены/подняты. Если бы знать гарантированно, что такая-то точка опущена на 3 юнита, то, прибавив 4, решим проблему. А если она опущена на 7, к примеру? Приходится делать расчёты.

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



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

Добавлено через 2 минуты
Думаю, проблема расчёта высоты игрока не решена =) Пока попробую взять за основу стандартные величины.
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
как раз в противоположном случае
Наверное, это для TR_TraceRayFilter краем.
дисковая пила плашмя
Не знаю таких проблем. В CS:S обычно так и рекомендуют - приподнять точку спавна, если бывает, что проваливаешься под землю.
 

Viproma

Участник
Сообщения
84
Реакции
1
лучше мне помогите , скажите как самому подогать размен скина из доты под размер кс го?
 

Вложения

  • морфингRs.jpg
    морфингRs.jpg
    144.2 КБ · Просмотры: 44
Сверху Снизу