#include "connection.h"
#include "constants.h"
#include "utility.h"
-
+#ifndef SERVER
+#include <ITextSceneNode.h>
+#endif
+#include "settings.h"
Player::Player():
touching_ground(false),
in_water(false),
in_water_stable(false),
+ is_climbing(false),
swimming_up(false),
+ is_frozen(false),
inventory_backup(NULL),
craftresult_is_preview(true),
hp(20),
peer_id(PEER_ID_INEXISTENT),
+ m_selected_item(0),
m_pitch(0),
m_yaw(0),
m_speed(0,0,0),
delete inventory_backup;
}
+void Player::wieldItem(u16 item)
+{
+ m_selected_item = item;
+}
+
void Player::resetInventory()
{
inventory.clear();
/*
Calculate new position
*/
- position += m_speed * dtime;
+ if(is_frozen) {
+ // Still move very slowly so as not to feel all completely stuck
+ position += m_speed * dtime * 0.001;
+ }
+ else {
+ position += m_speed * dtime;
+ }
+
+ /*
+ If the player enters an unloaded chunk this is set to true.
+ */
+ is_frozen = false;
// Skip collision detection if a special movement mode is used
- bool free_move = g_settings.getBool("free_move");
+ bool free_move = g_settings->getBool("free_move");
if(free_move)
{
setPosition(position);
try {
v3s16 pp = floatToInt(position + v3f(0,0.5*BS,0), BS);
v3s16 pp2 = floatToInt(position + v3f(0,-0.2*BS,0), BS);
- is_climbing = (content_features(map.getNode(pp).getContent()).climbable ||
- content_features(map.getNode(pp2).getContent()).climbable);
+ is_climbing = ((content_features(map.getNode(pp).getContent()).climbable ||
+ content_features(map.getNode(pp2).getContent()).climbable) && !free_move);
}
catch(InvalidPositionException &e)
{
}
catch(InvalidPositionException &e)
{
- // Doing nothing here will block the player from
- // walking over map borders
+ if(!is_frozen) {
+ // freeze when entering unloaded areas
+ is_frozen = true;
+ }
+ continue;
}
core::aabbox3d<f32> nodebox = getNodeBox(v3s16(x,y,z), BS);
v3f speed = v3f(0,0,0);
- bool free_move = g_settings.getBool("free_move");
- bool fast_move = g_settings.getBool("fast_move");
- bool continuous_forward = g_settings.getBool("continuous_forward");
+ bool free_move = g_settings->getBool("free_move");
+ bool fast_move = g_settings->getBool("fast_move");
+ bool continuous_forward = g_settings->getBool("continuous_forward");
- if(free_move)
+ if(free_move || is_climbing)
{
v3f speed = getSpeed();
speed.Y = 0;
speed.Y = -walkspeed_max;
setSpeed(speed);
}
+ else if(is_climbing)
+ {
+ v3f speed = getSpeed();
+ speed.Y = -3*BS;
+ setSpeed(speed);
+ }
else
{
// If not free movement but fast is allowed, aux1 is
setSpeed(speed);
swimming_up = true;
}
- }
-
- if (is_climbing) {
- if (control.up || control.left || control.right || control.down) {
- v3f speed = getSpeed();
- speed.Y = 2.5*BS;
- setSpeed(speed);
- }
- else {
- v3f speed = getSpeed();
- speed.Y = -2*BS;
+ else if(is_climbing)
+ {
+ v3f speed = getSpeed();
+ speed.Y = 3*BS;
setSpeed(speed);
}
}