X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fplayer.cpp;h=3ee34d41f0b594124df8e2dc337878f0a2f17c57;hb=2035bfc3a64e7c0c82f0cb100cd7d4cc588d0203;hp=0d506ec99a8e4ceb46bc73814afdd84a1c984b4b;hpb=089fc010abe439aea154813e3e31bc9477a84308;p=dragonfireclient.git diff --git a/src/player.cpp b/src/player.cpp index 0d506ec99..3ee34d41f 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -18,14 +18,21 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "player.h" + +#include +#include "threading/mutex_auto_lock.h" +#include "util/numeric.h" #include "hud.h" #include "constants.h" #include "gamedef.h" #include "settings.h" #include "content_sao.h" -#include "util/numeric.h" +#include "filesys.h" +#include "log.h" +#include "porting.h" // strlcpy -Player::Player(IGameDef *gamedef): + +Player::Player(IGameDef *gamedef, const char *name): touching_ground(false), in_liquid(false), in_liquid_stable(false), @@ -33,44 +40,43 @@ Player::Player(IGameDef *gamedef): is_climbing(false), swimming_vertical(false), camera_barely_in_ceiling(false), - light(0), inventory(gamedef->idef()), hp(PLAYER_MAX_HP), hurt_tilt_timer(0), hurt_tilt_strength(0), + protocol_version(0), peer_id(PEER_ID_INEXISTENT), keyPressed(0), // protected m_gamedef(gamedef), - m_breath(-1), + m_breath(PLAYER_MAX_BREATH), m_pitch(0), m_yaw(0), m_speed(0,0,0), m_position(0,0,0), m_collisionbox(-BS*0.30,0.0,-BS*0.30,BS*0.30,BS*1.75,BS*0.30), - m_last_pitch(0), - m_last_yaw(0), - m_last_pos(0,0,0), - m_last_hp(PLAYER_MAX_HP), - m_last_inventory(gamedef->idef()) + m_dirty(false) { - updateName(""); + strlcpy(m_name, name, PLAYERNAME_SIZE); + inventory.clear(); inventory.addList("main", PLAYER_INVENTORY_SIZE); InventoryList *craft = inventory.addList("craft", 9); craft->setWidth(3); inventory.addList("craftpreview", 1); inventory.addList("craftresult", 1); - m_last_inventory = inventory; + inventory.setModified(false); // Can be redefined via Lua inventory_formspec = "size[8,7.5]" //"image[1,0.6;1,2;player.png]" "list[current_player;main;0,3.5;8,4;]" "list[current_player;craft;3,0;3,3;]" + "listring[]" "list[current_player;craftpreview;7,1;1,1;]"; - // Initialize movement settings at default values, so movement can work if the server fails to send them + // Initialize movement settings at default values, so movement can work + // if the server fails to send them movement_acceleration_default = 3 * BS; movement_acceleration_air = 2 * BS; movement_acceleration_fast = 10 * BS; @@ -83,6 +89,7 @@ Player::Player(IGameDef *gamedef): movement_liquid_fluidity_smooth = 0.5 * BS; movement_liquid_sink = 10 * BS; movement_gravity = 9.81 * BS; + local_animation_speed = 0.0; // Movement overrides are multipliers and must be 1 by default physics_override_speed = 1; @@ -91,15 +98,17 @@ Player::Player(IGameDef *gamedef): physics_override_sneak = true; physics_override_sneak_glitch = true; - hud_flags = HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE | - HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE | - HUD_FLAG_BREATHBAR_VISIBLE; + hud_flags = + HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE | + HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE | + HUD_FLAG_BREATHBAR_VISIBLE | HUD_FLAG_MINIMAP_VISIBLE; hud_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT; } Player::~Player() { + clearHud(); } // Horizontal acceleration (X and Z), Y direction is ignored @@ -113,31 +122,12 @@ void Player::accelerateHorizontal(v3f target_speed, f32 max_increase) f32 dl = d_wanted.getLength(); if(dl > max_increase) dl = max_increase; - + v3f d = d_wanted.normalize() * dl; m_speed.X += d.X; m_speed.Z += d.Z; -#if 0 // old code - if(m_speed.X < target_speed.X - max_increase) - m_speed.X += max_increase; - else if(m_speed.X > target_speed.X + max_increase) - m_speed.X -= max_increase; - else if(m_speed.X < target_speed.X) - m_speed.X = target_speed.X; - else if(m_speed.X > target_speed.X) - m_speed.X = target_speed.X; - - if(m_speed.Z < target_speed.Z - max_increase) - m_speed.Z += max_increase; - else if(m_speed.Z > target_speed.Z + max_increase) - m_speed.Z -= max_increase; - else if(m_speed.Z < target_speed.Z) - m_speed.Z = target_speed.Z; - else if(m_speed.Z > target_speed.Z) - m_speed.Z = target_speed.Z; -#endif } // Vertical acceleration (Y), X and Z directions are ignored @@ -154,16 +144,6 @@ void Player::accelerateVertical(v3f target_speed, f32 max_increase) m_speed.Y += d_wanted; -#if 0 // old code - if(m_speed.Y < target_speed.Y - max_increase) - m_speed.Y += max_increase; - else if(m_speed.Y > target_speed.Y + max_increase) - m_speed.Y -= max_increase; - else if(m_speed.Y < target_speed.Y) - m_speed.Y = target_speed.Y; - else if(m_speed.Y > target_speed.Y) - m_speed.Y = target_speed.Y; -#endif } v3s16 Player::getLightPosition() const @@ -194,35 +174,28 @@ void Player::serialize(std::ostream &os) void Player::deSerialize(std::istream &is, std::string playername) { Settings args; - - for(;;) - { - if(is.eof()) - throw SerializationError - (("Player::deSerialize(): PlayerArgsEnd of player \"" + playername + "\" not found").c_str()); - std::string line; - std::getline(is, line); - std::string trimmedline = trim(line); - if(trimmedline == "PlayerArgsEnd") - break; - args.parseConfigLine(line); + + if (!args.parseConfigLines(is, "PlayerArgsEnd")) { + throw SerializationError("PlayerArgsEnd of player " + + playername + " not found!"); } + m_dirty = true; //args.getS32("version"); // Version field value not used std::string name = args.get("name"); - updateName(name.c_str()); + strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE); setPitch(args.getFloat("pitch")); setYaw(args.getFloat("yaw")); setPosition(args.getV3F("position")); try{ hp = args.getS32("hp"); }catch(SettingNotFoundException &e) { - hp = 20; + hp = PLAYER_MAX_HP; } try{ m_breath = args.getS32("breath"); }catch(SettingNotFoundException &e) { - m_breath = 11; + m_breath = PLAYER_MAX_BREATH; } inventory.deSerialize(is); @@ -240,13 +213,12 @@ void Player::deSerialize(std::istream &is, std::string playername) inventory.getList("craftresult")->changeItem(0, ItemStack()); } } - - // Set m_last_* - checkModified(); } u32 Player::addHud(HudElement *toadd) { + MutexAutoLock lock(m_mutex); + u32 id = getFreeHudID(); if (id < hud.size()) @@ -259,6 +231,8 @@ u32 Player::addHud(HudElement *toadd) HudElement* Player::getHud(u32 id) { + MutexAutoLock lock(m_mutex); + if (id < hud.size()) return hud[id]; @@ -267,6 +241,8 @@ HudElement* Player::getHud(u32 id) HudElement* Player::removeHud(u32 id) { + MutexAutoLock lock(m_mutex); + HudElement* retval = NULL; if (id < hud.size()) { retval = hud[id]; @@ -277,6 +253,8 @@ HudElement* Player::removeHud(u32 id) void Player::clearHud() { + MutexAutoLock lock(m_mutex); + while(!hud.empty()) { delete hud.back(); hud.pop_back(); @@ -293,7 +271,7 @@ void RemotePlayer::save(std::string savedir) */ // A player to deserialize files into to check their names - RemotePlayer testplayer(m_gamedef); + RemotePlayer testplayer(m_gamedef, ""); savedir += DIR_DELIM; std::string path = savedir + m_name; @@ -305,6 +283,7 @@ void RemotePlayer::save(std::string savedir) if (!fs::safeWriteToFile(path, ss.str())) { infostream << "Failed to write " << path << std::endl; } + setModified(false); return; } // Open file and deserialize @@ -314,6 +293,7 @@ void RemotePlayer::save(std::string savedir) return; } testplayer.deSerialize(is, path); + is.close(); if (strcmp(testplayer.getName(), m_name) == 0) { // Open file and serialize std::ostringstream ss(std::ios_base::binary); @@ -321,6 +301,7 @@ void RemotePlayer::save(std::string savedir) if (!fs::safeWriteToFile(path, ss.str())) { infostream << "Failed to write " << path << std::endl; } + setModified(false); return; } path = savedir + m_name + itos(i);