enter and leave messages close #95

This commit is contained in:
Flemmli97 2021-09-14 17:26:41 +02:00
parent 2c4d99e79f
commit e1a9ef08dc
6 changed files with 277 additions and 2 deletions

View File

@ -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<StatusEffect, Integer> 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
*/

View File

@ -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<ServerCommandSource> context) throws CommandSyntaxException {
return editClaimMessages(context, new LiteralText(StringArgumentType.getString(context, "message")));
}
public static int editClaimMessages(CommandContext<ServerCommandSource> 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;
}
}

View File

@ -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();

View File

@ -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);
}
}

View File

@ -74,6 +74,13 @@ public class ClaimMenuScreenHandler extends ServerOnlyScreenHandler<Claim> {
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<Claim> {
@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<Claim> {
} 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();

View File

@ -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<Claim> {
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<Text> 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<Text> 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());
}
}