From e1a9ef08dcbc3a0aed4d3025918f59981a31625c Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Tue, 14 Sep 2021 17:26:41 +0200 Subject: [PATCH] enter and leave messages close #95 --- .../io/github/flemmli97/flan/claim/Claim.java | 31 ++++ .../flemmli97/flan/commands/CommandClaim.java | 54 ++++++ .../flemmli97/flan/config/LangConfig.java | 11 ++ .../flan/event/EntityInteractEvents.java | 9 +- .../flan/gui/ClaimMenuScreenHandler.java | 17 +- .../flemmli97/flan/gui/ClaimTextHandler.java | 157 ++++++++++++++++++ 6 files changed, 277 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/io/github/flemmli97/flan/gui/ClaimTextHandler.java diff --git a/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java b/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java index 54bff63..bebcd0b 100644 --- a/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java +++ b/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java @@ -17,6 +17,7 @@ import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.network.packet.s2c.play.TitleS2CPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; @@ -68,6 +69,8 @@ public class Claim implements IPermissionContainer { private final Map potions = new HashMap<>(); + public Text enterTitle, enterSubtitle, leaveTitle, leaveSubtitle; + private Claim(ServerWorld world) { this.world = world; } @@ -516,6 +519,34 @@ public class Claim implements IPermissionContainer { return this.homePos; } + public void setEnterTitle(Text title, Text sub) { + this.enterTitle = title; + this.enterSubtitle = sub; + this.setDirty(true); + } + + public void setLeaveTitle(Text title, Text sub) { + this.leaveTitle = title; + this.leaveSubtitle = sub; + this.setDirty(true); + } + + public void displayEnterTitle(ServerPlayerEntity player) { + if (this.enterTitle != null) { + player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.TITLE, this.enterTitle)); + if (this.enterSubtitle != null) + player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.SUBTITLE, this.enterSubtitle)); + } + } + + public void displayLeaveTitle(ServerPlayerEntity player) { + if (this.leaveTitle != null) { + player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.TITLE, this.leaveTitle)); + if (this.leaveSubtitle != null) + player.networkHandler.sendPacket(new TitleS2CPacket(TitleS2CPacket.Action.SUBTITLE, this.leaveSubtitle)); + } + } + /** * Only marks non sub claims */ 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 6da8a9c..45c7e30 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 @@ -27,11 +27,15 @@ import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.command.CommandSource; import net.minecraft.command.argument.BlockPosArgumentType; import net.minecraft.command.argument.GameProfileArgumentType; +import net.minecraft.command.argument.TextArgumentType; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.LiteralText; +import net.minecraft.text.MutableText; +import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; @@ -80,6 +84,10 @@ public class CommandClaim { .then(CommandManager.argument("amount", IntegerArgumentType.integer()).executes(CommandCurrency::buyClaimBlocks))) .then(CommandManager.literal("sellBlocks").requires(src -> PermissionNodeHandler.perm(src, PermissionNodeHandler.cmdSell, false)) .then(CommandManager.argument("amount", IntegerArgumentType.integer()).executes(CommandCurrency::sellClaimBlocks))) + .then(CommandManager.literal("claimMessage").then(CommandManager.argument("type", StringArgumentType.word()).suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"enter", "leave"}, b)) + .then(CommandManager.argument("title", StringArgumentType.word()).suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"title", "subtitle"}, b)) + .then(CommandManager.literal("text").then(CommandManager.argument("component", TextArgumentType.text()).executes(ctx -> CommandClaim.editClaimMessages(ctx, TextArgumentType.getTextArgument(ctx, "component"))))) + .then(CommandManager.literal("string").then(CommandManager.argument("message", StringArgumentType.string()).executes(CommandClaim::editClaimMessages)))))) .then(CommandManager.literal("group").requires(src -> PermissionNodeHandler.perm(src, PermissionNodeHandler.cmdGroup)) .then(CommandManager.literal("add").then(CommandManager.argument("group", StringArgumentType.string()).executes(CommandClaim::addGroup))) .then(CommandManager.literal("remove").then(CommandManager.argument("group", StringArgumentType.string()) @@ -744,4 +752,50 @@ public class CommandClaim { return 0; }).orElse(0); } + + public static int editClaimMessages(CommandContext context) throws CommandSyntaxException { + return editClaimMessages(context, new LiteralText(StringArgumentType.getString(context, "message"))); + } + + public static int editClaimMessages(CommandContext context, Text text) throws CommandSyntaxException { + if (text instanceof MutableText) { + Style style = text.getStyle(); + if (style.isEmpty()) + style = style.withFormatting(Formatting.WHITE); + if (!style.isItalic()) + style = style.withItalic(false); + ((MutableText) text).setStyle(style); + } + ServerPlayerEntity player = context.getSource().getPlayer(); + Claim claim = PermHelper.checkReturn(player, PermissionRegistry.EDITPERMS, PermHelper.genericNoPermMessage(player)); + if (claim == null) + return 0; + boolean sub = StringArgumentType.getString(context, "title").equals("subtitle"); + boolean enter = StringArgumentType.getString(context, "type").equals("enter"); + String feedback; + if (enter) { + if (sub) { + claim.setEnterTitle(claim.enterTitle, text); + feedback = ConfigHandler.lang.setEnterSubMessage; + } else { + claim.setEnterTitle(text, claim.enterSubtitle); + feedback = ConfigHandler.lang.setEnterMessage; + } + } else { + if (sub) { + claim.setLeaveTitle(claim.leaveTitle, text); + feedback = ConfigHandler.lang.setLeaveSubMessage; + } else { + claim.setLeaveTitle(text, claim.leaveSubtitle); + feedback = ConfigHandler.lang.setLeaveMessage; + } + } + String[] unf = feedback.split("%s", 2); + MutableText cmdFeed = new LiteralText(unf[0]).formatted(Formatting.GOLD) + .append(text); + if (unf.length > 1) + cmdFeed.append(new LiteralText(unf[1])).formatted(Formatting.GOLD); + context.getSource().sendFeedback(cmdFeed, false); + 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 f5b6021..3656457 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 @@ -106,6 +106,7 @@ public class LangConfig { public String screenMenuGlobal = "Edit Global Permissions"; public String screenMenuGroup = "Edit Permissiongroups"; public String screenMenuPotion = "Edit Potioneffects"; + public String screenMenuClaimText = "Edit Enter/Leave Text"; public String screenMenuDelete = "Delete Claim"; public String screenConfirm = "Confirm"; public String screenYes = "Yes"; @@ -116,7 +117,12 @@ public class LangConfig { public String screenGroupPerms = "%s-Permissions"; public String screenPersonalGroups = "Personal-Groups"; public String screenPersonalPermissions = "Personal Permissions for %s"; + public String screenEnterText = "Edit title text on enter. (Right-Click to use JSON text. See MC Wiki for that)"; + public String screenEnterSubText = "Edit subtitle text on enter. (Right-Click to use JSON text. See MC Wiki for that)"; + public String screenLeaveText = "Edit title text on leave. (Right-Click to use JSON text. See MC Wiki for that)"; + public String screenLeaveSubText = "Edit subtitle text on enter. (Right-Click to use JSON text. See MC Wiki for that)"; + public String chatClaimTextEdit = "[Click for command]"; public String sellDisabled = "Claimblocks selling is disabled"; public String buyDisabled = "Claimblocks purchasing is disabled"; public String sellFail = "Not enough claimblocks to sell"; @@ -141,6 +147,11 @@ public class LangConfig { public String teleportHome = "Teleporting to claim home. Don't move for 5 seconds"; public String teleportHomeFail = "Teleport already happening"; + public String setEnterMessage = "Set enter title to %s"; + public String setEnterSubMessage = "Set enter subtitle to %s"; + public String setLeaveMessage = "Set leave title to %s"; + public String setLeaveSubMessage = "Set leave subtitle to %s"; + public String wiki = "For more info check out the wiki:"; public LangCommands cmdLang = new LangCommands(); diff --git a/common/src/main/java/io/github/flemmli97/flan/event/EntityInteractEvents.java b/common/src/main/java/io/github/flemmli97/flan/event/EntityInteractEvents.java index 85cb12b..2aac95c 100644 --- a/common/src/main/java/io/github/flemmli97/flan/event/EntityInteractEvents.java +++ b/common/src/main/java/io/github/flemmli97/flan/event/EntityInteractEvents.java @@ -316,7 +316,12 @@ public class EntityInteractEvents { ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); if (currentClaim != null) { if (!currentClaim.intersects(player.getBoundingBox())) { - cons.accept(null); + Claim claim = storage.getClaimAt(rounded); + cons.accept(claim); + if (claim == null) + currentClaim.displayLeaveTitle(player); + else + claim.displayEnterTitle(player); } else { if (!player.isSpectator()) { BlockPos.Mutable bPos = rounded.mutableCopy(); @@ -337,6 +342,8 @@ public class EntityInteractEvents { } else if (player.age % 3 == 0) { Claim claim = storage.getClaimAt(rounded); cons.accept(claim); + if (claim != null) + claim.displayEnterTitle(player); } } 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 0b36739..9f7566a 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 @@ -74,6 +74,13 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler { ServerScreenHelper.addLore(potions, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); inv.updateStack(i, potions); break; + case 5: + ItemStack sign = new ItemStack(Items.OAK_SIGN); + sign.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuClaimText, Formatting.GOLD)); + if (player instanceof ServerPlayerEntity && !this.hasPerm(claim, (ServerPlayerEntity) player, PermissionRegistry.EDITCLAIM)) + ServerScreenHelper.addLore(sign, ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenNoPerm, Formatting.DARK_RED)); + inv.updateStack(i, sign); + break; case 8: ItemStack delete = new ItemStack(Items.BARRIER); delete.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenMenuDelete, Formatting.RED)); @@ -89,7 +96,7 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler { @Override protected boolean isRightSlot(int slot) { - return slot == 0 || slot == 2 || slot == 3 || slot == 4 || slot == 8; + return slot == 0 || slot == 2 || slot == 3 || slot == 4 || slot == 5 || slot == 8; } @Override @@ -123,6 +130,14 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler { } else ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); break; + case 5: + if (this.hasPerm(this.claim, player, PermissionRegistry.EDITCLAIM)) { + player.closeHandledScreen(); + player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(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: if (this.hasPerm(this.claim, player, PermissionRegistry.EDITCLAIM)) { player.closeHandledScreen(); diff --git a/common/src/main/java/io/github/flemmli97/flan/gui/ClaimTextHandler.java b/common/src/main/java/io/github/flemmli97/flan/gui/ClaimTextHandler.java new file mode 100644 index 0000000..f8c548d --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/gui/ClaimTextHandler.java @@ -0,0 +1,157 @@ +package io.github.flemmli97.flan.gui; + +import io.github.flemmli97.flan.api.permission.ClaimPermission; +import io.github.flemmli97.flan.api.permission.PermissionRegistry; +import io.github.flemmli97.flan.claim.Claim; +import io.github.flemmli97.flan.claim.PermHelper; +import io.github.flemmli97.flan.config.ConfigHandler; +import io.github.flemmli97.flan.gui.inv.SeparateInv; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +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.ClickEvent; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.function.Consumer; + +public class ClaimTextHandler extends ServerOnlyScreenHandler { + + private final Claim claim; + + private ClaimTextHandler(int syncId, PlayerInventory playerInventory, Claim claim) { + super(syncId, playerInventory, 1, claim); + this.claim = claim; + } + + public static void openClaimMenu(ServerPlayerEntity player, Claim claim) { + NamedScreenHandlerFactory fac = new NamedScreenHandlerFactory() { + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + return new ClaimTextHandler(syncId, inv, claim); + } + + @Override + public Text getDisplayName() { + return PermHelper.simpleColoredText(claim.parentClaim() != null ? ConfigHandler.lang.screenMenuSub : ConfigHandler.lang.screenMenu); + } + }; + player.openHandledScreen(fac); + } + + @Override + protected void fillInventoryWith(PlayerEntity player, SeparateInv inv, Claim claim) { + for (int i = 0; i < 9; i++) { + switch (i) { + case 0: + ItemStack close = new ItemStack(Items.TNT); + close.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenBack, Formatting.DARK_RED)); + inv.updateStack(i, close); + break; + case 2: + ItemStack stack = new ItemStack(Items.OAK_SIGN); + stack.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenEnterText, Formatting.GOLD)); + if (claim.enterTitle != null) + ServerScreenHelper.addLore(stack, claim.enterTitle); + inv.updateStack(i, stack); + break; + case 3: + ItemStack stack2 = new ItemStack(Items.OAK_SIGN); + stack2.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenEnterSubText, Formatting.GOLD)); + if (claim.enterSubtitle != null) + ServerScreenHelper.addLore(stack2, claim.enterSubtitle); + inv.updateStack(i, stack2); + break; + case 4: + ItemStack stack3 = new ItemStack(Items.OAK_SIGN); + stack3.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenLeaveText, Formatting.GOLD)); + if (claim.leaveTitle != null) + ServerScreenHelper.addLore(stack3, claim.leaveTitle); + inv.updateStack(i, stack3); + break; + case 5: + ItemStack stack4 = new ItemStack(Items.OAK_SIGN); + stack4.setCustomName(ServerScreenHelper.coloredGuiText(ConfigHandler.lang.screenLeaveSubText, Formatting.GOLD)); + if (claim.leaveSubtitle != null) + ServerScreenHelper.addLore(stack4, claim.leaveSubtitle); + inv.updateStack(i, stack4); + break; + default: + inv.updateStack(i, ServerScreenHelper.emptyFiller()); + } + } + } + + @Override + protected boolean isRightSlot(int slot) { + return slot == 0 || slot == 2 || slot == 3 || slot == 4 || slot == 5 || slot == 8; + } + + @Override + protected boolean handleSlotClicked(ServerPlayerEntity player, int index, Slot slot, int clickType) { + if (index == 0) { + player.closeHandledScreen(); + player.getServer().execute(() -> ClaimMenuScreenHandler.openClaimMenu(player, this.claim)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } else { + Consumer cons = null; + switch (index) { + case 2: + cons = text -> this.claim.setEnterTitle(text, this.claim.enterSubtitle); + break; + case 3: + cons = text -> this.claim.setEnterTitle(this.claim.enterTitle, text); + break; + case 4: + cons = text -> this.claim.setLeaveTitle(text, this.claim.leaveSubtitle); + break; + case 5: + cons = text -> this.claim.setLeaveTitle(this.claim.leaveTitle, text); + break; + } + if (cons != null) { + player.closeHandledScreen(); + Consumer finalCons = cons; + if (clickType == 0) { + player.getServer().execute(() -> StringResultScreenHandler.createNewStringResult(player, (s) -> { + player.closeHandledScreen(); + finalCons.accept(new LiteralText(s).fillStyle(Style.EMPTY.withItalic(false).withFormatting(Formatting.WHITE))); + player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.BLOCK_ANVIL_USE, 1, 1f); + }, () -> { + player.closeHandledScreen(); + player.getServer().execute(() -> ClaimTextHandler.openClaimMenu(player, this.claim)); + ServerScreenHelper.playSongToPlayer(player, SoundEvents.ENTITY_VILLAGER_NO, 1, 1f); + })); + } else { + LiteralText text = new LiteralText(ConfigHandler.lang.chatClaimTextEdit); + String command = "/flan claimMessage" + (index == 2 || index == 3 ? " enter" : " leave") + + (index == 2 || index == 4 ? " title" : " subtitle") + " text "; + text.fillStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command))); + player.sendMessage(text, false); + } + ServerScreenHelper.playSongToPlayer(player, SoundEvents.UI_BUTTON_CLICK, 1, 1f); + } + } + 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()); + } +}