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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
//
//
#include "mc_info.h"
#include "model.h"
#include "vecmath.h"
namespace scripting {
namespace api {
mc_info_h::mc_info_h(const mc_info& val) : info(val), valid(true) {}
mc_info_h::mc_info_h() = default;
mc_info* mc_info_h::Get() { return &info; }
bool mc_info_h::isValid() const { return valid; }
//**********HANDLE: Collision info
ADE_OBJ(l_ColInfo, mc_info_h, "collision_info", "Information about a collision");
ADE_VIRTVAR(Model, l_ColInfo, "model", "The model this collision info is about", "model", "The model, or an invalid model if the handle is not valid")
{
mc_info_h* info;
model_h * mh = nullptr;
if(!ade_get_args(L, "o|o", l_ColInfo.GetPtr(&info), l_Model.GetPtr(&mh)))
return ade_set_error(L, "o", l_Model.Set(model_h()));
if (!info->isValid())
return ade_set_error(L, "o", l_Model.Set(model_h()));
mc_info *collide = info->Get();
int modelNum = collide->model_num;
if (ADE_SETTING_VAR && mh)
{
if (mh->isValid())
{
collide->model_num = mh->GetID();
}
}
return ade_set_args(L, "o", l_Model.Set(model_h(modelNum)));
}
ADE_FUNC(getCollisionSubmodel, l_ColInfo, nullptr, "The submodel where the collision occurred, if applicable", "submodel", "The submodel, or nil if none or if the handle is not valid")
{
mc_info_h *info;
submodel_h *sh = nullptr;
if (!ade_get_args(L, "o|o", l_ColInfo.GetPtr(&info), l_Submodel.GetPtr(&sh)))
return ADE_RETURN_NIL;
if (!info->isValid())
return ADE_RETURN_NIL;
mc_info *collide = info->Get();
if (collide->hit_submodel < 0)
return ADE_RETURN_NIL;
return ade_set_args(L, "o", l_Submodel.Set(submodel_h(collide->model_num, collide->hit_submodel)));
}
ADE_FUNC(getCollisionDistance, l_ColInfo, NULL, "The distance to the closest collision point", "number", "distance or -1 on error")
{
mc_info_h* info;
if(!ade_get_args(L, "o", l_ColInfo.GetPtr(&info)))
return ade_set_error(L, "f", -1.0f);
if (!info->isValid())
return ade_set_error(L, "f", -1.0f);
mc_info *collide = info->Get();
if (collide->num_hits <= 0)
{
return ade_set_args(L, "f", -1.0f);;
}
else
{
return ade_set_args(L, "f", collide->hit_dist);
}
}
ADE_FUNC(getCollisionPoint, l_ColInfo, "[boolean local]", "The collision point of this information (local to the object if boolean is set to <i>true</i>)", "vector", "The collision point, or nil if none or if the handle is not valid")
{
mc_info_h* info;
bool local = false;
if(!ade_get_args(L, "o|b", l_ColInfo.GetPtr(&info), &local))
return ADE_RETURN_NIL;
if (!info->isValid())
return ADE_RETURN_NIL;
mc_info *collide = info->Get();
if (collide->num_hits <= 0)
{
return ADE_RETURN_NIL;
}
else
{
if (local)
return ade_set_args(L, "o", l_Vector.Set(collide->hit_point));
else
return ade_set_args(L, "o", l_Vector.Set(collide->hit_point_world));
}
}
ADE_FUNC(getCollisionNormal, l_ColInfo, "[boolean local]", "The collision normal of this information (local to object if boolean is set to <i>true</i>)", "vector", "The collision normal, or nil if none or if the handle is not valid")
{
mc_info_h* info;
bool local = false;
if(!ade_get_args(L, "o|b", l_ColInfo.GetPtr(&info), &local))
return ADE_RETURN_NIL;
if (!info->isValid())
return ADE_RETURN_NIL;
mc_info *collide = info->Get();
if (collide->num_hits <= 0)
{
return ADE_RETURN_NIL;
}
else
{
if (!local)
{
vec3d normal;
auto pmi = model_get_instance(collide->model_instance_num);
auto pm = model_get(pmi->model_num);
model_instance_local_to_global_dir(&normal, &collide->hit_normal, pm, pmi, collide->hit_submodel, collide->orient);
return ade_set_args(L, "o", l_Vector.Set(normal));
}
else
{
return ade_set_args(L, "o", l_Vector.Set(collide->hit_normal));
}
}
}
ADE_FUNC(isValid, l_ColInfo, NULL, "Detects if this handle is valid", "boolean", "true if valid false otherwise")
{
mc_info_h* info;
if(!ade_get_args(L, "o", l_ColInfo.GetPtr(&info)))
return ADE_RETURN_FALSE;
if (info->isValid())
return ADE_RETURN_TRUE;
else
return ADE_RETURN_FALSE;
}
}
}
|