From 741edf146529d8fa787e6795efa33ee11654b07d Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 3 Nov 2020 04:45:08 -0400 Subject: [PATCH] three things: - logger is carpet, fixes #522 - fixed fancy commands to functions - so could be used later with lambdas and functions that use different argument names - moved a few builtin apps to commands via /carpet --- src/main/java/carpet/CarpetSettings.java | 28 ++++++++++++- .../java/carpet/script/CarpetScriptHost.java | 11 ++--- .../carpet/script/CarpetScriptServer.java | 41 +++++++++++-------- .../script/command/CommandArgument.java | 2 +- src/main/java/carpet/settings/ParsedRule.java | 3 +- src/main/java/carpet/settings/Rule.java | 2 +- .../java/carpet/settings/SettingsManager.java | 10 ++++- 7 files changed, 67 insertions(+), 30 deletions(-) diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index e7d5395f..c3fac0d0 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -37,7 +37,7 @@ import static carpet.settings.RuleCategory.CLIENT; public class CarpetSettings { public static final String carpetVersion = "1.4.15+v201102"; - public static final Logger LOG = LogManager.getLogger(); + public static final Logger LOG = LogManager.getLogger("carpet"); public static boolean skipGenerationChecks = false; public static boolean impendingFillSkipUpdates = false; public static Box currentTelepotingEntityBox = null; @@ -71,6 +71,32 @@ public class CarpetSettings ) public static String language = "none"; + @Rule( + desc = "Turns on internal camera path tracing app", + extra = "Controlled via 'camera' command", + category = {COMMAND, SCARPET}, + appSource = "camera" + ) + public static boolean commandCamera = true; + + @Rule( + desc = "Allows to add extra graphical debug information", + extra = "Controlled via 'overlay' command", + category = {COMMAND, SCARPET}, + appSource = "overlay" + ) + public static boolean commandOverlay = true; + + @Rule( + desc = "Turns on extra information about mobs above and around them", + extra = "Controlled via 'ai_tracker' command", + category = {COMMAND, SCARPET}, + appSource = "ai_tracker" + ) + public static boolean commandAITracker = true; + + + @Rule(desc = "Gbhs sgnf sadsgras fhskdpri!", category = EXPERIMENTAL) public static boolean superSecretSetting = false; diff --git a/src/main/java/carpet/script/CarpetScriptHost.java b/src/main/java/carpet/script/CarpetScriptHost.java index 68f5bc83..edd5281e 100644 --- a/src/main/java/carpet/script/CarpetScriptHost.java +++ b/src/main/java/carpet/script/CarpetScriptHost.java @@ -210,11 +210,11 @@ public class CarpetScriptHost extends ScriptHost } } - public Value handleCommand(ServerCommandSource source, String call, List args) + public Value handleCommand(ServerCommandSource source, FunctionValue function, List args) { try { - return call(source, call, args); + return call(source, function, args); } catch (CarpetExpressionException exc) { @@ -330,20 +330,17 @@ public class CarpetScriptHost extends ScriptHost } } - public Value call(ServerCommandSource source, String call, List suppliedArgs) + public Value call(ServerCommandSource source, FunctionValue function, List suppliedArgs) { if (CarpetServer.scriptServer.stopAll) throw new CarpetExpressionException("SCARPET PAUSED", null); - FunctionValue function = getFunction(call); - if (function == null) - throw new CarpetExpressionException("UNDEFINED", null); List argv = FunctionValue.lazify(suppliedArgs); List args = function.getArguments(); if (argv.size() != args.size()) { - String error = "Fail: stored function "+call+" takes "+args.size()+" arguments, not "+argv.size()+ ":\n"; + String error = "Fail: stored function "+function.getPrettyString()+" takes "+args.size()+" arguments, not "+argv.size()+ ":\n"; for (int i = 0; i < max(argv.size(), args.size()); i++) { error += (i "+(i ctx, String hostName, String funName) throws CommandSyntaxException + private int execute(CommandContext ctx, String hostName, FunctionValue function, List paramNames) throws CommandSyntaxException { CarpetScriptHost cHost = modules.get(hostName).retrieveForExecution(ctx.getSource()); - List argNames = cHost.getFunction(funName).getArguments(); + List argNames = function.getArguments(); + if (argNames.size() != paramNames.size()) + throw new SimpleCommandExceptionType(new LiteralText("Target function "+function.getPrettyString()+" as wrong number of arguments, required "+paramNames.size()+", found "+argNames.size())).create(); List args = new ArrayList<>(argNames.size()); - for (String s : argNames) + for (String s : paramNames) { args.add(CommandArgument.getValue(ctx, s)); } - Value response = cHost.handleCommand(ctx.getSource(), funName, args); + Value response = cHost.handleCommand(ctx.getSource(), function, args); if (!response.isNull()) Messenger.m(ctx.getSource(), "gi " + response.getString()); return (int) response.readInteger(); } - private LiteralArgumentBuilder getFancyCommand(LiteralArgumentBuilder command, ScriptHost host, String funName ) + private LiteralArgumentBuilder getFancyCommand(LiteralArgumentBuilder command, ScriptHost host, FunctionValue function ) { - List argNames = host.getFunction(funName).getArguments(); + List argNames = function.getArguments(); String hostName = host.getName(); if (argNames.size() == 0) { - return command.then(literal(funName). - requires((player) -> modules.containsKey(hostName) && modules.get(hostName).getFunction(funName) != null). - executes((c) -> execute(c, hostName, funName))); + return command.then(literal(function.getString()). + requires((player) -> modules.containsKey(hostName)). + executes((c) -> execute(c, hostName, function, Collections.emptyList()))); } else { List reversedArgs = new ArrayList<>(argNames); Collections.reverse(reversedArgs); - RequiredArgumentBuilder argChain = CommandArgument.argumentNode(reversedArgs.get(0)).executes(c -> execute(c, hostName, funName)); + RequiredArgumentBuilder argChain = CommandArgument.argumentNode(reversedArgs.get(0)).executes(c -> execute(c, hostName, function, argNames)); for (int i = 1; i < reversedArgs.size(); i++) { argChain = CommandArgument.argumentNode(reversedArgs.get(i)).then(argChain); } - return command.then(literal(funName). - requires((player) -> modules.containsKey(hostName) && modules.get(hostName).getFunction(funName) != null). + return command.then(literal(function.getString()). + requires((player) -> modules.containsKey(hostName)). then(argChain) ); } diff --git a/src/main/java/carpet/script/command/CommandArgument.java b/src/main/java/carpet/script/command/CommandArgument.java index 39468783..1a014834 100644 --- a/src/main/java/carpet/script/command/CommandArgument.java +++ b/src/main/java/carpet/script/command/CommandArgument.java @@ -169,7 +169,7 @@ public abstract class CommandArgument if (!caseSensitive) choseValue = choseValue.toLowerCase(Locale.ROOT); if (!validOptions.isEmpty() && !validOptions.contains(choseValue)) { - throw new SimpleCommandExceptionType(new LiteralText("")).create(); + throw new SimpleCommandExceptionType(new LiteralText("Incorrect value for "+param+": "+choseValue)).create(); } return StringValue.of(choseValue); } diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index b441c5f8..052eed7a 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -1,6 +1,5 @@ package carpet.settings; -import carpet.CarpetServer; import carpet.utils.Translations; import carpet.utils.Messenger; import com.google.common.collect.ImmutableList; @@ -43,7 +42,7 @@ public final class ParsedRule implements Comparable { this.isStrict = rule.strict(); this.extraInfo = ImmutableList.copyOf(rule.extra()); this.categories = ImmutableList.copyOf(rule.category()); - this.scarpetApp = rule.scarpetApp(); + this.scarpetApp = rule.appSource(); this.settingsManager = settingsManager; this.validators = new ArrayList<>(); for (Class v : rule.validate()) diff --git a/src/main/java/carpet/settings/Rule.java b/src/main/java/carpet/settings/Rule.java index e0364e6c..365d4cb3 100644 --- a/src/main/java/carpet/settings/Rule.java +++ b/src/main/java/carpet/settings/Rule.java @@ -58,7 +58,7 @@ public @interface Rule * Consider telling the rule name so users can edit globals * (in case there are relevant globals to edit ofc) */ - String scarpetApp() default ""; + String appSource() default ""; /** * The class of the validator checked when the rule is changed. diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 05da31f4..9c19b3f9 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -57,6 +57,8 @@ public class SettingsManager private final String fancyName; private MinecraftServer server; private List, String>> observers = new ArrayList<>(); + private static List, String>> staticObservers = new ArrayList<>(); + public SettingsManager(String version, String identifier) { @@ -103,13 +105,19 @@ public class SettingsManager { observers.add(observer); } + public static void addGlobalRuleObserver(TriConsumer, String> observer) + { + staticObservers.add(observer); + } + void notifyRuleChanged(ServerCommandSource source, ParsedRule rule, String userTypedValue) { observers.forEach(observer -> observer.accept(source, rule, userTypedValue)); + staticObservers.forEach(observer -> observer.accept(source, rule, userTypedValue)); ServerNetworkHandler.updateRuleWithConnectedClients(rule); switchScarpetRule(source, rule); - CARPET_RULE_CHANGES.onCarpetRuleChanges(rule, source); + if (CARPET_RULE_CHANGES.isNeeded()) CARPET_RULE_CHANGES.onCarpetRuleChanges(rule, source); } void switchScarpetRule(ServerCommandSource source, ParsedRule rule)