diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 8f173e32e..2fba3587e 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2205,27 +2205,64 @@ static int lib_rFrame2Char(lua_State *L) static int lib_rSetPlayerSkin(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + INT32 i = -1, j = -1; NOHUD INLEVEL if (!player) return LUA_ErrInvalid(L, "player_t"); + + j = (player-players); + if (lua_isnoneornil(L, 2)) return luaL_error(L, "argument #2 not given (expected number or string)"); else if (lua_type(L, 2) == LUA_TNUMBER) // skin number { - INT32 i = luaL_checkinteger(L, 2); - if (i < 0 || i >= MAXSKINS) - return luaL_error(L, "skin number (argument #2) %d out of range (0 - %d)", i, MAXSKINS-1); - SetPlayerSkinByNum(player-players, i); + i = luaL_checkinteger(L, 2); + if (i < 0 || i >= numskins) + return luaL_error(L, "skin %d (argument #2) out of range (0 - %d)", i, numskins-1); } else // skin name { const char *skinname = luaL_checkstring(L, 2); - SetPlayerSkin(player-players, skinname); + i = R_SkinAvailable(skinname); + if (i == -1) + return luaL_error(L, "skin %s (argument 2) is not loaded", skinname); } + + if (!R_SkinUsable(j, i)) + return luaL_error(L, "skin %d (argument 2) not usable - check with R_SkinUsable(player_t, skin) first.", i); + SetPlayerSkinByNum(j, i); return 0; } +static int lib_rSkinUsable(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + INT32 i = -1, j = -1; + if (player) + j = (player-players); + else if (netgame || multiplayer) + return luaL_error(L, "player_t (argument #1) must be provided in multiplayer games"); + if (lua_isnoneornil(L, 2)) + return luaL_error(L, "argument #2 not given (expected number or string)"); + else if (lua_type(L, 2) == LUA_TNUMBER) // skin number + { + i = luaL_checkinteger(L, 2); + if (i < 0 || i >= numskins) + return luaL_error(L, "skin %d (argument #2) out of range (0 - %d)", i, numskins-1); + } + else // skin name + { + const char *skinname = luaL_checkstring(L, 2); + i = R_SkinAvailable(skinname); + if (i == -1) + return luaL_error(L, "skin %s (argument 2) is not loaded", skinname); + } + + lua_pushboolean(L, R_SkinUsable(j, i)); + return 1; +} + // R_DATA //////////// @@ -2913,6 +2950,7 @@ static luaL_Reg lib[] = { {"R_Char2Frame",lib_rChar2Frame}, {"R_Frame2Char",lib_rFrame2Char}, {"R_SetPlayerSkin",lib_rSetPlayerSkin}, + {"R_SkinUsable",lib_rSkinUsable}, // r_data {"R_CheckTextureNumForName",lib_rCheckTextureNumForName},