Translated using Weblate (Italian)
[oweals/minetest.git] / src / player.cpp
index 1ff953253a0ca030a952fc8b737a837b7a5d30ec..d3ba5c2c20e9944e531f14506e289d81fd0f7dde 100644 (file)
@@ -36,7 +36,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);
@@ -74,13 +73,46 @@ Player::Player(const char *name, IItemDefManager *idef):
                HUD_FLAG_MINIMAP_RADAR_VISIBLE;
 
        hud_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT;
+
+       m_player_settings.readGlobalSettings();
+       // Register player setting callbacks
+       for (const std::string &name : m_player_settings.setting_names)
+               g_settings->registerChangedCallback(name,
+                       &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);
@@ -126,3 +158,20 @@ void Player::clearHud()
                hud.pop_back();
        }
 }
+
+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)
+{
+       ((PlayerSettings *)data)->readGlobalSettings();
+}