Files
DevilutionX/Source/lua/modules/player.cpp
T
Gleb Mazovetskiy 17e6da40f8 Lua: Improve function/property handling
1. Follows advice from
   https://sol2.readthedocs.io/en/latest/functions.html to use
   `set_function` when binding functions.
2. Adds autocomplete support for userdata methods.
3. Simplifies property bindings and improves string handling.
2025-07-20 17:46:35 +02:00

52 lines
1.5 KiB
C++

#include "lua/modules/player.hpp"
#include <optional>
#include <sol/sol.hpp>
#include "engine/point.hpp"
#include "lua/metadoc.hpp"
#include "player.h"
namespace devilution {
namespace {
void InitPlayerUserType(sol::state_view &lua)
{
sol::usertype<Player> playerType = lua.new_usertype<Player>(sol::no_constructor);
LuaSetDocReadonlyProperty(playerType, "name", "string",
"Player's name (readonly)",
&Player::name);
LuaSetDocFn(playerType, "addExperience", "(experience: integer, monsterLevel: integer = nil)",
"Adds experience to this player based on the current game mode",
[](Player &player, uint32_t experience, std::optional<int> monsterLevel) {
if (monsterLevel.has_value()) {
player.addExperience(experience, *monsterLevel);
} else {
player.addExperience(experience);
}
});
LuaSetDocProperty(playerType, "characterLevel", "number",
"Character level (writeable)",
&Player::getCharacterLevel, &Player::setCharacterLevel);
}
} // namespace
sol::table LuaPlayerModule(sol::state_view &lua)
{
InitPlayerUserType(lua);
sol::table table = lua.create_table();
LuaSetDocFn(table, "self", "()",
"The current player",
[]() {
return MyPlayer;
});
LuaSetDocFn(table, "walk_to", "(x: integer, y: integer)",
"Walk to the given coordinates",
[](int x, int y) {
NetSendCmdLoc(MyPlayerId, true, CMD_WALKXY, Point { x, y });
});
return table;
}
} // namespace devilution