From 7d940d35cf867061de75176c3db7d0011a35b0b8 Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Thu, 16 Apr 2020 21:35:26 +0200 Subject: Added /savedata stats command --- Readme.md | 28 +++- gradle.properties | 2 +- src/main/java/re/jag/parquet/Parquet.java | 5 +- .../java/re/jag/parquet/commands/CameraMode.java | 7 +- .../jag/parquet/commands/ListAllPlayerSaves.java | 59 ------- .../java/re/jag/parquet/commands/Savedata.java | 184 +++++++++++++++++++++ 6 files changed, 220 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/re/jag/parquet/commands/ListAllPlayerSaves.java create mode 100644 src/main/java/re/jag/parquet/commands/Savedata.java diff --git a/Readme.md b/Readme.md index 1ec6136..70d4e3f 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,29 @@ # Parquet -Minecraft Java Mod for Fabric Loader \ No newline at end of file +Minecraft Java Mod for Fabric Loader + +## Commands + +### Cameramode `/x` `/a` `/d` + +* `x` Enter +* `a` Survival +* `d` Server default + +Invocation Location is saved and restored on exit to make it less exploitable + +Not using `/c` and `/s` to be carpet compatible + +### `/savedata` + +#### `playersave list` + +List all player savefiles, UUIDs are resolved to names if in usercache + +#### `stats` + +Query user statistics and import them to the scoreboard. + +`/savedata stats PLAYER CRITERIA [import OBJECTIVE [MULTIPLIER]]` + +If `MULTIPLIER < 0` the score is modified with `1/MULTIPLIER`, since FloatArgumentType does not support exponentials like 1.3e-4 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 7cf5397..6dd7bd9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.8.2+build.194 # Mod Properties - mod_version = 0.0.0-2020-04-13 + mod_version = 0.0.0-2020-04-16 maven_group = re.jag archives_base_name = parquet diff --git a/src/main/java/re/jag/parquet/Parquet.java b/src/main/java/re/jag/parquet/Parquet.java index 17c3021..a7e1d27 100644 --- a/src/main/java/re/jag/parquet/Parquet.java +++ b/src/main/java/re/jag/parquet/Parquet.java @@ -5,7 +5,7 @@ import com.mojang.brigadier.CommandDispatcher; import net.fabricmc.api.ModInitializer; import net.minecraft.server.command.ServerCommandSource; import re.jag.parquet.commands.CameraMode; -import re.jag.parquet.commands.ListAllPlayerSaves; +import re.jag.parquet.commands.Savedata; public class Parquet implements ModInitializer { @@ -15,8 +15,9 @@ public class Parquet implements ModInitializer { } public static void registerCommands(CommandDispatcher dispatcher) { - ListAllPlayerSaves.register(dispatcher); + Savedata.register(dispatcher); CameraMode.register(dispatcher); + System.out.println("[parquet] Registered commands"); } } diff --git a/src/main/java/re/jag/parquet/commands/CameraMode.java b/src/main/java/re/jag/parquet/commands/CameraMode.java index 0b74f1e..55f7687 100644 --- a/src/main/java/re/jag/parquet/commands/CameraMode.java +++ b/src/main/java/re/jag/parquet/commands/CameraMode.java @@ -19,11 +19,14 @@ import re.jag.parquet.interfaces.CameraModeData; public class CameraMode { public static void register(CommandDispatcher dispatcher) { - LiteralArgumentBuilder camermode = literal("c"). + /* + * If not used with fabric-carpet, /s and /c can be used. + */ + LiteralArgumentBuilder camermode = literal("x"). executes((c) -> camera( c.getSource(), c.getSource().getPlayer())). then(argument("player", EntityArgumentType.player()). executes( (c) -> camera(c.getSource(), EntityArgumentType.getPlayer(c, "player")))); - LiteralArgumentBuilder survivalmode = literal("s"). + LiteralArgumentBuilder survivalmode = literal("a"). executes((c) -> survival( c.getSource(), c.getSource().getPlayer())). then(argument("player", EntityArgumentType.player()). executes( (c) -> survival(c.getSource(), EntityArgumentType.getPlayer(c, "player")))); diff --git a/src/main/java/re/jag/parquet/commands/ListAllPlayerSaves.java b/src/main/java/re/jag/parquet/commands/ListAllPlayerSaves.java deleted file mode 100644 index 5b5668f..0000000 --- a/src/main/java/re/jag/parquet/commands/ListAllPlayerSaves.java +++ /dev/null @@ -1,59 +0,0 @@ -package re.jag.parquet.commands; - -import java.util.UUID; - -import static net.minecraft.server.command.CommandManager.literal; -import static net.minecraft.server.command.CommandManager.argument; - -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.authlib.GameProfile; - -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.LiteralText; -import net.minecraft.world.dimension.DimensionType; - -public class ListAllPlayerSaves { - public static void register(CommandDispatcher dispatcher) { - LiteralArgumentBuilder savedata = literal("savedata"). - requires(source -> source.hasPermissionLevel(4)). - executes((c) -> help(c.getSource())). - then( literal("playersave"). - then(literal("list"). - executes((c) -> list_local_saves(c.getSource())) - ). - then(argument("UUID", StringArgumentType.word()). - executes((c) -> get_player_save_uuid(c.getSource(), StringArgumentType.getString(c, "UUID"))) - ) - ); - - dispatcher.register(savedata); - } - - private static int help(ServerCommandSource source) { - source.sendFeedback(new LiteralText("Test"), false); - return 1; - } - - private static int list_local_saves(ServerCommandSource source) { - String uuid_list[] = source.getMinecraftServer().getWorld(DimensionType.OVERWORLD).getSaveHandler().getSavedPlayerIds(); - - for (int i = 0; i < uuid_list.length; i++) { - GameProfile profile = source.getMinecraftServer().getUserCache().getByUuid(UUID.fromString(uuid_list[i])); - String name = "N.A."; - - if(profile != null) - name = profile.getName(); - - source.sendFeedback(new LiteralText(name + " (" + uuid_list[i] + ")"), false); - } - - return 1; - } - - private static int get_player_save_uuid(ServerCommandSource source, String uuid) { - return 1; - } - -} diff --git a/src/main/java/re/jag/parquet/commands/Savedata.java b/src/main/java/re/jag/parquet/commands/Savedata.java new file mode 100644 index 0000000..5d1c8e3 --- /dev/null +++ b/src/main/java/re/jag/parquet/commands/Savedata.java @@ -0,0 +1,184 @@ +package re.jag.parquet.commands; + +import java.util.UUID; + +import static net.minecraft.server.command.CommandManager.literal; +import static net.minecraft.server.command.CommandManager.argument; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.arguments.FloatArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.authlib.GameProfile; + +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.command.arguments.EntityArgumentType; +import net.minecraft.command.arguments.ObjectiveArgumentType; +import net.minecraft.command.arguments.ObjectiveCriteriaArgumentType; +import net.minecraft.item.Item; +import net.minecraft.scoreboard.ScoreboardCriterion; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.scoreboard.ScoreboardPlayerScore; +import net.minecraft.scoreboard.ServerScoreboard; +import net.minecraft.text.LiteralText; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.stat.Stat; +import net.minecraft.stat.StatType; +import net.minecraft.stat.Stats; +import net.minecraft.block.Block; + +public class Savedata { + public static void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder savedata = literal("savedata"). + requires(source -> source.hasPermissionLevel(4)). + executes((c) -> help(c.getSource())). + then( literal("playersave"). + then(literal("list"). + executes((c) -> list_local_saves(c.getSource())) + ). + then(argument("UUID", StringArgumentType.word()). + executes((c) -> get_player_save_uuid(c.getSource(), StringArgumentType.getString(c, "UUID"))) + ) + ). + then(literal("stats"). + then(argument("player", EntityArgumentType.player()). + then(argument("criteria", ObjectiveCriteriaArgumentType.objectiveCriteria()). + executes((c)->print_player_stat(c.getSource(), EntityArgumentType.getPlayer(c, "player"), ObjectiveCriteriaArgumentType.getCriteria(c, "criteria"))). + then(literal("import").then(argument("score", ObjectiveArgumentType.objective()). + executes((c) -> import_stat_to_scoreboard(c.getSource(), EntityArgumentType.getPlayer(c, "player"), ObjectiveCriteriaArgumentType.getCriteria(c, "criteria"), + ObjectiveArgumentType.getWritableObjective(c, "score"), 1)). + then(argument("multiplier", FloatArgumentType.floatArg()). + executes((c) -> import_stat_to_scoreboard(c.getSource(), EntityArgumentType.getPlayer(c, "player"), ObjectiveCriteriaArgumentType.getCriteria(c, "criteria"), + ObjectiveArgumentType.getWritableObjective(c, "score"), FloatArgumentType.getFloat(c, "multiplier"))))) + )) + ) + ) + ; + + dispatcher.register(savedata); + } + + private static int help(ServerCommandSource source) { + source.sendFeedback(new LiteralText("Test"), false); + return 1; + } + + private static int list_local_saves(ServerCommandSource source) { + String uuid_list[] = source.getMinecraftServer().getWorld(DimensionType.OVERWORLD).getSaveHandler().getSavedPlayerIds(); + + for (int i = 0; i < uuid_list.length; i++) { + GameProfile profile = source.getMinecraftServer().getUserCache().getByUuid(UUID.fromString(uuid_list[i])); + String name = "N.A."; + + if(profile != null) + name = profile.getName(); + + source.sendFeedback(new LiteralText(name + " (" + uuid_list[i] + ")"), false); + } + + return 1; + } + + private static int import_stat_to_scoreboard(ServerCommandSource source, ServerPlayerEntity player,ScoreboardCriterion stat, ScoreboardObjective objective, float multiplier) { + int score = get_player_stat(source, player, stat); + if (score < 0) + return 0; + + ServerScoreboard server_scoreboard = source.getMinecraftServer().getScoreboard(); + ScoreboardPlayerScore player_score = server_scoreboard.getPlayerScore(player.getEntityName(), objective); + + int mod_score = multiplier >= 0 ? (int)((float)score * multiplier) : (int)((float)score / multiplier * (-1)); + + player_score.setScore(mod_score); + + return 1; + } + + private static int get_player_save_uuid(ServerCommandSource source, String uuid) { + return 1; + } + + private static int print_player_stat(ServerCommandSource source, ServerPlayerEntity player, ScoreboardCriterion stat) { + Integer stat_value = get_player_stat(source, player, stat); + + if (stat_value >= 0) + { + source.sendFeedback(new LiteralText(stat_value.toString()), false); + return 1; + } + return 0; + } + + private static int get_player_stat(ServerCommandSource source, ServerPlayerEntity player, ScoreboardCriterion stat) { + + String criteria_name = stat.getName(); + int criteria_name_seperator = criteria_name.indexOf(':'); + + String registry_name=""; + String stat_name=""; + + if (criteria_name_seperator < 0) { + source.sendError(new LiteralText("Invalid Argument")); + return -1; + } else { + registry_name = criteria_name.substring(0,criteria_name_seperator); + stat_name = criteria_name.substring(criteria_name_seperator + 1, criteria_name.length() ); + } + + //Not good but whatever + int returned_stat = -1; + try { + switch(registry_name) { + case "minecraft.mined": + //Block + returned_stat = get_stat_block(player, registry_name, stat_name); + break; + case "minecraft.crafted": + case "minecraft.used": + case "minecraft.broken": + case "minecraft.picked_up": + case "minecraft.dropped": + returned_stat = get_stat_item(player, registry_name, stat_name); + break; + case "minecraft.custom": + returned_stat = get_stat_custom(player, stat_name); + //Custom + break; + default: + source.sendError(new LiteralText("Unknown Statistic")); + return -1; + }; + } catch (CommandSyntaxException e) { + source.sendError(new LiteralText("Failed: " + e.getContext())); + return -1; + } + + return returned_stat; + } + + private static int get_stat_block(ServerPlayerEntity player, String registry_name, String stat_name) throws CommandSyntaxException { + @SuppressWarnings("unchecked") + StatType stat_type = (StatType) Registry.STAT_TYPE.get(Identifier.splitOn(registry_name, '.')); + Block block = Registry.BLOCK.get(Identifier.splitOn(stat_name, '.')); + Stat stat = stat_type.getOrCreateStat(block); + return player.getStatHandler().getStat(stat); + } + + private static int get_stat_item(ServerPlayerEntity player, String registry_name, String stat_name) throws CommandSyntaxException { + @SuppressWarnings("unchecked") + StatType stat_type = (StatType) Registry.STAT_TYPE.get(Identifier.splitOn(registry_name, '.')); + Item item = Registry.ITEM.get(Identifier.splitOn(stat_name, '.')); + Stat stat = stat_type.getOrCreateStat(item); + return player.getStatHandler().getStat(stat); + } + + private static int get_stat_custom(ServerPlayerEntity player, String stat_name) throws CommandSyntaxException { + Stat stat = Stats.CUSTOM.getOrCreateStat(Identifier.splitOn(stat_name, '.')); + return player.getStatHandler().getStat(stat); + + } +} -- cgit v1.2.3