Skip to content

Commit

Permalink
Fixed mobs burn from sun below schematics blocks even when lights-upd…
Browse files Browse the repository at this point in the history
…ate is enabled (#1678)
  • Loading branch information
OmerBenGera committed Apr 11, 2023
1 parent b5a71be commit 3b448ee
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 72 deletions.
Expand Up @@ -52,21 +52,32 @@
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;

public class WorldEditSessionImpl implements WorldEditSession {

private static final ReflectField<Biome[]> BIOME_BASE_ARRAY = new ReflectField<>(
ChunkBiomeContainer.class, Biome[].class, "f");

private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();
private static final boolean isStarLightInterface = ((Supplier<Boolean>) () -> {
try {
Class.forName("ca.spottedleaf.starlight.common.light.StarLightInterface");
return true;
} catch (ClassNotFoundException error) {
return false;
}
}).get();

private final Map<Long, ChunkData> chunks = new HashMap<>();
private final List<Pair<BlockPos, BlockState>> blocksToUpdate = new LinkedList<>();
private final List<Pair<BlockPos, CompoundTag>> blockEntities = new LinkedList<>();

private final Set<ChunkPos> lightenChunks = isStarLightInterface ? new HashSet<>() : Collections.emptySet();
private final ServerLevel serverLevel;

public WorldEditSessionImpl(ServerLevel serverLevel) {
Expand Down Expand Up @@ -120,7 +131,7 @@ public void setBlock(Location location, int combinedId, @Nullable CompoundTag st

ChunkData chunkData = this.chunks.computeIfAbsent(chunkPos.toLong(), ChunkData::new);

if (plugin.getSettings().isLightsUpdate() && blockState.getLightEmission() > 0)
if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && blockState.getLightEmission() > 0)
chunkData.lights.add(blockPos);

LevelChunkSection levelChunkSection = chunkData.chunkSections[serverLevel.getSectionIndex(blockPos.getY())];
Expand Down Expand Up @@ -174,12 +185,15 @@ public void applyBlocks(Chunk bukkitChunk) {
Arrays.fill(biomes, biome);
}

// Update lights
if (plugin.getSettings().isLightsUpdate() && !chunkData.lights.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
if (plugin.getSettings().isLightsUpdate()) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
}
}

levelChunk.setUnsaved(true);
Expand Down Expand Up @@ -215,6 +229,14 @@ public void finish(Island island) {
worldBlockEntity.load(blockEntityCompound);
}
});

if (plugin.getSettings().isLightsUpdate() && isStarLightInterface && !lightenChunks.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
threadedLevelLightEngine.relight(lightenChunks, chunkCallback -> {
}, completeCallback -> {
});
this.lightenChunks.clear();
}
}

private boolean isValidPosition(BlockPos blockPos) {
Expand Down
Expand Up @@ -51,17 +51,29 @@
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;

public class WorldEditSessionImpl implements WorldEditSession {

private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();
private static final boolean isStarLightInterface = ((Supplier<Boolean>) () -> {
try {
Class.forName("ca.spottedleaf.starlight.common.light.StarLightInterface");
return true;
} catch (ClassNotFoundException error) {
return false;
}
}).get();

private final Map<Long, ChunkData> chunks = new HashMap<>();
private final List<Pair<BlockPos, BlockState>> blocksToUpdate = new LinkedList<>();
private final List<Pair<BlockPos, CompoundTag>> blockEntities = new LinkedList<>();
private final Set<ChunkPos> lightenChunks = isStarLightInterface ? new HashSet<>() : Collections.emptySet();
private final ServerLevel serverLevel;

public WorldEditSessionImpl(ServerLevel serverLevel) {
Expand Down Expand Up @@ -115,7 +127,7 @@ public void setBlock(Location location, int combinedId, @Nullable CompoundTag st

ChunkData chunkData = this.chunks.computeIfAbsent(chunkPos.toLong(), ChunkData::new);

if (plugin.getSettings().isLightsUpdate() && blockState.getLightEmission() > 0)
if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && blockState.getLightEmission() > 0)
chunkData.lights.add(blockPos);

LevelChunkSection levelChunkSection = chunkData.chunkSections[serverLevel.getSectionIndex(blockPos.getY())];
Expand Down Expand Up @@ -160,12 +172,15 @@ public void applyBlocks(Chunk bukkitChunk) {
levelChunk.setHeightmap(type, heightmap.getRawData());
}));

// Update lights
if (plugin.getSettings().isLightsUpdate() && !chunkData.lights.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
if (plugin.getSettings().isLightsUpdate()) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
}
}

levelChunk.setUnsaved(true);
Expand Down Expand Up @@ -201,6 +216,14 @@ public void finish(Island island) {
worldBlockEntity.load(blockEntityCompound);
}
});

if (plugin.getSettings().isLightsUpdate() && isStarLightInterface && !lightenChunks.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
threadedLevelLightEngine.relight(lightenChunks, chunkCallback -> {
}, completeCallback -> {
});
this.lightenChunks.clear();
}
}

private boolean isValidPosition(BlockPos blockPos) {
Expand Down
Expand Up @@ -51,17 +51,29 @@
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;

public class WorldEditSessionImpl implements WorldEditSession {

private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();
private static final boolean isStarLightInterface = ((Supplier<Boolean>) () -> {
try {
Class.forName("ca.spottedleaf.starlight.common.light.StarLightInterface");
return true;
} catch (ClassNotFoundException error) {
return false;
}
}).get();

private final Map<Long, ChunkData> chunks = new HashMap<>();
private final List<Pair<BlockPos, BlockState>> blocksToUpdate = new LinkedList<>();
private final List<Pair<BlockPos, CompoundTag>> blockEntities = new LinkedList<>();
private final Set<ChunkPos> lightenChunks = isStarLightInterface ? new HashSet<>() : Collections.emptySet();
private final ServerLevel serverLevel;

public WorldEditSessionImpl(ServerLevel serverLevel) {
Expand Down Expand Up @@ -115,7 +127,7 @@ public void setBlock(Location location, int combinedId, @Nullable CompoundTag st

ChunkData chunkData = this.chunks.computeIfAbsent(chunkPos.toLong(), ChunkData::new);

if (plugin.getSettings().isLightsUpdate() && blockState.getLightEmission() > 0)
if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && blockState.getLightEmission() > 0)
chunkData.lights.add(blockPos);

LevelChunkSection levelChunkSection = chunkData.chunkSections[serverLevel.getSectionIndex(blockPos.getY())];
Expand Down Expand Up @@ -160,12 +172,15 @@ public void applyBlocks(Chunk bukkitChunk) {
levelChunk.setHeightmap(type, heightmap.getRawData());
}));

// Update lights
if (plugin.getSettings().isLightsUpdate() && !chunkData.lights.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
if (plugin.getSettings().isLightsUpdate()) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
}
}

levelChunk.setUnsaved(true);
Expand Down Expand Up @@ -201,6 +216,14 @@ public void finish(Island island) {
worldBlockEntity.load(blockEntityCompound);
}
});

if (plugin.getSettings().isLightsUpdate() && isStarLightInterface && !lightenChunks.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
threadedLevelLightEngine.relight(lightenChunks, chunkCallback -> {
}, completeCallback -> {
});
this.lightenChunks.clear();
}
}

private boolean isValidPosition(BlockPos blockPos) {
Expand Down
Expand Up @@ -51,17 +51,29 @@
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;

public class WorldEditSessionImpl implements WorldEditSession {

private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();
private static final boolean isStarLightInterface = ((Supplier<Boolean>) () -> {
try {
Class.forName("ca.spottedleaf.starlight.common.light.StarLightInterface");
return true;
} catch (ClassNotFoundException error) {
return false;
}
}).get();

private final Map<Long, ChunkData> chunks = new HashMap<>();
private final List<Pair<BlockPos, BlockState>> blocksToUpdate = new LinkedList<>();
private final List<Pair<BlockPos, CompoundTag>> blockEntities = new LinkedList<>();
private final Set<ChunkPos> lightenChunks = isStarLightInterface ? new HashSet<>() : Collections.emptySet();
private final ServerLevel serverLevel;

public WorldEditSessionImpl(ServerLevel serverLevel) {
Expand Down Expand Up @@ -115,7 +127,7 @@ public void setBlock(Location location, int combinedId, @Nullable CompoundTag st

ChunkData chunkData = this.chunks.computeIfAbsent(chunkPos.toLong(), ChunkData::new);

if (plugin.getSettings().isLightsUpdate() && blockState.getLightEmission() > 0)
if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && blockState.getLightEmission() > 0)
chunkData.lights.add(blockPos);

LevelChunkSection levelChunkSection = chunkData.chunkSections[serverLevel.getSectionIndex(blockPos.getY())];
Expand Down Expand Up @@ -160,12 +172,15 @@ public void applyBlocks(Chunk bukkitChunk) {
levelChunk.setHeightmap(type, heightmap.getRawData());
}));

// Update lights
if (plugin.getSettings().isLightsUpdate() && !chunkData.lights.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
if (plugin.getSettings().isLightsUpdate()) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
}
}

levelChunk.setUnsaved(true);
Expand Down Expand Up @@ -201,6 +216,14 @@ public void finish(Island island) {
worldBlockEntity.load(blockEntityCompound);
}
});

if (plugin.getSettings().isLightsUpdate() && isStarLightInterface && !lightenChunks.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
threadedLevelLightEngine.relight(lightenChunks, chunkCallback -> {
}, completeCallback -> {
});
this.lightenChunks.clear();
}
}

private boolean isValidPosition(BlockPos blockPos) {
Expand Down
Expand Up @@ -127,13 +127,8 @@ public void setBlock(Location location, int combinedId, @Nullable CompoundTag st

ChunkData chunkData = this.chunks.computeIfAbsent(chunkPos.toLong(), ChunkData::new);

if (plugin.getSettings().isLightsUpdate() && blockState.getLightEmission() > 0) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
chunkData.lights.add(blockPos);
}
}
if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && blockState.getLightEmission() > 0)
chunkData.lights.add(blockPos);

LevelChunkSection levelChunkSection = chunkData.chunkSections[serverLevel.getSectionIndex(blockPos.getY())];

Expand Down Expand Up @@ -178,11 +173,15 @@ public void applyBlocks(Chunk bukkitChunk) {
levelChunk.setHeightmap(type, heightmap.getRawData());
}));

if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && !chunkData.lights.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
if (plugin.getSettings().isLightsUpdate()) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
}
}

levelChunk.setUnsaved(true);
Expand Down Expand Up @@ -224,6 +223,7 @@ public void finish(Island island) {
threadedLevelLightEngine.relight(lightenChunks, chunkCallback -> {
}, completeCallback -> {
});
this.lightenChunks.clear();
}

}
Expand Down
Expand Up @@ -128,13 +128,8 @@ public void setBlock(Location location, int combinedId, @Nullable CompoundTag st

ChunkData chunkData = this.chunks.computeIfAbsent(chunkPos.toLong(), ChunkData::new);

if (plugin.getSettings().isLightsUpdate() && blockState.getLightEmission() > 0) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
chunkData.lights.add(blockPos);
}
}
if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && blockState.getLightEmission() > 0)
chunkData.lights.add(blockPos);

LevelChunkSection levelChunkSection = chunkData.chunkSections[serverLevel.getSectionIndex(blockPos.getY())];

Expand Down Expand Up @@ -179,11 +174,15 @@ public void applyBlocks(Chunk bukkitChunk) {
levelChunk.setHeightmap(type, heightmap.getRawData());
}));

if (plugin.getSettings().isLightsUpdate() && !isStarLightInterface && !chunkData.lights.isEmpty()) {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
if (plugin.getSettings().isLightsUpdate()) {
if (isStarLightInterface) {
this.lightenChunks.add(chunkPos);
} else {
ThreadedLevelLightEngine threadedLevelLightEngine = serverLevel.getChunkSource().getLightEngine();
chunkData.lights.forEach(threadedLevelLightEngine::checkBlock);
// Queues chunk light for this chunk.
threadedLevelLightEngine.lightChunk(levelChunk, false);
}
}

levelChunk.setUnsaved(true);
Expand Down Expand Up @@ -225,6 +224,7 @@ public void finish(Island island) {
threadedLevelLightEngine.relight(lightenChunks, chunkCallback -> {
}, completeCallback -> {
});
this.lightenChunks.clear();
}

}
Expand Down

0 comments on commit 3b448ee

Please sign in to comment.