mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-18 07:22:28 +00:00
Added userdataType(userdata) function to Lua!
This new function returns a string representing the type of userdata the variable given (e.g. mobj_t, player_t), it even works on "minor" userdata types (player_t.powers, skin_t.soundsid, sector_t.lines, etc)
This commit is contained in:
parent
2ac3f68438
commit
1b542c6501
1 changed files with 166 additions and 0 deletions
|
@ -87,6 +87,171 @@ static int lib_print(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
UTYPE_NULL=0,
|
||||||
|
UTYPE_STATE,
|
||||||
|
UTYPE_MOBJINFO,
|
||||||
|
UTYPE_SFXINFO,
|
||||||
|
|
||||||
|
UTYPE_MOBJ,
|
||||||
|
UTYPE_MAPTHING,
|
||||||
|
|
||||||
|
UTYPE_PLAYER,
|
||||||
|
UTYPE_TICCMD,
|
||||||
|
UTYPE_SKIN,
|
||||||
|
UTYPE_POWERS,
|
||||||
|
UTYPE_SOUNDSID,
|
||||||
|
|
||||||
|
UTYPE_VERTEX,
|
||||||
|
UTYPE_LINE,
|
||||||
|
UTYPE_SIDE,
|
||||||
|
UTYPE_SUBSECTOR,
|
||||||
|
UTYPE_SECTOR,
|
||||||
|
UTYPE_FFLOOR,
|
||||||
|
#ifdef HAVE_LUA_SEGS
|
||||||
|
UTYPE_SEG,
|
||||||
|
UTYPE_NODE,
|
||||||
|
#endif
|
||||||
|
UTYPE_MAPHEADER,
|
||||||
|
|
||||||
|
UTYPE_CVAR,
|
||||||
|
|
||||||
|
UTYPE_SECTORLINES,
|
||||||
|
UTYPE_SIDENUM,
|
||||||
|
#ifdef HAVE_LUA_SEGS
|
||||||
|
UTYPE_NODEBBOX,
|
||||||
|
UTYPE_NODECHILDREN,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
UTYPE_BBOX,
|
||||||
|
|
||||||
|
UTYPE_HUDINFO,
|
||||||
|
UTYPE_PATCH,
|
||||||
|
UTYPE_COLORMAP,
|
||||||
|
UTYPE_CAMERA,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define META_UTYPE(name) {META_##name, UTYPE_##name}
|
||||||
|
static const struct {
|
||||||
|
const char *meta;
|
||||||
|
UINT8 utype;
|
||||||
|
} meta2utype[] = {
|
||||||
|
META_UTYPE(STATE),
|
||||||
|
META_UTYPE(MOBJINFO),
|
||||||
|
META_UTYPE(SFXINFO),
|
||||||
|
|
||||||
|
META_UTYPE(MOBJ),
|
||||||
|
META_UTYPE(MAPTHING),
|
||||||
|
|
||||||
|
META_UTYPE(PLAYER),
|
||||||
|
META_UTYPE(TICCMD),
|
||||||
|
META_UTYPE(SKIN),
|
||||||
|
META_UTYPE(POWERS),
|
||||||
|
META_UTYPE(SOUNDSID),
|
||||||
|
|
||||||
|
META_UTYPE(VERTEX),
|
||||||
|
META_UTYPE(LINE),
|
||||||
|
META_UTYPE(SIDE),
|
||||||
|
META_UTYPE(SUBSECTOR),
|
||||||
|
META_UTYPE(SECTOR),
|
||||||
|
META_UTYPE(FFLOOR),
|
||||||
|
#ifdef HAVE_LUA_SEGS
|
||||||
|
META_UTYPE(SEG),
|
||||||
|
META_UTYPE(NODE),
|
||||||
|
#endif
|
||||||
|
META_UTYPE(MAPHEADER),
|
||||||
|
|
||||||
|
META_UTYPE(CVAR),
|
||||||
|
|
||||||
|
META_UTYPE(SECTORLINES),
|
||||||
|
META_UTYPE(SIDENUM),
|
||||||
|
#ifdef HAVE_LUA_SEGS
|
||||||
|
META_UTYPE(NODEBBOX),
|
||||||
|
META_UTYPE(NODECHILDREN),
|
||||||
|
#endif
|
||||||
|
|
||||||
|
META_UTYPE(BBOX),
|
||||||
|
|
||||||
|
META_UTYPE(HUDINFO),
|
||||||
|
META_UTYPE(PATCH),
|
||||||
|
META_UTYPE(COLORMAP),
|
||||||
|
META_UTYPE(CAMERA),
|
||||||
|
{NULL, UTYPE_NULL}
|
||||||
|
};
|
||||||
|
#undef META_UTYPE
|
||||||
|
|
||||||
|
static UINT8 GetUserdataUType(lua_State *L)
|
||||||
|
{
|
||||||
|
UINT8 i;
|
||||||
|
lua_getmetatable(L, -1);
|
||||||
|
|
||||||
|
for (i = 0; meta2utype[i].meta; i++)
|
||||||
|
{
|
||||||
|
luaL_getmetatable(L, meta2utype[i].meta);
|
||||||
|
if (lua_rawequal(L, -1, -2))
|
||||||
|
{
|
||||||
|
lua_pop(L, 2);
|
||||||
|
return meta2utype[i].utype;
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return UTYPE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int lib_userdataType(lua_State *L)
|
||||||
|
{
|
||||||
|
lua_settop(L, 1); // pop everything except arg 1 (in case somebody decided to add more)
|
||||||
|
luaL_checktype(L, 1, LUA_TUSERDATA);
|
||||||
|
switch (GetUserdataUType(L))
|
||||||
|
{
|
||||||
|
case UTYPE_STATE: lua_pushliteral(L, "state_t"); break;
|
||||||
|
case UTYPE_MOBJINFO: lua_pushliteral(L, "mobjinfo_t"); break;
|
||||||
|
case UTYPE_SFXINFO: lua_pushliteral(L, "sfxinfo_t"); break;
|
||||||
|
|
||||||
|
case UTYPE_MOBJ: lua_pushliteral(L, "mobj_t"); break;
|
||||||
|
case UTYPE_MAPTHING: lua_pushliteral(L, "mapthing_t"); break;
|
||||||
|
|
||||||
|
case UTYPE_PLAYER: lua_pushliteral(L, "player_t"); break;
|
||||||
|
case UTYPE_TICCMD: lua_pushliteral(L, "ticcmd_t"); break;
|
||||||
|
case UTYPE_SKIN: lua_pushliteral(L, "skin_t"); break;
|
||||||
|
case UTYPE_POWERS: lua_pushliteral(L, "player_t.powers"); break;
|
||||||
|
case UTYPE_SOUNDSID: lua_pushliteral(L, "skin_t.soundsid"); break;
|
||||||
|
|
||||||
|
case UTYPE_VERTEX: lua_pushliteral(L, "vertex_t"); break;
|
||||||
|
case UTYPE_LINE: lua_pushliteral(L, "line_t"); break;
|
||||||
|
case UTYPE_SIDE: lua_pushliteral(L, "side_t"); break;
|
||||||
|
case UTYPE_SUBSECTOR: lua_pushliteral(L, "subsector_t"); break;
|
||||||
|
case UTYPE_SECTOR: lua_pushliteral(L, "sector_t"); break;
|
||||||
|
case UTYPE_FFLOOR: lua_pushliteral(L, "ffloor_t"); break;
|
||||||
|
#ifdef HAVE_LUA_SEGS
|
||||||
|
case UTYPE_SEG: lua_pushliteral(L, "seg_t"); break;
|
||||||
|
case UTYPE_NODE: lua_pushliteral(L, "node_t"); break;
|
||||||
|
#endif
|
||||||
|
case UTYPE_MAPHEADER: lua_pushliteral(L, "mapheader_t"); break;
|
||||||
|
|
||||||
|
case UTYPE_CVAR: lua_pushliteral(L, "cvar_t"); break;
|
||||||
|
|
||||||
|
case UTYPE_SECTORLINES: lua_pushliteral(L, "sector_t.lines"); break;
|
||||||
|
case UTYPE_SIDENUM: lua_pushliteral(L, "line_t.sidenum"); break;
|
||||||
|
#ifdef HAVE_LUA_SEGS
|
||||||
|
case UTYPE_NODEBBOX: lua_pushliteral(L, "node_t.bbox"); break;
|
||||||
|
case UTYPE_NODECHILDREN: lua_pushliteral(L, "node_t.children"); break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case UTYPE_BBOX: lua_pushliteral(L, "bbox"); break;
|
||||||
|
|
||||||
|
case UTYPE_HUDINFO: lua_pushliteral(L, "hudinfo_t"); break;
|
||||||
|
case UTYPE_PATCH: lua_pushliteral(L, "patch_t"); break;
|
||||||
|
case UTYPE_COLORMAP: lua_pushliteral(L, "colormap"); break;
|
||||||
|
case UTYPE_CAMERA: lua_pushliteral(L, "camera_t"); break;
|
||||||
|
default: return luaL_error(L, "Unknown userdata type");
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// M_RANDOM
|
// M_RANDOM
|
||||||
//////////////
|
//////////////
|
||||||
|
|
||||||
|
@ -2190,6 +2355,7 @@ static int lib_gTicsToMilliseconds(lua_State *L)
|
||||||
|
|
||||||
static luaL_Reg lib[] = {
|
static luaL_Reg lib[] = {
|
||||||
{"print", lib_print},
|
{"print", lib_print},
|
||||||
|
{"userdataType", lib_userdataType},
|
||||||
|
|
||||||
// m_random
|
// m_random
|
||||||
{"P_RandomFixed",lib_pRandomFixed},
|
{"P_RandomFixed",lib_pRandomFixed},
|
||||||
|
|
Loading…
Reference in a new issue