diff --git a/common/src/main/java/io/github/flemmli97/flan/api/PermissionRegistry.java b/common/src/main/java/io/github/flemmli97/flan/api/PermissionRegistry.java index 1fd6808..4c0d3ef 100644 --- a/common/src/main/java/io/github/flemmli97/flan/api/PermissionRegistry.java +++ b/common/src/main/java/io/github/flemmli97/flan/api/PermissionRegistry.java @@ -29,6 +29,7 @@ public class PermissionRegistry { public static ClaimPermission EDITCLAIM = register(new ClaimPermission("EDITCLAIM", () -> new ItemStack(ConfigHandler.config.claimingItem), "Gives permission to edit (resize, delete...) the claim")); public static ClaimPermission EDITPERMS = register(new ClaimPermission("EDITPERMS", () -> new ItemStack(Items.COMMAND_BLOCK), "Gives permission to change the claims permissions")); + public static ClaimPermission EDITPOTIONS = register(new ClaimPermission("EDITPOTIONS", () -> new ItemStack(Items.POTION), "Gives permission to edit the claims potion effect")); public static ClaimPermission BREAK = register(new ClaimPermission("BREAK", () -> new ItemStack(Items.DIAMOND_PICKAXE), "Permission to break blocks in the claim")); public static ClaimPermission PLACE = register(new ClaimPermission("PLACE", () -> new ItemStack(Items.GRASS_BLOCK), "Permission to place blocks in the claim")); public static ClaimPermission OPENCONTAINER = register(new ClaimPermission("OPENCONTAINER", () -> new ItemStack(Items.CHEST), "Permission to open containers", "(chest, furnace etc.)")); diff --git a/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java b/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java index 2d8f781..4d38de6 100644 --- a/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java +++ b/common/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java @@ -179,23 +179,26 @@ public class CommandClaim { } private static int openMenu(CommandContext context) throws CommandSyntaxException { - ServerPlayerEntity player = context.getSource().getPlayer(); - PlayerClaimData data = PlayerClaimData.get(player); - if (data.getEditMode() == EnumEditMode.DEFAULT) { - Claim claim = PermHelper.checkReturn(player, PermissionRegistry.EDITPERMS, PermHelper.genericNoPermMessage(player)); - if (claim == null) - return 0; - ClaimMenuScreenHandler.openClaimMenu(player, claim); - data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); - } else { + try { + ServerPlayerEntity player = context.getSource().getPlayer(); + PlayerClaimData data = PlayerClaimData.get(player); Claim claim = ClaimStorage.get(player.getServerWorld()).getClaimAt(player.getBlockPos()); - Claim sub = claim.getSubClaim(player.getBlockPos()); - if (sub != null && (claim.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos()) || sub.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos()))) - ClaimMenuScreenHandler.openClaimMenu(player, sub); - else if (claim.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) + if (claim == null) { + PermHelper.noClaimMessage(player); + return 0; + } + if (data.getEditMode() == EnumEditMode.DEFAULT) { ClaimMenuScreenHandler.openClaimMenu(player, claim); - else - player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermission, Formatting.DARK_RED), false); + data.addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); + } else { + Claim sub = claim.getSubClaim(player.getBlockPos()); + if (sub != null) + ClaimMenuScreenHandler.openClaimMenu(player, sub); + else + ClaimMenuScreenHandler.openClaimMenu(player, claim); + } + } catch (Exception e) { + e.printStackTrace(); } return Command.SINGLE_SUCCESS; } diff --git a/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java b/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java index b14175d..d77ee28 100644 --- a/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java +++ b/common/src/main/java/io/github/flemmli97/flan/config/LangConfig.java @@ -98,6 +98,7 @@ public class LangConfig { public String screenPrevious = "Prev"; public String screenAdd = "Add"; public String screenBack = "Back"; + public String screenNoPerm = "No Permission"; public String screenMenu = "Claim-Menu"; public String screenMenuSub = "SubClaim-Menu"; diff --git a/common/src/main/java/io/github/flemmli97/flan/gui/ClaimMenuScreenHandler.java b/common/src/main/java/io/github/flemmli97/flan/gui/ClaimMenuScreenHandler.java index d7b1a26..1c46435 100644 --- a/common/src/main/java/io/github/flemmli97/flan/gui/ClaimMenuScreenHandler.java +++ b/common/src/main/java/io/github/flemmli97/flan/gui/ClaimMenuScreenHandler.java @@ -1,5 +1,7 @@ package io.github.flemmli97.flan.gui; +import io.github.flemmli97.flan.api.ClaimPermission; +import io.github.flemmli97.flan.api.PermissionRegistry; import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.PermHelper; @@ -23,7 +25,7 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler { private final Claim claim; private ClaimMenuScreenHandler(int syncId, PlayerInventory playerInventory, Claim claim) { - super(syncId, playerInventory, 1); + super(syncId, playerInventory, 1, claim); this.claim = claim; } @@ -44,6 +46,7 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler { @Override protected void fillInventoryWith(PlayerEntity player, Inventory inv, Object... additionalData) { + Claim claim = (Claim) additionalData[0]; for (int i = 0; i < 9; i++) { switch (i) { case 0: @@ -54,21 +57,29 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler { case 2: ItemStack perm = new ItemStack(Items.BEACON); perm.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuGlobal, Formatting.GOLD)); + if (player instanceof ServerPlayerEntity && !this.hasEditPerm(claim, (ServerPlayerEntity) player)) + ServerScreenHelper.addLore(perm, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); inv.setStack(i, perm); break; case 3: ItemStack group = new ItemStack(Items.WRITABLE_BOOK); group.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuGroup, Formatting.GOLD)); + if (player instanceof ServerPlayerEntity && !this.hasEditPerm(claim, (ServerPlayerEntity) player)) + ServerScreenHelper.addLore(group, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); inv.setStack(i, group); break; case 4: ItemStack potions = new ItemStack(Items.POTION); potions.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuPotion, Formatting.GOLD)); + if (player instanceof ServerPlayerEntity && !this.hasPerm(claim, (ServerPlayerEntity) player, PermissionRegistry.EDITPOTIONS)) + ServerScreenHelper.addLore(potions, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); inv.setStack(i, potions); break; case 8: ItemStack delete = new ItemStack(Items.BARRIER); delete.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuDelete, Formatting.RED)); + if (player instanceof ServerPlayerEntity && !this.hasPerm(claim, (ServerPlayerEntity) player, PermissionRegistry.EDITCLAIM)) + ServerScreenHelper.addLore(delete, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); inv.setStack(i, delete); break; default: @@ -90,37 +101,60 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler { ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); break; case 2: - player.closeHandledScreen(); - player.getServer().execute(() -> PermissionScreenHandler.openClaimMenu(player, this.claim, null)); - ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + if (this.hasEditPerm(this.claim, player)) { + player.closeHandledScreen(); + player.getServer().execute(() -> PermissionScreenHandler.openClaimMenu(player, this.claim, null)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } else + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); break; case 3: - player.closeHandledScreen(); - player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); - ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + if (this.hasEditPerm(this.claim, player)) { + player.closeHandledScreen(); + player.getServer().execute(() -> GroupScreenHandler.openGroupMenu(player, this.claim)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } else + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); break; case 4: - player.closeHandledScreen(); - player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim)); - ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + if (this.hasPerm(this.claim, player, PermissionRegistry.EDITPOTIONS)) { + player.closeHandledScreen(); + player.getServer().execute(() -> PotionEditScreenHandler.openPotionMenu(player, this.claim)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } else + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); break; case 8: - player.closeHandledScreen(); - player.getServer().execute(() -> ConfirmScreenHandler.openConfirmScreen(player, (bool) -> { - if (bool) { - ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); - storage.deleteClaim(this.claim, true, PlayerClaimData.get(player).getEditMode(), player.getServerWorld()); - player.closeHandledScreen(); - player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.deleteClaim, Formatting.RED), false); - ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_PLACE, 1, 1f); - } else { - player.closeHandledScreen(); - player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); - ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); - } - })); + if (this.hasPerm(this.claim, player, PermissionRegistry.EDITCLAIM)) { + player.closeHandledScreen(); + player.getServer().execute(() -> ConfirmScreenHandler.openConfirmScreen(player, (bool) -> { + if (bool) { + ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); + storage.deleteClaim(this.claim, true, PlayerClaimData.get(player).getEditMode(), player.getServerWorld()); + player.closeHandledScreen(); + player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.deleteClaim, Formatting.RED), false); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_PLACE, 1, 1f); + } else { + player.closeHandledScreen(); + player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); + } + })); + } else + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); break; } return true; } + + private boolean hasEditPerm(Claim claim, ServerPlayerEntity player) { + return ((claim.parentClaim() != null && claim.parentClaim().canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())) + || claim.canInteract(player, PermissionRegistry.EDITPERMS, player.getBlockPos())); + } + + private boolean hasPerm(Claim claim, ServerPlayerEntity player, ClaimPermission perm) { + if (claim.parentClaim() != null) + return claim.parentClaim().canInteract(player, perm, player.getBlockPos()); + return claim.canInteract(player, perm, player.getBlockPos()); + } } diff --git a/common/src/main/java/io/github/flemmli97/flan/gui/PotionEditScreenHandler.java b/common/src/main/java/io/github/flemmli97/flan/gui/PotionEditScreenHandler.java index 4b77da0..d08ee81 100644 --- a/common/src/main/java/io/github/flemmli97/flan/gui/PotionEditScreenHandler.java +++ b/common/src/main/java/io/github/flemmli97/flan/gui/PotionEditScreenHandler.java @@ -12,7 +12,6 @@ import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; diff --git a/common/src/main/java/io/github/flemmli97/flan/gui/ServerScreenHelper.java b/common/src/main/java/io/github/flemmli97/flan/gui/ServerScreenHelper.java index a566125..4c79757 100644 --- a/common/src/main/java/io/github/flemmli97/flan/gui/ServerScreenHelper.java +++ b/common/src/main/java/io/github/flemmli97/flan/gui/ServerScreenHelper.java @@ -19,7 +19,9 @@ 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 ServerScreenHelper { @@ -33,18 +35,18 @@ public class ServerScreenHelper { public static ItemStack fromPermission(Claim claim, ClaimPermission perm, String group) { ItemStack stack = perm.getItem(); stack.setCustomName(ServerScreenHelper.coloredGuiText(perm.id, Formatting.GOLD)); - ListTag lore = new ListTag(); + List lore = new ArrayList<>(); for (String pdesc : perm.desc) { Text trans = ServerScreenHelper.coloredGuiText(pdesc, Formatting.YELLOW); - lore.add(StringTag.of(Text.Serializer.toJson(trans))); + lore.add(trans); } Config.GlobalType global = ConfigHandler.config.getGlobal(claim.getWorld(), perm); if (!claim.isAdminClaim() && !global.canModify()) { Text text = ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenUneditable, Formatting.DARK_RED); - lore.add(StringTag.of(Text.Serializer.toJson(text))); + lore.add(text); String permFlag = String.valueOf(global.getValue()); Text text2 = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals("true") ? Formatting.GREEN : Formatting.RED); - lore.add(StringTag.of(Text.Serializer.toJson(text2))); + lore.add(text2); } else { String permFlag; if (group == null) { @@ -77,9 +79,9 @@ public class ServerScreenHelper { } } Text text = ServerScreenHelper.coloredGuiText(String.format(ConfigHandler.lang.screenEnableText, permFlag), permFlag.equals("true") ? Formatting.GREEN : Formatting.RED); - lore.add(StringTag.of(Text.Serializer.toJson(text))); + lore.add(text); } - stack.getOrCreateSubTag("display").put("Lore", lore); + addLore(stack, lore); return stack; } @@ -120,4 +122,16 @@ public class ServerScreenHelper { public static Text coloredGuiText(String text, Formatting... formattings) { return new LiteralText(text).setStyle(Style.EMPTY.withItalic(false).withFormatting(formattings)); } + + public static void addLore(ItemStack stack, Text text) { + ListTag lore = new ListTag(); + lore.add(StringTag.of(Text.Serializer.toJson(text))); + stack.getOrCreateSubTag("display").put("Lore", lore); + } + + public static void addLore(ItemStack stack, List texts) { + ListTag lore = new ListTag(); + texts.forEach(text -> lore.add(StringTag.of(Text.Serializer.toJson(text)))); + stack.getOrCreateSubTag("display").put("Lore", lore); + } }