From c5841408a617bcb9a9c1acdc87a9539045aaf06e Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 5 Jun 2020 23:23:47 -0300 Subject: [PATCH] extensions trigger for resource reload. Apps will reload upon reload --- src/main/java/carpet/CarpetExtension.java | 2 ++ src/main/java/carpet/CarpetServer.java | 6 +++++ .../mixins/PlayerManager_coreMixin.java | 11 +++++++++ .../java/carpet/script/CarpetEventServer.java | 9 +++++++ .../carpet/script/CarpetScriptServer.java | 24 +++++++++++++++---- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/carpet/CarpetExtension.java b/src/main/java/carpet/CarpetExtension.java index 499c6c9e..30329dc6 100644 --- a/src/main/java/carpet/CarpetExtension.java +++ b/src/main/java/carpet/CarpetExtension.java @@ -50,6 +50,8 @@ public interface CarpetExtension default void onServerClosed(MinecraftServer server) {} + default void onReload(MinecraftServer server) {} + default String version() {return null;} default void registerLoggers() {} diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index cb8254e2..44f0e91b 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -146,5 +146,11 @@ public class CarpetServer // static for now - easier to handle all around the co TickSpeed.reset(); settingsManager.detachServer(); } + + public static void onReload(MinecraftServer server) + { + scriptServer.reload(server); + extensions.forEach(e -> e.onReload(server)); + } } diff --git a/src/main/java/carpet/mixins/PlayerManager_coreMixin.java b/src/main/java/carpet/mixins/PlayerManager_coreMixin.java index 62eeefff..a272f7bd 100644 --- a/src/main/java/carpet/mixins/PlayerManager_coreMixin.java +++ b/src/main/java/carpet/mixins/PlayerManager_coreMixin.java @@ -2,9 +2,12 @@ package carpet.mixins; import carpet.CarpetServer; import net.minecraft.network.ClientConnection; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ServerPlayerEntity; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -14,10 +17,18 @@ import static carpet.script.CarpetEventServer.Event.PLAYER_CONNECTS; @Mixin(PlayerManager.class) public class PlayerManager_coreMixin { + @Shadow @Final private MinecraftServer server; + @Inject(method = "onPlayerConnect", at = @At("RETURN")) private void onPlayerConnected(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { CarpetServer.onPlayerLoggedIn(player); PLAYER_CONNECTS.onPlayerEvent(player); } + + @Inject(method = "onDataPacksReloaded", at = @At("HEAD")) + private void onResourcesRefreshedReloadCommand(CallbackInfo ci) + { + CarpetServer.onReload(server); + } } diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 6ad0eebf..048e7ce1 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -187,6 +187,10 @@ public class CarpetEventServer { callList.removeIf((c)-> c.host != null && c.host.equals(hostName)); } + public void clearEverything() + { + callList.clear(); + } } public enum Event @@ -736,6 +740,11 @@ public class CarpetEventServer Event.byName.values().forEach((e) -> e.handler.removeAllCalls(hostName)); } + public void clearAll() + { + Event.byName.values().forEach(e -> e.handler.clearEverything()); + } + private Pair decodeCallback(String funName) { Pattern find = Pattern.compile("(\\w+)\\(from (\\w+)\\)"); diff --git a/src/main/java/carpet/script/CarpetScriptServer.java b/src/main/java/carpet/script/CarpetScriptServer.java index 49237b0c..0717e875 100644 --- a/src/main/java/carpet/script/CarpetScriptServer.java +++ b/src/main/java/carpet/script/CarpetScriptServer.java @@ -15,6 +15,7 @@ import carpet.utils.Messenger; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.tree.CommandNode; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.WorldSavePath; import net.minecraft.util.math.BlockPos; @@ -35,12 +36,12 @@ import static net.minecraft.server.command.CommandManager.literal; public class CarpetScriptServer { //make static for now, but will change that later: - public final CarpetScriptHost globalHost; - public final Map modules; + public CarpetScriptHost globalHost; + public Map modules; public long tickStart; public boolean stopAll; - private final Set holyMoly; - public final CarpetEventServer events; + private Set holyMoly; + public CarpetEventServer events; private static final List bundledModuleData = new ArrayList(){{ add(new BundledModule("camera", false)); @@ -51,6 +52,11 @@ public class CarpetScriptServer }}; public CarpetScriptServer() + { + init(); + } + + private void init() { ScriptHost.systemGlobals.clear(); events = new CarpetEventServer(); @@ -281,4 +287,14 @@ public class CarpetScriptServer } ThreadValue.shutdown(); } + + public void reload(MinecraftServer server) + { + Map apps = new HashMap<>(); + modules.forEach((s, h) -> apps.put(s, h.perUser)); + apps.keySet().forEach(s -> removeScriptHost(server.getCommandSource(), s)); + events.clearAll(); + init(); + apps.forEach((s, pp) -> addScriptHost(server.getCommandSource(), s, pp, false)); + } }