@Override public boolean unload(boolean save, boolean safe) { LevelProvider level = this.getProvider(); if (level == null) { return true; } if (save && this.hasChanged) { level.saveChunk(this.vector2); } if (safe) { for (Entity entity : this.getEntities().values()) { if (entity instanceof Player) { return false; } } } for (Entity entity : new ArrayList<>(this.getEntities().values())) { if (entity instanceof Player) { continue; } entity.close(); } for (BlockEntity blockEntity : new ArrayList<>(this.getBlockEntities().values())) { blockEntity.close(); } this.provider = null; return true; }
public void initChunk() { if (this.getProvider() != null && !this.isInit) { boolean changed = false; if (this.NBTentities != null) { this.getProvider().getLevel().timings.syncChunkLoadEntitiesTimer.startTiming(); for (CompoundTag nbt : NBTentities) { if (!nbt.contains("id")) { this.setChanged(); continue; } ListTag pos = nbt.getList("Pos"); if ((((NumberTag) pos.get(0)).getData().intValue() >> 4) != this.vector2.x || ((((NumberTag) pos.get(2)).getData().intValue() >> 4) != this.vector2.z)) { changed = true; continue; } Entity entity = Entity.createEntity(nbt.getString("id"), this, nbt); if (entity != null) { entity.spawnToAll(); } else { changed = true; continue; } } this.getProvider().getLevel().timings.syncChunkLoadEntitiesTimer.stopTiming(); this.getProvider().getLevel().timings.syncChunkLoadBlockEntitiesTimer.startTiming(); for (CompoundTag nbt : NBTtiles) { if (nbt != null) { if (!nbt.contains("id")) { changed = true; continue; } if ((nbt.getInt("x") >> 4) != this.vector2.x || ((nbt.getInt("z") >> 4) != this.vector2.z)) { changed = true; continue; } BlockEntity blockEntity = BlockEntity.createBlockEntity(nbt.getString("id"), this, nbt); if (blockEntity == null) { changed = true; continue; } } } this.getProvider().getLevel().timings.syncChunkLoadBlockEntitiesTimer.stopTiming(); this.NBTentities = null; this.NBTtiles = null; } this.setChanged(changed); this.isInit = true; } }
@Override public void removeBlockEntity(BlockEntity blockEntity) { this.tiles.remove(blockEntity.getId()); int index = ((blockEntity.z & 0x0f) << 12) | ((blockEntity.x & 0x0f) << 8) | (blockEntity.y & 0xff); this.tileList.remove(index); if (this.isInit) { this.hasChanged = true; } }
@Override public void addBlockEntity(BlockEntity blockEntity) { this.tiles.put(blockEntity.getId(), blockEntity); int index = (((int) blockEntity.z & 0x0f) << 12) | (((int) blockEntity.x & 0x0f) << 8) | ((int) blockEntity.y & 0xff); if (this.tileList.containsKey(index) && !this.tileList.get(index).equals(blockEntity)) { this.tileList.get(index).close(); } this.tileList.put(index, blockEntity); if (this.isInit) { this.hasChanged = true; } }