Skip to content

Commit b90c210

Browse files
committed
Fix iota renderers being cached when they shouldn't be
1 parent 1f82dcb commit b90c210

File tree

3 files changed

+41
-15
lines changed

3 files changed

+41
-15
lines changed

Common/src/main/kotlin/gay/object/hexdebug/HexDebugClient.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import at.petrak.hexcasting.api.client.ScryingLensOverlayRegistry
55
import at.petrak.hexcasting.api.utils.asTextComponent
66
import at.petrak.hexcasting.api.utils.gray
77
import at.petrak.hexcasting.api.utils.plusAssign
8+
import dev.architectury.event.events.client.ClientPlayerEvent
89
import gay.`object`.hexdebug.HexDebug.LOGGER
910
import gay.`object`.hexdebug.adapter.proxy.DebugProxyClient
1011
import gay.`object`.hexdebug.api.client.splicing.SplicingTableIotaRenderers
@@ -13,6 +14,7 @@ import gay.`object`.hexdebug.config.HexDebugClientConfig
1314
import gay.`object`.hexdebug.config.HexDebugServerConfig
1415
import gay.`object`.hexdebug.gui.splicing.renderers.*
1516
import gay.`object`.hexdebug.gui.splicing.renderers.conditional.IfPathExistsRendererProvider
17+
import gay.`object`.hexdebug.gui.splicing.widgets.BaseIotaButton
1618
import gay.`object`.hexdebug.registry.HexDebugBlocks
1719
import gay.`object`.hexdebug.utils.styledHoverName
1820
import gay.`object`.hexdebug.utils.toComponent
@@ -22,6 +24,7 @@ import net.minecraft.client.gui.screens.Screen
2224
import net.minecraft.nbt.CompoundTag
2325
import net.minecraft.network.chat.Component
2426
import net.minecraft.network.chat.Style
27+
import net.minecraft.world.InteractionResult
2528
import net.minecraft.world.item.Item
2629
import net.minecraft.world.item.ItemStack
2730
import net.minecraft.world.item.Items
@@ -39,6 +42,7 @@ object HexDebugClient {
3942
DebugProxyClient.init()
4043
addScryingLensOverlays()
4144
registerSplicingTableIotaRenderers()
45+
invalidateIotaRendererCacheWhenThingsHappenThatShouldInvalidateIt()
4246
}
4347

4448
fun getConfigScreen(parent: Screen): Screen {
@@ -104,4 +108,17 @@ object HexDebugClient {
104108
SplicingTableIotaRenderers.register(HexDebug.id(name), parser)
105109
}
106110
}
111+
112+
private fun invalidateIotaRendererCacheWhenThingsHappenThatShouldInvalidateIt() {
113+
// for rainbow bracket configs
114+
HexDebugClientConfig.holder.registerSaveListener { _, _ ->
115+
BaseIotaButton.invalidateRendererCache()
116+
InteractionResult.PASS
117+
}
118+
119+
// cached iotas from one world are probably not applicable to others
120+
ClientPlayerEvent.CLIENT_PLAYER_QUIT.register {
121+
BaseIotaButton.invalidateRendererCache()
122+
}
123+
}
107124
}

Common/src/main/kotlin/gay/object/hexdebug/gui/splicing/widgets/BaseIotaButton.kt

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import gay.`object`.hexdebug.api.client.splicing.SplicingTableIotaRenderer
99
import gay.`object`.hexdebug.api.client.splicing.SplicingTableIotaRenderers
1010
import gay.`object`.hexdebug.api.splicing.SplicingTableIotaClientView
1111
import net.minecraft.client.gui.GuiGraphics
12-
import net.minecraft.client.gui.components.Tooltip
1312
import net.minecraft.network.chat.Component
13+
import java.util.*
14+
import kotlin.jvm.optionals.getOrNull
1415

1516
abstract class BaseIotaButton(x: Int, y: Int) : HexagonButton(
1617
x = x,
@@ -61,25 +62,30 @@ abstract class BaseIotaButton(x: Int, y: Int) : HexagonButton(
6162

6263
active = true
6364

64-
val (renderer, tooltip) = rendererCache.get(iotaView) {
65-
try {
66-
val renderer = SplicingTableIotaRenderers.getProvider(iotaType)
67-
?.createRenderer(iotaType, iotaView, x, y)
68-
renderer to renderer?.createTooltip()
69-
} catch (e: Exception) {
70-
HexDebug.LOGGER.error("Caught exception while preparing renderer for ${iotaType.typeName().string}", e)
71-
null to null
72-
}
65+
try {
66+
val renderer = rendererCache.get(iotaView) {
67+
Optional.ofNullable(
68+
SplicingTableIotaRenderers.getProvider(iotaType)
69+
?.createRenderer(iotaType, iotaView, x, y)
70+
)
71+
}.getOrNull()
72+
renderer?.x = x
73+
renderer?.y = y
74+
this.renderer = renderer
75+
this.tooltip = renderer?.createTooltip()
76+
} catch (e: Exception) {
77+
HexDebug.LOGGER.error("Caught exception while preparing renderer for ${iotaType.typeName().string}", e)
78+
renderer = null
7379
}
74-
renderer?.x = x
75-
renderer?.y = y
76-
this.renderer = renderer
77-
this.tooltip = tooltip
7880
}
7981

8082
companion object {
8183
private val rendererCache = CacheBuilder.newBuilder()
8284
.maximumSize(HexIotaTypes.MAX_SERIALIZATION_TOTAL * 2L)
83-
.build<SplicingTableIotaClientView, Pair<SplicingTableIotaRenderer?, Tooltip?>>()
85+
.build<SplicingTableIotaClientView, Optional<SplicingTableIotaRenderer>>()
86+
87+
fun invalidateRendererCache() {
88+
rendererCache.invalidateAll()
89+
}
8490
}
8591
}

Common/src/main/kotlin/gay/object/hexdebug/resources/splicing/SplicingTableIotasResourceReloadListener.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.google.gson.JsonObject
88
import com.google.gson.JsonParseException
99
import gay.`object`.hexdebug.HexDebug
1010
import gay.`object`.hexdebug.api.client.splicing.SplicingTableIotaRenderers
11+
import gay.`object`.hexdebug.gui.splicing.widgets.BaseIotaButton
1112
import gay.`object`.hexdebug.utils.contains
1213
import gay.`object`.hexdebug.utils.getAsResourceLocation
1314
import gay.`object`.hexdebug.utils.getOrNull
@@ -68,6 +69,8 @@ object SplicingTableIotasResourceReloadListener :
6869
) {
6970
HexDebug.LOGGER.info("Loading splicing table iota renderers...")
7071

72+
BaseIotaButton.invalidateRendererCache()
73+
7174
fallback = null
7275
providersByType.clear()
7376

0 commit comments

Comments
 (0)