From ecd50b8ec1e35276faa4348aae8d654b6b661ecf Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Sun, 2 May 2021 21:39:06 +0200 Subject: [PATCH] default + personal groups (close #51) + basic help command --- .../java/com/flemmli97/flan/IClaimData.java | 6 - .../flan/api/PermissionRegistry.java | 4 +- .../java/com/flemmli97/flan/claim/Claim.java | 15 +- .../flemmli97/flan/claim/ClaimStorage.java | 5 +- .../flemmli97/flan/claim/IClaimStorage.java | 6 + .../flemmli97/flan/commands/CommandClaim.java | 65 ++++++- .../flemmli97/flan/commands/CommandHelp.java | 49 +++++ .../flan/commands/CommandPermission.java | 1 + .../com/flemmli97/flan/config/Config.java | 52 +++++ .../com/flemmli97/flan/config/LangConfig.java | 3 + .../flan/gui/GroupPlayerScreenHandler.java | 2 +- .../flan/gui/GroupScreenHandler.java | 2 +- .../flan/gui/PersonalGroupScreenHandler.java | 130 +++++++++++++ .../gui/PersonalPermissionScreenHandler.java | 183 ++++++++++++++++++ .../flan/gui/ServerScreenHelper.java | 33 ++++ .../flan/gui/StringResultScreenHandler.java | 9 +- .../flan/mixin/PlayerClaimMixin.java | 6 +- .../flan/mixin/ServerWorldMixin.java | 6 +- .../flan/player/IPlayerClaimImpl.java | 6 + .../flan/player/PlayerClaimData.java | 42 +++- 20 files changed, 594 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/com/flemmli97/flan/IClaimData.java create mode 100644 src/main/java/com/flemmli97/flan/claim/IClaimStorage.java create mode 100644 src/main/java/com/flemmli97/flan/commands/CommandHelp.java create mode 100644 src/main/java/com/flemmli97/flan/gui/PersonalGroupScreenHandler.java create mode 100644 src/main/java/com/flemmli97/flan/gui/PersonalPermissionScreenHandler.java create mode 100644 src/main/java/com/flemmli97/flan/player/IPlayerClaimImpl.java diff --git a/src/main/java/com/flemmli97/flan/IClaimData.java b/src/main/java/com/flemmli97/flan/IClaimData.java deleted file mode 100644 index 034856d..0000000 --- a/src/main/java/com/flemmli97/flan/IClaimData.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.flemmli97.flan; - -public interface IClaimData { - - T getClaimData(); -} diff --git a/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java b/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java index 051b453..28ba88d 100644 --- a/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java +++ b/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java @@ -58,7 +58,7 @@ public class PermissionRegistry { public static ClaimPermission BUCKET = register(new ClaimPermission("BUCKET", () -> new ItemStack(Items.BUCKET), "Permission to take liquids with buckets")); public static ClaimPermission ENDERPEARL = register(new ClaimPermission("ENDERPEARL", () -> new ItemStack(Items.ENDER_PEARL), "Permission to use enderpearls")); public static ClaimPermission CHORUSFRUIT = register(new ClaimPermission("CHORUSFRUIT", () -> new ItemStack(Items.CHORUS_FRUIT), "Permission to eat chorus fruits")); - public static ClaimPermission ANIMALINTERACT = register(new ClaimPermission("ANIMALINTERACT", () -> new ItemStack(Items.CHICKEN_SPAWN_EGG), "Permission to interact with animals (e.g. shearing sheeps)")); + public static ClaimPermission ANIMALINTERACT = register(new ClaimPermission("ANIMALINTERACT", () -> new ItemStack(Items.CHICKEN_SPAWN_EGG), "Permission to interact with animals", "(e.g. shearing sheeps)")); public static ClaimPermission HURTANIMAL = register(new ClaimPermission("HURTANIMAL", () -> new ItemStack(Items.BEEF), "Permission to hurt animals")); public static ClaimPermission XP = register(new ClaimPermission("XP", () -> new ItemStack(Items.EXPERIENCE_BOTTLE), "Permission to pick up xp orbs")); public static ClaimPermission TRADING = register(new ClaimPermission("TRADING", () -> new ItemStack(Items.EMERALD), "Permission to trade with villagers")); @@ -73,7 +73,7 @@ public class PermissionRegistry { public static ClaimPermission WATERBORDER = global(new ClaimPermission("WATERBORDER", () -> new ItemStack(Items.WATER_BUCKET), "Toggle water crossing claim borders")); public static ClaimPermission PISTONBORDER = global(new ClaimPermission("PISTONBORDER", () -> new ItemStack(Items.PISTON), "Toggle piston pull/push across claim borders")); public static ClaimPermission MOBSPAWN = global(new ClaimPermission("MOBSPAWN", () -> new ItemStack(Items.ZOMBIE_SPAWN_EGG), "Prevent hostile mobspawn in claim")); - public static ClaimPermission ANIMALSPAWN = global(new ClaimPermission("ANIMALSPAWN", () -> new ItemStack(Items.CHICKEN_SPAWN_EGG), "Prevent other spawn in claim")); + public static ClaimPermission ANIMALSPAWN = global(new ClaimPermission("ANIMALSPAWN", () -> new ItemStack(Items.PIG_SPAWN_EGG), "Prevent other spawn in claim")); private static ClaimPermission register(ClaimPermission perm) { if (locked) { diff --git a/src/main/java/com/flemmli97/flan/claim/Claim.java b/src/main/java/com/flemmli97/flan/claim/Claim.java index 345010f..4ad39c8 100644 --- a/src/main/java/com/flemmli97/flan/claim/Claim.java +++ b/src/main/java/com/flemmli97/flan/claim/Claim.java @@ -59,11 +59,20 @@ public class Claim implements IPermissionContainer { this.world = world; } + public Claim(BlockPos pos1, BlockPos pos2, ServerPlayerEntity creator) { + this(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ(), Math.min(pos1.getY(), pos2.getY()), creator.getUuid(), creator.getServerWorld(), PlayerClaimData.get(creator).playerDefaultGroups().isEmpty()); + PlayerClaimData.get(creator).playerDefaultGroups().forEach((s, m) -> m.forEach((perm, bool) -> this.editPerms(null, s, perm, bool ? 1 : 0))); + } + public Claim(BlockPos pos1, BlockPos pos2, UUID creator, ServerWorld world) { this(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ(), Math.min(pos1.getY(), pos2.getY()), creator, world); } public Claim(int x1, int x2, int z1, int z2, int minY, UUID creator, ServerWorld world) { + this(x1, x2, z1, z2, minY, creator, world, true); + } + + public Claim(int x1, int x2, int z1, int z2, int minY, UUID creator, ServerWorld world, boolean setDefaultGroups) { this.minX = Math.min(x1, x2); this.minZ = Math.min(z1, z2); this.maxX = Math.max(x1, x2); @@ -73,6 +82,8 @@ public class Claim implements IPermissionContainer { this.world = world; this.setDirty(true); PermissionRegistry.getPerms().stream().filter(perm -> perm.defaultVal).forEach(perm -> this.globalPerm.put(perm, true)); + if (setDefaultGroups) + ConfigHandler.config.defaultGroups.forEach((s, m) -> m.forEach((perm, bool) -> this.editPerms(null, s, perm, bool ? 1 : 0))); } public static Claim fromJson(JsonObject obj, UUID owner, ServerWorld world) { @@ -384,10 +395,10 @@ public class Claim implements IPermissionContainer { * @param mode -1 = makes it resort to the global perm, 0 = deny perm, 1 = allow perm * @return If editing was successful or not */ - public boolean editPerms(ServerPlayerEntity player, String group, ClaimPermission perm, int mode, boolean griefPrevention) { + public boolean editPerms(ServerPlayerEntity player, String group, ClaimPermission perm, int mode, boolean alwaysCan) { if (PermissionRegistry.globalPerms().contains(perm) || (!this.isAdminClaim() && ConfigHandler.config.globallyDefined(this.world, perm))) return false; - if (griefPrevention || this.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) { + if (alwaysCan || this.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) { if (mode > 1) mode = -1; boolean has = this.permissions.containsKey(group); diff --git a/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java b/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java index 524797a..1643035 100644 --- a/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java +++ b/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java @@ -1,7 +1,6 @@ package com.flemmli97.flan.claim; import com.flemmli97.flan.Flan; -import com.flemmli97.flan.IClaimData; import com.flemmli97.flan.api.ClaimPermission; import com.flemmli97.flan.api.PermissionRegistry; import com.flemmli97.flan.config.ConfigHandler; @@ -55,7 +54,7 @@ public class ClaimStorage { private final GlobalClaim globalClaim; public static ClaimStorage get(ServerWorld world) { - return ((IClaimData) world).getClaimData(); + return ((IClaimStorage) world).get(); } public ClaimStorage(MinecraftServer server, ServerWorld world) { @@ -71,7 +70,7 @@ public class ClaimStorage { } public boolean createClaim(BlockPos pos1, BlockPos pos2, ServerPlayerEntity player) { - Claim claim = new Claim(pos1.down(ConfigHandler.config.defaultClaimDepth), pos2.down(ConfigHandler.config.defaultClaimDepth), player.getUuid(), player.getServerWorld()); + Claim claim = new Claim(pos1.down(ConfigHandler.config.defaultClaimDepth), pos2.down(ConfigHandler.config.defaultClaimDepth), player); Set conflicts = this.conflicts(claim, null); if (conflicts.isEmpty()) { PlayerClaimData data = PlayerClaimData.get(player); diff --git a/src/main/java/com/flemmli97/flan/claim/IClaimStorage.java b/src/main/java/com/flemmli97/flan/claim/IClaimStorage.java new file mode 100644 index 0000000..24bcf39 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/claim/IClaimStorage.java @@ -0,0 +1,6 @@ +package com.flemmli97.flan.claim; + +public interface IClaimStorage { + + ClaimStorage get(); +} diff --git a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java index 68546c9..b661915 100644 --- a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java +++ b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java @@ -7,6 +7,7 @@ import com.flemmli97.flan.claim.ClaimStorage; import com.flemmli97.flan.claim.PermHelper; import com.flemmli97.flan.config.ConfigHandler; import com.flemmli97.flan.gui.ClaimMenuScreenHandler; +import com.flemmli97.flan.gui.PersonalGroupScreenHandler; import com.flemmli97.flan.player.EnumDisplayType; import com.flemmli97.flan.player.EnumEditMode; import com.flemmli97.flan.player.OfflinePlayerData; @@ -17,6 +18,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.Suggestions; @@ -46,10 +48,11 @@ import java.util.regex.Pattern; public class CommandClaim { public static void register(CommandDispatcher dispatcher, boolean dedicated) { - dispatcher.register(CommandManager.literal("flan") + LiteralArgumentBuilder builder = CommandManager.literal("flan") .then(CommandManager.literal("reload").requires(src -> CommandPermission.perm(src, CommandPermission.cmdReload, true)).executes(CommandClaim::reloadConfig)) .then(CommandManager.literal("addClaim").requires(src -> CommandPermission.perm(src, CommandPermission.claimCreate)).then(CommandManager.argument("from", BlockPosArgumentType.blockPos()).then(CommandManager.argument("to", BlockPosArgumentType.blockPos()).executes(CommandClaim::addClaim)))) .then(CommandManager.literal("menu").requires(src -> CommandPermission.perm(src, CommandPermission.cmdMenu)).executes(CommandClaim::openMenu)) + .then(CommandManager.literal("personalGroups").requires(src -> CommandPermission.perm(src, CommandPermission.cmdPGroup)).executes(CommandClaim::openPersonalGroups)) .then(CommandManager.literal("claimInfo").requires(src -> CommandPermission.perm(src, CommandPermission.cmdInfo)).executes(CommandClaim::claimInfo)) .then(CommandManager.literal("transferClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).executes(CommandClaim::transferClaim))) .then(CommandManager.literal("delete").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).executes(CommandClaim::deleteClaim)) @@ -89,13 +92,18 @@ public class CommandClaim { return CommandSource.suggestMatching(list, build); }).executes(CommandClaim::removePlayer)))))) .then(CommandManager.literal("permission").requires(src -> CommandPermission.perm(src, CommandPermission.cmdPermission)) + .then(CommandManager.literal("personal").then(CommandManager.argument("group", StringArgumentType.string()).suggests(CommandClaim::personalGroupSuggestion) + .then(CommandManager.argument("permission", StringArgumentType.word()).suggests((ctx, b) -> permSuggestions(ctx, b, true)) + .then(CommandManager.argument("toggle", StringArgumentType.word()) + .suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editPersonalPerm))))) .then(CommandManager.literal("global").then(CommandManager.argument("permission", StringArgumentType.word()).suggests((ctx, b) -> permSuggestions(ctx, b, false)) .then(CommandManager.argument("toggle", StringArgumentType.word()).suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editGlobalPerm)))) .then(CommandManager.literal("group").then(CommandManager.argument("group", StringArgumentType.string()).suggests(CommandClaim::groupSuggestion) .then(CommandManager.argument("permission", StringArgumentType.word()).suggests((ctx, b) -> permSuggestions(ctx, b, true)) .then(CommandManager.argument("toggle", StringArgumentType.word()) - .suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editGroupPerm)))))) - ); + .suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editGroupPerm)))))); + builder.then(CommandManager.literal("help").executes(ctx -> CommandHelp.helpMessage(ctx, 0, builder.getArguments())).then(CommandManager.argument("page", IntegerArgumentType.integer()).executes(ctx -> CommandHelp.helpMessage(ctx, builder.getArguments())))); + dispatcher.register(builder); } private static int reloadConfig(CommandContext context) { @@ -176,6 +184,12 @@ public class CommandClaim { return Command.SINGLE_SUCCESS; } + private static int openPersonalGroups(CommandContext context) throws CommandSyntaxException { + ServerPlayerEntity player = context.getSource().getPlayer(); + PersonalGroupScreenHandler.openGroupMenu(player); + return Command.SINGLE_SUCCESS; + } + private static int claimInfo(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().getPlayer(); Claim claim = ClaimStorage.get(player.getServerWorld()).getClaimAt(player.getBlockPos()); @@ -188,7 +202,7 @@ public class CommandClaim { Claim sub = claim.getSubClaim(player.getBlockPos()); if (sub != null) { List info = sub.infoString(player); - player.sendMessage(PermHelper.simpleColoredText("==SubclaimInfo==", Formatting.AQUA), false); + player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.claimSubHeader, Formatting.AQUA), false); for (Text text : info) player.sendMessage(text, false); return Command.SINGLE_SUCCESS; @@ -433,6 +447,18 @@ public class CommandClaim { return CommandSource.suggestMatching(list, build); } + private static CompletableFuture personalGroupSuggestion(CommandContext context, SuggestionsBuilder build) throws CommandSyntaxException { + ServerPlayerEntity player = context.getSource().getPlayer(); + List list = new ArrayList<>(PlayerClaimData.get(player).playerDefaultGroups().keySet()); + list.sort(null); + for (int i = 0; i < list.size(); i++) { + if (allowed.matcher(list.get(i)).matches()) + continue; + list.set(i, '\"' + list.get(i) + '\"'); + } + return CommandSource.suggestMatching(list, build); + } + private static int addGroup(CommandContext context) throws CommandSyntaxException { return modifyGroup(context, false); @@ -594,4 +620,35 @@ public class CommandClaim { } return Command.SINGLE_SUCCESS; } + + private static int editPersonalPerm(CommandContext context) throws CommandSyntaxException { + ServerPlayerEntity player = context.getSource().getPlayer(); + String group = StringArgumentType.getString(context, "group"); + int mode = 0; + switch (StringArgumentType.getString(context, "toggle")) { + case "true": + mode = 1; + break; + case "false": + mode = 0; + break; + case "default": + mode = -1; + break; + } + ClaimPermission perm; + String p = StringArgumentType.getString(context, "permission"); + try { + perm = PermissionRegistry.get(p); + if (PermissionRegistry.globalPerms().contains(perm)) + throw new IllegalArgumentException(); + } catch (NullPointerException e) { + player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.noSuchPerm, p), Formatting.DARK_RED), false); + return 0; + } + String setPerm = mode == 1 ? "true" : mode == 0 ? "false" : "default"; + if (PlayerClaimData.get(player).editDefaultPerms(group, perm, mode)) + player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.editPersonalGroup, group, perm, setPerm), Formatting.GOLD), false); + return Command.SINGLE_SUCCESS; + } } diff --git a/src/main/java/com/flemmli97/flan/commands/CommandHelp.java b/src/main/java/com/flemmli97/flan/commands/CommandHelp.java new file mode 100644 index 0000000..9942e51 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/commands/CommandHelp.java @@ -0,0 +1,49 @@ +package com.flemmli97.flan.commands; + +import com.flemmli97.flan.claim.PermHelper; +import com.flemmli97.flan.config.ConfigHandler; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.tree.CommandNode; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.MutableText; +import net.minecraft.text.Style; +import net.minecraft.util.Formatting; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class CommandHelp { + + public static int helpMessage(CommandContext context, Collection> nodes) { + int page = IntegerArgumentType.getInteger(context, "page"); + return helpMessage(context, page, nodes); + } + + public static int helpMessage(CommandContext context, int page, Collection> nodes) { + List subCommands = nodes.stream().filter(node -> node.canUse(context.getSource())).map(CommandNode::getName).collect(Collectors.toList()); + int max = subCommands.size() / 8; + if (page > max) + page = max; + context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.helpHeader, page), Formatting.GOLD), false); + for (int i = 8 * page; i < 8 * (page + 1); i++) + if (i < subCommands.size()) + context.getSource().sendFeedback(PermHelper.simpleColoredText(" -" + subCommands.get(i), Formatting.GRAY), false); + MutableText pageText = PermHelper.simpleColoredText((page > 0 ? " " : "") + " ", Formatting.DARK_GREEN); + if (page > 0) { + MutableText pageTextBack = PermHelper.simpleColoredText("<<", Formatting.DARK_GREEN); + pageTextBack.fillStyle(pageTextBack.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help " + (page - 1)))); + pageText = pageTextBack.append(pageText); + } + if (page < max) { + MutableText pageTextNext = PermHelper.simpleColoredText(">>"); + pageTextNext.fillStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/flan help " + (page + 1)))); + pageText = pageText.append(pageTextNext); + } + context.getSource().sendFeedback(pageText, false); + return Command.SINGLE_SUCCESS; + } +} diff --git a/src/main/java/com/flemmli97/flan/commands/CommandPermission.java b/src/main/java/com/flemmli97/flan/commands/CommandPermission.java index 99021da..ab53910 100644 --- a/src/main/java/com/flemmli97/flan/commands/CommandPermission.java +++ b/src/main/java/com/flemmli97/flan/commands/CommandPermission.java @@ -14,6 +14,7 @@ public class CommandPermission { public static final String claimCreate = "flan.claim.create"; public static final String cmdMenu = "flan.command.menu"; + public static final String cmdPGroup = "flan.command.personal"; public static final String cmdInfo = "flan.command.info"; public static final String cmdTransfer = "flan.command.transfer"; diff --git a/src/main/java/com/flemmli97/flan/config/Config.java b/src/main/java/com/flemmli97/flan/config/Config.java index 08afe75..438adeb 100644 --- a/src/main/java/com/flemmli97/flan/config/Config.java +++ b/src/main/java/com/flemmli97/flan/config/Config.java @@ -19,8 +19,10 @@ import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; public class Config { @@ -46,6 +48,22 @@ public class Config { public boolean log; + public Map> defaultGroups = createHashMap(map -> { + map.put("Co-Owner", createLinkedHashMap(perms -> PermissionRegistry.getPerms().forEach(p -> perms.put(p, true)))); + map.put("Visitor", createLinkedHashMap(perms -> { + perms.put(PermissionRegistry.BED, true); + perms.put(PermissionRegistry.DOOR, true); + perms.put(PermissionRegistry.FENCEGATE, true); + perms.put(PermissionRegistry.TRAPDOOR, true); + perms.put(PermissionRegistry.BUTTONLEVER, true); + perms.put(PermissionRegistry.PRESSUREPLATE, true); + perms.put(PermissionRegistry.ENDERCHEST, true); + perms.put(PermissionRegistry.ENCHANTMENTTABLE, true); + perms.put(PermissionRegistry.ITEMFRAMEROTATE, true); + perms.put(PermissionRegistry.PORTAL, true); + perms.put(PermissionRegistry.TRADING, true); + })); + }); private final Map> globalDefaultPerms = new HashMap<>(); public Config(MinecraftServer server) { @@ -89,6 +107,21 @@ public class Config { if (obj.has("inspectionItem")) this.inspectionItem = Registry.ITEM.get(new Identifier((obj.get("inspectionItem").getAsString()))); this.claimDisplayTime = ConfigHandler.fromJson(obj, "claimDisplayTime", this.claimDisplayTime); + this.defaultGroups.clear(); + JsonObject defP = ConfigHandler.fromJson(obj, "defaultGroups"); + defP.entrySet().forEach(e -> { + Map perms = new HashMap<>(); + if (e.getValue().isJsonObject()) { + e.getValue().getAsJsonObject().entrySet().forEach(jperm -> { + try { + perms.put(PermissionRegistry.get(jperm.getKey()), jperm.getValue().getAsBoolean()); + } catch (NullPointerException ex) { + Flan.log("No permission with name {}", jperm.getKey()); + } + }); + } + this.defaultGroups.put(e.getKey(), perms); + }); this.globalDefaultPerms.clear(); JsonObject glob = ConfigHandler.fromJson(obj, "globalDefaultPerms"); glob.entrySet().forEach(e -> { @@ -134,6 +167,13 @@ public class Config { obj.addProperty("inspectionItem", Registry.ITEM.getId(this.inspectionItem).toString()); obj.addProperty("claimDisplayTime", this.claimDisplayTime); obj.addProperty("permissionLevel", this.permissionLevel); + JsonObject defPerm = new JsonObject(); + this.defaultGroups.forEach((key, value) -> { + JsonObject perm = new JsonObject(); + value.forEach((key1, value1) -> perm.addProperty(key1.id, value1)); + defPerm.add(key, perm); + }); + obj.add("defaultGroups", defPerm); JsonObject global = new JsonObject(); this.globalDefaultPerms.forEach((key, value) -> { JsonObject perm = new JsonObject(); @@ -161,4 +201,16 @@ public class Config { Map permMap = ConfigHandler.config.globalDefaultPerms.get(world.getRegistryKey().getValue().toString()); return permMap == null ? null : permMap.getOrDefault(perm, null); } + + private Map createHashMap(Consumer> cons) { + Map map = new HashMap<>(); + cons.accept(map); + return map; + } + + private Map createLinkedHashMap(Consumer> cons) { + Map map = new LinkedHashMap<>(); + cons.accept(map); + return map; + } } diff --git a/src/main/java/com/flemmli97/flan/config/LangConfig.java b/src/main/java/com/flemmli97/flan/config/LangConfig.java index 810c8a3..1569894 100644 --- a/src/main/java/com/flemmli97/flan/config/LangConfig.java +++ b/src/main/java/com/flemmli97/flan/config/LangConfig.java @@ -65,6 +65,7 @@ public class LangConfig { public String noSuchPerm = "No such Permission %s"; public String editPerm = "%1$s now set to %2$s"; public String editPermGroup = "%1$s for %2$s now set to %3$s"; + public String editPersonalGroup = "Default permission %1$s for group %2$s now set to %3$s"; public String adminMode = "Adminmode (Ignore Claims) set to: %s"; public String adminDeleteAll = "Deleted all claims for following players: %s"; @@ -76,11 +77,13 @@ public class LangConfig { public String giveClaimBlocks = "Gave following players %2$d claimblocks: %1$s"; public String claimBasicInfo = "Owner: %1$s, from: [x=%2$d,z=%3$d] to [x=%4$d,z=%5$d]; Subclaim-amount: %6$d"; + public String claimSubHeader = "==SubclaimInfo=="; public String claimBasicInfoSub = "Owner: %1$s, from: [x=%2$d,z=%3$d] to [x=%4$d,z=%5$d]"; public String claimInfoPerms = "Permissions: %s"; public String claimGroupInfoHeader = "Groups: "; public String claimGroupPerms = " Permissions: %s"; public String claimGroupPlayers = " Players: %s"; + public String helpHeader = "Available subcommands are (page %d):"; public String screenEnableText = "Enabled: %s"; public String screenUneditable = "Non Editable!"; diff --git a/src/main/java/com/flemmli97/flan/gui/GroupPlayerScreenHandler.java b/src/main/java/com/flemmli97/flan/gui/GroupPlayerScreenHandler.java index f6a68c6..c9db75b 100644 --- a/src/main/java/com/flemmli97/flan/gui/GroupPlayerScreenHandler.java +++ b/src/main/java/com/flemmli97/flan/gui/GroupPlayerScreenHandler.java @@ -101,7 +101,7 @@ public class GroupPlayerScreenHandler extends ServerOnlyScreenHandler { } if (index == 3) { player.closeHandledScreen(); - player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, this.claim, (s) -> { + player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { GameProfile prof = player.getServer().getUserCache().findByName(s); boolean fl = prof == null || this.claim.setPlayerGroup(prof.getId(), this.group, false); player.closeHandledScreen(); diff --git a/src/main/java/com/flemmli97/flan/gui/GroupScreenHandler.java b/src/main/java/com/flemmli97/flan/gui/GroupScreenHandler.java index c842f06..ec1adca 100644 --- a/src/main/java/com/flemmli97/flan/gui/GroupScreenHandler.java +++ b/src/main/java/com/flemmli97/flan/gui/GroupScreenHandler.java @@ -94,7 +94,7 @@ public class GroupScreenHandler extends ServerOnlyScreenHandler { } if (index == 3) { player.closeHandledScreen(); - player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, this.claim, (s) -> { + player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { this.claim.editPerms(player, s, PermissionRegistry.EDITPERMS, -1); player.closeHandledScreen(); player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); diff --git a/src/main/java/com/flemmli97/flan/gui/PersonalGroupScreenHandler.java b/src/main/java/com/flemmli97/flan/gui/PersonalGroupScreenHandler.java new file mode 100644 index 0000000..9b4cea4 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/gui/PersonalGroupScreenHandler.java @@ -0,0 +1,130 @@ +package com.flemmli97.flan.gui; + +import com.flemmli97.flan.api.PermissionRegistry; +import com.flemmli97.flan.claim.PermHelper; +import com.flemmli97.flan.player.PlayerClaimData; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.slot.Slot; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.ArrayList; +import java.util.List; + +public class PersonalGroupScreenHandler extends ServerOnlyScreenHandler { + + private boolean removeMode; + + private PersonalGroupScreenHandler(int syncId, PlayerInventory playerInventory) { + super(syncId, playerInventory, 6); + } + + public static void openGroupMenu(PlayerEntity player) { + NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + return new PersonalGroupScreenHandler(syncId, inv); + } + + @Override + public Text getDisplayName() { + return PermHelper.simpleColoredText("Personal-Groups"); + } + }; + player.openHandledScreen(fac); + } + + @Override + protected void fillInventoryWith(PlayerEntity player, Inventory inv, Object... additionalData) { + if (!(player instanceof ServerPlayerEntity)) + return; + for (int i = 0; i < 54; i++) { + if (i == 0) { + ItemStack close = new ItemStack(Items.TNT); + close.setCustomName(new LiteralText("Back").setStyle(Style.EMPTY.withFormatting(Formatting.DARK_RED))); + inv.setStack(i, close); + } else if (i == 3) { + ItemStack stack = new ItemStack(Items.ANVIL); + stack.setCustomName(new LiteralText("Add").setStyle(Style.EMPTY.withFormatting(Formatting.DARK_GREEN))); + inv.setStack(i, stack); + } else if (i == 4) { + ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); + stack.setCustomName(new LiteralText("Remove Mode: " + this.removeMode).setStyle(Style.EMPTY.withFormatting(Formatting.DARK_RED))); + inv.setStack(i, stack); + } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) + inv.setStack(i, ServerScreenHelper.emptyFiller()); + else { + List groups = new ArrayList<>(PlayerClaimData.get(player).playerDefaultGroups().keySet()); + groups.sort(null); + int row = i / 9 - 1; + int id = (i % 9) + row * 7 - 1; + if (id < groups.size()) { + ItemStack group = new ItemStack(Items.PAPER); + group.setCustomName(new LiteralText(groups.get(id)).setStyle(Style.EMPTY.withFormatting(Formatting.DARK_BLUE))); + inv.setStack(i, group); + } + } + } + } + + @Override + protected boolean isRightSlot(int slot) { + return slot == 0 || slot == 3 || slot == 4 || (slot < 45 && slot > 8 && slot % 9 != 0 && slot % 9 != 8); + } + + @Override + protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { + if (index == 0) { + player.closeHandledScreen(); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + return true; + } + if (index == 3) { + player.closeHandledScreen(); + player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { + PlayerClaimData.get(player).editDefaultPerms(s, PermissionRegistry.EDITPERMS, -1); + player.closeHandledScreen(); + player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_USE, 1, 1f); + }, () -> { + player.closeHandledScreen(); + player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); + })); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + return true; + } + if (index == 4) { + this.removeMode = !this.removeMode; + ItemStack stack = new ItemStack(Items.REDSTONE_BLOCK); + stack.setCustomName(new LiteralText("Remove Mode: " + this.removeMode).setStyle(Style.EMPTY.withFormatting(Formatting.DARK_RED))); + slot.setStack(stack); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + return true; + } + ItemStack stack = slot.getStack(); + if (!stack.isEmpty()) { + String name = stack.getName().asString(); + if (this.removeMode) { + PlayerClaimData.get(player).playerDefaultGroups().remove(name); + slot.setStack(ItemStack.EMPTY); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_BAT_DEATH, 1, 1f); + } else { + player.closeHandledScreen(); + player.getServer().execute(() -> PersonalPermissionScreenHandler.openClaimMenu(player, name)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/flemmli97/flan/gui/PersonalPermissionScreenHandler.java b/src/main/java/com/flemmli97/flan/gui/PersonalPermissionScreenHandler.java new file mode 100644 index 0000000..e22ba42 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/gui/PersonalPermissionScreenHandler.java @@ -0,0 +1,183 @@ +package com.flemmli97.flan.gui; + +import com.flemmli97.flan.api.ClaimPermission; +import com.flemmli97.flan.api.PermissionRegistry; +import com.flemmli97.flan.claim.PermHelper; +import com.flemmli97.flan.player.PlayerClaimData; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.slot.Slot; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PersonalPermissionScreenHandler extends ServerOnlyScreenHandler { + + private final String group; + private int page; + private final PlayerEntity player; + + private PersonalPermissionScreenHandler(int syncId, PlayerInventory playerInventory, String group, int page) { + super(syncId, playerInventory, 6, group, page); + this.group = group; + this.page = page; + this.player = playerInventory.player; + } + + public static void openClaimMenu(PlayerEntity player, String group) { + NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + return new PersonalPermissionScreenHandler(syncId, inv, group, 0); + } + + @Override + public Text getDisplayName() { + return PermHelper.simpleColoredText(String.format("Personal Permissions for %s", group)); + } + }; + player.openHandledScreen(fac); + } + + private static void openClaimMenu(PlayerEntity player, String group, int page) { + NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + return new PersonalPermissionScreenHandler(syncId, inv, group, page); + } + + @Override + public Text getDisplayName() { + return PermHelper.simpleColoredText(String.format("Personal Permissions for %s", group)); + } + }; + player.openHandledScreen(fac); + } + + @Override + protected void fillInventoryWith(PlayerEntity player, Inventory inv, Object... additionalData) { + if (!(player instanceof ServerPlayerEntity)) + return; + List perms = new ArrayList<>(PermissionRegistry.getPerms()); + if (this.group != null) + perms.removeAll(PermissionRegistry.globalPerms()); + for (int i = 0; i < 54; i++) { + int page = (int) additionalData[1]; + if (i == 0) { + ItemStack close = new ItemStack(Items.TNT); + close.setCustomName(new LiteralText("Back").setStyle(Style.EMPTY.withFormatting(Formatting.DARK_RED))); + inv.setStack(i, close); + } else if (page == 1 && i == 47) { + ItemStack close = new ItemStack(Items.ARROW); + close.setCustomName(new LiteralText("Prev").setStyle(Style.EMPTY.withFormatting(Formatting.WHITE))); + inv.setStack(i, close); + } else if (page == 0 && i == 51) { + ItemStack close = new ItemStack(Items.ARROW); + close.setCustomName(new LiteralText("Next").setStyle(Style.EMPTY.withFormatting(Formatting.WHITE))); + inv.setStack(i, close); + } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) + inv.setStack(i, ServerScreenHelper.emptyFiller()); + else { + int row = i / 9 - 1; + int id = (i % 9) + row * 7 - 1 + page * 28; + if (id < perms.size()) + inv.setStack(i, ServerScreenHelper.getFromPersonal((ServerPlayerEntity) player, perms.get(id), additionalData[0] == null ? null : additionalData[0].toString())); + } + } + } + + private void flipPage() { + if (!(this.player instanceof ServerPlayerEntity)) + return; + List perms = new ArrayList<>(PermissionRegistry.getPerms()); + if (this.group != null) + perms.removeAll(PermissionRegistry.globalPerms()); + int maxPages = perms.size() / 28; + for (int i = 0; i < 54; i++) { + if (i == 0) { + ItemStack close = new ItemStack(Items.TNT); + close.setCustomName(new LiteralText("Back").setStyle(Style.EMPTY.withFormatting(Formatting.DARK_RED))); + this.slots.get(i).setStack(close); + } else if (i == 47) { + ItemStack stack = ServerScreenHelper.emptyFiller(); + if (this.page >= 1) { + stack = new ItemStack(Items.ARROW); + stack.setCustomName(new LiteralText("Prev").setStyle(Style.EMPTY.withFormatting(Formatting.WHITE))); + } + this.slots.get(i).setStack(stack); + } else if (i == 51) { + ItemStack stack = ServerScreenHelper.emptyFiller(); + if (this.page < maxPages) { + stack = new ItemStack(Items.ARROW); + stack.setCustomName(new LiteralText("Next").setStyle(Style.EMPTY.withFormatting(Formatting.WHITE))); + } + this.slots.get(i).setStack(stack); + } else if (i < 9 || i > 44 || i % 9 == 0 || i % 9 == 8) + this.slots.get(i).setStack(ServerScreenHelper.emptyFiller()); + else { + int row = i / 9 - 1; + int id = (i % 9) + row * 7 - 1 + this.page * 28; + if (id < perms.size()) { + this.slots.get(i).setStack(ServerScreenHelper.getFromPersonal((ServerPlayerEntity) this.player, perms.get(id), this.group)); + } else + this.slots.get(i).setStack(ItemStack.EMPTY); + } + } + this.sendContentUpdates(); + } + + @Override + protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { + if (index == 0) { + player.closeHandledScreen(); + player.getServer().execute(() -> PersonalGroupScreenHandler.openGroupMenu(player)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + return true; + } + if (index == 47) { + this.page = 0; + this.flipPage(); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } + if (index == 51) { + this.page = 1; + this.flipPage(); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } + ItemStack stack = slot.getStack(); + String name = stack.getName().asString(); + ClaimPermission perm; + try { + perm = PermissionRegistry.get(name); + } catch (NullPointerException e) { + return false; + } + PlayerClaimData data = PlayerClaimData.get(player); + Map perms = data.playerDefaultGroups().getOrDefault(group, new HashMap<>()); + boolean success = data.editDefaultPerms(this.group, perm, (perms.containsKey(perm) ? perms.get(perm) ? 1 : 0 : -1) + 1); + slot.setStack(ServerScreenHelper.getFromPersonal(player, perm, this.group)); + if (success) + ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_NOTE_BLOCK_PLING, 1, 1.2f); + else + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); + return true; + } + + @Override + protected boolean isRightSlot(int slot) { + return slot == 0 || (this.page == 1 && slot == 47) || (this.page == 0 && slot == 51) || (slot < 45 && slot > 8 && slot % 9 != 0 && slot % 9 != 8); + } +} diff --git a/src/main/java/com/flemmli97/flan/gui/ServerScreenHelper.java b/src/main/java/com/flemmli97/flan/gui/ServerScreenHelper.java index bf371c7..7d19d65 100644 --- a/src/main/java/com/flemmli97/flan/gui/ServerScreenHelper.java +++ b/src/main/java/com/flemmli97/flan/gui/ServerScreenHelper.java @@ -4,6 +4,7 @@ import com.flemmli97.flan.api.ClaimPermission; import com.flemmli97.flan.claim.Claim; import com.flemmli97.flan.claim.PermHelper; import com.flemmli97.flan.config.ConfigHandler; +import com.flemmli97.flan.player.PlayerClaimData; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.ListTag; @@ -17,6 +18,9 @@ import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.util.HashMap; +import java.util.Map; + public class ServerScreenHelper { public static ItemStack emptyFiller() { @@ -78,6 +82,35 @@ public class ServerScreenHelper { return stack; } + public static ItemStack getFromPersonal(ServerPlayerEntity player, ClaimPermission perm, String group) { + ItemStack stack = perm.getItem(); + stack.setCustomName(new LiteralText(perm.id).setStyle(Style.EMPTY.withFormatting(Formatting.GOLD))); + ListTag lore = new ListTag(); + for (String pdesc : perm.desc) { + Text trans = new LiteralText(pdesc).setStyle(Style.EMPTY.withFormatting(Formatting.YELLOW)); + lore.add(StringTag.of(Text.Serializer.toJson(trans))); + } + Boolean global = ConfigHandler.config.getGlobal(player.getServerWorld(), perm); + if (global != null) { + Text text = new LiteralText(ConfigHandler.lang.screenUneditable).setStyle(Style.EMPTY.withFormatting(Formatting.DARK_RED)); + lore.add(StringTag.of(Text.Serializer.toJson(text))); + String permFlag = global.toString(); + Text text2 = new LiteralText(String.format(ConfigHandler.lang.screenEnableText, permFlag)).setStyle(Style.EMPTY.withFormatting(permFlag.equals("true") ? Formatting.GREEN : Formatting.RED)); + lore.add(StringTag.of(Text.Serializer.toJson(text2))); + } else { + String permFlag; + Map map = PlayerClaimData.get(player).playerDefaultGroups().getOrDefault(group, new HashMap<>()); + if (map.containsKey(perm)) + permFlag = map.get(perm) ? "true" : "false"; + else + permFlag = "default"; + Text text = new LiteralText(String.format(ConfigHandler.lang.screenEnableText, permFlag)).setStyle(Style.EMPTY.withFormatting(permFlag.equals("true") ? Formatting.GREEN : Formatting.RED)); + lore.add(StringTag.of(Text.Serializer.toJson(text))); + } + stack.getOrCreateSubTag("display").put("Lore", lore); + return stack; + } + public static void playSongToPlayer(ServerPlayerEntity player, SoundEvent event, float vol, float pitch) { player.networkHandler.sendPacket( new PlaySoundS2CPacket(event, SoundCategory.PLAYERS, player.getPos().x, player.getPos().y, player.getPos().z, vol, pitch)); diff --git a/src/main/java/com/flemmli97/flan/gui/StringResultScreenHandler.java b/src/main/java/com/flemmli97/flan/gui/StringResultScreenHandler.java index edb50ec..9e0d9b0 100644 --- a/src/main/java/com/flemmli97/flan/gui/StringResultScreenHandler.java +++ b/src/main/java/com/flemmli97/flan/gui/StringResultScreenHandler.java @@ -1,6 +1,5 @@ package com.flemmli97.flan.gui; -import com.flemmli97.flan.claim.Claim; import com.flemmli97.flan.claim.PermHelper; import com.flemmli97.flan.config.ConfigHandler; import net.minecraft.entity.player.PlayerEntity; @@ -13,6 +12,7 @@ import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.ScreenHandlerListener; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import org.apache.commons.lang3.StringUtils; @@ -44,7 +44,7 @@ public class StringResultScreenHandler extends AnvilScreenHandler { } - public static void createNewStringResult(PlayerEntity player, Claim claim, Consumer cons, Runnable ret) { + public static void createNewStringResult(PlayerEntity player, Consumer cons, Runnable ret) { NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { @Override public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { @@ -73,16 +73,17 @@ public class StringResultScreenHandler extends AnvilScreenHandler { public ItemStack onSlotClick(int i, int j, SlotActionType actionType, PlayerEntity playerEntity) { if (i < 0) return ItemStack.EMPTY; + Slot slot = this.slots.get(i); if (i == 0) this.ret.run(); else if (i == 2) { - Slot slot = this.slots.get(i); String s = slot.getStack().hasCustomName() ? slot.getStack().getName().asString() : ""; if (!s.isEmpty() && !s.equals(ConfigHandler.lang.stringScreenReturn)) this.cons.accept(s); } this.sendContentUpdates(); - return ItemStack.EMPTY; + ((ServerPlayerEntity) playerEntity).updateCursorStack(); + return slot.getStack(); } @Override diff --git a/src/main/java/com/flemmli97/flan/mixin/PlayerClaimMixin.java b/src/main/java/com/flemmli97/flan/mixin/PlayerClaimMixin.java index 16b3d17..f79e34f 100644 --- a/src/main/java/com/flemmli97/flan/mixin/PlayerClaimMixin.java +++ b/src/main/java/com/flemmli97/flan/mixin/PlayerClaimMixin.java @@ -1,6 +1,6 @@ package com.flemmli97.flan.mixin; -import com.flemmli97.flan.IClaimData; +import com.flemmli97.flan.player.IPlayerClaimImpl; import com.flemmli97.flan.player.PlayerClaimData; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.MinecraftServer; @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ServerPlayerEntity.class) -public abstract class PlayerClaimMixin implements IClaimData { +public abstract class PlayerClaimMixin implements IPlayerClaimImpl { @Unique private PlayerClaimData claimData; @@ -47,7 +47,7 @@ public abstract class PlayerClaimMixin implements IClaimData { } @Override - public PlayerClaimData getClaimData() { + public PlayerClaimData get() { return this.claimData; } } diff --git a/src/main/java/com/flemmli97/flan/mixin/ServerWorldMixin.java b/src/main/java/com/flemmli97/flan/mixin/ServerWorldMixin.java index aaf8636..79e88d1 100644 --- a/src/main/java/com/flemmli97/flan/mixin/ServerWorldMixin.java +++ b/src/main/java/com/flemmli97/flan/mixin/ServerWorldMixin.java @@ -1,7 +1,7 @@ package com.flemmli97.flan.mixin; -import com.flemmli97.flan.IClaimData; import com.flemmli97.flan.claim.ClaimStorage; +import com.flemmli97.flan.claim.IClaimStorage; import com.flemmli97.flan.event.WorldEvents; import net.minecraft.entity.Entity; import net.minecraft.entity.damage.DamageSource; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(ServerWorld.class) -public abstract class ServerWorldMixin implements IClaimData { +public abstract class ServerWorldMixin implements IClaimStorage { @Unique private ClaimStorage claimData; @@ -39,7 +39,7 @@ public abstract class ServerWorldMixin implements IClaimData { } @Override - public ClaimStorage getClaimData() { + public ClaimStorage get() { return this.claimData; } } diff --git a/src/main/java/com/flemmli97/flan/player/IPlayerClaimImpl.java b/src/main/java/com/flemmli97/flan/player/IPlayerClaimImpl.java new file mode 100644 index 0000000..696fcc7 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/player/IPlayerClaimImpl.java @@ -0,0 +1,6 @@ +package com.flemmli97.flan.player; + +public interface IPlayerClaimImpl { + + PlayerClaimData get(); +} diff --git a/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java b/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java index 4c52f3b..eefba91 100644 --- a/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java +++ b/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java @@ -1,7 +1,8 @@ package com.flemmli97.flan.player; import com.flemmli97.flan.Flan; -import com.flemmli97.flan.IClaimData; +import com.flemmli97.flan.api.ClaimPermission; +import com.flemmli97.flan.api.PermissionRegistry; import com.flemmli97.flan.claim.Claim; import com.flemmli97.flan.claim.ClaimStorage; import com.flemmli97.flan.claim.IPermissionContainer; @@ -26,7 +27,9 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -50,13 +53,15 @@ public class PlayerClaimData { private boolean confirmDeleteAll, adminIgnoreClaim, claimBlockMessage; private boolean dirty; + private Map> defaultGroups = new HashMap<>(); + public PlayerClaimData(ServerPlayerEntity player) { this.player = player; this.claimBlocks = ConfigHandler.config.startingBlocks; } public static PlayerClaimData get(PlayerEntity player) { - return ((IClaimData) player).getClaimData(); + return ((IPlayerClaimImpl) player).get(); } public int getClaimBlocks() { @@ -175,6 +180,27 @@ public class PlayerClaimData { return this.adminIgnoreClaim; } + public Map> playerDefaultGroups() { + return this.defaultGroups; + } + + public boolean editDefaultPerms(String group, ClaimPermission perm, int mode) { + if (PermissionRegistry.globalPerms().contains(perm) || ConfigHandler.config.globallyDefined(this.player.getServerWorld(), perm)) + return false; + if (mode > 1) + mode = -1; + boolean has = this.defaultGroups.containsKey(group); + Map perms = has ? this.defaultGroups.get(group) : new HashMap<>(); + if (mode == -1) + perms.remove(perm); + else + perms.put(perm, mode == 1); + if (!has) + this.defaultGroups.put(group, perms); + this.dirty = true; + return true; + } + public void tick() { boolean tool = this.player.getMainHandStack().getItem() == ConfigHandler.config.claimingItem || this.player.getOffHandStack().getItem() == ConfigHandler.config.claimingItem; @@ -232,6 +258,13 @@ public class PlayerClaimData { JsonObject obj = new JsonObject(); obj.addProperty("ClaimBlocks", this.claimBlocks); obj.addProperty("AdditionalBlocks", this.additionalClaimBlocks); + JsonObject defPerm = new JsonObject(); + this.defaultGroups.forEach((key, value) -> { + JsonObject perm = new JsonObject(); + value.forEach((key1, value1) -> perm.addProperty(key1.id, value1)); + defPerm.add(key, perm); + }); + obj.add("DefaultGroups", defPerm); FileWriter writer = new FileWriter(file); ConfigHandler.GSON.toJson(obj, writer); writer.close(); @@ -256,6 +289,11 @@ public class PlayerClaimData { Flan.debug("Read following json data {} from file {}", obj, file.getName()); this.claimBlocks = obj.get("ClaimBlocks").getAsInt(); this.additionalClaimBlocks = obj.get("AdditionalBlocks").getAsInt(); + JsonObject defP = ConfigHandler.fromJson(obj, "defaultGroups"); + defP.entrySet().forEach(e -> { + Map perms = new HashMap<>(); + perms.forEach((p, b) -> this.editDefaultPerms(e.getKey(), p, b ? 1 : 0)); + }); reader.close(); } catch (IOException e) { e.printStackTrace();