summaryrefslogtreecommitdiff
path: root/src/content_cao.cpp
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2012-01-24 00:00:26 +0100
committerPerttu Ahola <celeron55@gmail.com>2012-02-05 12:06:55 +0200
commit88cdd3a363668cfb2fd07b5381cce29738aed0bf (patch)
tree445cfa71f50e87045b44c7674dc3f3eacf9b2e15 /src/content_cao.cpp
parente15de8b70dc13e24aefca7fdd2a17be5f150ae49 (diff)
downloadminetest-88cdd3a363668cfb2fd07b5381cce29738aed0bf.tar.gz
minetest-88cdd3a363668cfb2fd07b5381cce29738aed0bf.tar.bz2
minetest-88cdd3a363668cfb2fd07b5381cce29738aed0bf.zip
Players stay in environment even when dead, damage flash and fall damage fixes
Don't set m_removed on dead players (dead players are indicated by hp == 0). Local damage flash is shown whatever the cause was (even from Lua set_hp). PlayerCAO damage flash matches duration of local damage flash. Fall damage is dealt much more consistently (this is done by disallowing jumping when speed.Y is very negative, up to now jumping could sometimes negate fall damage)
Diffstat (limited to 'src/content_cao.cpp')
-rw-r--r--src/content_cao.cpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index a2708674b..3c30a0819 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -2067,6 +2067,7 @@ private:
bool m_is_local_player;
LocalPlayer *m_local_player;
float m_damage_visual_timer;
+ bool m_dead;
public:
PlayerCAO(IGameDef *gamedef, ClientEnvironment *env):
@@ -2078,7 +2079,8 @@ public:
m_yaw(0),
m_is_local_player(false),
m_local_player(NULL),
- m_damage_visual_timer(0)
+ m_damage_visual_timer(0),
+ m_dead(false)
{
if(gamedef == NULL)
ClientActiveObject::registerType(getType(), create);
@@ -2100,6 +2102,8 @@ public:
m_position = readV3F1000(is);
// yaw
m_yaw = readF1000(is);
+ // dead
+ m_dead = readU8(is);
pos_translator.init(m_position);
@@ -2129,6 +2133,8 @@ public:
{
if(m_is_local_player)
return NULL;
+ if(m_dead)
+ return NULL;
return &m_selection_box;
}
v3f getPosition()
@@ -2204,6 +2210,7 @@ public:
m_text->setPosition(v3f(0, (f32)BS*2.1, 0));
updateTextures("");
+ updateVisibility();
updateNodePos();
}
@@ -2221,11 +2228,11 @@ public:
if(m_node == NULL)
return;
- m_node->setVisible(true);
-
u8 li = decode_light(light_at_pos);
video::SColor color(255,li,li,li);
setMeshColor(m_node->getMesh(), color);
+
+ updateVisibility();
}
v3s16 getLightPosition()
@@ -2233,6 +2240,14 @@ public:
return floatToInt(m_position+v3f(0,BS*1.5,0), BS);
}
+ void updateVisibility()
+ {
+ if(m_node == NULL)
+ return;
+
+ m_node->setVisible(!m_dead);
+ }
+
void updateNodePos()
{
if(m_node == NULL)
@@ -2248,6 +2263,7 @@ public:
void step(float dtime, ClientEnvironment *env)
{
pos_translator.translate(dtime);
+ updateVisibility();
updateNodePos();
if(m_damage_visual_timer > 0){
@@ -2279,13 +2295,16 @@ public:
{
// damage
s16 damage = readS16(is);
-
- if(m_is_local_player)
- m_env->damageLocalPlayer(damage, false);
-
- m_damage_visual_timer = 0.5;
+ m_damage_visual_timer = 0.05;
+ if(damage >= 2)
+ m_damage_visual_timer += 0.05 * damage;
updateTextures("^[brighten");
}
+ else if(cmd == 2) // died or respawned
+ {
+ m_dead = readU8(is);
+ updateVisibility();
+ }
}
void updateTextures(const std::string &mod)