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:
Ayush Thoren
2026-03-13 04:16:05 -07:00
committed by GitHub
parent ad74d44300
commit d131a551bf
4 changed files with 32 additions and 1 deletions

View File

@@ -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);
} }
} }
} }

View File

@@ -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);

View File

@@ -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);
} }
} }
} }

View File

@@ -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)
{ {