Various features and fixes

This commit is contained in:
sfan5 2020-04-11 00:09:11 +02:00 committed by Loïc Blot
parent 5f3a17eb65
commit 1292bdbbce
5 changed files with 123 additions and 69 deletions

@ -31,6 +31,7 @@ core.after(4, function()
end) end)
core.after(1, function() core.after(1, function()
print("armor: " .. dump(core.localplayer:get_armor_groups()))
id = core.localplayer:hud_add({ id = core.localplayer:hud_add({
hud_elem_type = "text", hud_elem_type = "text",
name = "example", name = "example",
@ -125,19 +126,6 @@ core.register_chatcommand("dump", {
end, end,
}) })
core.register_chatcommand("colorize_test", {
func = function(param)
return true, core.colorize("red", param)
end,
})
core.register_chatcommand("test_node", {
func = function(param)
core.display_chat_message(dump(core.get_node({x=0, y=0, z=0})))
core.display_chat_message(dump(core.get_node_or_nil({x=0, y=0, z=0})))
end,
})
local function preview_minimap() local function preview_minimap()
local minimap = core.ui.minimap local minimap = core.ui.minimap
if not minimap then if not minimap then
@ -157,7 +145,7 @@ end
core.after(2, function() core.after(2, function()
print("[PREVIEW] loaded " .. modname .. " mod") print("[PREVIEW] loaded " .. modname .. " mod")
modstorage:set_string("current_mod", modname) modstorage:set_string("current_mod", modname)
print(modstorage:get_string("current_mod")) assert(modstorage:get_string("current_mod") == modname)
preview_minimap() preview_minimap()
end) end)
@ -184,30 +172,12 @@ end)
core.register_on_punchnode(function(pos, node) core.register_on_punchnode(function(pos, node)
print("The local player punched a node!") print("The local player punched a node!")
local itemstack = core.get_wielded_item() local itemstack = core.localplayer:get_wielded_item()
--[[
-- getters
print(dump(itemstack:is_empty()))
print(dump(itemstack:get_name()))
print(dump(itemstack:get_count()))
print(dump(itemstack:get_wear()))
print(dump(itemstack:get_meta()))
print(dump(itemstack:get_metadata()
print(dump(itemstack:is_known()))
--print(dump(itemstack:get_definition()))
print(dump(itemstack:get_tool_capabilities()))
print(dump(itemstack:to_string()))
print(dump(itemstack:to_table()))
-- setters
print(dump(itemstack:set_name("default:dirt")))
print(dump(itemstack:set_count("95")))
print(dump(itemstack:set_wear(934)))
print(dump(itemstack:get_meta()))
print(dump(itemstack:get_metadata()))
--]]
print(dump(itemstack:to_table())) print(dump(itemstack:to_table()))
print("pos:" .. dump(pos)) print("pos:" .. dump(pos))
print("node:" .. dump(node)) print("node:" .. dump(node))
local meta = core.get_meta(pos)
print("punched meta: " .. (meta and dump(meta:to_table()) or "(missing)"))
return false return false
end) end)

@ -804,8 +804,6 @@ Call these functions only at load time!
* get max available level for leveled node * get max available level for leveled node
### Player ### Player
* `minetest.get_wielded_item()`
* Returns the itemstack the local player is holding
* `minetest.send_chat_message(message)` * `minetest.send_chat_message(message)`
* Act as if `message` was typed by the player into the terminal. * Act as if `message` was typed by the player into the terminal.
* `minetest.run_server_chatcommand(cmd, param)` * `minetest.run_server_chatcommand(cmd, param)`
@ -1006,6 +1004,10 @@ Methods:
* returns player HP * returns player HP
* `get_name()` * `get_name()`
* returns player name * returns player name
* `get_wield_index()`
* returns the index of the wielded item
* `get_wielded_item()`
* returns the itemstack the player is holding
* `is_attached()` * `is_attached()`
* returns true if player is attached * returns true if player is attached
* `is_touching_ground()` * `is_touching_ground()`
@ -1029,7 +1031,8 @@ Methods:
jump = float, jump = float,
gravity = float, gravity = float,
sneak = boolean, sneak = boolean,
sneak_glitch = boolean sneak_glitch = boolean,
new_move = boolean,
} }
``` ```
@ -1081,8 +1084,26 @@ Methods:
* returns last look horizontal angle * returns last look horizontal angle
* `get_last_look_vertical()`: * `get_last_look_vertical()`:
* returns last look vertical angle * returns last look vertical angle
* `get_key_pressed()`: * `get_control()`:
* returns last key typed by the player * returns pressed player controls
```lua
{
up = boolean,
down = boolean,
left = boolean,
right = boolean,
jump = boolean,
aux1 = boolean,
sneak = boolean,
zoom = boolean,
LMB = boolean,
RMB = boolean,
}
```
* `get_armor_groups()`
* returns a table with the armor group ratings
* `hud_add(definition)` * `hud_add(definition)`
* add a HUD element described by HUD def, returns ID number on success and `nil` on failure. * add a HUD element described by HUD def, returns ID number on success and `nil` on failure.
* See [`HUD definition`](#hud-definition-hud_add-hud_get) * See [`HUD definition`](#hud-definition-hud_add-hud_get)

@ -29,7 +29,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_base.h" #include "cpp_api/s_base.h"
#include "gettext.h" #include "gettext.h"
#include "l_internal.h" #include "l_internal.h"
#include "lua_api/l_item.h"
#include "lua_api/l_nodemeta.h" #include "lua_api/l_nodemeta.h"
#include "gui/mainmenumanager.h" #include "gui/mainmenumanager.h"
#include "map.h" #include "map.h"
@ -245,25 +244,18 @@ int ModApiClient::l_get_language(lua_State *L)
return 2; return 2;
} }
// get_wielded_item()
int ModApiClient::l_get_wielded_item(lua_State *L)
{
Client *client = getClient(L);
LocalPlayer *player = client->getEnv().getLocalPlayer();
if (!player)
return 0;
ItemStack selected_item;
player->getWieldedItem(&selected_item, nullptr);
LuaItemStack::create(L, selected_item);
return 1;
}
// get_meta(pos) // get_meta(pos)
int ModApiClient::l_get_meta(lua_State *L) int ModApiClient::l_get_meta(lua_State *L)
{ {
v3s16 p = read_v3s16(L, 1); v3s16 p = read_v3s16(L, 1);
NodeMetadata *meta = getClient(L)->getEnv().getMap().getNodeMetadata(p);
// check restrictions first
bool pos_ok;
getClient(L)->CSMGetNode(p, &pos_ok);
if (!pos_ok)
return 0;
NodeMetadata *meta = getEnv(L)->getMap().getNodeMetadata(p);
NodeMetaRef::createClient(L, meta); NodeMetaRef::createClient(L, meta);
return 1; return 1;
} }
@ -390,6 +382,7 @@ int ModApiClient::l_get_node_def(lua_State *L)
return 1; return 1;
} }
// get_privilege_list()
int ModApiClient::l_get_privilege_list(lua_State *L) int ModApiClient::l_get_privilege_list(lua_State *L)
{ {
const Client *client = getClient(L); const Client *client = getClient(L);
@ -436,7 +429,6 @@ void ModApiClient::Initialize(lua_State *L, int top)
API_FCT(send_respawn); API_FCT(send_respawn);
API_FCT(gettext); API_FCT(gettext);
API_FCT(get_node_or_nil); API_FCT(get_node_or_nil);
API_FCT(get_wielded_item);
API_FCT(disconnect); API_FCT(disconnect);
API_FCT(get_meta); API_FCT(get_meta);
API_FCT(sound_play); API_FCT(sound_play);

@ -19,10 +19,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "l_localplayer.h" #include "l_localplayer.h"
#include "l_internal.h" #include "l_internal.h"
#include "lua_api/l_item.h"
#include "script/common/c_converter.h" #include "script/common/c_converter.h"
#include "client/localplayer.h" #include "client/localplayer.h"
#include "hud.h" #include "hud.h"
#include "common/c_content.h" #include "common/c_content.h"
#include "client/content_cao.h"
LuaLocalPlayer::LuaLocalPlayer(LocalPlayer *m) : m_localplayer(m) LuaLocalPlayer::LuaLocalPlayer(LocalPlayer *m) : m_localplayer(m)
{ {
@ -74,6 +76,26 @@ int LuaLocalPlayer::l_get_name(lua_State *L)
return 1; return 1;
} }
// get_wield_index(self)
int LuaLocalPlayer::l_get_wield_index(lua_State *L)
{
LocalPlayer *player = getobject(L, 1);
lua_pushinteger(L, player->getWieldIndex());
return 1;
}
// get_wielded_item(self)
int LuaLocalPlayer::l_get_wielded_item(lua_State *L)
{
LocalPlayer *player = getobject(L, 1);
ItemStack selected_item;
player->getWieldedItem(&selected_item, nullptr);
LuaItemStack::create(L, selected_item);
return 1;
}
int LuaLocalPlayer::l_is_attached(lua_State *L) int LuaLocalPlayer::l_is_attached(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
@ -130,6 +152,7 @@ int LuaLocalPlayer::l_swimming_vertical(lua_State *L)
return 1; return 1;
} }
// get_physics_override(self)
int LuaLocalPlayer::l_get_physics_override(lua_State *L) int LuaLocalPlayer::l_get_physics_override(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
@ -150,14 +173,9 @@ int LuaLocalPlayer::l_get_physics_override(lua_State *L)
lua_pushboolean(L, player->physics_override_sneak_glitch); lua_pushboolean(L, player->physics_override_sneak_glitch);
lua_setfield(L, -2, "sneak_glitch"); lua_setfield(L, -2, "sneak_glitch");
return 1; lua_pushboolean(L, player->physics_override_new_move);
} lua_setfield(L, -2, "new_move");
int LuaLocalPlayer::l_get_override_pos(lua_State *L)
{
LocalPlayer *player = getobject(L, 1);
push_v3f(L, player->getPosition());
return 1; return 1;
} }
@ -193,14 +211,33 @@ int LuaLocalPlayer::l_get_last_look_horizontal(lua_State *L)
return 1; return 1;
} }
int LuaLocalPlayer::l_get_key_pressed(lua_State *L) // get_control(self)
int LuaLocalPlayer::l_get_control(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
const PlayerControl &c = player->getPlayerControl();
auto set = [L] (const char *name, bool value) {
lua_pushboolean(L, value);
lua_setfield(L, -2, name);
};
lua_createtable(L, 0, 12);
set("up", c.up);
set("down", c.down);
set("left", c.left);
set("right", c.right);
set("jump", c.jump);
set("aux1", c.aux1);
set("sneak", c.sneak);
set("zoom", c.zoom);
set("LMB", c.LMB);
set("RMB", c.RMB);
lua_pushinteger(L, player->last_keyPressed);
return 1; return 1;
} }
// get_breath(self)
int LuaLocalPlayer::l_get_breath(lua_State *L) int LuaLocalPlayer::l_get_breath(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
@ -209,6 +246,7 @@ int LuaLocalPlayer::l_get_breath(lua_State *L)
return 1; return 1;
} }
// get_pos(self)
int LuaLocalPlayer::l_get_pos(lua_State *L) int LuaLocalPlayer::l_get_pos(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
@ -217,6 +255,7 @@ int LuaLocalPlayer::l_get_pos(lua_State *L)
return 1; return 1;
} }
// get_movement_acceleration(self)
int LuaLocalPlayer::l_get_movement_acceleration(lua_State *L) int LuaLocalPlayer::l_get_movement_acceleration(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
@ -234,6 +273,7 @@ int LuaLocalPlayer::l_get_movement_acceleration(lua_State *L)
return 1; return 1;
} }
// get_movement_speed(self)
int LuaLocalPlayer::l_get_movement_speed(lua_State *L) int LuaLocalPlayer::l_get_movement_speed(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
@ -257,6 +297,7 @@ int LuaLocalPlayer::l_get_movement_speed(lua_State *L)
return 1; return 1;
} }
// get_movement(self)
int LuaLocalPlayer::l_get_movement(lua_State *L) int LuaLocalPlayer::l_get_movement(lua_State *L)
{ {
LocalPlayer *player = getobject(L, 1); LocalPlayer *player = getobject(L, 1);
@ -278,6 +319,13 @@ int LuaLocalPlayer::l_get_movement(lua_State *L)
return 1; return 1;
} }
// get_armor_groups(self)
int LuaLocalPlayer::l_get_armor_groups(lua_State *L)
{
LocalPlayer *player = getobject(L, 1);
push_groups(L, player->getCAO()->getGroups());
return 1;
}
// hud_add(self, form) // hud_add(self, form)
int LuaLocalPlayer::l_hud_add(lua_State *L) int LuaLocalPlayer::l_hud_add(lua_State *L)
@ -407,6 +455,8 @@ const luaL_Reg LuaLocalPlayer::methods[] = {
luamethod(LuaLocalPlayer, get_velocity), luamethod(LuaLocalPlayer, get_velocity),
luamethod(LuaLocalPlayer, get_hp), luamethod(LuaLocalPlayer, get_hp),
luamethod(LuaLocalPlayer, get_name), luamethod(LuaLocalPlayer, get_name),
luamethod(LuaLocalPlayer, get_wield_index),
luamethod(LuaLocalPlayer, get_wielded_item),
luamethod(LuaLocalPlayer, is_attached), luamethod(LuaLocalPlayer, is_attached),
luamethod(LuaLocalPlayer, is_touching_ground), luamethod(LuaLocalPlayer, is_touching_ground),
luamethod(LuaLocalPlayer, is_in_liquid), luamethod(LuaLocalPlayer, is_in_liquid),
@ -415,17 +465,19 @@ const luaL_Reg LuaLocalPlayer::methods[] = {
luamethod(LuaLocalPlayer, is_climbing), luamethod(LuaLocalPlayer, is_climbing),
luamethod(LuaLocalPlayer, swimming_vertical), luamethod(LuaLocalPlayer, swimming_vertical),
luamethod(LuaLocalPlayer, get_physics_override), luamethod(LuaLocalPlayer, get_physics_override),
luamethod(LuaLocalPlayer, get_override_pos), // TODO: figure our if these are useful in any way
luamethod(LuaLocalPlayer, get_last_pos), luamethod(LuaLocalPlayer, get_last_pos),
luamethod(LuaLocalPlayer, get_last_velocity), luamethod(LuaLocalPlayer, get_last_velocity),
luamethod(LuaLocalPlayer, get_last_look_horizontal), luamethod(LuaLocalPlayer, get_last_look_horizontal),
luamethod(LuaLocalPlayer, get_last_look_vertical), luamethod(LuaLocalPlayer, get_last_look_vertical),
luamethod(LuaLocalPlayer, get_key_pressed), //
luamethod(LuaLocalPlayer, get_control),
luamethod(LuaLocalPlayer, get_breath), luamethod(LuaLocalPlayer, get_breath),
luamethod(LuaLocalPlayer, get_pos), luamethod(LuaLocalPlayer, get_pos),
luamethod(LuaLocalPlayer, get_movement_acceleration), luamethod(LuaLocalPlayer, get_movement_acceleration),
luamethod(LuaLocalPlayer, get_movement_speed), luamethod(LuaLocalPlayer, get_movement_speed),
luamethod(LuaLocalPlayer, get_movement), luamethod(LuaLocalPlayer, get_movement),
luamethod(LuaLocalPlayer, get_armor_groups),
luamethod(LuaLocalPlayer, hud_add), luamethod(LuaLocalPlayer, hud_add),
luamethod(LuaLocalPlayer, hud_remove), luamethod(LuaLocalPlayer, hud_remove),
luamethod(LuaLocalPlayer, hud_change), luamethod(LuaLocalPlayer, hud_change),

@ -32,12 +32,21 @@ private:
// garbage collector // garbage collector
static int gc_object(lua_State *L); static int gc_object(lua_State *L);
// get_velocity(self)
static int l_get_velocity(lua_State *L); static int l_get_velocity(lua_State *L);
// get_hp(self)
static int l_get_hp(lua_State *L); static int l_get_hp(lua_State *L);
// get_name(self)
static int l_get_name(lua_State *L); static int l_get_name(lua_State *L);
// get_wield_index(self)
static int l_get_wield_index(lua_State *L);
// get_wielded_item(self)
static int l_get_wielded_item(lua_State *L);
static int l_is_attached(lua_State *L); static int l_is_attached(lua_State *L);
static int l_is_touching_ground(lua_State *L); static int l_is_touching_ground(lua_State *L);
static int l_is_in_liquid(lua_State *L); static int l_is_in_liquid(lua_State *L);
@ -54,18 +63,28 @@ private:
static int l_get_last_velocity(lua_State *L); static int l_get_last_velocity(lua_State *L);
static int l_get_last_look_vertical(lua_State *L); static int l_get_last_look_vertical(lua_State *L);
static int l_get_last_look_horizontal(lua_State *L); static int l_get_last_look_horizontal(lua_State *L);
static int l_get_key_pressed(lua_State *L);
// get_control(self)
static int l_get_control(lua_State *L);
// get_breath(self)
static int l_get_breath(lua_State *L); static int l_get_breath(lua_State *L);
// get_pos(self)
static int l_get_pos(lua_State *L); static int l_get_pos(lua_State *L);
// get_movement_acceleration(self)
static int l_get_movement_acceleration(lua_State *L); static int l_get_movement_acceleration(lua_State *L);
// get_movement_speed(self)
static int l_get_movement_speed(lua_State *L); static int l_get_movement_speed(lua_State *L);
// get_movement(self)
static int l_get_movement(lua_State *L); static int l_get_movement(lua_State *L);
// get_armor_groups(self)
static int l_get_armor_groups(lua_State *L);
// hud_add(self, id, form) // hud_add(self, id, form)
static int l_hud_add(lua_State *L); static int l_hud_add(lua_State *L);