mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-01-13 21:31:32 +00:00
Starting work for getting sector.lines in Lua: it WORKS at the least, but I have no way to determine the size of the array itself as of yet
This commit is contained in:
parent
9422ca4427
commit
b564a169d8
2 changed files with 54 additions and 0 deletions
|
@ -42,6 +42,7 @@ extern lua_State *gL;
|
|||
|
||||
#define META_CVAR "CONSVAR_T*"
|
||||
|
||||
#define META_SECTORLINES "SECTOR_T*LINES"
|
||||
#define META_SIDENUM "LINE_T*SIDENUM"
|
||||
|
||||
#define META_HUDINFO "HUDINFO_T*"
|
||||
|
|
|
@ -37,6 +37,7 @@ enum sector_e {
|
|||
sector_thinglist,
|
||||
sector_heightsec,
|
||||
sector_camsec,
|
||||
sector_lines,
|
||||
sector_ffloors
|
||||
};
|
||||
|
||||
|
@ -52,6 +53,7 @@ static const char *const sector_opt[] = {
|
|||
"thinglist",
|
||||
"heightsec",
|
||||
"camsec",
|
||||
"lines",
|
||||
"ffloors",
|
||||
NULL};
|
||||
|
||||
|
@ -260,6 +262,49 @@ static int sector_iterate(lua_State *L)
|
|||
return 3;
|
||||
}
|
||||
|
||||
// sector.lines, i -> sector.lines[i]
|
||||
// sector.lines.valid, for validity checking
|
||||
static int sectorlines_get(lua_State *L)
|
||||
{
|
||||
line_t **seclines = *((line_t ***)luaL_checkudata(L, 1, META_SECTORLINES));
|
||||
size_t i;
|
||||
//size_t numoflines;
|
||||
lua_settop(L, 2);
|
||||
if (!lua_isnumber(L, 2))
|
||||
{
|
||||
int field = luaL_checkoption(L, 2, NULL, valid_opt);
|
||||
if (!seclines)
|
||||
{
|
||||
if (field == 0) {
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
return luaL_error(L, "accessed sector_t doesn't exist anymore.");
|
||||
} else if (field == 0) {
|
||||
lua_pushboolean(L, 1);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* \TODO: figure out how to find size of seclines array, rather than the size of a pointer!
|
||||
Testing for sectors[0].lines in GFZ1 with a test Lua script:
|
||||
sizeof(seclines) returns 4
|
||||
sizeof(*seclines) returns 4
|
||||
sizeof(**seclines) returns 84, presumably the size of line_t
|
||||
You can probably see why I haven't been successful yet, hopefully
|
||||
//CONS_Printf("sizeof(seclines): %d\n", sizeof(seclines));
|
||||
//CONS_Printf("sizeof(seclines[0]): %d\n", sizeof(seclines[0]));*/
|
||||
|
||||
/*numoflines = sizeof(seclines) / sizeof(seclines[0]);
|
||||
if (!numoflines)
|
||||
return luaL_error(L, "no lines found!");*/
|
||||
i = (size_t)lua_tointeger(L, 2);
|
||||
/*if (i > numoflines)
|
||||
return 0;*/
|
||||
LUA_PushUserdata(L, seclines[i], META_LINE);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int sector_get(lua_State *L)
|
||||
{
|
||||
sector_t *sector = *((sector_t **)luaL_checkudata(L, 1, META_SECTOR));
|
||||
|
@ -325,6 +370,9 @@ static int sector_get(lua_State *L)
|
|||
return 0;
|
||||
LUA_PushUserdata(L, §ors[sector->camsec], META_SECTOR);
|
||||
return 1;
|
||||
case sector_lines: // lines
|
||||
LUA_PushUserdata(L, sector->lines, META_SECTORLINES);
|
||||
return 1;
|
||||
case sector_ffloors: // ffloors
|
||||
lua_pushcfunction(L, lib_iterateSectorFFloors);
|
||||
LUA_PushUserdata(L, sector->ffloors, META_FFLOOR);
|
||||
|
@ -1178,6 +1226,11 @@ static int mapheaderinfo_get(lua_State *L)
|
|||
|
||||
int LUA_MapLib(lua_State *L)
|
||||
{
|
||||
luaL_newmetatable(L, META_SECTORLINES);
|
||||
lua_pushcfunction(L, sectorlines_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
lua_pop(L, 1);
|
||||
|
||||
luaL_newmetatable(L, META_SECTOR);
|
||||
lua_pushcfunction(L, sector_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
|
|
Loading…
Reference in a new issue