]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
LocalPlayer:set_physics_override; minetest.register_on_recieve_physics_override
authorElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 23 Nov 2020 18:10:56 +0000 (19:10 +0100)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 23 Nov 2020 18:10:56 +0000 (19:10 +0100)
builtin/client/register.lua
doc/client_lua_api.txt
src/client/content_cao.cpp
src/script/common/c_content.cpp
src/script/common/c_content.h
src/script/cpp_api/s_client.cpp
src/script/cpp_api/s_client.h
src/script/lua_api/l_localplayer.cpp
src/script/lua_api/l_localplayer.h

index 071220a43f7a3975ce734e70bb2cd4b43070945a..c6374ab413f2a651fb34d2f33c76a291f5a048aa 100644 (file)
@@ -94,3 +94,4 @@ core.registered_on_item_use, core.register_on_item_use = make_registration()
 core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration()
 core.registered_on_modchannel_signal, core.register_on_modchannel_signal = make_registration()
 core.registered_on_inventory_open, core.register_on_inventory_open = make_registration()
+core.registered_on_recieve_physics_override, core.register_on_recieve_physics_override = make_registration()
index 2802ff6c1be85b49fc7192c45809961dca449933..dd7bb380850804883f6105172d28e62d3b58f126 100644 (file)
@@ -746,6 +746,10 @@ Call these functions only at load time!
     * Called when the local player open inventory
     * Newest functions are called first
     * If any function returns true, inventory doesn't open
+* `minetest.register_on_recieve_physics_override(function(override))`
+    * Called when recieving physics_override from server
+    * Newest functions are called first
+    * If any function returns true, the physics override does not change
 
 ### Setting-related
 * `minetest.settings`: Settings object containing all of the settings from the
@@ -1223,6 +1227,17 @@ Methods:
     }
 ```
 
+* `set_physics_override(override_table)`
+    * `override_table` is a table with the following fields:
+        * `speed`: multiplier to default walking speed value (default: `1`)
+        * `jump`: multiplier to default jump value (default: `1`)
+        * `gravity`: multiplier to default gravity value (default: `1`)
+        * `sneak`: whether player can sneak (default: `true`)
+        * `sneak_glitch`: whether player can use the new move code replications
+          of the old sneak side-effects: sneak ladders and 2 node sneak jump
+          (default: `false`)
+        * `new_move`: use new move/sneak code. When `false` the exact old code
+          is used for the specific old sneak behaviour (default: `true`)
 * `get_override_pos()`
     * returns override position
 * `get_last_pos()`
index cf671d5ca942001bd6548dfc623e28d0af90fb08..aed576372fccdb24e1362de6d6e5b7ab1c538d10 100644 (file)
@@ -47,6 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <algorithm>
 #include <cmath>
 #include "client/shader.h"
+#include "script/scripting_client.h"
 
 class Settings;
 struct ToolCapabilities;
@@ -1673,6 +1674,11 @@ void GenericCAO::processMessage(const std::string &data)
 
                if(m_is_local_player)
                {
+                       Client *client = m_env->getGameDef();
+                       
+                       if (client->modsLoaded() && client->getScript()->on_recieve_physics_override(override_speed, override_jump, override_gravity, sneak, sneak_glitch, new_move))
+                               return;
+                       
                        LocalPlayer *player = m_env->getLocalPlayer();
                        player->physics_override_speed = override_speed;
                        player->physics_override_jump = override_jump;
index 2103634177f79c3ed638a4dc8cd08a0dbf0baaa2..78c46f0e086f5842bc4caa61fafc3ae83d644870 100644 (file)
@@ -2096,3 +2096,26 @@ void push_collision_move_result(lua_State *L, const collisionMoveResult &res)
        lua_setfield(L, -2, "collisions");
        /**/
 }
+
+void push_physics_override(lua_State *L, float speed, float jump, float gravity, bool sneak, bool sneak_glitch, bool new_move)
+{
+       lua_createtable(L, 0, 6);
+       
+       lua_pushnumber(L, speed);
+       lua_setfield(L, -2, "speed");
+
+       lua_pushnumber(L, jump);
+       lua_setfield(L, -2, "jump");
+
+       lua_pushnumber(L, gravity);
+       lua_setfield(L, -2, "gravity");
+
+       lua_pushboolean(L, sneak);
+       lua_setfield(L, -2, "sneak");
+
+       lua_pushboolean(L, sneak_glitch);
+       lua_setfield(L, -2, "sneak_glitch");
+
+       lua_pushboolean(L, new_move);
+       lua_setfield(L, -2, "new_move");
+}
index 5a8bf67007c557e20157ec1b0714babb6320f46a..eeef71c365b98bef370b3ad87d5b45d64b431813 100644 (file)
@@ -202,3 +202,5 @@ void               push_hud_element          (lua_State *L, HudElement *elem);
 HudElementStat     read_hud_change           (lua_State *L, HudElement *elem, void **value);
 
 void               push_collision_move_result(lua_State *L, const collisionMoveResult &res);
+
+void                      push_physics_override         (lua_State *L, float speed, float jump, float gravity, bool sneak, bool sneak_glitch, bool new_move);
index dd9019d4d9270afe3c08517156397ad55d47916e..981b08537bc23ce5ddbf0b745e15a7574dca35df 100644 (file)
@@ -221,6 +221,22 @@ bool ScriptApiClient::on_item_use(const ItemStack &item, const PointedThing &poi
        return readParam<bool>(L, -1);
 }
 
+bool ScriptApiClient::on_recieve_physics_override(float speed, float jump, float gravity, bool sneak, bool sneak_glitch, bool new_move)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_recieve_physics_override
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_recieve_physics_override");
+
+       // Push data
+       push_physics_override(L, speed, jump, gravity, sneak, sneak_glitch, new_move);
+
+       // Call functions
+       runCallbacks(1, RUN_CALLBACKS_MODE_OR);
+       return readParam<bool>(L, -1);
+}
+
 bool ScriptApiClient::on_inventory_open(Inventory *inventory)
 {
        SCRIPTAPI_PRECHECKHEADER
index 177dce3eaf4303c2fd7a39f363ddf35c44ba5455..2ad3bcfad0d50f1c4449331d816b35ed9ff74952 100644 (file)
@@ -57,6 +57,7 @@ class ScriptApiClient : virtual public ScriptApiBase
        bool on_punchnode(v3s16 p, MapNode node);
        bool on_placenode(const PointedThing &pointed, const ItemDefinition &item);
        bool on_item_use(const ItemStack &item, const PointedThing &pointed);
+       bool on_recieve_physics_override(float override_speed, float override_jump, float override_gravity, bool sneak, bool sneak_glitch, bool new_move);
 
        bool on_inventory_open(Inventory *inventory);
        void open_enderchest();
index 9b089458daf4200aeb9fb6d48425ee1f003228d7..1cb6ff156f2e9fa9a86fe622f9dfab4b7d2da935 100644 (file)
@@ -225,26 +225,30 @@ int LuaLocalPlayer::l_get_physics_override(lua_State *L)
 {
        LocalPlayer *player = getobject(L, 1);
 
-       lua_newtable(L);
-       lua_pushnumber(L, player->physics_override_speed);
-       lua_setfield(L, -2, "speed");
-
-       lua_pushnumber(L, player->physics_override_jump);
-       lua_setfield(L, -2, "jump");
-
-       lua_pushnumber(L, player->physics_override_gravity);
-       lua_setfield(L, -2, "gravity");
-
-       lua_pushboolean(L, player->physics_override_sneak);
-       lua_setfield(L, -2, "sneak");
-
-       lua_pushboolean(L, player->physics_override_sneak_glitch);
-       lua_setfield(L, -2, "sneak_glitch");
+       push_physics_override(L, player->physics_override_speed, player->physics_override_jump, player->physics_override_gravity, player->physics_override_sneak, player->physics_override_sneak_glitch, player->physics_override_new_move);
+       
+       return 1;
+}
 
-       lua_pushboolean(L, player->physics_override_new_move);
-       lua_setfield(L, -2, "new_move");
+// set_physics_override(self, override)
+int LuaLocalPlayer::l_set_physics_override(lua_State *L)
+{
+       LocalPlayer *player = getobject(L, 1);
+       
+       player->physics_override_speed = getfloatfield_default(
+                       L, 2, "speed", player->physics_override_speed);
+       player->physics_override_jump = getfloatfield_default(
+                       L, 2, "jump", player->physics_override_jump);
+       player->physics_override_gravity = getfloatfield_default(
+                       L, 2, "gravity", player->physics_override_gravity);
+       player->physics_override_sneak = getboolfield_default(
+                       L, 2, "sneak", player->physics_override_sneak);
+       player->physics_override_sneak_glitch = getboolfield_default(
+                       L, 2, "sneak_glitch", player->physics_override_sneak_glitch);
+       player->physics_override_new_move = getboolfield_default(
+                       L, 2, "new_move", player->physics_override_new_move);
 
-       return 1;
+       return 0;
 }
 
 int LuaLocalPlayer::l_get_last_pos(lua_State *L)
@@ -561,6 +565,7 @@ const luaL_Reg LuaLocalPlayer::methods[] = {
                luamethod(LuaLocalPlayer, is_climbing),
                luamethod(LuaLocalPlayer, swimming_vertical),
                luamethod(LuaLocalPlayer, get_physics_override),
+               luamethod(LuaLocalPlayer, set_physics_override),
                // TODO: figure our if these are useful in any way
                luamethod(LuaLocalPlayer, get_last_pos),
                luamethod(LuaLocalPlayer, get_last_velocity),
index c436c3b114bc7364138628f2d0fb82bf6ce17e05..33e23d178b989d7aaa04b893dcdb1ec8f287e0c1 100644 (file)
@@ -74,6 +74,7 @@ class LuaLocalPlayer : public ModApiBase
        static int l_swimming_vertical(lua_State *L);
 
        static int l_get_physics_override(lua_State *L);
+       static int l_set_physics_override(lua_State *L);
 
        static int l_get_override_pos(lua_State *L);