
Что такое BMOD?
BMOD позволяет amxx программистам использовать альтернативный физический движок (Bullet). Немного видео для наглядности:
https://youtube.com/watch?v=Nn26KkoIGNY
https://youtube.com/watch?v=CUmNRsVro1U
https://youtube.com/watch?v=vUCIKGlyDBQ
https://youtube.com/watch?v=fAJlHJehlI8
Как это работает?
Во время загрузки игровой карты движок Bullet создает свою. У нас получается два “мира” – один со старой HL1 физикой и один с Bullet Physics. Это позволяет добавить объект в мир Bullet и синхронизировать движения с любой энтити в мире HL1.
Какие функции имеет BMOD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
/* Типы объектов bmod: */ enum { BMOD_sphere = 0, /* сфера: x - радиус */ BMOD_box, /* куб: x, y и z - стороны */ BMOD_cylinder, /* цилиндр: x - радиус; z - ось, вдоль которой расположен цилиндр */ BMOD_capsule, /* капсула: x - радиус, y - расстояние между полусфер; z - ось, вдоль которой расположена капсула */ BMOD_cone /* конус: x - радиус, y - высота; z - ось, вдоль которой расположен конус */ }; /* Создает bmod объект с параметрами: энтити, тип, масса и размеры (x,y,z). Впоследствии bmod объект прикрепляется к данной энтити. */ native bmod_object_add(ent,type,Float:mass,Float:size[3]) /* Удаляет bmod объект, прикрепленный к энтити. */ native bmod_object_remove(ent) /* Возвращает 1, если к энтити прикреплен какой-нибудь bmod объект. */ native bmod_object_check(ent) enum BMOD_FL { BMOD_FL_afactor, //только устанавливает угловой фактор BMOD_FL_friction, //устанавливает/получает трение BMOD_FL_restitution //устанавливает/получает восстановление }; enum BMOD_VEC { BMOD_VEC_afactor, //устанавливает/получает угловой фактор BMOD_VEC_avelocity, //устанавливает/получает угловое ускорение BMOD_VEC_afriction, //устанавливает/получает анизотропное трение BMOD_VEC_gravity, //устанавливает/получает гравитацию BMOD_VEC_factor, //устанавливает/получает линейный фактор BMOD_VEC_velocity, //устанавливает/получает линейное ускорение BMOD_VEC_force, //применяет центральная силу / получает полную силу BMOD_VEC_torque //применяет момент силы / получает полный момент силы }; /* Устанавливает параметры объекту. */ native bmod_object_set_float(ent,BMOD_FL:key,Float:float) native bmod_object_set_vector(ent,BMOD_VEC:key,Float:vector[3]) /* Применяет объект в силу относительного положения. */ native bmod_object_apply_force_at(ent,Float:force[3],Float:pos[3]) /* Получает параметры объекта. */ native Float:bmod_object_get_float(ent,BMOD_FL:key) native bmod_object_get_vector(ent,BMOD_VEC:key,Float:vector[3]) /* Активирут callback(forward) для энтити. */ native bmod_object_set_callback(ent,bool) /* Устанавливает/применяет мировые параметры. */ native bmod_world_set_float(BMOD_FL:key,Float:float) native Float:bmod_world_get_float(BMOD_FL:key) /* Стоит трейс до энтити, возвращая его индекс или ноль, если ее нет. Также возвращает точку касания и нормаль. */ native bmod_traceline(Float:start[3],Float:end[3],Float:point[3],Float:normal[3]) /* Форвард, вызывающийся при столкновении объектов. */ forward bmod_forward_contact(ent1,ent2,Float:distance) |
Пример?
Как создать шар над головой игрока:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public plugin_init() { register_concmd("bmod_test","_bmod_test") } public _bmod_test(id){ //создаем новую энтити и устанавливаем модель к ней new entity = create_entity("func_wall") entity_set_model(entity,"models/fyzsph.mdl") //устанавливаем координаты энтити над головой игрока new Float:origin[3] entity_get_vector(id,EV_VEC_origin,origin) origin[2]+=128 entity_set_origin(entity,origin) //устанавливаем movetype и nextthink для плавного движения энтити entity_set_float(entity,EV_FL_nextthink,86400.0) entity_set_int(entity,EV_INT_movetype,8) //прикрепляем bmod объект к созданной энтити new Float:size[3] = {24.0,24.0,24.0} bmod_object_add(entity,BMOD_sphere,10.0,size) //устанавливаем трение и восстановление bmod_object_set_float(entity,BMOD_FL_friction,2.0) bmod_object_set_float(entity,BMOD_FL_restitution,0.88) //устанавливаем мировое трение и мировое восстановление bmod_world_set_float(BMOD_FL_friction,1.0) bmod_world_set_float(BMOD_FL_restitution,1.0) } public plugin_precache(){ precache_model("models/fyzsph.mdl") } |
Последние файлы/исходники
Скачать последние файлы GitHub (windows, linux).
Скачать последние amxx исходники Github.
Просмотреть последние исходники GitHub.
Источник: https://forums.alliedmods.net/showthread.php?t=178066
o_O
MeGusta
Я не понял, модуль действует на все энтинити, или только на встроенные?
На все (включая игрока)
Круто, но теперь игроки не смогут друг на друге стоять, да?
или на хитбоксы это никак не влияет?
И ещё, смогут ли игроки стоять под наклоном? Так: / или так: \ …
можно конечно приаттачить объект бмод, типа прямоугольник, к игроку, но это какая-то хрень, мне кажется, получится
Был бы ещё плагин урона по хитбоксам модели, ибо скелет кс стандартной моделе не полностью соответствует(
Игрока можно повернуть на все 360, а вот камеру только частично – слегка наклонить.
Psycrow, вынужден с тобой не согласиться. Знаю 1 баг на хнс карте, где можно наклонять камеру как угодно. Если надо будет, залью скрины.
Тём более плагин реалистичной смерти наклоняет камеру на 90 градусов, что не является “слегка наклонить” 🙂