Не нашёл здесь и на alliedmods. Как я могу получить высоту модели игрока? У меня разные модели, в том числе немного выше и ниже стандарта, а мне нужно выяснить высоту любой конкретной модели.
Модели имеют одинаковый скелет, но каждый автор, по разному привязывает меш. В итоге получается разная высота/толщина. Стандартный размер, если не ошибаюсь "32", а вот какая единица измерения - не знаю :D А в прочем, зачем это вам?
Я объясню. Я пишу плагин, который ловит спаун игрока и определяет, появился ли он НА поверхности, а не в ней (в HL2DM бывают ситуации, когда либо неправильно поставлена info_player_*, либо игрок появляется в предмете, который случайно упал/прилетел на точку спауна). Если игрок появился в чём-то, что блокирует его передвижение, игрок перемещается на это что-то плюс несколько юнитов. Но есть такие места на картах, где потолок низкий, соответственно, если игрок появится на крупном объекте и будет помещён на него, то он застрянет головой в потолке (так тоже можно, да). Вот я и хочу иметь возможность знать, попаду ли я головой в потолок, а для этого мне надо знать текущую высоту модели игрока, поскольку у меня ещё и кастомные модели на сервере. Пока есть только идея использовать либо стандартную метрику отсюда, либо брать высоту глаз плюс несколько юнитов вверх. Значит ли это, что физически модели имеют равную высоту и не будут, грубо говоря, застревать в дверях, если автор сделал модель на вид больше? Прошу извинить, в моделях и картах не смыслю...
Всё куда проще - используйте TR_TraceHull(). Ф-я проверяет объем в пространстве, и если что-то ей мешает, то она сообщает об этом. Код: 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 - всё хорошо. Для исключения игроков из фильтра нужно изменить Код: return (iEntity != data); на Код: return (iEntity > MaxClients || iEntity <= 0);
Проще один раз на карте приподнять все точки респавна (высота - origin[2]). Если краешком застрял, разве правильно сработает?
Мне кажется, что она неправильно сработает как раз в противоположном случае, т.к. сверяется объем на столкновение, но если объем больше модели, и как раз он сталкивается, а модель нет, то будет возвращен true, хотя модели ничего не мешает.
Отнюдь, мы не знаем, насколько точки опущены/подняты. Если бы знать гарантированно, что такая-то точка опущена на 3 юнита, то, прибавив 4, решим проблему. А если она опущена на 7, к примеру? Приходится делать расчёты. Поднимать именно точки - плохая идея, так как на ней может лежать как небольшой предмет (дисковая пила плашмя), так и бочка или батарея. А если не лежит ничего, игроки будут падать при спауне. Кроме того, при таком подходе вероятность застревания головой в потолке сохраняется. Выход - считать и двигать игрока или перемещать на другую точку. Первый раз вижу такое, спасибо. Сейчас почитаю. Ваше решение крайне изящное. Однако, это только половина решения, поскольку, как я уже сказал, мне необходимо принимать решение, насколько двигать игрока. Попробую скомбинировать оба метода. Добавлено через 2 минуты Думаю, проблема расчёта высоты игрока не решена =) Пока попробую взять за основу стандартные величины.
Наверное, это для TR_TraceRayFilter краем. Не знаю таких проблем. В CS:S обычно так и рекомендуют - приподнять точку спавна, если бывает, что проваливаешься под землю.