1
0
Fork 0
cuberite-2a/src/UI/WindowOwner.h

101 lines
1.7 KiB
C++

#pragma once
#include "../BlockEntities/BlockEntity.h"
#include "../Entities/Entity.h"
#include "Window.h"
/* Being a descendant of cWindowOwner means that the class can own one window. That window can be
queried, opened by other players, closed by players and finally destroyed.
Also, a cWindowOwner can be queried for the block coords where the window is displayed. That will be used
for entities / players in motion to close their windows when they get too far away from the window "source". */
/** Base class for the window owning */
class cWindowOwner
{
public:
cWindowOwner() :
m_Window(nullptr)
{
}
virtual ~cWindowOwner()
{
}
void CloseWindow(void)
{
m_Window = nullptr;
}
void OpenWindow(cWindow * a_Window)
{
m_Window = a_Window;
m_Window->SetOwner(this);
}
cWindow * GetWindow(void) const
{
return m_Window;
}
/** Returns the block position at which the element owning the window is */
virtual Vector3i GetBlockPos(void) = 0;
private:
cWindow * m_Window;
};
/** Window owner that is associated with a block entity (chest, furnace, ...) */
class cBlockEntityWindowOwner :
public cWindowOwner
{
public:
cBlockEntityWindowOwner(cBlockEntity * a_BlockEntity) :
m_BlockEntity(a_BlockEntity)
{
}
virtual Vector3i GetBlockPos(void) override
{
return Vector3i(m_BlockEntity->GetPosX(), m_BlockEntity->GetPosY(), m_BlockEntity->GetPosZ());
}
private:
cBlockEntity * m_BlockEntity;
};
/** Window owner that is associated with an entity (chest minecart etc.) */
class cEntityWindowOwner :
public cWindowOwner
{
public:
cEntityWindowOwner(cEntity * a_Entity) :
m_Entity(a_Entity)
{
}
virtual Vector3i GetBlockPos(void) override
{
return m_Entity->GetPosition().Floor();
}
private:
cEntity * m_Entity;
};