В коде компиляторов и функциях GetHullBounds на сервере и клиенте задефайнены размеры хуллов игрока. Три штуки: в полный рост, в присяде и точечный нулевой. Чтобы изменить размер игрока, надо поменять значения во всех трёх местах. Сегодня убедился экспериментально, пересобрав ещё и компиляторы. Это не беда, сделать не сложно. Но можно ли добавить ещё один хулл для лежачего игрока? Подозреваю, что нет, и это ограничение формата карт и движка. А для чего юзается точечный хулл? С первыми двумя понятно - для размеров игрока сидя и стоя. Ну а третий для чего? Для дохлого игрока? Можно ли его заюзать для своих целей?
~ X ~ понял. Трейс он ведь точечный. Значит и все точечные энтити, тоже его юзают. И монстры, им ведь можно без труда задавать произвольный размер, в отличие от игрока.
Добавлено 21-04-2015 в 17:15:
Можно модифицировать компиляторы и добавить ещё один хулл, только вот прожуёт ли это дело движок? Я тут в DoD поэкспериментировал. Хулл у лежачего игрока такой же как и у сидячего. Забавно наверное выглядит со стороны, когда один игрок запрыгивает на другого в таком случае.
Добавлено 21-04-2015 в 17:27:
Похоже, нельзя добавить. Всего движок юзает 4 хулла: 3 для коллизии, про которые и идёт речь и один визуальный.
Есть мысль сделать хулл в присяде изначально маленьким, для лежачего игрока и как-то искусственно блокировать движение, когда игрок в присяде, а пространство не позволяет пролезть.
ДМ вот чё мне писал "в pm_shared функция pmove->usehull.
Там есть нулевой - это обычный хулл игрока, есть первый - это присевший игрок и есть второй - точечный. Засада в том, что третий хитрая халфа может вообще не добавить в эту структуру.
Так что попробуй pmove->usehull = 3, но предупреждаю - может и не сработать."
Почитал на русском форуме, посвящённом AMX. У чувака получилось хакнуть GetHullBounds и применить к игроку второй (третий по счёту) Vector(0,0,0), нулевой хулл. На скрине видно, что залез в узенькую щель (юнита 3) между ящиками на дедасте. Значит для игрока сработает usehull = 2.
Я боюсь, что если изменю его размеры в компиляторах и в движке, то что-нибудь изломаю.
Цитата:
~ X ~ писал: для всего юзается. Просто прям для всего. Особенно для трейсов, вроде.
Цитата:
XaeroX писал: На самом деле нулевого хулла не существует. Он строится при загрузке уровня.
Так он юзается для чего-то или нет?
Где-то краем глаза видел чью-то писанину про то, что если менять какой-то из существующих хуллов, чтобы сделать его для лежачего игрока, то изломается коллизия монстров...
Добавлено 21-04-2015 в 23:12:
C++ Source Code:
1
/*
2
================================
3
GetHullBounds
4
5
Engine calls this to enumerate player collision hulls, for prediction. Return 0 if the hullnumber doesn't exist.
6
================================
7
*/.
Ключевая фраза PLAYER collision hulls. Попробую поковырять код, может только на игрока и действует.
Методом тыка выяснил, что в GetHullBounds можно подставлять любые значения (и в любой кейс), лишь бы они совпадали с хуллами, задефайнеными в компиляторах, и кейс соответствовал pmove->usehull.
C++ Source Code:
1
vec3_t g_hull_size[NUM_HULLS][2] =
2
{
3
{// 0x0x0
4
{0, 0, 0}, {0, 0, 0}
5
}
6
,
7
{// 32x32x72
8
{-16, -16, -36}, {16, 16, 36}
9
}
10
,
11
{// 64x64x64
12
{-32, -32, -32}, {32, 32, 32}
13
}
14
,
15
{// 32x32x36
16
{-16, -16, -18}, {16, 16, 18}
17
}
18
};
Из компилятора. Первый хулл для точечных объектов. Второй для стоячего игрока, третий ХЗ для чего, вроде пишут что для монстров, четвёртый для сидячего игрока. Поясните пожалуйста, для коллизий чего конкретно нужен третий хулл, куб 64х64х64? Ну не для монстров ведь. Им же задаётся произвольный размер: хедкраб, гаргантюа или барник пролезают в разные дырки, и ни одна из них не соответствует кубу со стороной 64. Может это какой-то рудимент от кваки? Да и размеры монстрам задаются совсем не так:
Ku2zoff писал: для коллизий чего конкретно нужен третий хулл, куб 64х64х64?
Для пушаблей, гаргов и т.п.
Движок сам подбирает наиболее близкий хулл.
Но ты не путай коллизию игрока с монстром (она точная, по боксу или даже хитбоксам) и монстра с миром (она приближённая - но обычно достаточно. Хотя бывает, что нод вроде бы вот он, а монстр к нему не идёт).
Ага, ясненько. Значит этот хулл трогать всё равно нельзя. А может есть способ обойтись без хулла? Сделать в pm_shared проверку и считать коллизии там? Или это придётся тащить из движка недостающую физику?
Замечал, кстати, если менять UTIL_SetSize монстрикам на свои, более подходящие к модельке, то бывает монстры перестают ходить по лестнице, высота ступенек которой равны 16 юнитам. В итоге у меня все монстрики размером 32х32х72. Ходят по ступенькам хорошо, но вот когда прыгают в сторону стены, то наполовину в стену уходят. Есть какое-то решение?