summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlisacvuk <lisacvukhome@gmail.com>2018-01-23 19:28:21 +0100
committerSmallJoker <SmallJoker@users.noreply.github.com>2018-01-23 19:28:21 +0100
commit62c10e3d0855fa14fdc260da0b7cd748e53db13f (patch)
treed293ad561db63011a8b37f40aad55c6a0a20ab80
parent04e5a65c65e3434b78ef23b3c9369d3d7aeb4de3 (diff)
downloadminetest-62c10e3d0855fa14fdc260da0b7cd748e53db13f.tar.gz
minetest-62c10e3d0855fa14fdc260da0b7cd748e53db13f.tar.bz2
minetest-62c10e3d0855fa14fdc260da0b7cd748e53db13f.zip
Disable fall damage when "immortal" group set (#6946)
-rw-r--r--src/clientenvironment.cpp5
-rw-r--r--src/content_cao.cpp5
-rw-r--r--src/content_cao.h7
3 files changed, 15 insertions, 2 deletions
diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp
index af00586c5..8de073258 100644
--- a/src/clientenvironment.cpp
+++ b/src/clientenvironment.cpp
@@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "raycast.h"
#include "voxelalgorithms.h"
#include "settings.h"
+#include "content_cao.h"
#include <algorithm>
#include "client/renderingengine.h"
@@ -207,6 +208,8 @@ void ClientEnvironment::step(float dtime)
//std::cout<<"Looped "<<loopcount<<" times."<<std::endl;
+ bool player_immortal = lplayer->getCAO() && lplayer->getCAO()->isImmortal();
+
for (const CollisionInfo &info : player_collisions) {
v3f speed_diff = info.new_speed - info.old_speed;;
// Handle only fall damage
@@ -227,7 +230,7 @@ void ClientEnvironment::step(float dtime)
pre_factor = 1.0 + (float)addp/100.0;
}
float speed = pre_factor * speed_diff.getLength();
- if (speed > tolerance) {
+ if (speed > tolerance && !player_immortal) {
f32 damage_f = (speed - tolerance) / BS * post_factor;
u8 damage = (u8)MYMIN(damage_f + 0.5, 255);
if (damage != 0) {
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index a8b4ae2e1..affa092e7 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -360,6 +360,11 @@ v3f GenericCAO::getPosition()
return pos_translator.vect_show;
}
+const bool GenericCAO::isImmortal()
+{
+ return itemgroup_get(getGroups(), "immortal");
+}
+
scene::ISceneNode* GenericCAO::getSceneNode()
{
if (m_meshnode) {
diff --git a/src/content_cao.h b/src/content_cao.h
index 575aad241..7e946efb7 100644
--- a/src/content_cao.h
+++ b/src/content_cao.h
@@ -124,7 +124,10 @@ public:
{
return ACTIVEOBJECT_TYPE_GENERIC;
}
-
+ inline const ItemGroupList &getGroups() const
+ {
+ return m_armor_groups;
+ }
void initialize(const std::string &data);
void processInitData(const std::string &data);
@@ -143,6 +146,8 @@ public:
return m_yaw;
}
+ const bool isImmortal();
+
scene::ISceneNode *getSceneNode();
scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode();