Add disable_jump and fall_damage_add_percent node groups
authorPerttu Ahola <celeron55@gmail.com>
Sat, 1 Sep 2012 09:07:27 +0000 (12:07 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 1 Sep 2012 09:07:27 +0000 (12:07 +0300)
doc/lua_api.txt
src/environment.cpp
src/localplayer.cpp
src/localplayer.h

index 88c594eb2c8528f1021c6dc4202854252c06a200..008c9d40cab44edb668357b4b1db75062dad2a9f 100644 (file)
@@ -453,6 +453,8 @@ Special groups
   - 2: node is removed without tool wear after 0.5 seconds or so
        (rail, sign)
   - 3: node is removed without tool wear immediately (torch)
+- disable_jump: Player (and possibly other things) cannot jump from node
+- fall_damage_add_percent: damage speed = speed * (1 + value/100)
 
 Known damage and digging time defining groups
 ----------------------------------------------
index b88f55dead838a51b25f3c0a89c50fad8e9ddde7..2926795425b870f730b8a4477f9ca6f3b2e2a2d4 100644 (file)
@@ -2040,6 +2040,11 @@ void ClientEnvironment::step(float dtime)
                        //f32 tolerance = BS*12; // 3 without damage
                        f32 tolerance = BS*14; // 5 without damage
                        f32 factor = 1;
+                       const ContentFeatures &f = m_gamedef->ndef()->
+                                       get(m_map->getNodeNoEx(lplayer->getStandingNodePos()));
+                       // Determine fall damage multiplier
+                       int addp = itemgroup_get(f.groups, "fall_damage_add_percent");
+                       info.speed *= (1.0 + (float)addp/100.0);
                        if(info.speed > tolerance)
                        {
                                f32 damage_f = (info.speed - tolerance)/BS*factor;
index ee4fcd4e50a6016a0082e47af9d360ffe394def8..16111629e60662a36178046e72f713174eb8944c 100644 (file)
@@ -38,7 +38,8 @@ LocalPlayer::LocalPlayer(IGameDef *gamedef):
        m_sneak_node_exists(false),
        m_old_node_below(32767,32767,32767),
        m_old_node_below_type("air"),
-       m_need_to_get_new_sneak_node(true)
+       m_need_to_get_new_sneak_node(true),
+       m_can_jump(false)
 {
        // Initialize hp to 0, so that no hearts will be shown if server
        // doesn't support health points
@@ -314,6 +315,15 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
        */
        m_old_node_below = floatToInt(position - v3f(0,BS/2,0), BS);
        m_old_node_below_type = nodemgr->get(map.getNodeNoEx(m_old_node_below)).name;
+       
+       /*
+               Check properties of the node on which the player is standing
+       */
+       const ContentFeatures &f = nodemgr->get(map.getNodeNoEx(getStandingNodePos()));
+       // Determine if jumping is possible
+       m_can_jump = touching_ground;
+       if(itemgroup_get(f.groups, "disable_jump"))
+               m_can_jump = false;
 }
 
 void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d)
@@ -459,7 +469,7 @@ void LocalPlayer::applyControl(float dtime)
                                speed.Y = walkspeed_max;
                        setSpeed(speed);
                }
-               else if(touching_ground)
+               else if(m_can_jump)
                {
                        /*
                                NOTE: The d value in move() affects jump height by
index 9a9767d38eb36ca533a0fc7c127ebc857e057556..fb57e6538e1fbf93fa95c08e1f2d7b6d5c51c8db 100644 (file)
@@ -101,6 +101,7 @@ private:
        std::string m_old_node_below_type;
        // Whether recalculation of the sneak node is needed
        bool m_need_to_get_new_sneak_node;
+       bool m_can_jump;
 };
 
 #endif