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

Тема в разделе "Программирование / Скриптинг", создана пользователем iamdss, 15 сен 2015.

  1. iamdss

    iamdss

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

    EPacker2 3D-моделист

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

    iamdss

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

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

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

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

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Всё куда проще - используйте 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);
     
  5. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    Проще один раз на карте приподнять все точки респавна (высота - origin[2]).
    Если краешком застрял, разве правильно сработает?
     
  6. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Мне кажется, что она неправильно сработает как раз в противоположном случае, т.к. сверяется объем на столкновение, но если объем больше модели, и как раз он сталкивается, а модель нет, то будет возвращен true, хотя модели ничего не мешает.
     
  7. iamdss

    iamdss

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

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


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

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    Наверное, это для TR_TraceRayFilter краем.
    Не знаю таких проблем. В CS:S обычно так и рекомендуют - приподнять точку спавна, если бывает, что проваливаешься под землю.
     
  9. Viproma

    Viproma

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

    Вложения: