Skip to content

Commit

Permalink
render spawn chunks as lines
Browse files Browse the repository at this point in the history
  • Loading branch information
rfresh2 committed Feb 18, 2025
1 parent 7c6d29a commit e390c8b
Show file tree
Hide file tree
Showing 16 changed files with 95 additions and 174 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

import com.github.benmanes.caffeine.cache.AsyncLoadingCache;
import com.github.benmanes.caffeine.cache.Caffeine;
import net.minecraft.client.Minecraft;
import xaeroplus.Globals;
import xaeroplus.module.ModuleManager;
import xaeroplus.module.impl.TickTaskExecutor;
import xaeroplus.util.ChunkUtils;

import java.util.Collections;
Expand All @@ -21,7 +22,7 @@ public LineDrawFeature(LineProvider lineProvider, int refreshIntervalMs) {
this.lineRenderCache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.SECONDS)
.refreshAfterWrite(refreshIntervalMs, TimeUnit.MILLISECONDS)
.executor(Minecraft.getInstance())
.executor(ModuleManager.getModule(TickTaskExecutor.class))
.buildAsync(k -> loadLinesInWindow());
}

Expand Down
25 changes: 2 additions & 23 deletions common/src/main/java/xaeroplus/module/impl/SpawnChunks.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package xaeroplus.module.impl;

import it.unimi.dsi.fastutil.longs.Long2LongMap;
import it.unimi.dsi.fastutil.longs.Long2LongMaps;
import net.lenni0451.lambdaevents.EventHandler;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.resources.ResourceKey;
Expand All @@ -19,27 +17,8 @@ public void onClientTick(ClientTickEvent.Post event) {
}

@Override
public Long2LongMap entityProcessing(ResourceKey<Level> dimension) {
if (dimension != Level.OVERWORLD) return Long2LongMaps.EMPTY_MAP;
return entityProcessingCache;
}

@Override
public Long2LongMap redstoneProcessing(ResourceKey<Level> dimension) {
if (dimension != Level.OVERWORLD) return Long2LongMaps.EMPTY_MAP;
return redstoneProcessingCache;
}

@Override
public Long2LongMap lazyChunks(ResourceKey<Level> dimension) {
if (dimension != Level.OVERWORLD) return Long2LongMaps.EMPTY_MAP;
return lazyChunksCache;
}

@Override
public Long2LongMap outerChunks(ResourceKey<Level> dimension) {
if (dimension != Level.OVERWORLD) return Long2LongMaps.EMPTY_MAP;
return outerChunksCache;
public ResourceKey<Level> dimension() {
return Level.OVERWORLD;
}

@Override
Expand Down
145 changes: 88 additions & 57 deletions common/src/main/java/xaeroplus/module/impl/SpawnChunksBase.java
Original file line number Diff line number Diff line change
@@ -1,36 +1,35 @@
package xaeroplus.module.impl;

import it.unimi.dsi.fastutil.longs.Long2LongMap;
import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
import xaeroplus.Globals;
import xaeroplus.feature.render.Line;
import xaeroplus.module.Module;
import xaeroplus.settings.Settings;
import xaeroplus.util.ChunkUtils;
import xaeroplus.util.ColorHelper;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public abstract class SpawnChunksBase extends Module {
final String entityProcessingId = getClass().getName() + "$EntityProcessing";
final String redstoneProcessingId = getClass().getName() + "$RedstoneProcessing";
final String lazyChunkId = getClass().getName() + "$LazyChunk";
final String outerChunksId = getClass().getName() + "$OuterChunks";
final Long2LongMap entityProcessingCache = new Long2LongOpenHashMap();
final Long2LongMap redstoneProcessingCache = new Long2LongOpenHashMap();
final Long2LongMap lazyChunksCache = new Long2LongOpenHashMap();
final Long2LongMap outerChunksCache = new Long2LongOpenHashMap();
int entityProcessingColor = ColorHelper.getColor(0, 255, 0, 100);
int redstoneProcessingColor = ColorHelper.getColor(255, 0, 0, 100);
int lazyChunksColor = ColorHelper.getColor(0, 0, 255, 100);
int outerChunksColor = ColorHelper.getColor(255, 255, 0, 100);

public abstract Long2LongMap entityProcessing(ResourceKey<Level> dimension);

public abstract Long2LongMap redstoneProcessing(ResourceKey<Level> dimension);

public abstract Long2LongMap lazyChunks(ResourceKey<Level> dimension);

public abstract Long2LongMap outerChunks(ResourceKey<Level> dimension);
final List<Line> entityProcessingCache = new ArrayList<>();
final List<Line> redstoneProcessingCache = new ArrayList<>();
final List<Line> lazyChunksCache = new ArrayList<>();
final List<Line> outerChunksCache = new ArrayList<>();
int alpha = 204;
int entityProcessingColor = ColorHelper.getColor(0, 255, 0, alpha);
int redstoneProcessingColor = ColorHelper.getColor(255, 0, 0, alpha);
int lazyChunksColor = ColorHelper.getColor(0, 0, 255, alpha);
int outerChunksColor = ColorHelper.getColor(255, 255, 0, alpha);
float lineWidth = 0.1f;

public abstract ResourceKey<Level> dimension();

abstract int getSpawnRadius();

Expand All @@ -42,38 +41,62 @@ void onClientTick() {

@Override
public void onEnable() {
Globals.drawManager.registry().registerDirectChunkHighlightProvider(
Globals.drawManager.registry().registerLineProvider(
entityProcessingId,
true,
this::entityProcessing,
this::entityProcessingColor
this::entityProcessingColor,
this::getLineWidth,
50
);
Globals.drawManager.registry().registerDirectChunkHighlightProvider(
Globals.drawManager.registry().registerLineProvider(
redstoneProcessingId,
true,
this::redstoneProcessing,
this::redstoneProcessingColor
this::redstoneProcessingColor,
this::getLineWidth,
50
);
Globals.drawManager.registry().registerDirectChunkHighlightProvider(
Globals.drawManager.registry().registerLineProvider(
lazyChunkId,
true,
this::lazyChunks,
this::lazyChunksColor
this::lazyChunksColor,
this::getLineWidth,
50
);
Globals.drawManager.registry().registerDirectChunkHighlightProvider(
Globals.drawManager.registry().registerLineProvider(
outerChunksId,
true,
this::outerChunks,
this::outerChunksColor
this::outerChunksColor,
this::getLineWidth,
50
);
}

@Override
public void onDisable() {
Globals.drawManager.registry().unregisterChunkHighlightProvider(entityProcessingId);
Globals.drawManager.registry().unregisterChunkHighlightProvider(redstoneProcessingId);
Globals.drawManager.registry().unregisterChunkHighlightProvider(lazyChunkId);
Globals.drawManager.registry().unregisterChunkHighlightProvider(outerChunksId);
Globals.drawManager.registry().unregisterLineProvider(entityProcessingId);
Globals.drawManager.registry().unregisterLineProvider(redstoneProcessingId);
Globals.drawManager.registry().unregisterLineProvider(lazyChunkId);
Globals.drawManager.registry().unregisterLineProvider(outerChunksId);
}

public List<Line> entityProcessing(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, ResourceKey<Level> dimension) {
if (dimension != dimension()) return Collections.emptyList();
return entityProcessingCache;
}

public List<Line> redstoneProcessing(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, ResourceKey<Level> dimension) {
if (dimension != dimension()) return Collections.emptyList();
return redstoneProcessingCache;
}

public List<Line> lazyChunks(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, ResourceKey<Level> dimension) {
if (dimension != dimension()) return Collections.emptyList();
return lazyChunksCache;
}

public List<Line> outerChunks(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, ResourceKey<Level> dimension) {
if (dimension != dimension()) return Collections.emptyList();
return outerChunksCache;
}

int entityProcessingColor() {
Expand All @@ -93,28 +116,37 @@ int outerChunksColor() {
}

public void setEntityProcessingColor(final int color) {
entityProcessingColor = ColorHelper.getColorWithAlpha(color, Settings.REGISTRY.spawnChunksAlphaSetting.getAsInt());
entityProcessingColor = ColorHelper.getColorWithAlpha(color, alpha);
}

public void setRedstoneProcessingColor(final int color) {
redstoneProcessingColor = ColorHelper.getColorWithAlpha(color, Settings.REGISTRY.spawnChunksAlphaSetting.getAsInt());
redstoneProcessingColor = ColorHelper.getColorWithAlpha(color, alpha);
}

public void setLazyChunksColor(final int color) {
lazyChunksColor = ColorHelper.getColorWithAlpha(color, Settings.REGISTRY.spawnChunksAlphaSetting.getAsInt());
lazyChunksColor = ColorHelper.getColorWithAlpha(color, alpha);
}

public void setOuterChunksColor(final int color) {
outerChunksColor = ColorHelper.getColorWithAlpha(color, Settings.REGISTRY.spawnChunksAlphaSetting.getAsInt());
outerChunksColor = ColorHelper.getColorWithAlpha(color, alpha);
}

public void setAlpha(final int alpha) {
this.alpha = alpha;
setEntityProcessingColor(entityProcessingColor);
setRedstoneProcessingColor(redstoneProcessingColor);
setLazyChunksColor(lazyChunksColor);
setOuterChunksColor(outerChunksColor);
}

public float getLineWidth() {
return lineWidth;
}

public void setLineWidth(final float lineWidth) {
this.lineWidth = lineWidth;
}

void updateCaches() {
int spawnChunkRadius = getSpawnRadius();
clearCaches();
Expand All @@ -130,26 +162,25 @@ void updateCaches() {

populateCache(entityProcessingCache, spawnChunkX, spawnChunkZ, entityProcessingRadius);
if (Settings.REGISTRY.spawnChunksRedstoneProcessingEnabled.get())
populateCache(redstoneProcessingCache, spawnChunkX, spawnChunkZ, redstoneRadius, entityProcessingCache);
populateCache(lazyChunksCache, spawnChunkX, spawnChunkZ, lazyRadius, entityProcessingCache, redstoneProcessingCache);
populateCache(redstoneProcessingCache, spawnChunkX, spawnChunkZ, redstoneRadius);
populateCache(lazyChunksCache, spawnChunkX, spawnChunkZ, lazyRadius);
if (Settings.REGISTRY.spawnChunksOuterChunksEnabled.get())
populateCache(outerChunksCache, spawnChunkX, spawnChunkZ, worldGenRadius, entityProcessingCache, redstoneProcessingCache, lazyChunksCache);
}

void populateCache(Long2LongMap cache, int centerX, int centerZ, int radius, Long2LongMap... except) {
for (int x = centerX - radius; x <= centerX + radius; x++) {
for (int z = centerZ - radius; z <= centerZ + radius; z++) {
long pos = ChunkUtils.chunkPosToLong(x, z);
boolean skip = false;
for (Long2LongMap ex : except) {
if (ex.containsKey(pos)) {
skip = true;
break;
}
}
if (!skip) cache.put(pos, 0);
}
}
populateCache(outerChunksCache, spawnChunkX, spawnChunkZ, worldGenRadius);
}

void populateCache(List<Line> cache, int centerX, int centerZ, int radius) {
int minChunkX = centerX - radius;
int maxChunkX = centerX + radius;
int minChunkZ = centerZ - radius;
int maxChunkZ = centerZ + radius;
int minBlockX = ChunkUtils.chunkCoordToCoord(minChunkX);
int maxBlockX = ChunkUtils.chunkCoordToCoord(maxChunkX + 1);
int minBlockZ = ChunkUtils.chunkCoordToCoord(minChunkZ);
int maxBlockZ = ChunkUtils.chunkCoordToCoord(maxChunkZ + 1);
cache.add(new Line(minBlockX, minBlockZ, maxBlockX, minBlockZ));
cache.add(new Line(minBlockX, minBlockZ, minBlockX, maxBlockZ));
cache.add(new Line(maxBlockX, minBlockZ, maxBlockX, maxBlockZ));
cache.add(new Line(minBlockX, maxBlockZ, maxBlockX, maxBlockZ));
}

void clearCaches() {
Expand Down
25 changes: 2 additions & 23 deletions common/src/main/java/xaeroplus/module/impl/SpawnChunksPlayer.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package xaeroplus.module.impl;

import it.unimi.dsi.fastutil.longs.Long2LongMap;
import it.unimi.dsi.fastutil.longs.Long2LongMaps;
import net.lenni0451.lambdaevents.EventHandler;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
Expand All @@ -16,27 +14,8 @@ public void onClientTick(ClientTickEvent.Post event) {
}

@Override
public Long2LongMap entityProcessing(ResourceKey<Level> dimension) {
if (dimension != ChunkUtils.getActualDimension()) return Long2LongMaps.EMPTY_MAP;
return entityProcessingCache;
}

@Override
public Long2LongMap redstoneProcessing(ResourceKey<Level> dimension) {
if (dimension != ChunkUtils.getActualDimension()) return Long2LongMaps.EMPTY_MAP;
return redstoneProcessingCache;
}

@Override
public Long2LongMap lazyChunks(ResourceKey<Level> dimension) {
if (dimension != ChunkUtils.getActualDimension()) return Long2LongMaps.EMPTY_MAP;
return lazyChunksCache;
}

@Override
public Long2LongMap outerChunks(ResourceKey<Level> dimension) {
if (dimension != ChunkUtils.getActualDimension()) return Long2LongMaps.EMPTY_MAP;
return outerChunksCache;
public ResourceKey<Level> dimension() {
return ChunkUtils.getActualDimension();
}

@Override
Expand Down
11 changes: 0 additions & 11 deletions common/src/main/java/xaeroplus/settings/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -622,17 +622,6 @@ public int getWidth() {
ModuleManager.getModule(SpawnChunksPlayer.class).setOuterChunksColor(b.getColor());
}),
SettingLocation.OVERLAYS);
public final DoubleSetting spawnChunksAlphaSetting = register(
DoubleSetting.create(
"Spawn Chunks Opacity",
"xaeroplus.setting.spawn_chunks_opacity",
0, 255, 10,
100,
(b) -> {
ModuleManager.getModule(SpawnChunks.class).setAlpha((int) b);
ModuleManager.getModule(SpawnChunksPlayer.class).setAlpha((int) b);
}),
SettingLocation.OVERLAYS);
public final BooleanSetting nullOverworldDimensionFolder = register(
BooleanSetting.create(
"null OW Dim Dir",
Expand Down
2 changes: 0 additions & 2 deletions common/src/main/resources/assets/xaeroplus/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,6 @@
"xaeroplus.setting.spawn_chunks_lazy_chunks_color.tooltip": "Sets the color of lazy chunks",
"xaeroplus.setting.spawn_chunks_outer_chunks_color": "Spawn Chunks Outer Color",
"xaeroplus.setting.spawn_chunks_outer_chunks_color.tooltip": "Sets the color of outer chunks",
"xaeroplus.setting.spawn_chunks_opacity": "Spawn Chunks Opacity",
"xaeroplus.setting.spawn_chunks_opacity.tooltip": "Sets the color opacity of the Spawn Chunks types",
"xaeroplus.setting.2b2t_highways_enabled": "2b2t Highways",
"xaeroplus.setting.2b2t_highways_enabled.tooltip": "Renders lines over the positions of highways on 2b2t",
"xaeroplus.setting.2b2t_highways_width": "2b2t Highways Width",
Expand Down
2 changes: 0 additions & 2 deletions common/src/main/resources/assets/xaeroplus/lang/es_ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,6 @@
"xaeroplus.setting.spawn_chunks_lazy_chunks_color.tooltip": "Establece el color de los chunks perezosos",
"xaeroplus.setting.spawn_chunks_outer_chunks_color": "Color de Chunks Exteriores",
"xaeroplus.setting.spawn_chunks_outer_chunks_color.tooltip": "Establece el color de los chunks exteriores",
"xaeroplus.setting.spawn_chunks_opacity": "Opacidad de Chunks de Spawn",
"xaeroplus.setting.spawn_chunks_opacity.tooltip": "Establece la opacidad del color de los tipos de Chunks de Spawn",
"xaeroplus.setting.2b2t_highways_enabled": "Carreteras 2b2t",
"xaeroplus.setting.2b2t_highways_enabled.tooltip": "Destaca los chunks en las carreteras de 2b2t",
"xaeroplus.setting.2b2t_highways_width": "Ancho de las autopistas 2b2t",
Expand Down
6 changes: 0 additions & 6 deletions common/src/main/resources/assets/xaeroplus/lang/fr_ca.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,6 @@
"xaeroplus.setting.spawn_chunks_lazy_chunks_color.tooltip": "Définit la couleur des chunks paresseux",
"xaeroplus.setting.spawn_chunks_outer_chunks_color": "Couleur des Chunks Extérieurs",
"xaeroplus.setting.spawn_chunks_outer_chunks_color.tooltip": "Définit la couleur des chunks extérieurs",
"xaeroplus.setting.spawn_chunks_opacity": "Opacité des Chunks de Spawn",
"xaeroplus.setting.spawn_chunks_opacity.tooltip": "Définit l'opacité de couleur des types de Chunks de Spawn",
"xaeroplus.setting.2b2t_highways_enabled": "Autoroutes 2b2t",
"xaeroplus.setting.2b2t_highways_enabled.tooltip": "Surligne les chunks sur les autoroutes de 2b2t",
"xaeroplus.setting.2b2t_highways_width": "Largeur des autoroutes 2b2t",
Expand Down Expand Up @@ -149,12 +147,8 @@
"xaeroplus.setting.show_waypoint_distances.tooltip": "Afficher la distance de chaque point de passage dans le menu complet des points de passage.",
"xaeroplus.setting.show_render_distance": "Afficher la distance de rendu",
"xaeroplus.setting.show_render_distance.tooltip": "Afficher la distance de rendu côté serveur.",
"xaeroplus.setting.show_render_distance_world_map": "Afficher la distance de rendu sur la WorldMap",
"xaeroplus.setting.show_render_distance_world_map.tooltip": "Afficher la distance de rendu côté serveur sur la carte du monde.",
"xaeroplus.setting.show_world_border": "Afficher la Frontière du Monde",
"xaeroplus.setting.show_world_border.tooltip": "Affiche un rectangle sur la frontière actuelle du monde",
"xaeroplus.setting.show_world_border_world_map": "Afficher la Frontière du Monde sur la Carte du Monde",
"xaeroplus.setting.show_world_border_world_map.tooltip": "Affiche un rectangle sur la frontière actuelle du monde sur la Carte du Monde",
"xaeroplus.setting.assumed_server_render_distance": "Distance de rendu du serveur",
"xaeroplus.setting.assumed_server_render_distance.tooltip": "Distance de vue du serveur.",
"xaeroplus.setting.null_overworld_dimension_folder": "null OW Dim Dir",
Expand Down
6 changes: 0 additions & 6 deletions common/src/main/resources/assets/xaeroplus/lang/fr_fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,6 @@
"xaeroplus.setting.spawn_chunks_lazy_chunks_color.tooltip": "Définit la couleur des chunks paresseux",
"xaeroplus.setting.spawn_chunks_outer_chunks_color": "Couleur des Chunks Extérieurs",
"xaeroplus.setting.spawn_chunks_outer_chunks_color.tooltip": "Définit la couleur des chunks extérieurs",
"xaeroplus.setting.spawn_chunks_opacity": "Opacité des Chunks de Spawn",
"xaeroplus.setting.spawn_chunks_opacity.tooltip": "Définit l'opacité de couleur des types de Chunks de Spawn",
"xaeroplus.setting.2b2t_highways_enabled": "Autoroutes 2b2t",
"xaeroplus.setting.2b2t_highways_enabled.tooltip": "Surligne les chunks sur les autoroutes de 2b2t",
"xaeroplus.setting.2b2t_highways_width": "Largeur des autoroutes 2b2t",
Expand Down Expand Up @@ -149,12 +147,8 @@
"xaeroplus.setting.show_waypoint_distances.tooltip": "Afficher la distance de chaque point de passage dans le menu complet des points de passage.",
"xaeroplus.setting.show_render_distance": "Afficher la distance de rendu",
"xaeroplus.setting.show_render_distance.tooltip": "Afficher la distance de rendu côté serveur.",
"xaeroplus.setting.show_render_distance_world_map": "Afficher la distance de rendu sur la WorldMap",
"xaeroplus.setting.show_render_distance_world_map.tooltip": "Afficher la distance de rendu côté serveur sur la carte du monde.",
"xaeroplus.setting.show_world_border": "Afficher la Frontière du Monde",
"xaeroplus.setting.show_world_border.tooltip": "Affiche un rectangle sur la frontière actuelle du monde",
"xaeroplus.setting.show_world_border_world_map": "Afficher la Frontière du Monde sur la Carte du Monde",
"xaeroplus.setting.show_world_border_world_map.tooltip": "Affiche un rectangle sur la frontière actuelle du monde sur la Carte du Monde",
"xaeroplus.setting.assumed_server_render_distance": "Distance de rendu du serveur",
"xaeroplus.setting.assumed_server_render_distance.tooltip": "Distance de vue du serveur.",
"xaeroplus.setting.null_overworld_dimension_folder": "null OW Dim Dir",
Expand Down
Loading

0 comments on commit e390c8b

Please sign in to comment.