mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-24 05:11:08 +00:00
Send Lua commands with a netid for name instead of string
This commit is contained in:
parent
bff6b19056
commit
540ea1daf8
3 changed files with 60 additions and 8 deletions
|
@ -298,6 +298,7 @@ typedef struct xcommand_s
|
||||||
} xcommand_t;
|
} xcommand_t;
|
||||||
|
|
||||||
static xcommand_t *com_commands = NULL; // current commands
|
static xcommand_t *com_commands = NULL; // current commands
|
||||||
|
static UINT16 com_last_netid = 1;
|
||||||
|
|
||||||
#define MAX_ARGS 80
|
#define MAX_ARGS 80
|
||||||
static size_t com_argc;
|
static size_t com_argc;
|
||||||
|
@ -499,6 +500,18 @@ void COM_AddCommand(const char *name, com_func_t func)
|
||||||
com_commands = cmd;
|
com_commands = cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Allocates a new netid for commands. Only applicable for Lua commands.
|
||||||
|
*
|
||||||
|
* \return The new netid, or zero if we ran out.
|
||||||
|
*/
|
||||||
|
UINT16 COM_NewNetID(void)
|
||||||
|
{
|
||||||
|
if (com_last_netid > 0)
|
||||||
|
return ++com_last_netid;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** Adds a console command for Lua.
|
/** Adds a console command for Lua.
|
||||||
* No I_Errors allowed; return a negative code instead.
|
* No I_Errors allowed; return a negative code instead.
|
||||||
*
|
*
|
||||||
|
|
|
@ -36,6 +36,8 @@ enum
|
||||||
|
|
||||||
typedef void (*com_func_t)(void);
|
typedef void (*com_func_t)(void);
|
||||||
|
|
||||||
|
UINT16 COM_NewNetID(void);
|
||||||
|
|
||||||
void COM_AddCommand(const char *name, com_func_t func);
|
void COM_AddCommand(const char *name, com_func_t func);
|
||||||
int COM_AddLuaCommand(const char *name);
|
int COM_AddLuaCommand(const char *name);
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ static const char *cvname = NULL;
|
||||||
void Got_Luacmd(UINT8 **cp, INT32 playernum)
|
void Got_Luacmd(UINT8 **cp, INT32 playernum)
|
||||||
{
|
{
|
||||||
UINT8 i, argc, flags;
|
UINT8 i, argc, flags;
|
||||||
|
UINT16 netid;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
// don't use I_Assert here, goto the deny code below
|
// don't use I_Assert here, goto the deny code below
|
||||||
|
@ -43,10 +44,9 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum)
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "COM_Command"); // push COM_Command
|
lua_getfield(gL, LUA_REGISTRYINDEX, "COM_Command"); // push COM_Command
|
||||||
if (!lua_istable(gL, -1)) goto deny;
|
if (!lua_istable(gL, -1)) goto deny;
|
||||||
|
|
||||||
|
netid = READUINT16(*cp);
|
||||||
argc = READUINT8(*cp);
|
argc = READUINT8(*cp);
|
||||||
READSTRINGN(*cp, buf, 255);
|
lua_rawgeti(gL, -1, netid); // push command info table
|
||||||
strlwr(buf); // must lowercase buffer
|
|
||||||
lua_getfield(gL, -1, buf); // push command info table
|
|
||||||
if (!lua_istable(gL, -1)) goto deny;
|
if (!lua_istable(gL, -1)) goto deny;
|
||||||
|
|
||||||
lua_remove(gL, -2); // pop COM_Command
|
lua_remove(gL, -2); // pop COM_Command
|
||||||
|
@ -129,6 +129,12 @@ void COM_Lua_f(void)
|
||||||
if (netgame && !( flags & COM_LOCAL ))/* don't send local commands */
|
if (netgame && !( flags & COM_LOCAL ))/* don't send local commands */
|
||||||
{ // Send the command through the network
|
{ // Send the command through the network
|
||||||
UINT8 argc;
|
UINT8 argc;
|
||||||
|
UINT16 netid;
|
||||||
|
|
||||||
|
lua_rawgeti(gL, -1, 3); // push netid from command info table
|
||||||
|
netid = lua_tonumber(gL, -1);
|
||||||
|
lua_pop(gL, -1); // pop netid
|
||||||
|
|
||||||
lua_pop(gL, 1); // pop command info table
|
lua_pop(gL, 1); // pop command info table
|
||||||
|
|
||||||
if (flags & COM_ADMIN && !server && !IsPlayerAdmin(playernum)) // flag 1: only server/admin can use this command.
|
if (flags & COM_ADMIN && !server && !IsPlayerAdmin(playernum)) // flag 1: only server/admin can use this command.
|
||||||
|
@ -144,12 +150,13 @@ void COM_Lua_f(void)
|
||||||
if (argc == UINT8_MAX)
|
if (argc == UINT8_MAX)
|
||||||
len = UINT16_MAX;
|
len = UINT16_MAX;
|
||||||
else
|
else
|
||||||
len = (argc+1)*256;
|
len = (argc)*256;
|
||||||
|
|
||||||
buf = malloc(len);
|
buf = malloc(sizeof (UINT16) + len);
|
||||||
p = buf;
|
p = buf;
|
||||||
|
WRITEUINT16(p, netid);
|
||||||
WRITEUINT8(p, argc);
|
WRITEUINT8(p, argc);
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 1; i < argc; i++)
|
||||||
WRITESTRINGN(p, COM_Argv(i), 255);
|
WRITESTRINGN(p, COM_Argv(i), 255);
|
||||||
if (flags & COM_SPLITSCREEN)
|
if (flags & COM_SPLITSCREEN)
|
||||||
SendNetXCmd2(XD_LUACMD, buf, p-buf);
|
SendNetXCmd2(XD_LUACMD, buf, p-buf);
|
||||||
|
@ -176,6 +183,8 @@ static int lib_comAddCommand(lua_State *L)
|
||||||
int com_return = -1;
|
int com_return = -1;
|
||||||
const char *luaname = luaL_checkstring(L, 1);
|
const char *luaname = luaL_checkstring(L, 1);
|
||||||
|
|
||||||
|
UINT16 netid;
|
||||||
|
|
||||||
// must store in all lowercase
|
// must store in all lowercase
|
||||||
char *name = Z_StrDup(luaname);
|
char *name = Z_StrDup(luaname);
|
||||||
strlwr(name);
|
strlwr(name);
|
||||||
|
@ -202,16 +211,44 @@ static int lib_comAddCommand(lua_State *L)
|
||||||
lua_pushinteger(L, 0);
|
lua_pushinteger(L, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!( lua_tonumber(L, 3) & COM_LOCAL ))
|
||||||
|
{
|
||||||
|
netid = COM_NewNetID();
|
||||||
|
|
||||||
|
if (! netid)
|
||||||
|
{ // no more netids -- free the lowercased name and return error
|
||||||
|
Z_Free(name);
|
||||||
|
return luaL_error(L,
|
||||||
|
"Couldn't add a new console command \"%s\", too many", luaname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
netid = 0;
|
||||||
|
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, "COM_Command");
|
lua_getfield(L, LUA_REGISTRYINDEX, "COM_Command");
|
||||||
I_Assert(lua_istable(L, -1));
|
I_Assert(lua_istable(L, -1));
|
||||||
|
|
||||||
lua_createtable(L, 2, 0);
|
lua_createtable(L, ( (netid > 0) ? 3 : 2 ), 0);
|
||||||
lua_pushvalue(L, 2);
|
lua_pushvalue(L, 2);
|
||||||
lua_rawseti(L, -2, 1);
|
lua_rawseti(L, -2, 1);
|
||||||
|
|
||||||
lua_pushvalue(L, 3);
|
lua_pushvalue(L, 3);
|
||||||
lua_rawseti(L, -2, 2);
|
lua_rawseti(L, -2, 2);
|
||||||
lua_setfield(L, -2, name);
|
|
||||||
|
if (netid > 0)
|
||||||
|
{
|
||||||
|
lua_pushnumber(L, netid);
|
||||||
|
lua_rawseti(L, -2, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netid > 0)
|
||||||
|
{
|
||||||
|
lua_pushvalue(L, -1);/* push the table again to reference it :V */
|
||||||
|
lua_setfield(L, -3, name);
|
||||||
|
lua_rawseti(L, -2, netid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lua_setfield(L, -2, name);
|
||||||
|
|
||||||
// Try to add the Lua command
|
// Try to add the Lua command
|
||||||
com_return = COM_AddLuaCommand(name);
|
com_return = COM_AddLuaCommand(name);
|
||||||
|
|
Loading…
Reference in a new issue