]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/player.cpp
DevTest: Fix broken PNG textures
[dragonfireclient.git] / src / player.cpp
index c7036663a63af13e35e19686989574a35ffc47a8..1e064c1dac557d43c92ab9663c9d552f4c3f8e7b 100644 (file)
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "player.h"
 
+#include <cmath>
 #include "threading/mutex_auto_lock.h"
 #include "util/numeric.h"
 #include "hud.h"
@@ -36,7 +37,6 @@ Player::Player(const char *name, IItemDefManager *idef):
 
        inventory.clear();
        inventory.addList("main", PLAYER_INVENTORY_SIZE);
-       inventory.addList("hand", 1);
        InventoryList *craft = inventory.addList("craft", 9);
        craft->setWidth(3);
        inventory.addList("craftpreview", 1);
@@ -71,30 +71,49 @@ Player::Player(const char *name, IItemDefManager *idef):
                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_FLAG_MINIMAP_RADAR_VISIBLE;
+               HUD_FLAG_MINIMAP_RADAR_VISIBLE | HUD_FLAG_BASIC_DEBUG;
 
        hud_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT;
 
        m_player_settings.readGlobalSettings();
-       g_settings->registerChangedCallback("free_move", &Player::settingsChangedCallback,
-                       &m_player_settings);
-       g_settings->registerChangedCallback("fast_move", &Player::settingsChangedCallback,
-                       &m_player_settings);
-       g_settings->registerChangedCallback("continuous_forward",
+       // Register player setting callbacks
+       for (const std::string &name : m_player_settings.setting_names)
+               g_settings->registerChangedCallback(name,
                        &Player::settingsChangedCallback, &m_player_settings);
-       g_settings->registerChangedCallback("always_fly_fast",
-                       &Player::settingsChangedCallback, &m_player_settings);
-       g_settings->registerChangedCallback("aux1_descends",
-                       &Player::settingsChangedCallback, &m_player_settings);
-       g_settings->registerChangedCallback(
-                       "noclip", &Player::settingsChangedCallback, &m_player_settings);
 }
 
 Player::~Player()
 {
+       // m_player_settings becomes invalid, remove callbacks
+       for (const std::string &name : m_player_settings.setting_names)
+               g_settings->deregisterChangedCallback(name,
+                       &Player::settingsChangedCallback, &m_player_settings);
        clearHud();
 }
 
+void Player::setWieldIndex(u16 index)
+{
+       const InventoryList *mlist = inventory.getList("main");
+       m_wield_index = MYMIN(index, mlist ? mlist->getSize() : 0);
+}
+
+ItemStack &Player::getWieldedItem(ItemStack *selected, ItemStack *hand) const
+{
+       assert(selected);
+
+       const InventoryList *mlist = inventory.getList("main"); // TODO: Make this generic
+       const InventoryList *hlist = inventory.getList("hand");
+
+       if (mlist && m_wield_index < mlist->getSize())
+               *selected = mlist->getItem(m_wield_index);
+
+       if (hand && hlist)
+               *hand = hlist->getItem(0);
+
+       // Return effective tool item
+       return (hand && selected->name.empty()) ? *hand : *selected;
+}
+
 u32 Player::addHud(HudElement *toadd)
 {
        MutexAutoLock lock(m_mutex);
@@ -141,14 +160,74 @@ void Player::clearHud()
        }
 }
 
+#ifndef SERVER
+
+u32 PlayerControl::getKeysPressed() const
+{
+       u32 keypress_bits =
+               ( (u32)(jump  & 1) << 4) |
+               ( (u32)(aux1  & 1) << 5) |
+               ( (u32)(sneak & 1) << 6) |
+               ( (u32)(dig   & 1) << 7) |
+               ( (u32)(place & 1) << 8) |
+               ( (u32)(zoom  & 1) << 9)
+       ;
+
+       // If any direction keys are pressed pass those through
+       if (direction_keys != 0)
+       {
+               keypress_bits |= direction_keys;
+       }
+       // Otherwise set direction keys based on joystick movement (for mod compatibility)
+       else if (isMoving())
+       {
+               float abs_d;
+
+               // (absolute value indicates forward / backward)
+               abs_d = abs(movement_direction);
+               if (abs_d < 3.0f / 8.0f * M_PI)
+                       keypress_bits |= (u32)1; // Forward
+               if (abs_d > 5.0f / 8.0f * M_PI)
+                       keypress_bits |= (u32)1 << 1; // Backward
+
+               // rotate entire coordinate system by 90 degree
+               abs_d = movement_direction + M_PI_2;
+               if (abs_d >= M_PI)
+                       abs_d -= 2 * M_PI;
+               abs_d = abs(abs_d);
+               // (value now indicates left / right)
+               if (abs_d < 3.0f / 8.0f * M_PI)
+                       keypress_bits |= (u32)1 << 2; // Left
+               if (abs_d > 5.0f / 8.0f * M_PI)
+                       keypress_bits |= (u32)1 << 3; // Right
+       }
+
+       return keypress_bits;
+}
+
+#endif
+
+void PlayerControl::unpackKeysPressed(u32 keypress_bits)
+{
+       direction_keys = keypress_bits & 0xf;
+       jump  = keypress_bits & (1 << 4);
+       aux1  = keypress_bits & (1 << 5);
+       sneak = keypress_bits & (1 << 6);
+       dig   = keypress_bits & (1 << 7);
+       place = keypress_bits & (1 << 8);
+       zoom  = keypress_bits & (1 << 9);
+}
+
 void PlayerSettings::readGlobalSettings()
 {
        free_move = g_settings->getBool("free_move");
+       pitch_move = g_settings->getBool("pitch_move");
        fast_move = g_settings->getBool("fast_move");
        continuous_forward = g_settings->getBool("continuous_forward");
        always_fly_fast = g_settings->getBool("always_fly_fast");
        aux1_descends = g_settings->getBool("aux1_descends");
        noclip = g_settings->getBool("noclip");
+       autojump = g_settings->getBool("autojump");
 }
 
 void Player::settingsChangedCallback(const std::string &name, void *data)