Июл 302013
 

BMOD

Что такое 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

/*
Типы объектов 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)

Пример?
Как создать шар над головой игрока:

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

Извините, форма комментирования закрыта в данный момент.