X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fplayer.cpp;h=40d403952bbbeac0b0c5822d8ef1803212dffc60;hb=58e6d25e033c76dc91aaac18fdeda92ac23fe0e1;hp=0c34c4cdfcf2dbb98f0715b607b8f095b0c22ace;hpb=df3c925b3ccae3bdba125e6dc3ecc740739baeab;p=oweals%2Fminetest.git diff --git a/src/player.cpp b/src/player.cpp index 0c34c4cdf..40d403952 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -18,9 +18,9 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "player.h" +#include "hud.h" #include "constants.h" #include "gamedef.h" -#include "connection.h" // PEER_ID_INEXISTENT #include "settings.h" #include "content_sao.h" #include "util/numeric.h" @@ -33,15 +33,26 @@ 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), peer_id(PEER_ID_INEXISTENT), + keyPressed(0), // protected m_gamedef(gamedef), + m_breath(-1), m_pitch(0), m_yaw(0), m_speed(0,0,0), - m_position(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()) { updateName(""); inventory.clear(); @@ -50,31 +61,46 @@ Player::Player(IGameDef *gamedef): craft->setWidth(3); inventory.addList("craftpreview", 1); inventory.addList("craftresult", 1); + m_last_inventory = inventory; // Can be redefined via Lua - inventory_formspec = "size[8,7.5]" + 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;]" "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 - movement_acceleration_default = 2 * BS; - movement_acceleration_air = 0.5 * BS; - movement_acceleration_fast = 8 * BS; - movement_speed_walk = 4 * BS; - movement_speed_crouch = 1.35 * BS; - movement_speed_fast = 20 * BS; - movement_speed_climb = 2 * BS; - movement_speed_jump = 6.5 * BS; - movement_liquid_fluidity = 1 * BS; - movement_liquid_fluidity_smooth = 0.5 * BS; - movement_liquid_sink = 10 * BS; - movement_gravity = 9.81 * BS; + movement_acceleration_default = 3 * BS; + movement_acceleration_air = 2 * BS; + movement_acceleration_fast = 10 * BS; + movement_speed_walk = 4 * BS; + movement_speed_crouch = 1.35 * BS; + movement_speed_fast = 20 * BS; + movement_speed_climb = 2 * BS; + movement_speed_jump = 6.5 * BS; + movement_liquid_fluidity = 1 * BS; + movement_liquid_fluidity_smooth = 0.5 * BS; + movement_liquid_sink = 10 * BS; + movement_gravity = 9.81 * BS; + + // Movement overrides are multipliers and must be 1 by default + physics_override_speed = 1; + physics_override_jump = 1; + physics_override_gravity = 1; + 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_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT; } Player::~Player() { + clearHud(); } // Horizontal acceleration (X and Z), Y direction is ignored @@ -157,15 +183,16 @@ void Player::serialize(std::ostream &os) args.setFloat("yaw", m_yaw); args.setV3F("position", m_position); args.setS32("hp", hp); + args.setS32("breath", m_breath); args.writeLines(os); os<<"PlayerArgsEnd\n"; - + inventory.serialize(os); } -void Player::deSerialize(std::istream &is) +void Player::deSerialize(std::istream &is, std::string playername) { Settings args; @@ -173,7 +200,7 @@ void Player::deSerialize(std::istream &is) { if(is.eof()) throw SerializationError - ("Player::deSerialize(): PlayerArgsEnd not found"); + (("Player::deSerialize(): PlayerArgsEnd of player \"" + playername + "\" not found").c_str()); std::string line; std::getline(is, line); std::string trimmedline = trim(line); @@ -190,14 +217,18 @@ void Player::deSerialize(std::istream &is) setPosition(args.getV3F("position")); try{ hp = args.getS32("hp"); - }catch(SettingNotFoundException &e){ + }catch(SettingNotFoundException &e) { hp = 20; } + try{ + m_breath = args.getS32("breath"); + }catch(SettingNotFoundException &e) { + m_breath = 11; + } inventory.deSerialize(is); - if(inventory.getList("craftpreview") == NULL) - { + if(inventory.getList("craftpreview") == NULL) { // Convert players without craftpreview inventory.addList("craftpreview", 1); @@ -210,19 +241,104 @@ void Player::deSerialize(std::istream &is) inventory.getList("craftresult")->changeItem(0, ItemStack()); } } + + // Set m_last_* + checkModified(); } -/* - RemotePlayer -*/ +u32 Player::addHud(HudElement *toadd) +{ + u32 id = getFreeHudID(); + + if (id < hud.size()) + hud[id] = toadd; + else + hud.push_back(toadd); + + return id; +} + +HudElement* Player::getHud(u32 id) +{ + if (id < hud.size()) + return hud[id]; + + return NULL; +} +HudElement* Player::removeHud(u32 id) +{ + HudElement* retval = NULL; + if (id < hud.size()) { + retval = hud[id]; + hud[id] = NULL; + } + return retval; +} +void Player::clearHud() +{ + while(!hud.empty()) { + delete hud.back(); + hud.pop_back(); + } +} +void RemotePlayer::save(std::string savedir) +{ + /* + * We have to open all possible player files in the players directory + * and check their player names because some file systems are not + * case-sensitive and player names are case-sensitive. + */ + + // A player to deserialize files into to check their names + RemotePlayer testplayer(m_gamedef); + + savedir += DIR_DELIM; + std::string path = savedir + m_name; + for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { + if (!fs::PathExists(path)) { + // Open file and serialize + std::ostringstream ss(std::ios_base::binary); + serialize(ss); + if (!fs::safeWriteToFile(path, ss.str())) { + infostream << "Failed to write " << path << std::endl; + } + return; + } + // Open file and deserialize + std::ifstream is(path.c_str(), std::ios_base::binary); + if (!is.good()) { + infostream << "Failed to open " << path << std::endl; + 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); + serialize(ss); + if (!fs::safeWriteToFile(path, ss.str())) { + infostream << "Failed to write " << path << std::endl; + } + return; + } + path = savedir + m_name + itos(i); + } + + infostream << "Didn't find free file for player " << m_name << std::endl; + return; +} +/* + RemotePlayer +*/ void RemotePlayer::setPosition(const v3f &position) { Player::setPosition(position); if(m_sao) m_sao->setBasePosition(position); } +