]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/lua_api/l_localplayer.cpp
UI Update; Added AutoTool
[dragonfireclient.git] / src / script / lua_api / l_localplayer.cpp
index 8aac5355cba089df0e50895044fbcee92a6e3edd..2644893f91cce9e1e44fe9f879b60233ef935e21 100644 (file)
@@ -19,29 +19,39 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "l_localplayer.h"
 #include "l_internal.h"
+#include "lua_api/l_item.h"
 #include "script/common/c_converter.h"
+#include "client/localplayer.h"
+#include "hud.h"
+#include "common/c_content.h"
+#include "client/client.h"
+#include "client/content_cao.h"
+#include "client/game.h"
 
-LuaLocalPlayer::LuaLocalPlayer(LocalPlayer *m)
+LuaLocalPlayer::LuaLocalPlayer(LocalPlayer *m) : m_localplayer(m)
 {
-       m_localplayer = m;
 }
 
 void LuaLocalPlayer::create(lua_State *L, LocalPlayer *m)
 {
+       lua_getglobal(L, "core");
+       luaL_checktype(L, -1, LUA_TTABLE);
+       int objectstable = lua_gettop(L);
+       lua_getfield(L, -1, "localplayer");
+
+       // Duplication check
+       if (lua_type(L, -1) == LUA_TUSERDATA) {
+               lua_pop(L, 1);
+               return;
+       }
+
        LuaLocalPlayer *o = new LuaLocalPlayer(m);
        *(void **)(lua_newuserdata(L, sizeof(void *))) = o;
        luaL_getmetatable(L, className);
        lua_setmetatable(L, -2);
 
-       // Keep localplayer object stack id
-       int localplayer_object = lua_gettop(L);
-
-       lua_getglobal(L, "core");
-       luaL_checktype(L, -1, LUA_TTABLE);
-       int coretable = lua_gettop(L);
-
-       lua_pushvalue(L, localplayer_object);
-       lua_setfield(L, coretable, "localplayer");
+       lua_pushvalue(L, lua_gettop(L));
+       lua_setfield(L, objectstable, "localplayer");
 }
 
 int LuaLocalPlayer::l_get_velocity(lua_State *L)
@@ -68,11 +78,34 @@ int LuaLocalPlayer::l_get_name(lua_State *L)
        return 1;
 }
 
-int LuaLocalPlayer::l_is_teleported(lua_State *L)
+// 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;
+}
+
+// set_wield_index(self)
+int LuaLocalPlayer::l_set_wield_index(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
+       u32 index = luaL_checkinteger(L, 2);
+       
+       player->setWieldIndex(index);
+       g_game->processItemSelection(&g_game->runData.new_playeritem);
+       return 0;
+}
 
-       lua_pushboolean(L, player->got_teleported);
+// 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;
 }
 
@@ -80,7 +113,7 @@ int LuaLocalPlayer::l_is_attached(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
 
-       lua_pushboolean(L, player->isAttached);
+       lua_pushboolean(L, player->getParent() != nullptr);
        return 1;
 }
 
@@ -132,6 +165,7 @@ int LuaLocalPlayer::l_swimming_vertical(lua_State *L)
        return 1;
 }
 
+// get_physics_override(self)
 int LuaLocalPlayer::l_get_physics_override(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
@@ -152,14 +186,9 @@ int LuaLocalPlayer::l_get_physics_override(lua_State *L)
        lua_pushboolean(L, player->physics_override_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->overridePosition);
        return 1;
 }
 
@@ -195,14 +224,33 @@ int LuaLocalPlayer::l_get_last_look_horizontal(lua_State *L)
        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);
+       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;
 }
 
+// get_breath(self)
 int LuaLocalPlayer::l_get_breath(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
@@ -211,34 +259,7 @@ int LuaLocalPlayer::l_get_breath(lua_State *L)
        return 1;
 }
 
-int LuaLocalPlayer::l_get_look_dir(lua_State *L)
-{
-       LocalPlayer *player = getobject(L, 1);
-
-       float pitch = -1.0 * player->getPitch() * core::DEGTORAD;
-       float yaw = (player->getYaw() + 90.) * core::DEGTORAD;
-       v3f v(cos(pitch) * cos(yaw), sin(pitch), cos(pitch) * sin(yaw));
-
-       push_v3f(L, v);
-       return 1;
-}
-
-int LuaLocalPlayer::l_get_look_horizontal(lua_State *L)
-{
-       LocalPlayer *player = getobject(L, 1);
-
-       lua_pushnumber(L, (player->getYaw() + 90.) * core::DEGTORAD);
-       return 1;
-}
-
-int LuaLocalPlayer::l_get_look_vertical(lua_State *L)
-{
-       LocalPlayer *player = getobject(L, 1);
-
-       lua_pushnumber(L, -1.0 * player->getPitch() * core::DEGTORAD);
-       return 1;
-}
-
+// get_pos(self)
 int LuaLocalPlayer::l_get_pos(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
@@ -247,22 +268,18 @@ int LuaLocalPlayer::l_get_pos(lua_State *L)
        return 1;
 }
 
-int LuaLocalPlayer::l_get_eye_pos(lua_State *L)
+// set_pos(self, pos)
+int LuaLocalPlayer::l_set_pos(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
-
-       push_v3f(L, player->getEyePosition());
-       return 1;
-}
-
-int LuaLocalPlayer::l_get_eye_offset(lua_State *L)
-{
-       LocalPlayer *player = getobject(L, 1);
-
-       push_v3f(L, player->getEyeOffset());
-       return 1;
+       
+       v3f pos = checkFloatPos(L, 2);
+       player->setPosition(pos);
+       getClient(L)->sendPlayerPos();
+       return 0;
 }
 
+// get_movement_acceleration(self)
 int LuaLocalPlayer::l_get_movement_acceleration(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
@@ -280,6 +297,7 @@ int LuaLocalPlayer::l_get_movement_acceleration(lua_State *L)
        return 1;
 }
 
+// get_movement_speed(self)
 int LuaLocalPlayer::l_get_movement_speed(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
@@ -303,6 +321,7 @@ int LuaLocalPlayer::l_get_movement_speed(lua_State *L)
        return 1;
 }
 
+// get_movement(self)
 int LuaLocalPlayer::l_get_movement(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
@@ -324,6 +343,80 @@ int LuaLocalPlayer::l_get_movement(lua_State *L)
        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)
+int LuaLocalPlayer::l_hud_add(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+
+       HudElement *elem = new HudElement;
+       read_hud_element(L, elem);
+
+       u32 id = player->addHud(elem);
+       if (id == U32_MAX) {
+               delete elem;
+               return 0;
+       }
+       lua_pushnumber(L, id);
+       return 1;
+}
+
+// hud_remove(self, id)
+int LuaLocalPlayer::l_hud_remove(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+       u32 id = luaL_checkinteger(L, 2);
+       HudElement *element = player->removeHud(id);
+       if (!element)
+               lua_pushboolean(L, false);
+       else
+               lua_pushboolean(L, true);
+       delete element;
+       return 1;
+}
+
+// hud_change(self, id, stat, data)
+int LuaLocalPlayer::l_hud_change(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+
+       u32 id = luaL_checkinteger(L, 2);
+
+       HudElement *element = player->getHud(id);
+       if (!element)
+               return 0;
+
+       void *unused;
+       read_hud_change(L, element, &unused);
+
+       lua_pushboolean(L, true);
+       return 1;
+}
+
+// hud_get(self, id)
+int LuaLocalPlayer::l_hud_get(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+
+       u32 id = luaL_checkinteger(L, -1);
+
+       HudElement *e = player->getHud(id);
+       if (!e) {
+               lua_pushnil(L);
+               return 1;
+       }
+
+       push_hud_element(L, e);
+       return 1;
+}
+
 LuaLocalPlayer *LuaLocalPlayer::checkobject(lua_State *L, int narg)
 {
        luaL_checktype(L, narg, LUA_TUSERDATA);
@@ -382,11 +475,13 @@ void LuaLocalPlayer::Register(lua_State *L)
 }
 
 const char LuaLocalPlayer::className[] = "LocalPlayer";
-const luaL_reg LuaLocalPlayer::methods[] = {
+const luaL_Reg LuaLocalPlayer::methods[] = {
                luamethod(LuaLocalPlayer, get_velocity),
                luamethod(LuaLocalPlayer, get_hp),
                luamethod(LuaLocalPlayer, get_name),
-               luamethod(LuaLocalPlayer, is_teleported),
+               luamethod(LuaLocalPlayer, get_wield_index),
+               luamethod(LuaLocalPlayer, set_wield_index),
+               luamethod(LuaLocalPlayer, get_wielded_item),
                luamethod(LuaLocalPlayer, is_attached),
                luamethod(LuaLocalPlayer, is_touching_ground),
                luamethod(LuaLocalPlayer, is_in_liquid),
@@ -395,22 +490,24 @@ const luaL_reg LuaLocalPlayer::methods[] = {
                luamethod(LuaLocalPlayer, is_climbing),
                luamethod(LuaLocalPlayer, swimming_vertical),
                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_velocity),
                luamethod(LuaLocalPlayer, get_last_look_horizontal),
                luamethod(LuaLocalPlayer, get_last_look_vertical),
-               luamethod(LuaLocalPlayer, get_key_pressed),
+               //
+               luamethod(LuaLocalPlayer, get_control),
                luamethod(LuaLocalPlayer, get_breath),
-               luamethod(LuaLocalPlayer, get_look_dir),
-               luamethod(LuaLocalPlayer, get_look_horizontal),
-               luamethod(LuaLocalPlayer, get_look_vertical),
                luamethod(LuaLocalPlayer, get_pos),
-               luamethod(LuaLocalPlayer, get_eye_pos),
-               luamethod(LuaLocalPlayer, get_eye_offset),
+               luamethod(LuaLocalPlayer, set_pos),
                luamethod(LuaLocalPlayer, get_movement_acceleration),
                luamethod(LuaLocalPlayer, get_movement_speed),
                luamethod(LuaLocalPlayer, get_movement),
+               luamethod(LuaLocalPlayer, get_armor_groups),
+               luamethod(LuaLocalPlayer, hud_add),
+               luamethod(LuaLocalPlayer, hud_remove),
+               luamethod(LuaLocalPlayer, hud_change),
+               luamethod(LuaLocalPlayer, hud_get),
 
                {0, 0}
 };