Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 19 additions & 31 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version '1.10-SNAPSHOT'
id 'fabric-loom' version '1.14-SNAPSHOT'
id 'maven-publish'
}

Expand All @@ -10,20 +10,21 @@ base {
archivesName = project.archives_base_name
}

loom {
mods {
"amap" {
sourceSet sourceSets.main
}
}
}

repositories {
// Add repositories to retrieve artifacts from in here.
// You should only use this when depending on other mods because
// Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
// See https://docs.gradle.org/current/userguide/declaring_repositories.html
// for more information about repositories.
maven { url 'https://repo.sleeping.town' }
maven { url 'https://maven.parchmentmc.org' }
maven { url 'https://maven.terraformersmc.com' }
}

dependencies {
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings loom.layered() {
officialMojangMappings()
Expand All @@ -32,52 +33,39 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}"

modImplementation "folk.sisby:surveyor:${project.surveyor_version}"
implementation "folk.sisby:kaleido-config:${project.kaleido_version}"

modCompileOnly "com.terraformersmc:modmenu:${project.modmenu_version}"
}

processResources {
inputs.property "version", project.version
inputs.property "minecraft_version", project.minecraft_version
inputs.property "loader_version", project.loader_version
filteringCharset "UTF-8"

filesMatching("fabric.mod.json") {
expand "version": project.version,
"minecraft_version": project.minecraft_version,
"loader_version": project.loader_version
expand "version": inputs.properties.version,
"minecraft_version": inputs.properties.minecraft_version
}
}

def targetJavaVersion = 21
tasks.withType(JavaCompile).configureEach {
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
// If Javadoc is generated, this must be specified in that task too.
it.options.encoding = "UTF-8"
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
it.options.release.set(targetJavaVersion)
}
it.options.release = 21
}

java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion)
if (JavaVersion.current() < javaVersion) {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()

sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

jar {
inputs.property "archivesName", project.base.archivesName

from("LICENSE") {
rename { "${it}_${project.archivesBaseName}" }
rename { "${it}_${inputs.properties.archivesName}" }
}
}

Expand Down
8 changes: 4 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties
# check these on https://modmuss50.me/fabric.html
minecraft_version=1.21.1
loader_version=0.16.10
loader_version=0.18.2
parchment_mc_version=1.21.1
parchment_version=2024.11.17
# Mod Properties
Expand All @@ -12,7 +12,7 @@ maven_group=cc.abbie
archives_base_name=amap
# Dependencies
# check this on https://modmuss50.me/fabric.html
fabric_version=0.115.3+1.21.1
surveyor_version=1.0.0-alpha.6+1.21
kaleido_version=0.3.1+1.3.2
fabric_version=0.116.7+1.21.1
surveyor_version=1.1.0+1.21
kaleido_version=0.3.3+1.3.2
modmenu_version=11.0.3
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
12 changes: 4 additions & 8 deletions gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion src/main/java/cc/abbie/amap/client/AMapClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import folk.sisby.surveyor.WorldSummary;
import folk.sisby.surveyor.client.SurveyorClientEvents;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientWorldEvents;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;

Expand All @@ -18,7 +19,7 @@ public void onInitializeClient() {
WorldSummary.enableTerrain();
WorldSummary.enableLandmarks();

SurveyorClientEvents.Register.worldLoad(AMap.id("world_load"), MapStorage.INSTANCE);
ClientWorldEvents.AFTER_CLIENT_WORLD_CHANGE.register(MapStorage.INSTANCE::onWorldLoad);
SurveyorClientEvents.Register.terrainUpdated(AMap.id("terrain_updated"), MapStorage.INSTANCE);
SurveyorClientEvents.Register.landmarksAdded(AMap.id("landmarks_added"), MapStorage.INSTANCE);
SurveyorClientEvents.Register.landmarksRemoved(AMap.id("landmarks_removed"), MapStorage.INSTANCE);
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/cc/abbie/amap/client/ChunkRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import net.minecraft.world.level.material.MapColor;

import folk.sisby.surveyor.terrain.LayerSummary;
import folk.sisby.surveyor.terrain.RegionSummary;
import folk.sisby.surveyor.util.RegionPos;
import folk.sisby.surveyor.util.RegistryPalette;

import java.util.HashMap;
Expand All @@ -38,8 +38,8 @@ public static void bakeChunk(ChunkPos chunkPos) {
// needed for shading
// done first to cancel as early as possible (map gets are expensive?)
ChunkPos northChunkPos = new ChunkPos(chunkPos.x, chunkPos.z - 1);
ChunkPos northRegionPos = new ChunkPos(RegionSummary.chunkToRegion(northChunkPos.x), RegionSummary.chunkToRegion(northChunkPos.z));
ChunkPos northRegionRelativePos = new ChunkPos(RegionSummary.regionRelative(northChunkPos.x), RegionSummary.regionRelative(northChunkPos.z));
ChunkPos northRegionPos = new ChunkPos(RegionPos.chunkToRegion(northChunkPos.x), RegionPos.chunkToRegion(northChunkPos.z));
ChunkPos northRegionRelativePos = new ChunkPos(RegionPos.regionRelative(northChunkPos.x), RegionPos.regionRelative(northChunkPos.z));

LayerSummary.Raw[][] northTerr = MapStorage.INSTANCE.regions.get(northRegionPos);
if (northTerr == null) return;
Expand All @@ -62,8 +62,8 @@ public static void bakeChunk(ChunkPos chunkPos) {
RegistryAccess registryAccess = level.registryAccess();
Registry<Biome> biomeRegistry = registryAccess.registryOrThrow(Registries.BIOME);

ChunkPos regionPos = new ChunkPos(RegionSummary.chunkToRegion(chunkPos.x), RegionSummary.chunkToRegion(chunkPos.z));
ChunkPos regionRelativePos = new ChunkPos(RegionSummary.regionRelative(chunkPos.x), RegionSummary.regionRelative(chunkPos.z));
ChunkPos regionPos = new ChunkPos(RegionPos.chunkToRegion(chunkPos.x), RegionPos.chunkToRegion(chunkPos.z));
ChunkPos regionRelativePos = new ChunkPos(RegionPos.regionRelative(chunkPos.x), RegionPos.regionRelative(chunkPos.z));
LayerSummary.Raw[][] terr = MapStorage.INSTANCE.regions.get(regionPos);
RegistryPalette<Block>.ValueView blockPalette = MapStorage.INSTANCE.blockPalettes.get(chunkPos);
RegistryPalette<Biome>.ValueView biomePalette = MapStorage.INSTANCE.biomePalettes.get(chunkPos);
Expand Down
80 changes: 48 additions & 32 deletions src/main/java/cc/abbie/amap/client/MapStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,29 @@

import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;

import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.levelgen.structure.Structure;

import folk.sisby.surveyor.WorldSummary;
import folk.sisby.surveyor.client.SurveyorClient;
import folk.sisby.surveyor.client.SurveyorClientEvents;
import folk.sisby.surveyor.landmark.Landmark;
import folk.sisby.surveyor.landmark.WorldLandmarks;
import folk.sisby.surveyor.terrain.ChunkSummary;
import folk.sisby.surveyor.terrain.LayerSummary;
import folk.sisby.surveyor.terrain.RegionSummary;
import folk.sisby.surveyor.terrain.WorldTerrainSummary;
import folk.sisby.surveyor.util.RegionPos;
import folk.sisby.surveyor.util.RegistryPalette;

import java.util.BitSet;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;

// mostly copied from https://github.com/HestiMae/hoofprint/blob/777a182f5e0136d8e3b9a5b9c9362fe6dc41ea72/src/main/java/garden/hestia/hoofprint/HoofprintMapStorage.java
public class MapStorage implements SurveyorClientEvents.WorldLoad, SurveyorClientEvents.TerrainUpdated, SurveyorClientEvents.LandmarksAdded, SurveyorClientEvents.LandmarksRemoved {
public class MapStorage implements SurveyorClientEvents.TerrainUpdated, SurveyorClientEvents.LandmarksAdded, SurveyorClientEvents.LandmarksRemoved {
public static final MapStorage INSTANCE = new MapStorage();

public Map<ChunkPos, LayerSummary.Raw[][]> regions = new Object2ObjectOpenHashMap<>();
Expand All @@ -39,45 +35,65 @@ public class MapStorage implements SurveyorClientEvents.WorldLoad, SurveyorClien
public Map<UUID, Map<ResourceLocation, Landmark>> landmarks = new Object2ObjectOpenHashMap<>();

@Override
public void onTerrainUpdated(Level level, WorldTerrainSummary terrainSummary, Collection<ChunkPos> chunks) {
for (ChunkPos pos : chunks) {
ChunkSummary chunk = terrainSummary.get(pos);
if (chunk == null) continue;
LayerSummary.Raw layerSummary = chunk.toSingleLayer(null, null, level.getHeight());
// empty chunks will return null for toSingleLayer, we don't want this
if (layerSummary == null) layerSummary = new LayerSummary.Raw(new BitSet(256), new int[256], new int[256], new int[256], new int[256], new int[256], new int[256]);
regions.computeIfAbsent(
new ChunkPos(RegionSummary.chunkToRegion(pos.x), RegionSummary.chunkToRegion(pos.z)),
c -> new LayerSummary.Raw[32][32]
)[RegionSummary.regionRelative(pos.x)][RegionSummary.regionRelative(pos.z)]
= layerSummary;
blockPalettes.put(pos, terrainSummary.getBlockPalette(pos));
biomePalettes.put(pos, terrainSummary.getBiomePalette(pos));
ChunkRenderer.dirtyChunks.add(pos);
public void onTerrainUpdated(WorldSummary summary, Map<RegionPos, BitSet> chunks) {
var terrainSummary = summary.terrain();
var level = summary.world();
if (terrainSummary != null && level != null) {
for (Map.Entry<RegionPos, BitSet> entry : chunks.entrySet()) {
for (ChunkPos pos : entry.getKey().toChunks(entry.getValue())) {
ChunkSummary chunk = terrainSummary.get(pos);
if (chunk == null) continue;
LayerSummary.Raw layerSummary = chunk.toSingleLayer(null, null, level.getHeight());
// empty chunks will return null for toSingleLayer, we don't want this
if (layerSummary == null) layerSummary = new LayerSummary.Raw(new BitSet(256), new int[256], new int[256], new int[256], new int[256], new int[256], new int[256]);
regions.computeIfAbsent(
new ChunkPos(RegionPos.chunkToRegion(pos.x), RegionPos.chunkToRegion(pos.z)),
c -> new LayerSummary.Raw[32][32]
)[RegionPos.regionRelative(pos.x)][RegionPos.regionRelative(pos.z)]
= layerSummary;
blockPalettes.put(pos, terrainSummary.getBlockPalette(pos));
biomePalettes.put(pos, terrainSummary.getBiomePalette(pos));
ChunkRenderer.dirtyChunks.add(pos);
}
}
}
}

@Override
public void onWorldLoad(ClientLevel clientLevel, WorldSummary summary, LocalPlayer player, Map<ChunkPos, BitSet> terrain, Multimap<ResourceKey<Structure>, ChunkPos> structures, Multimap<UUID, ResourceLocation> multimap) {
public void onWorldLoad(Minecraft client, ClientLevel level) {
regions.clear();
biomePalettes.clear();
blockPalettes.clear();
ChunkRenderer.clear();
updateLandmarks(summary.landmarks());
onTerrainUpdated(clientLevel, summary.terrain(), WorldTerrainSummary.toKeys(terrain));
var summary = WorldSummary.of(level);
if (summary != null) {
var landmarks = summary.landmarks();
if (landmarks != null) {
updateLandmarks(landmarks);
}
var terrain = summary.terrain();
if (terrain != null) {
onTerrainUpdated(summary, terrain.bitSet(SurveyorClient.getExploration()));
}
}
}

@Override
public void onLandmarksAdded(Level level, WorldLandmarks worldLandmarks, Multimap<UUID, ResourceLocation> multimap) {
updateLandmarks(worldLandmarks);
public void onLandmarksAdded(WorldSummary summary, Multimap<UUID, ResourceLocation> landmarks) {
var worldLandmarks = summary.landmarks();
if (worldLandmarks != null) {
updateLandmarks(worldLandmarks);
}
}

@Override
public void onLandmarksRemoved(Level level, WorldLandmarks worldLandmarks, Multimap<UUID, ResourceLocation> multimap) {
updateLandmarks(worldLandmarks);
public void onLandmarksRemoved(WorldSummary summary, Multimap<UUID, ResourceLocation> landmarks) {
var worldLandmarks = summary.landmarks();
if (worldLandmarks != null) {
updateLandmarks(worldLandmarks);
}
}

private void updateLandmarks(WorldLandmarks worldLandmarks) {
landmarks = worldLandmarks.asMap(null);
landmarks = worldLandmarks.asMap(SurveyorClient.getExploration()).rowMap();
}
}
Loading