diff options
Diffstat (limited to 'src')
4 files changed, 79 insertions, 21 deletions
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt b/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt index 1986339..a7a8a19 100644 --- a/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt +++ b/src/main/kotlin/moe/nea/notenoughupdates/NotEnoughUpdates.kt @@ -3,6 +3,7 @@ package moe.nea.notenoughupdates import com.mojang.brigadier.Command import com.mojang.brigadier.CommandDispatcher import io.github.cottonmc.cotton.gui.client.CottonClientScreen +import io.github.moulberry.repo.NEURepositoryException import io.ktor.client.* import io.ktor.client.plugins.* import io.ktor.client.plugins.contentnegotiation.* @@ -18,6 +19,7 @@ import net.fabricmc.api.ModInitializer import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents import net.fabricmc.loader.api.FabricLoader import net.fabricmc.loader.api.Version import net.fabricmc.loader.api.metadata.ModMetadata @@ -67,14 +69,20 @@ object NotEnoughUpdates : ModInitializer, ClientModInitializer { ) { dispatcher.register(ClientCommandManager.literal("neureload").executes { it.source.sendFeedback(Component.literal("Reloading repository from disk. This may lag a bit.")) - RepoManager.neuRepo.reload() + try { + RepoManager.reload() + } catch (exc: NEURepositoryException) { + it.source.sendError(Component.literal("There has been an error reloading the repository. Please try again. IF this persists, delete the .notenoughupdates folder in your mincraft folder")) + exc.printStackTrace() + } Command.SINGLE_SUCCESS }) - dispatcher.register(ClientCommandManager.literal("neu") - .then(ClientCommandManager.literal("repo").executes { - setScreenLater(CottonClientScreen(RepoManagementGui())) - Command.SINGLE_SUCCESS - }) + dispatcher.register( + ClientCommandManager.literal("neu") + .then(ClientCommandManager.literal("repo").executes { + setScreenLater(CottonClientScreen(RepoManagementGui())) + Command.SINGLE_SUCCESS + }) ) } @@ -82,6 +90,12 @@ object NotEnoughUpdates : ModInitializer, ClientModInitializer { RepoManager.initialize() ConfigHolder.registerEvents() ClientCommandRegistrationCallback.EVENT.register(this::registerCommands) + ClientLifecycleEvents.CLIENT_STOPPING.register(ClientLifecycleEvents.ClientStopping { + runBlocking { + logger.info("Shutting down NEU coroutines") + globalJob.cancel() + } + }) } override fun onInitializeClient() { diff --git a/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt b/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt index 893b1c0..8deb4c3 100644 --- a/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt +++ b/src/main/kotlin/moe/nea/notenoughupdates/repo/ItemCache.kt @@ -4,6 +4,8 @@ import com.mojang.serialization.Dynamic import io.github.moulberry.repo.IReloadable import io.github.moulberry.repo.NEURepository import io.github.moulberry.repo.data.NEUItem +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import moe.nea.notenoughupdates.NotEnoughUpdates import moe.nea.notenoughupdates.util.LegacyTagParser import moe.nea.notenoughupdates.util.appendLore @@ -70,7 +72,18 @@ object ItemCache : IReloadable { ResourceLocation("skyblockitem", skyblockItemId.lowercase().replace(";", "__")) + var job: Job? = null + override fun reload(repository: NEURepository) { cache.clear() + val j = job + if (j != null && j.isActive) { + j.cancel() + job = NotEnoughUpdates.coroutineScope.launch { + repository.items?.items?.values?.forEach { + it.asItemStack() // Rebuild cache + } + } + } } } diff --git a/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt b/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt index 70ee18e..375b2bb 100644 --- a/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt +++ b/src/main/kotlin/moe/nea/notenoughupdates/repo/RepoManager.kt @@ -1,6 +1,7 @@ package moe.nea.notenoughupdates.repo import io.github.moulberry.repo.NEURepository +import io.github.moulberry.repo.NEURepositoryException import kotlinx.coroutines.launch import kotlinx.serialization.Serializable import kotlinx.serialization.serializer @@ -9,15 +10,16 @@ import moe.nea.notenoughupdates.NotEnoughUpdates.logger import moe.nea.notenoughupdates.util.ConfigHolder import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents import net.minecraft.client.Minecraft +import net.minecraft.network.chat.Component import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket object RepoManager : ConfigHolder<RepoManager.Config>(serializer(), "repo", ::Config) { @Serializable data class Config( - var user: String = "NotEnoughUpdates", - var repo: String = "NotEnoughUpdates-REPO", - var autoUpdate: Boolean = true, - var branch: String = "dangerous", + var user: String = "NotEnoughUpdates", + var repo: String = "NotEnoughUpdates-REPO", + var autoUpdate: Boolean = true, + var branch: String = "dangerous", ) var recentlyFailedToUpdateItemList = false @@ -33,7 +35,9 @@ object RepoManager : ConfigHolder<RepoManager.Config>(serializer(), "repo", ::Co } private fun trySendClientboundUpdateRecipesPacket(): Boolean { - return Minecraft.getInstance().level != null && Minecraft.getInstance().connection?.handleUpdateRecipes(ClientboundUpdateRecipesPacket(mutableListOf())) != null + return Minecraft.getInstance().level != null && Minecraft.getInstance().connection?.handleUpdateRecipes( + ClientboundUpdateRecipesPacket(mutableListOf()) + ) != null } init { @@ -46,7 +50,18 @@ object RepoManager : ConfigHolder<RepoManager.Config>(serializer(), "repo", ::Co fun launchAsyncUpdate() { NotEnoughUpdates.coroutineScope.launch { RepoDownloadManager.downloadUpdate() + reload() + } + } + + fun reload() { + try { neuRepo.reload() + } catch (exc: NEURepositoryException) { + Minecraft.getInstance().player?.sendSystemMessage( + Component.literal("Failed to reload repository. This will result in some mod features not working.") + ) + exc.printStackTrace() } } @@ -54,7 +69,7 @@ object RepoManager : ConfigHolder<RepoManager.Config>(serializer(), "repo", ::Co if (config.autoUpdate) { launchAsyncUpdate() } else { - neuRepo.reload() + reload() } } diff --git a/src/main/kotlin/moe/nea/notenoughupdates/util/ConfigHolder.kt b/src/main/kotlin/moe/nea/notenoughupdates/util/ConfigHolder.kt index 003de6c..07a9b4c 100644 --- a/src/main/kotlin/moe/nea/notenoughupdates/util/ConfigHolder.kt +++ b/src/main/kotlin/moe/nea/notenoughupdates/util/ConfigHolder.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.KSerializer import kotlinx.serialization.SerializationException import moe.nea.notenoughupdates.NotEnoughUpdates import moe.nea.notenoughupdates.events.NEUScreenEvents +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents import net.minecraft.client.Minecraft import net.minecraft.commands.CommandSource import net.minecraft.network.chat.Component @@ -15,9 +16,11 @@ import kotlin.io.path.readText import kotlin.io.path.writeText import kotlin.reflect.KClass -abstract class ConfigHolder<T>(val serializer: KSerializer<T>, - val name: String, - val default: () -> T) { +abstract class ConfigHolder<T>( + val serializer: KSerializer<T>, + val name: String, + val default: () -> T +) { var config: T private set @@ -33,15 +36,21 @@ abstract class ConfigHolder<T>(val serializer: KSerializer<T>, if (file.exists()) try { return NotEnoughUpdates.json.decodeFromString( - serializer, - file.readText() + serializer, + file.readText() ) } catch (e: IOException) { badLoads.add(name) - NotEnoughUpdates.logger.error("IO exception during loading of config file $name. This will reset this config.", e) + NotEnoughUpdates.logger.error( + "IO exception during loading of config file $name. This will reset this config.", + e + ) } catch (e: SerializationException) { badLoads.add(name) - NotEnoughUpdates.logger.error("Serialization exception during loading of config file $name. This will reset this config.", e) + NotEnoughUpdates.logger.error( + "Serialization exception during loading of config file $name. This will reset this config.", + e + ) } return default() } @@ -95,8 +104,12 @@ abstract class ConfigHolder<T>(val serializer: KSerializer<T>, private fun warnForResetConfigs(player: CommandSource) { if (badLoads.isNotEmpty()) { - player.sendSystemMessage(Component.literal("The following configs have been reset: ${badLoads.joinToString(", ")}. " + - "This can be intentional, but probably isn't.")) + player.sendSystemMessage( + Component.literal( + "The following configs have been reset: ${badLoads.joinToString(", ")}. " + + "This can be intentional, but probably isn't." + ) + ) badLoads.clear() } } @@ -110,6 +123,9 @@ abstract class ConfigHolder<T>(val serializer: KSerializer<T>, } false }) + ClientLifecycleEvents.CLIENT_STOPPING.register(ClientLifecycleEvents.ClientStopping { + performSaves() + }) } |