From b6b0b831aceaefec31673c15333952d7eb8fbb36 Mon Sep 17 00:00:00 2001 From: cmdskp Date: Tue, 29 Dec 2015 18:15:51 +0000 Subject: [PATCH] Slippery physics override setting Allows mods to change a player's slip factor (e.g. wearing boots could reduce this) Note: Require assistance on implementing needed changed protocol version check in I_object! --- src/content_cao.cpp | 3 +++ src/content_sao.cpp | 5 +++-- src/content_sao.h | 1 + src/genericobject.cpp | 3 ++- src/genericobject.h | 2 +- src/localplayer.cpp | 26 ++++++++++++++++---------- src/network/networkprotocol.h | 4 +++- src/player.cpp | 5 +++-- src/player.h | 1 + src/script/lua_api/l_object.cpp | 5 ++++- src/script/lua_api/l_object.h | 2 +- src/serverobject.h | 2 +- 12 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 1b8e84c8f..9b75e641d 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1661,6 +1661,8 @@ void GenericCAO::processMessage(const std::string &data) float override_speed = readF1000(is); float override_jump = readF1000(is); float override_gravity = readF1000(is); +///TODO: detect protocol VERSION! + float override_slip = readF1000(is); // these are sent inverted so we get true when the server sends nothing bool sneak = !readU8(is); bool sneak_glitch = !readU8(is); @@ -1672,6 +1674,7 @@ void GenericCAO::processMessage(const std::string &data) player->physics_override_speed = override_speed; player->physics_override_jump = override_jump; player->physics_override_gravity = override_gravity; + player->physics_override_slip = override_slip; player->physics_override_sneak = sneak; player->physics_override_sneak_glitch = sneak_glitch; } diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 4d144aa17..09157e136 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -773,6 +773,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_, m_physics_override_speed(1), m_physics_override_jump(1), m_physics_override_gravity(1), + m_physics_override_slip(1), m_physics_override_sneak(true), m_physics_override_sneak_glitch(true), m_physics_override_sent(false) @@ -865,7 +866,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) } os<ndef(); Map *map = &env->getMap(); - v3s16 p = floatToInt(getPosition() - v3f(0,BS/2,0), BS); - ContentFeatures node = nodemgr->get(map->getNodeNoEx(p)); - int slippery = itemgroup_get(node.groups, "slippery"); - // Sliding onto a non-walkable node, set a default to allow sliding off edges - if (slippery==0 && node.walkable==false && !free_move && !is_climbing && !control.sneak) - { - slippery = 10; - } + v3s16 position = floatToInt(getPosition() - v3f(0,BS/2,0), BS); + ContentFeatures node = nodemgr->get(map->getNodeNoEx(position)); - accelerateHorizontal(speedH * physics_override_speed, incH * physics_override_speed, slippery); + slippery = itemgroup_get(node.groups, "slippery"); + + // Sliding onto a non-walkable node that you should fall through? + if (slippery==0 && !node.walkable) + slippery = 100; // override to allow sliding off edges into + } + else + slippery = 0; + + // Accelerate to target speed with maximum increment + accelerateHorizontal(speedH * physics_override_speed, incH * physics_override_speed, slippery * physics_override_slip); accelerateVertical(speedV * physics_override_speed, incV * physics_override_speed); } diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 674c68104..7e2ae39c0 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -132,9 +132,11 @@ with this program; if not, write to the Free Software Foundation, Inc., Rename GENERIC_CMD_SET_ATTACHMENT to GENERIC_CMD_ATTACH_TO PROTOCOL_VERSION 26: Add TileDef tileable_horizontal, tileable_vertical flags + PROTOCOL_VERSION 27: + Add physics_override_slip */ -#define LATEST_PROTOCOL_VERSION 26 +#define LATEST_PROTOCOL_VERSION 27 // Server's supported network protocol range #define SERVER_PROTOCOL_VERSION_MIN 13 diff --git a/src/player.cpp b/src/player.cpp index 5c1be5ed7..71ccd1fba 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -95,6 +95,7 @@ Player::Player(IGameDef *gamedef, const char *name): physics_override_speed = 1; physics_override_jump = 1; physics_override_gravity = 1; + physics_override_slip = 1; physics_override_sneak = true; physics_override_sneak_glitch = true; @@ -121,9 +122,9 @@ void Player::accelerateHorizontal(v3f target_speed, f32 max_increase, int slippe if (slippery) { if (target_speed == v3f(0)) - d_wanted = -m_speed*.5/slippery; + d_wanted = -m_speed * 5 / slippery; else - d_wanted = target_speed*.1 - m_speed*.1; + d_wanted = target_speed * .1 - m_speed * .1; } d_wanted.Y = 0; f32 dl = d_wanted.getLength(); diff --git a/src/player.h b/src/player.h index 46fdf5534..babe7fd80 100644 --- a/src/player.h +++ b/src/player.h @@ -352,6 +352,7 @@ public: float physics_override_speed; float physics_override_jump; float physics_override_gravity; + float physics_override_slip; bool physics_override_sneak; bool physics_override_sneak_glitch; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 6d6614e7d..3eacdf29d 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -401,7 +401,7 @@ int ObjectRef::l_get_armor_groups(lua_State *L) } // set_physics_override(self, physics_override_speed, physics_override_jump, -// physics_override_gravity, sneak, sneak_glitch) +// physics_override_gravity, physics_override_slip, sneak, sneak_glitch) int ObjectRef::l_set_physics_override(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -413,6 +413,7 @@ int ObjectRef::l_set_physics_override(lua_State *L) co->m_physics_override_speed = getfloatfield_default(L, 2, "speed", co->m_physics_override_speed); co->m_physics_override_jump = getfloatfield_default(L, 2, "jump", co->m_physics_override_jump); co->m_physics_override_gravity = getfloatfield_default(L, 2, "gravity", co->m_physics_override_gravity); + co->m_physics_override_slip = getfloatfield_default(L, 2, "slip", co->m_physics_override_slip); co->m_physics_override_sneak = getboolfield_default(L, 2, "sneak", co->m_physics_override_sneak); co->m_physics_override_sneak_glitch = getboolfield_default(L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch); co->m_physics_override_sent = false; @@ -450,6 +451,8 @@ int ObjectRef::l_get_physics_override(lua_State *L) lua_setfield(L, -2, "jump"); lua_pushnumber(L, co->m_physics_override_gravity); lua_setfield(L, -2, "gravity"); + lua_pushnumber(L, co->m_physics_override_slip); + lua_setfield(L, -2, "slip"); lua_pushboolean(L, co->m_physics_override_sneak); lua_setfield(L, -2, "sneak"); lua_pushboolean(L, co->m_physics_override_sneak_glitch); diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index a4457cc05..57c21d818 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -105,7 +105,7 @@ private: static int l_get_armor_groups(lua_State *L); // set_physics_override(self, physics_override_speed, physics_override_jump, - // physics_override_gravity, sneak, sneak_glitch) + // physics_override_gravity, physics_override_slip, sneak, sneak_glitch) static int l_set_physics_override(lua_State *L); // get_physics_override(self) diff --git a/src/serverobject.h b/src/serverobject.h index 597eb63a8..cb8a3631a 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -149,7 +149,7 @@ public: {} virtual ItemGroupList getArmorGroups() { return ItemGroupList(); } - virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity) + virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity, float physics_override_slip) {} virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop) {}