@@ -2,9 +2,11 @@ package com.possible_triangle.atheneum_connector
2
2
3
3
import com.mojang.datafixers.util.Either
4
4
import com.possible_triangle.atheneum_connector.generated.AreasQuery
5
+ import com.possible_triangle.atheneum_connector.generated.PlacesQuery
5
6
import com.possible_triangle.atheneum_connector.generated.areasquery.Area
6
7
import com.possible_triangle.atheneum_connector.generated.areasquery.FlatPoint
7
8
import com.possible_triangle.atheneum_connector.generated.placesquery.Place
9
+ import kotlinx.coroutines.async
8
10
import kotlinx.coroutines.runBlocking
9
11
import net.minecraft.core.BlockPos
10
12
import net.minecraft.core.SectionPos.blockToSectionCoord
@@ -14,29 +16,55 @@ import net.minecraft.resources.ResourceLocation
14
16
import net.minecraft.world.level.ChunkPos
15
17
import net.minecraft.world.level.Level
16
18
17
- class LocationCache <T > {
19
+ class LocationCache <T >( private val getId : ( T ) -> Int ) {
18
20
19
21
private val lookup = hashMapOf<ResourceKey <Level >, MutableMap <ChunkPos , T >>()
20
22
private val reverseLookup = hashMapOf<Int , Pair <ResourceKey <Level >, List <ChunkPos >>>()
21
23
24
+ fun get (level : ResourceKey <Level >, chunk : ChunkPos ): T ? {
25
+ return lookup[level]?.get(chunk)
26
+ }
27
+
28
+ fun set (level : ResourceKey <Level >, value : T , chunks : List <ChunkPos >) {
29
+ reverseLookup[getId(value)] = level to chunks
30
+
31
+ lookup.getOrPut(level, ::hashMapOf).apply {
32
+ chunks.forEach { put(it, value) }
33
+ }
34
+ }
35
+
22
36
companion object {
23
- private val AREAS = LocationCache <Area >()
37
+ private val AREAS = LocationCache <Area > { it.id }
38
+ private val PLACES = LocationCache <Place > { it.id }
24
39
25
40
fun reload () {
26
41
AREAS .clear()
42
+ PLACES .clear()
27
43
initialize()
28
44
}
29
45
46
+ private fun String.levelKey () = ResourceKey .create(Registries .DIMENSION , ResourceLocation (this ))
47
+
48
+ private fun chunkAt (x : Int , z : Int ) = ChunkPos (
49
+ blockToSectionCoord(x),
50
+ blockToSectionCoord(z),
51
+ )
52
+
30
53
fun initialize () = runBlocking {
31
- val areas = GraphQL .query(AreasQuery ()).areas
32
- areas.nodes.forEach { area ->
33
- val level = ResourceKey .create(Registries .DIMENSION , ResourceLocation (area.world))
54
+ val areasQuery = async { GraphQL .query(AreasQuery ()) }
55
+ val placesQuery = async { GraphQL .query(PlacesQuery ()) }
56
+
57
+ areasQuery.await().areas.nodes.forEach { area ->
58
+ val level = area.world.levelKey()
34
59
val chunks = area.points.containingChunks()
35
- AREAS .reverseLookup[area.id] = level to chunks
60
+ AREAS .set(level, area, chunks)
61
+ }
36
62
37
- AREAS .lookup.getOrPut(level, ::hashMapOf).apply {
38
- chunks.forEach { put(it, area) }
39
- }
63
+ placesQuery.await().places.nodes.forEach { place ->
64
+ val level = place.pos.world.levelKey()
65
+ val chunks = listOf (chunkAt(place.pos.x, place.pos.z))
66
+
67
+ PLACES .set(level, place, chunks)
40
68
}
41
69
}
42
70
@@ -69,20 +97,17 @@ class LocationCache<T> {
69
97
}
70
98
71
99
odd
72
- }.map {
73
- ChunkPos (
74
- blockToSectionCoord(it.x),
75
- blockToSectionCoord(it.z),
76
- )
77
- }
100
+ }.map { chunkAt(it.x, it.z) }
78
101
}
79
102
80
103
fun containing (level : ResourceKey <Level >, pos : BlockPos ): Either <Area , Place >? {
81
104
val chunk = ChunkPos (pos)
82
105
83
- val area = AREAS .lookup[level]?.get(chunk)
84
-
85
- return area?.let { Either .left(area) }
106
+ return PLACES .get(level, chunk)?.let {
107
+ Either .right(it)
108
+ } ? : AREAS .get(level, chunk)?.let {
109
+ Either .left(it)
110
+ }
86
111
}
87
112
}
88
113
0 commit comments