package com.github.zly2006.carpetslsaddition; import carpet.CarpetExtension; import carpet.CarpetServer; import com.github.zly2006.carpetslsaddition.command.BotCommand; import com.github.zly2006.carpetslsaddition.command.HatCommand; import com.github.zly2006.carpetslsaddition.command.SitCommand; import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.mojang.brigadier.CommandDispatcher; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.Version; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.MinecraftServer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; public class ServerMain implements ModInitializer, CarpetExtension { public static final String MOD_ID = "carpet-sls-addition"; public static final String MOD_NAME = "Carpet SLS Addition"; public static final Version MOD_VERSION = FabricLoader.getInstance().getModContainer(MOD_ID).get().getMetadata().getVersion(); public static final Logger LOGGER = LogManager.getLogger(MOD_ID); static final Gson GSON = new GsonBuilder().setLenient().create(); public static ServerMain INSTANCE; public static MinecraftServer server; public static final boolean tisCarpetLoaded = FabricLoader.getInstance().isModLoaded("carpet-tis-addition"); @Override public void onInitialize() { LOGGER.info("[SLSA] onInitialize: managing Carpet extension"); INSTANCE = this; CarpetServer.manageExtension(this); } @Override public void onGameStarted() { CarpetServer.settingsManager.parseSettingsClass(SLSCarpetSettings.class); } @Override public void onServerLoaded(MinecraftServer server) { ServerMain.server = server; startLegacyRuleWatcher(); } /** [旧版] 轮询规则状态,按需启停异步 chunk 线程。 */ private void startLegacyRuleWatcher() { Thread watcher = new Thread(() -> { boolean running = false; while (!Thread.currentThread().isInterrupted()) { try { boolean want = SLSCarpetSettings.legacyExploitMode && SLSCarpetSettings.legacyAsyncChunkAccess; if (want && !running) { com.github.zly2006.carpetslsaddition.util.LegacyAsyncExecutor.start(); running = true; } else if (!want && running) { com.github.zly2006.carpetslsaddition.util.LegacyAsyncExecutor.stop(); running = false; } Thread.sleep(1000L); } catch (InterruptedException e) { return; } catch (Throwable t) { LOGGER.debug("[SLSA] legacy rule watcher error: {}", t.toString()); } } }, "SLSA-Legacy-RuleWatcher"); watcher.setDaemon(true); watcher.start(); } @Override public Map canHasTranslations(String lang) { Map translation = Maps.newHashMap(); try { try (InputStream stream = ServerMain.class.getResourceAsStream("/assets/slsaddition/lang/%s.json".formatted(lang))) { assert stream != null; return GSON.fromJson(new InputStreamReader(stream), Map.class); } } catch (IOException | NullPointerException ignored) { try { try (InputStream stream = ServerMain.class.getResourceAsStream("/assets/slsaddition/lang/en_us.json")) { assert stream != null; return GSON.fromJson(new InputStreamReader(stream), Map.class); } } catch (IOException | NullPointerException e) { return translation; } } } @Override public void registerCommands(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext) { LOGGER.info("[SLSA] registerCommands called!"); try { HatCommand.register(dispatcher); SitCommand.register(dispatcher); BotCommand.register(dispatcher); LOGGER.info("[SLSA] commands registered: hat/sit/bot"); } catch (Throwable t) { LOGGER.error("[SLSA] failed to register commands", t); } } }