summaryrefslogtreecommitdiffstats
path: root/src/Bindings/LuaWindow.cpp
diff options
context:
space:
mode:
authorLukas Pioch <lukas@zgow.de>2017-05-29 21:33:30 +0200
committerLukas Pioch <lukas@zgow.de>2017-06-05 15:14:23 +0200
commit7922e6addb06de89cc73c64d30321aa6710e30ce (patch)
tree8b35b17e08f41bf535ec25844bc7648697b083ec /src/Bindings/LuaWindow.cpp
parentAvoid pickups to sink into blocks and disappear (#3739) (diff)
downloadcuberite-7922e6addb06de89cc73c64d30321aa6710e30ce.tar
cuberite-7922e6addb06de89cc73c64d30321aa6710e30ce.tar.gz
cuberite-7922e6addb06de89cc73c64d30321aa6710e30ce.tar.bz2
cuberite-7922e6addb06de89cc73c64d30321aa6710e30ce.tar.lz
cuberite-7922e6addb06de89cc73c64d30321aa6710e30ce.tar.xz
cuberite-7922e6addb06de89cc73c64d30321aa6710e30ce.tar.zst
cuberite-7922e6addb06de89cc73c64d30321aa6710e30ce.zip
Diffstat (limited to 'src/Bindings/LuaWindow.cpp')
-rw-r--r--src/Bindings/LuaWindow.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/Bindings/LuaWindow.cpp b/src/Bindings/LuaWindow.cpp
index 83463520c..fd714390e 100644
--- a/src/Bindings/LuaWindow.cpp
+++ b/src/Bindings/LuaWindow.cpp
@@ -4,8 +4,10 @@
#include "Globals.h"
#include "LuaWindow.h"
+#include "../Entities/Player.h"
#include "../UI/SlotArea.h"
#include "PluginLua.h"
+#include "Root.h"
#include "lua/src/lauxlib.h" // Needed for LUA_REFNIL
@@ -51,6 +53,24 @@ cLuaWindow::~cLuaWindow()
{
m_Contents.RemoveListener(*this);
+ // Close open lua window from players, to avoid dangling pointers
+ class cPlayerCallback : public cPlayerListCallback
+ {
+ virtual bool Item(cPlayer * a_Player)
+ {
+ if (a_Player->GetWindow() == m_LuaWindow)
+ {
+ a_Player->CloseWindow(false);
+ }
+ return false;
+ }
+ cLuaWindow * m_LuaWindow;
+ public:
+ cPlayerCallback(cLuaWindow & a_LuaWindow) { m_LuaWindow = &a_LuaWindow; }
+ } PlayerCallback(*this);
+
+ cRoot::Get()->ForEachPlayer(PlayerCallback);
+
// Must delete slot areas now, because they are referencing this->m_Contents and would try to access it in cWindow's
// destructor, when the member is already gone.
for (cSlotAreas::iterator itr = m_SlotAreas.begin(), end = m_SlotAreas.end(); itr != end; ++itr)