bool from_mod = false;
int lua_reference = -1;
+ inline bool hasLuaReference() const
+ {
+ return lua_reference >= 0;
+ }
+
bool setTypeFromString(const std::string &typestr)
{
if (typestr == "set_hp")
void ScriptApiBase::pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeReason &reason)
{
- if (reason.lua_reference >= 0) {
+ if (reason.hasLuaReference())
lua_rawgeti(L, LUA_REGISTRYINDEX, reason.lua_reference);
- luaL_unref(L, LUA_REGISTRYINDEX, reason.lua_reference);
- } else
+ else
lua_newtable(L);
- lua_pushstring(L, reason.getTypeAsString().c_str());
- lua_setfield(L, -2, "type");
+ lua_getfield(L, -1, "type");
+ bool has_type = (bool)lua_isstring(L, -1);
+ lua_pop(L, 1);
+ if (!has_type) {
+ lua_pushstring(L, reason.getTypeAsString().c_str());
+ lua_setfield(L, -2, "type");
+ }
lua_pushstring(L, reason.from_mod ? "mod" : "engine");
lua_setfield(L, -2, "from");
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, reason);
+ if (reason.hasLuaReference())
+ luaL_unref(L, LUA_REGISTRYINDEX, reason.lua_reference);
+
// Return
return 0;
}