#pragma once #include "Window.h" #include "SlotArea.h" #include "../Mobs/Villager.h" class cVillagerTradeWindow : public cWindow { typedef cWindow super; public: cVillagerTradeWindow(cVillager & Villager) : cWindow(wtVillagerTrade, Printf("Villager № %i", Villager.GetUniqueID())), m_Villager(Villager) { m_SlotAreas.push_back(new cSlotAreaVillagerTrade(m_Villager, *this)); m_SlotAreas.push_back(new cSlotAreaInventory(*this)); m_SlotAreas.push_back(new cSlotAreaHotBar(*this)); } virtual void DistributeStack(cItem & a_ItemStack, int a_Slot, cPlayer & a_Player, cSlotArea * a_ClickedArea, bool a_ShouldApply) override { cSlotAreas AreasInOrder; if (a_ClickedArea == m_SlotAreas[0]) { // Trading Area AreasInOrder.push_back(m_SlotAreas[1]); /* Inventory */ AreasInOrder.push_back(m_SlotAreas[2]); /* Hotbar */ super::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true); } else if (a_ClickedArea == m_SlotAreas[1]) { // Inventory AreasInOrder.push_back(m_SlotAreas[2]); /* Hotbar */ super::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true); } else { // Hotbar AreasInOrder.push_back(m_SlotAreas[1]); /* Inventory */ super::DistributeStackToAreas(a_ItemStack, a_Player, AreasInOrder, a_ShouldApply, true); } } virtual void OpenedByPlayer(cPlayer & Player) override { super::OpenedByPlayer(Player); m_TradeIndexOpenedByPlayer[&Player] = 0; m_Villager.HandleTradeInProgress(); } void PlayerChangedTradeOffer(const cPlayer & Player, unsigned NewIndex) { m_TradeIndexOpenedByPlayer[&Player] = NewIndex; static_cast(m_SlotAreas[0])->UpdateTrade(Player); m_Villager.HandleTradeInProgress(); } unsigned GetPlayerTradeOfferIndex(const cPlayer & Player) { return m_TradeIndexOpenedByPlayer[&Player]; } private: cVillager & m_Villager; std::unordered_map m_TradeIndexOpenedByPlayer; };