summaryrefslogtreecommitdiffstats
path: root/src/NetherPortalScanner.cpp
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2020-04-05 14:41:14 +0200
committerTiger Wang <ziwei.tiger@outlook.com>2020-04-18 20:51:30 +0200
commite98f93a079c2cfea7b5478e2cb2934874e0b88e0 (patch)
treebf4726fd6c2a31da5bb6aab973354654a88f13ce /src/NetherPortalScanner.cpp
parentAdd API documentation for repeater metadata constants (diff)
downloadcuberite-e98f93a079c2cfea7b5478e2cb2934874e0b88e0.tar
cuberite-e98f93a079c2cfea7b5478e2cb2934874e0b88e0.tar.gz
cuberite-e98f93a079c2cfea7b5478e2cb2934874e0b88e0.tar.bz2
cuberite-e98f93a079c2cfea7b5478e2cb2934874e0b88e0.tar.lz
cuberite-e98f93a079c2cfea7b5478e2cb2934874e0b88e0.tar.xz
cuberite-e98f93a079c2cfea7b5478e2cb2934874e0b88e0.tar.zst
cuberite-e98f93a079c2cfea7b5478e2cb2934874e0b88e0.zip
Diffstat (limited to 'src/NetherPortalScanner.cpp')
-rw-r--r--src/NetherPortalScanner.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/NetherPortalScanner.cpp b/src/NetherPortalScanner.cpp
index 8de0a6dcc..386da61fb 100644
--- a/src/NetherPortalScanner.cpp
+++ b/src/NetherPortalScanner.cpp
@@ -17,8 +17,9 @@ const double cNetherPortalScanner::AcrossOffset = 0.5;
-cNetherPortalScanner::cNetherPortalScanner(cEntity * a_MovingEntity, cWorld * a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY) :
- m_Entity(a_MovingEntity),
+cNetherPortalScanner::cNetherPortalScanner(cEntity & a_MovingEntity, cWorld * a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY) :
+ m_EntityID(a_MovingEntity.GetUniqueID()),
+ m_SourceWorld(*a_MovingEntity.GetWorld()),
m_World(a_DestinationWorld),
m_FoundPortal(false),
m_BuildPlatform(true),
@@ -296,8 +297,18 @@ void cNetherPortalScanner::OnDisabled(void)
Position.z += OutOffset;
}
- FLOGD("Placing player at {0}", Position);
- m_Entity->MoveToWorld(m_World, Position, true, false);
+ // Lookup our warping entity by ID
+ // Necessary as they may have been destroyed in the meantime (#4582)
+ m_SourceWorld.DoWithEntityByID(
+ m_EntityID,
+ [this, &Position](cEntity & a_Entity)
+ {
+ FLOGD("Placing player at {0}", Position);
+ a_Entity.MoveToWorld(m_World, Position, true, false);
+ return true;
+ }
+ );
+
delete this;
}