diff options
author | Tiger Wang <ziwei.tiger@hotmail.co.uk> | 2017-08-27 23:37:39 +0200 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@hotmail.co.uk> | 2017-08-30 19:00:17 +0200 |
commit | 5481249d0f6025251e811f2e35daa79ee7c258aa (patch) | |
tree | 6f2bfd59cbf4d11b1236b8c24e1b1b7dd09077f5 /src/UI/VillagerTradeWindow.h | |
parent | Merge pull request #3969 from peterbell10/cuboid (diff) | |
download | cuberite-VillagerTrading.tar cuberite-VillagerTrading.tar.gz cuberite-VillagerTrading.tar.bz2 cuberite-VillagerTrading.tar.lz cuberite-VillagerTrading.tar.xz cuberite-VillagerTrading.tar.zst cuberite-VillagerTrading.zip |
Diffstat (limited to 'src/UI/VillagerTradeWindow.h')
-rw-r--r-- | src/UI/VillagerTradeWindow.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/UI/VillagerTradeWindow.h b/src/UI/VillagerTradeWindow.h new file mode 100644 index 000000000..ec5ea26e7 --- /dev/null +++ b/src/UI/VillagerTradeWindow.h @@ -0,0 +1,74 @@ + +#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<cSlotAreaVillagerTrade *>(m_SlotAreas[0])->UpdateTrade(Player); + m_Villager.HandleTradeInProgress(); + } + + unsigned GetPlayerTradeOfferIndex(const cPlayer & Player) + { + return m_TradeIndexOpenedByPlayer[&Player]; + } + +private: + cVillager & m_Villager; + std::unordered_map<const cPlayer *, unsigned> m_TradeIndexOpenedByPlayer; +}; |