Нашел неплохую альтернативу z_ground
Если кто не помнит - это опкод(ну и функция, ессно), которая находит координату z ниже точки X Y Z, которую указываете вы.
В виде опкода это выглядит так:
02CE: $98 = ground_z $953 $954 50.0
где $953 $954 - XY координаты точки, 50.0 - высота, с которой будет начинаться поиск "земли", $98 - полученный уровень земли.
Функция опкода используется аналогично.
Помимо жесткого ограничения(искать можно строго вертикально сверху вниз), функция находила лишь уровень статичной земли, т.е. она "не видела" ни динамические объекты, ни какие-либо другие объекты вообще.
Покопав разные куски кода(пробовал ковырять и устройство пули, и физику объектов и прочее, что пока слишком сложно для меня), вспомнил про лазерный прицел снайперки, который "реагировал" вообще на всё, имеющее COL(и все типы объектов, и транспорт, и педов).
Расковырял функцию:
0AA7: call_function 0x4D92D0 num_params 12 pop 12 0 0 0 0 1 1 1 1 7@ 6@ 5@ 4@ 10@
На самом деле, в оригинале пераметры идут в другую сторону, просто в CLEO почему-то нужно делать задом наперед. Оригинал:
CWorld::ProcessLineOfSight(CVector const&,CVector const&,CColPoint &,CEntity *&,bool,bool,bool,bool,bool,bool,bool,bool)
Короче, первый параметр - оффсет матрицы первых координат(x,y,z),
второй - оффсет вторых соответственно,
третий - оффсет вроде дальности действия поиска(если он меньше расстояния между координатами, то вроде как после этого радиуса уже не ищет)
четвертый - этот оффсет должен содержать значение ноль.
далее четыре единицы и четыре нуля.
Функция возвращает BOOL 1, если что-то обнаружено между первыми и вторыми координатами, и 0 - если ничего нет.
В CLEO возращаемое значение записывается в 10@, но не как BOOL(или BYTE), а как Integer, так что приходится преобразовывать(но это мелочи).
Как и лазер снайперки, реагирует на всё, что имеет COL. НО! Мне кажется, судя по другим участкам кода, использующим эту функцию - в тех четырех единицах и четырех нулях кроется детальная настройка того, на что реагирует данная функция, что может сделать её просто божественной заменой ground_z.
Пока ничего внятного(кроме того, что это работает!) сказать не могу, но позже отпишусь, если что-то обнаружу.