From fe63334509f5e127d806edbd4f6804e94a1a53bc Mon Sep 17 00:00:00 2001 From: gnembon Date: Mon, 30 Mar 2020 17:14:16 -0300 Subject: [PATCH] enabled some client side command interpretation. --- src/main/java/carpet/CarpetServer.java | 1 + src/main/java/carpet/CarpetSettings.java | 7 ++++++- ...ClientPlayerEntity_clientCommandMixin.java | 19 +++++++++++++++++++ src/main/java/carpet/settings/ParsedRule.java | 19 ++++++++++++++----- .../java/carpet/settings/RuleCategory.java | 1 + .../java/carpet/settings/SettingsManager.java | 18 ++++++++++++++++++ src/main/java/carpet/settings/Validator.java | 13 +++++++++++++ src/main/resources/carpet.mixins.json | 3 ++- 8 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 src/main/java/carpet/mixins/ClientPlayerEntity_clientCommandMixin.java diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index 825b221f..7f471737 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -119,6 +119,7 @@ public class CarpetServer // static for now - easier to handle all around the co settingsManager.detachServer(); LoggerRegistry.stopLoggers(); extensions.forEach(e -> e.onServerClosed(server)); + minecraft_server = null; } public static void registerExtensionLoggers() diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index b57e1705..a46c7019 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -30,6 +30,7 @@ import static carpet.settings.RuleCategory.SURVIVAL; import static carpet.settings.RuleCategory.TNT; import static carpet.settings.RuleCategory.DISPENSER; import static carpet.settings.RuleCategory.SCARPET; +import static carpet.settings.RuleCategory.CLIENT; @SuppressWarnings("CanBeFinal") public class CarpetSettings @@ -364,7 +365,11 @@ public class CarpetSettings @Rule(desc = "placing blocks cause block updates", category = CREATIVE) public static boolean interactionUpdates = true; - @Rule(desc = "smooth client animations with low tps settings", extra = "works only in SP, and will slow down players", category = CREATIVE) + @Rule( + desc = "smooth client animations with low tps settings", + extra = "works only in SP, and will slow down players", + category = {CREATIVE, SURVIVAL, CLIENT} + ) public static boolean smoothClientAnimations; //@Rule( diff --git a/src/main/java/carpet/mixins/ClientPlayerEntity_clientCommandMixin.java b/src/main/java/carpet/mixins/ClientPlayerEntity_clientCommandMixin.java new file mode 100644 index 00000000..622de0c3 --- /dev/null +++ b/src/main/java/carpet/mixins/ClientPlayerEntity_clientCommandMixin.java @@ -0,0 +1,19 @@ +package carpet.mixins; + +import carpet.CarpetServer; +import net.minecraft.client.network.ClientPlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientPlayerEntity.class) +public class ClientPlayerEntity_clientCommandMixin +{ + @Inject(method = "sendChatMessage", at = @At("HEAD")) + private void inspectMessage(String string, CallbackInfo ci) + { + if (CarpetServer.minecraft_server == null) + CarpetServer.settingsManager.inspectClientsideCommand(string); + } +} diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index 2b7289cf..e75bb3f6 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -20,6 +20,7 @@ public final class ParsedRule implements Comparable { public final ImmutableList categories; public final ImmutableList options; public boolean isStrict; + public boolean isClient; public final Class type; public final List> validators; public final T defaultValue; @@ -46,6 +47,11 @@ public final class ParsedRule implements Comparable { this.validators.add((Validator) callConstructor(Validator._COMMAND_LEVEL_VALIDATOR.class)); } } + this.isClient = categories.contains(RuleCategory.CLIENT); + if (this.isClient) + { + this.validators.add(callConstructor(Validator._CLIENT.class)); + } this.defaultValue = get(); this.defaultAsString = convertToString(this.defaultValue); if (rule.options().length > 0) @@ -132,16 +138,19 @@ public final class ParsedRule implements Comparable { value = validator.validate(source, this, value, stringValue); if (value == null) { - Messenger.m(source, "r Wrong value for " + name + ": " + stringValue); - if (validator.description()!= null) - Messenger.m(source, "r " + validator.description()); + if (source != null) + { + Messenger.m(source, "r Wrong value for " + name + ": " + stringValue); + if (validator.description() != null) + Messenger.m(source, "r " + validator.description()); + } return null; } } - if (!value.equals(get())) + if (!value.equals(get()) || source == null) { this.field.set(null, value); - CarpetServer.settingsManager.notifyRuleChanged(source, this, stringValue); + if (source != null) CarpetServer.settingsManager.notifyRuleChanged(source, this, stringValue); } } catch (IllegalAccessException e) diff --git a/src/main/java/carpet/settings/RuleCategory.java b/src/main/java/carpet/settings/RuleCategory.java index 07a37f16..a6f0e302 100644 --- a/src/main/java/carpet/settings/RuleCategory.java +++ b/src/main/java/carpet/settings/RuleCategory.java @@ -12,5 +12,6 @@ public class RuleCategory public static final String TNT = "tnt"; public static final String DISPENSER = "dispenser"; public static final String SCARPET = "scarpet"; + public static final String CLIENT = "client"; } diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 77fad242..675df7b8 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -558,4 +558,22 @@ public class SettingsManager return 1; } + public void inspectClientsideCommand(String string) + { + if (string.startsWith("/carpet ")) + { + String[] res = string.split("\\s+", 3); + if (res.length == 3) + { + String setting = res[1]; + String strOption = res[2]; + if (rules.containsKey(setting) && rules.get(setting).isClient) + { + rules.get(setting).set(null, strOption); + } + } + + + } + } } diff --git a/src/main/java/carpet/settings/Validator.java b/src/main/java/carpet/settings/Validator.java index 7a59bec9..56bf64a0 100644 --- a/src/main/java/carpet/settings/Validator.java +++ b/src/main/java/carpet/settings/Validator.java @@ -41,6 +41,19 @@ public abstract class Validator public String description() { return "It has an accompanying command";} } + public static class _CLIENT extends Validator + { + @Override + public T validate(ServerCommandSource source, ParsedRule currentRule, T newValue, String string) + { + return newValue; + } + @Override + public String description() { return "Its a client command so can be issued when connecting to non-carpet servers. " + + "In client-server setting it will only affect the executing player, so each player needs to type it" + + " separately for the desired effect";} + } + public static class _COMMAND_LEVEL_VALIDATOR extends Validator { private static ImmutableList OPTIONS = ImmutableList.of("true", "false", "ops", "0", "1", "2", "3", "4"); @Override public String validate(ServerCommandSource source, ParsedRule currentRule, String newValue, String userString) { diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index fc3fbbfa..25c2356e 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -163,7 +163,8 @@ "InGameHudMixin", "PlayerListHudMixin", "PistonBlockEntityRenderer_movableTEMixin", - "ClientPlayNetworkHandler_smoothClientAnimationsMixin" + "ClientPlayNetworkHandler_smoothClientAnimationsMixin", + "ClientPlayerEntity_clientCommandMixin" ], "server": [ "MinecraftDedicatedServerMixin"