diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 65f6ad234..bf3618ad2 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -150,6 +150,9 @@ private fun misc(provider: MatteryLanguageProvider) { misc("exosuit.granted7", "You are now permanently equipped with four dimensional omni-present Exosuit.") misc("exosuit.granted8", "As of now, this exosuit is not much, but it's built-in AI hints there are upgrade modules out there somewhere...") + misc("dumping_matter_registry", "Dumping matter registry to %s") + misc("dumped_matter_registry", "Dumped matter registry to %s") + misc("iteration", "Iteration %s") misc("death_reason", "Decommissioned!") diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 2f9a9c7b3..fdb845469 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -141,7 +141,7 @@ public final class OverdriveThatMatters { private void setup(final FMLCommonSetupEvent event) { EVENT_BUS.addListener(EventPriority.LOWEST, DrivePool.INSTANCE::onServerPostTick); EVENT_BUS.addListener(EventPriority.HIGHEST, DrivePool.INSTANCE::serverStopEvent); - EVENT_BUS.addListener(EventPriority.HIGHEST, DrivePool.INSTANCE::serverStartEvent); + EVENT_BUS.addListener(EventPriority.LOWEST, DrivePool.INSTANCE::serverStartEvent); EVENT_BUS.addListener(EventPriority.NORMAL, DrivePool.INSTANCE::onWorldSave); EVENT_BUS.addListener(EventPriority.HIGHEST, GlobalEventHandlerKt::onServerStopped); @@ -171,6 +171,7 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::reloadEvent); EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::onServerStarted); + EVENT_BUS.addListener(EventPriority.NORMAL, MatterManager.INSTANCE::addCommands); EVENT_BUS.addListener(EventPriority.NORMAL, SynchronizedBlockEntity.Companion::onServerStopping); EVENT_BUS.addListener(EventPriority.NORMAL, SynchronizedBlockEntity.Companion::onLevelUnload); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt index 9e26c69e1..e8dd4e7c1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt @@ -9,11 +9,14 @@ import com.google.gson.JsonObject import com.google.gson.JsonParseException import com.google.gson.JsonSyntaxException import com.mojang.blaze3d.platform.InputConstants +import com.mojang.brigadier.context.CommandContext import it.unimi.dsi.fastutil.objects.Reference2ObjectFunction import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.ReferenceLinkedOpenHashSet import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet import net.minecraft.ChatFormatting +import net.minecraft.commands.CommandSourceStack +import net.minecraft.commands.Commands import net.minecraft.network.chat.Component import net.minecraft.network.chat.MutableComponent import net.minecraft.resources.ResourceLocation @@ -29,6 +32,7 @@ import net.minecraft.world.item.crafting.Recipe import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.level.ItemLike import net.minecraftforge.event.AddReloadListenerEvent +import net.minecraftforge.event.RegisterCommandsEvent import net.minecraftforge.event.entity.player.ItemTooltipEvent import net.minecraftforge.event.server.ServerStartedEvent import net.minecraftforge.eventbus.api.IEventBus @@ -36,6 +40,7 @@ import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.ForgeRegistries import org.apache.logging.log4j.LogManager import org.lwjgl.glfw.GLFW +import ru.dbotthepony.mc.otm.MINECRAFT_SERVER import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.SystemTime import ru.dbotthepony.mc.otm.capability.MatteryCapability @@ -54,7 +59,10 @@ import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.stream import ru.dbotthepony.mc.otm.registry.RegistryDelegate import ru.dbotthepony.mc.otm.storage.ItemStackWrapper +import java.io.File import java.math.BigInteger +import java.time.Instant +import java.time.format.DateTimeFormatter import java.util.* import java.util.stream.Stream import kotlin.ConcurrentModificationException @@ -137,6 +145,8 @@ internal class KeyEntry( priority: Int, ) : Entry(modificationChain, matter, complexity, priority) +private fun transformQuotes(it: String?): String = if (it != null) '"' + it.replace("\"", "\"\"") + '"' else "NULL" + object MatterManager { const val MATTER_DIRECTORY = "otm_matter" const val FINDER_DIRECTORY = "otm_recipe_finder" @@ -1061,12 +1071,51 @@ object MatterManager { Resolver.registrar.register(bus) } + private fun dumpRegistry(stack: CommandContext): Int { + val targetFile = File(MINECRAFT_SERVER.serverDirectory, "otm/registry_dumps/full_${System.currentTimeMillis() / 1_000L}.csv") + File(MINECRAFT_SERVER.serverDirectory, "otm/registry_dumps").mkdirs() + + stack.source.sendSuccess(TranslatableComponent("otm.dumping_matter_registry", targetFile.absolutePath), false) + + val writer = targetFile.bufferedWriter(Charsets.UTF_8) + + writer.write(arrayOf("Registry ID", "Matter Value", "Complexity", "Commentary").joinToString(";", transform = ::transformQuotes)) + writer.write("\n") + + for ((key, item) in ForgeRegistries.ITEMS.entries) { + val value = get(item) + + if (!value.hasMatterValue) { + writer.write(arrayOf(key.location().toString(), "", "", commentary[item]?.string ?: "").joinToString(";", transform = ::transformQuotes)) + } else { + writer.write(arrayOf(key.location().toString(), value.matter.toString(), value.complexity.toString(), commentary[item]?.string ?: "").joinToString(";", transform = ::transformQuotes)) + } + + writer.write("\n") + } + + writer.close() + + stack.source.sendSuccess(TranslatableComponent("otm.dumped_matter_registry", targetFile.absolutePath), true) + + return 0 + } + + fun addCommands(event: RegisterCommandsEvent) { + event.dispatcher.register( + Commands.literal("dump_matter_registry") + .requires { it.hasPermission(Commands.LEVEL_OWNERS) } + .executes(::dumpRegistry) + ) + } + private val matterValues = Reference2ObjectOpenHashMap() private val validMatterValues = ArrayList>() val valuesMap: Map = Collections.unmodifiableMap(matterValues) val valuesList: List> = Collections.unmodifiableList(validMatterValues) + // TODO: /reload fun onServerStarted(event: ServerStartedEvent) { Resolver.resolve(event.server)