Fix mounted minecarts not persisting across world reloads (#979)
* Fix mounted minecarts not persisting across world reloads Signed-off-by: Ayush Thoren <ayushthoren@gmail.com> * Apply patch --------- Signed-off-by: Ayush Thoren <ayushthoren@gmail.com>
This commit is contained in:
@@ -1222,6 +1222,30 @@ void LevelChunk::addEntity(shared_ptr<Entity> e)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LevelChunk::addRidingEntities(shared_ptr<Entity> rider, CompoundTag *riderTag)
|
||||||
|
{
|
||||||
|
#ifdef _LARGE_WORLDS #This shouldnt be called when we dont have large worlds enabled
|
||||||
|
CompoundTag *mountTag = riderTag;
|
||||||
|
shared_ptr<Entity> ridingEntity = rider;
|
||||||
|
|
||||||
|
while (mountTag != NULL && mountTag->contains(Entity::RIDING_TAG))
|
||||||
|
{
|
||||||
|
CompoundTag *nextMountTag = mountTag->getCompound(Entity::RIDING_TAG);
|
||||||
|
shared_ptr<Entity> mount = EntityIO::loadStatic(nextMountTag, level);
|
||||||
|
if (mount == NULL)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mount->onLoadedFromSave();
|
||||||
|
addEntity(mount);
|
||||||
|
ridingEntity->ride(mount);
|
||||||
|
|
||||||
|
ridingEntity = mount;
|
||||||
|
mountTag = nextMountTag;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
void LevelChunk::removeEntity(shared_ptr<Entity> e)
|
void LevelChunk::removeEntity(shared_ptr<Entity> e)
|
||||||
{
|
{
|
||||||
@@ -1431,6 +1455,7 @@ void LevelChunk::load()
|
|||||||
{
|
{
|
||||||
ent->onLoadedFromSave();
|
ent->onLoadedFromSave();
|
||||||
addEntity(ent);
|
addEntity(ent);
|
||||||
|
addRidingEntities(ent, teTag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ public:
|
|||||||
virtual void setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness);
|
virtual void setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness);
|
||||||
virtual int getRawBrightness(int x, int y, int z, int skyDampen);
|
virtual int getRawBrightness(int x, int y, int z, int skyDampen);
|
||||||
virtual void addEntity(shared_ptr<Entity> e);
|
virtual void addEntity(shared_ptr<Entity> e);
|
||||||
|
virtual void addRidingEntities(shared_ptr<Entity> rider, CompoundTag *riderTag);
|
||||||
virtual void removeEntity(shared_ptr<Entity> e);
|
virtual void removeEntity(shared_ptr<Entity> e);
|
||||||
virtual void removeEntity(shared_ptr<Entity> e, int yc);
|
virtual void removeEntity(shared_ptr<Entity> e, int yc);
|
||||||
virtual bool isSkyLit(int x, int y, int z);
|
virtual bool isSkyLit(int x, int y, int z);
|
||||||
|
|||||||
@@ -403,6 +403,7 @@ void OldChunkStorage::loadEntities(LevelChunk *lc, Level *level, CompoundTag *ta
|
|||||||
if (te != nullptr)
|
if (te != nullptr)
|
||||||
{
|
{
|
||||||
lc->addEntity(te);
|
lc->addEntity(te);
|
||||||
|
lc->addRidingEntities(te, teTag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,7 +194,11 @@ void ZonedChunkStorage::loadEntities(Level *level, LevelChunk *lc)
|
|||||||
if (type == 0)
|
if (type == 0)
|
||||||
{
|
{
|
||||||
shared_ptr<Entity> e = EntityIO::loadStatic(tag, level);
|
shared_ptr<Entity> e = EntityIO::loadStatic(tag, level);
|
||||||
if (e != nullptr) lc->addEntity(e);
|
if (e != nullptr)
|
||||||
|
{
|
||||||
|
lc->addEntity(e);
|
||||||
|
lc->addRidingEntities(e, tag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (type == 1)
|
else if (type == 1)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user