fix lua crashes.

Co-Authored-By: fed <58637860+fedddddd@users.noreply.github.com>
This commit is contained in:
quaK 2021-03-15 04:33:26 +02:00
parent 993a0ce70e
commit d362a8ade3
2 changed files with 18 additions and 18 deletions

View File

@ -105,7 +105,7 @@ namespace scripting::lua
for (auto arg : va)
{
arguments.push_back(convert(arg));
arguments.push_back(convert({s, arg}));
}
return convert(s, entity.call(name, arguments));
@ -119,9 +119,9 @@ namespace scripting::lua
{
return convert(s, entity.get(constant));
},
[constant](const entity& entity, const sol::lua_value& value)
[constant](const entity& entity, const sol::this_state s, const sol::lua_value& value)
{
entity.set(constant, convert(value));
entity.set(constant, convert({s, value}));
});
}
@ -136,13 +136,14 @@ namespace scripting::lua
return convert(s, entity.get(field));
};
entity_type["notify"] = [](const entity& entity, const std::string& event, sol::variadic_args va)
entity_type["notify"] = [](const entity& entity, const sol::this_state s, const std::string& event,
sol::variadic_args va)
{
std::vector<script_value> arguments{};
for (auto arg : va)
{
arguments.push_back(convert(arg));
arguments.push_back(convert({s, arg}));
}
notify(entity, event, arguments);
@ -179,7 +180,7 @@ namespace scripting::lua
for (auto arg : va)
{
arguments.push_back(convert(arg));
arguments.push_back(convert({s, arg}));
}
return convert(s, entity.call(function, arguments));
@ -211,7 +212,7 @@ namespace scripting::lua
for (auto arg : va)
{
arguments.push_back(convert(arg));
arguments.push_back(convert({s, arg}));
}
return convert(s, call(name, arguments));
@ -225,7 +226,7 @@ namespace scripting::lua
for (auto arg : va)
{
arguments.push_back(convert(arg));
arguments.push_back(convert({s, arg}));
}
return convert(s, call(function, arguments));

View File

@ -8,18 +8,19 @@ namespace scripting::lua
struct array_value
{
int index;
sol::lua_value value{};
script_value value;
};
sol::lua_value entity_to_array(lua_State* state, unsigned int id)
{
auto table = sol::table::create(state);
auto metatable = sol::table::create(state);
std::unordered_map<std::string, array_value> values;
const auto offset = 64000 * (id & 3);
auto current = game::scr_VarGlob->objectVariableChildren[id].firstChild;
auto current = game::scr_VarGlob->objectVariableChildren[id].firstChild;
auto idx = 1;
for (auto i = offset + current; current; i = offset + current)
@ -45,7 +46,7 @@ namespace scripting::lua
array_value value;
value.index = i;
value.value = convert(state, script_value(variable));
value.value = variable;
values[key] = value;
@ -64,9 +65,7 @@ namespace scripting::lua
return _keys;
};
auto metatable = sol::table::create(state);
metatable[sol::meta_function::new_index] = [state, values](const sol::table t, const sol::this_state s,
metatable[sol::meta_function::new_index] = [values](const sol::table t, const sol::this_state s,
const sol::lua_value& key_value, const sol::lua_value& value)
{
const auto key = key_value.is<int>()
@ -78,14 +77,14 @@ namespace scripting::lua
return;
}
const auto variable = convert(value).get_raw();
const auto variable = convert({s, value}).get_raw();
const auto i = values.at(key).index;
game::scr_VarGlob->childVariableValue[i].type = (char)variable.type;
game::scr_VarGlob->childVariableValue[i].u.u = variable.u;
};
metatable[sol::meta_function::index] = [state, values](const sol::table t, const sol::this_state s,
metatable[sol::meta_function::index] = [values](const sol::table t, const sol::this_state s,
const sol::lua_value& key_value)
{
const auto key = key_value.is<int>()
@ -97,7 +96,7 @@ namespace scripting::lua
return sol::lua_value{};
}
return values.at(key).value;
return convert(s, values.at(key).value);
};
metatable[sol::meta_function::length] = [values]()
@ -107,7 +106,7 @@ namespace scripting::lua
table[sol::metatable_key] = metatable;
return table;
return { state, table };
}
}