Cleanup
This commit is contained in:
parent
fb615f8261
commit
ea5e02b43b
@ -428,14 +428,12 @@ namespace scripting::lua
|
||||
|
||||
entity_type["struct"] = sol::property([](const entity& entity, const sol::this_state s)
|
||||
{
|
||||
const auto id = entity.get_entity_id();
|
||||
return scripting::lua::entity_to_struct(s, id);
|
||||
return entity;
|
||||
});
|
||||
|
||||
entity_type["getstruct"] = [](const entity& entity, const sol::this_state s)
|
||||
{
|
||||
const auto id = entity.get_entity_id();
|
||||
return scripting::lua::entity_to_struct(s, id);
|
||||
return entity;
|
||||
};
|
||||
|
||||
entity_type["scriptcall"] = [](const entity& entity, const sol::this_state s, const std::string& filename,
|
||||
|
@ -8,110 +8,6 @@ namespace scripting::lua
|
||||
{
|
||||
namespace
|
||||
{
|
||||
struct array_value
|
||||
{
|
||||
int index;
|
||||
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 = 0xA000 * (id & 3);
|
||||
|
||||
auto current = game::scr_VarGlob->objectVariableChildren[id].firstChild;
|
||||
auto idx = 1;
|
||||
|
||||
for (auto i = offset + current; current; i = offset + current)
|
||||
{
|
||||
const auto var = game::scr_VarGlob->childVariableValue[i];
|
||||
|
||||
if (var.type == game::SCRIPT_NONE)
|
||||
{
|
||||
current = var.nextSibling;
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto string_value = (game::scr_string_t)((unsigned __int8)var.name_lo + (var.k.keys.name_hi << 8));
|
||||
const auto* str = game::SL_ConvertToString(string_value);
|
||||
|
||||
std::string key = string_value < 0x40000 && str
|
||||
? str
|
||||
: std::to_string(idx++);
|
||||
|
||||
game::VariableValue variable{};
|
||||
variable.type = var.type;
|
||||
variable.u = var.u.u;
|
||||
|
||||
array_value value;
|
||||
value.index = i;
|
||||
value.value = variable;
|
||||
|
||||
values[key] = value;
|
||||
|
||||
current = var.nextSibling;
|
||||
}
|
||||
|
||||
table["getkeys"] = [values]()
|
||||
{
|
||||
std::vector<std::string> _keys;
|
||||
|
||||
for (const auto& entry : values)
|
||||
{
|
||||
_keys.push_back(entry.first);
|
||||
}
|
||||
|
||||
return _keys;
|
||||
};
|
||||
|
||||
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>()
|
||||
? std::to_string(key_value.as<int>())
|
||||
: key_value.as<std::string>();
|
||||
|
||||
if (values.find(key) == values.end())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
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] = [values](const sol::table t, const sol::this_state s,
|
||||
const sol::lua_value& key_value)
|
||||
{
|
||||
const auto key = key_value.is<int>()
|
||||
? std::to_string(key_value.as<int>())
|
||||
: key_value.as<std::string>();
|
||||
|
||||
if (values.find(key) == values.end())
|
||||
{
|
||||
return sol::lua_value{s, sol::lua_nil};
|
||||
}
|
||||
|
||||
return convert(s, values.at(key).value);
|
||||
};
|
||||
|
||||
metatable[sol::meta_function::length] = [values]()
|
||||
{
|
||||
return values.size();
|
||||
};
|
||||
|
||||
table[sol::metatable_key] = metatable;
|
||||
|
||||
return {state, table};
|
||||
}
|
||||
|
||||
bool is_istring(const sol::lua_value& value)
|
||||
{
|
||||
if (!value.is<std::string>())
|
||||
@ -170,50 +66,6 @@ namespace scripting::lua
|
||||
}
|
||||
}
|
||||
|
||||
sol::lua_value entity_to_struct(lua_State* state, unsigned int parent_id)
|
||||
{
|
||||
auto table = sol::table::create(state);
|
||||
auto metatable = sol::table::create(state);
|
||||
|
||||
table["getentity"] = [parent_id]()
|
||||
{
|
||||
return entity(parent_id);
|
||||
};
|
||||
|
||||
metatable[sol::meta_function::new_index] = [parent_id](const sol::table t, const sol::this_state s,
|
||||
const sol::lua_value& field, const sol::lua_value& value)
|
||||
{
|
||||
const auto new_variable = convert({s, value});
|
||||
if (field.is<unsigned int>())
|
||||
{
|
||||
scripting::set_object_variable(parent_id, field.as<unsigned int>(), new_variable);
|
||||
}
|
||||
else if (field.is<std::string>())
|
||||
{
|
||||
scripting::set_object_variable(parent_id, field.as<std::string>(), new_variable);
|
||||
}
|
||||
};
|
||||
|
||||
metatable[sol::meta_function::index] = [parent_id](const sol::table t, const sol::this_state s,
|
||||
const sol::lua_value& field)
|
||||
{
|
||||
if (field.is<unsigned int>())
|
||||
{
|
||||
return convert(s, scripting::get_object_variable(parent_id, field.as<unsigned int>()));
|
||||
}
|
||||
else if (field.is<std::string>())
|
||||
{
|
||||
return convert(s, scripting::get_object_variable(parent_id, field.as<std::string>()));
|
||||
}
|
||||
|
||||
return sol::lua_value{s, sol::lua_nil};
|
||||
};
|
||||
|
||||
table[sol::metatable_key] = metatable;
|
||||
|
||||
return {state, table};
|
||||
}
|
||||
|
||||
script_value convert(const sol::lua_value& value)
|
||||
{
|
||||
if (value.is<int>())
|
||||
|
@ -4,8 +4,6 @@
|
||||
|
||||
namespace scripting::lua
|
||||
{
|
||||
sol::lua_value entity_to_struct(lua_State* state, unsigned int parent_id);
|
||||
|
||||
script_value convert(const sol::lua_value& value);
|
||||
sol::lua_value convert(lua_State* state, const script_value& value);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user