diff --git a/src/main/java/de/melanx/skyguis/client/screen/info/TeamEditScreen.java b/src/main/java/de/melanx/skyguis/client/screen/info/TeamEditScreen.java index 68fe6a1..cca1bd7 100644 --- a/src/main/java/de/melanx/skyguis/client/screen/info/TeamEditScreen.java +++ b/src/main/java/de/melanx/skyguis/client/screen/info/TeamEditScreen.java @@ -14,13 +14,17 @@ import de.melanx.skyguis.util.ComponentBuilder; import de.melanx.skyguis.util.LoadingResult; import de.melanx.skyguis.util.TextHelper; +import de.melanx.skyguis.util.ToggleButtons; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.Tooltip; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; @@ -33,11 +37,19 @@ public class TeamEditScreen extends BaseScreen implements LoadingResultHandler { private static final Component SPAWNS = ComponentBuilder.text("spawns"); private static final Component MEMBERS = ComponentBuilder.text("members"); + private static final Component REQUESTS = ComponentBuilder.text("requests"); private static final Component INVALID = ComponentBuilder.text("invalid"); private static final Component ADD = ComponentBuilder.text("add"); private static final Component REMOVE = ComponentBuilder.text("remove"); private static final Component SHOW = ComponentBuilder.text("show"); private static final Component INVITE = ComponentBuilder.text("invite"); + private static final Component ALLOW_VISITS = ComponentBuilder.text("allow_visits"); + private static final Component ALLOW_REQUESTS = ComponentBuilder.text("allow_requests"); + private static final MutableComponent VISIT_BASE = ComponentBuilder.button("allow_visits").append(Component.literal(" ")); + private static final MutableComponent REQUEST_BASE = ComponentBuilder.button("allow_requests").append(Component.literal(" ")); + + private static final Component ALLOWED = ComponentBuilder.text("allowed").withStyle(ChatFormatting.GREEN); + private static final Component DISALLOWED = ComponentBuilder.text("disallowed").withStyle(ChatFormatting.RED); private final Team team; private final BaseScreen prev; @@ -48,7 +60,7 @@ public class TeamEditScreen extends BaseScreen implements LoadingResultHandler { private boolean posValid; public TeamEditScreen(Team team, BaseScreen prev) { - super(Component.literal(team.getName()), 245, 185); + super(Component.literal(team.getName()), 245, 231); this.team = team; this.prev = prev; this.random = new Random(); @@ -116,15 +128,25 @@ protected void init() { .build()); this.addRenderableWidget(Button.builder(SHOW, button -> Minecraft.getInstance().setScreen(new TeamPlayersScreen(this.team, this))) - .bounds(this.x(10), this.y(115), 70, 20) + .bounds(this.x(10), this.y(115), 90, 20) .build()); this.addRenderableWidget(Button.builder(INVITE, button -> Minecraft.getInstance().setScreen(new InvitablePlayersScreen(this.team, this))) - .bounds(this.x(85), this.y(115), 70, 20) + .bounds(this.x(105), this.y(115), 90, 20) + .build()); + + this.addRenderableWidget(Button.builder(ALLOW_VISITS, button -> ToggleButtons.toggleState(this.team, button, VISIT_BASE, ToggleButtons.Type.VISITS)) + .tooltip(Tooltip.create(VISIT_BASE.copy().append(this.team.allowsVisits() ? ALLOWED : DISALLOWED))) + .bounds(this.x(10), this.y(161), 90, 20) + .build()); + + this.addRenderableWidget(Button.builder(ALLOW_REQUESTS, button -> ToggleButtons.toggleState(this.team, button, REQUEST_BASE, ToggleButtons.Type.JOIN_REQUEST)) + .tooltip(Tooltip.create(REQUEST_BASE.copy().append(this.team.allowsJoinRequests() ? ALLOWED : DISALLOWED))) + .bounds(this.x(105), this.y(161), 90, 20) .build()); this.addRenderableWidget(Button.builder(PREV_SCREEN_COMPONENT, button -> Minecraft.getInstance().setScreen(this.prev)) - .bounds(this.x(10), this.y(155), 226, 20) + .bounds(this.x(10), this.y(201), 226, 20) .build()); if (!PermissionsConfig.selfManage || !PermissionsConfig.Spawns.modifySpawns) { @@ -154,6 +176,7 @@ public void render_(@Nonnull GuiGraphics guiGraphics, int mouseX, int mouseY, fl guiGraphics.drawString(this.font, SPAWNS, this.x(10), this.y(30), Color.DARK_GRAY.getRGB(), false); guiGraphics.drawString(this.font, MEMBERS, this.x(10), this.y(100), Color.DARK_GRAY.getRGB(), false); + guiGraphics.drawString(this.font, REQUESTS, this.x(10), this.y(146), Color.DARK_GRAY.getRGB(), false); if (!this.posValid) { guiGraphics.pose().pushPose(); diff --git a/src/main/java/de/melanx/skyguis/network/EasyNetwork.java b/src/main/java/de/melanx/skyguis/network/EasyNetwork.java index d16eec5..69c6bd9 100644 --- a/src/main/java/de/melanx/skyguis/network/EasyNetwork.java +++ b/src/main/java/de/melanx/skyguis/network/EasyNetwork.java @@ -1,8 +1,10 @@ package de.melanx.skyguis.network; +import de.melanx.skyblockbuilder.data.Team; import de.melanx.skyblockbuilder.template.TemplateLoader; import de.melanx.skyguis.network.handler.*; import de.melanx.skyguis.util.LoadingResult; +import de.melanx.skyguis.util.ToggleButtons; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -24,7 +26,7 @@ public EasyNetwork(ModX mod) { @Override protected Protocol getProtocol() { - return Protocol.of("4"); + return Protocol.of("5"); } @Override @@ -36,6 +38,7 @@ protected void registerPackets() { this.registerGame(NetworkDirection.PLAY_TO_SERVER, new AnswerInvitation.Serializer(), () -> AnswerInvitation.Handler::new); this.registerGame(NetworkDirection.PLAY_TO_SERVER, new RequestTemplateFromServer.Serializer(), () -> RequestTemplateFromServer.Handler::new); this.registerGame(NetworkDirection.PLAY_TO_SERVER, new VisitTeam.Serializer(), () -> VisitTeam.Handler::new); + this.registerGame(NetworkDirection.PLAY_TO_SERVER, new ToggleStateButtonClick.Serializer(), () -> ToggleStateButtonClick.Handler::new); this.registerGame(NetworkDirection.PLAY_TO_CLIENT, new OpenGui.Serializer(), () -> OpenGui.Handler::new); this.registerGame(NetworkDirection.PLAY_TO_CLIENT, new SendLoadingResult.Serializer(), () -> SendLoadingResult.Handler::new); @@ -73,4 +76,12 @@ public void requestTemplateFromServer(String name) { public void sendTemplateToClient(NetworkEvent.Context ctx, String name) { this.channel.reply(new SendTemplateToClient(name, TemplateLoader.getConfiguredTemplate(name)), ctx); } + + public void toggleState(Team team, ToggleButtons.Type type) { + this.toggleState(team.getId(), type); + } + + public void toggleState(UUID team, ToggleButtons.Type type) { + this.channel.sendToServer(new ToggleStateButtonClick(team, type)); + } } diff --git a/src/main/java/de/melanx/skyguis/network/handler/ToggleStateButtonClick.java b/src/main/java/de/melanx/skyguis/network/handler/ToggleStateButtonClick.java new file mode 100644 index 0000000..104caab --- /dev/null +++ b/src/main/java/de/melanx/skyguis/network/handler/ToggleStateButtonClick.java @@ -0,0 +1,64 @@ +package de.melanx.skyguis.network.handler; + +import de.melanx.skyblockbuilder.data.SkyblockSavedData; +import de.melanx.skyblockbuilder.data.Team; +import de.melanx.skyguis.util.ToggleButtons; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkEvent; +import org.moddingx.libx.network.PacketHandler; +import org.moddingx.libx.network.PacketSerializer; + +import java.util.UUID; +import java.util.function.Supplier; + +public record ToggleStateButtonClick(UUID team, ToggleButtons.Type type) { + + public static class Handler implements PacketHandler { + + @Override + public Target target() { + return Target.MAIN_THREAD; + } + + @Override + public boolean handle(ToggleStateButtonClick msg, Supplier ctx) { + ServerPlayer player = ctx.get().getSender(); + if (player == null) { + return true; + } + + Level level = player.level(); + SkyblockSavedData data = SkyblockSavedData.get(level); + Team team = data.getTeam(msg.team); + if (team != null) { + switch (msg.type) { + case VISITS -> team.setAllowVisit(!team.allowsVisits()); + case JOIN_REQUEST -> team.setAllowJoinRequest(!team.allowsJoinRequests()); + } + } + + return true; + } + } + + public static class Serializer implements PacketSerializer { + + @Override + public Class messageClass() { + return ToggleStateButtonClick.class; + } + + @Override + public void encode(ToggleStateButtonClick msg, FriendlyByteBuf buffer) { + buffer.writeUUID(msg.team); + buffer.writeEnum(msg.type); + } + + @Override + public ToggleStateButtonClick decode(FriendlyByteBuf buffer) { + return new ToggleStateButtonClick(buffer.readUUID(), buffer.readEnum(ToggleButtons.Type.class)); + } + } +} diff --git a/src/main/java/de/melanx/skyguis/util/ToggleButtons.java b/src/main/java/de/melanx/skyguis/util/ToggleButtons.java new file mode 100644 index 0000000..5c5cee2 --- /dev/null +++ b/src/main/java/de/melanx/skyguis/util/ToggleButtons.java @@ -0,0 +1,36 @@ +package de.melanx.skyguis.util; + +import de.melanx.skyblockbuilder.data.Team; +import de.melanx.skyguis.SkyGUIs; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +public class ToggleButtons { + + private static final Component ALLOWED = ComponentBuilder.text("allowed").withStyle(ChatFormatting.GREEN); + private static final Component DISALLOWED = ComponentBuilder.text("disallowed").withStyle(ChatFormatting.RED); + + public static void toggleState(Team team, Button button, MutableComponent base, Type type) { + switch (type) { + case VISITS -> team.setAllowVisit(!team.allowsVisits()); + case JOIN_REQUEST -> team.setAllowJoinRequest(!team.allowsJoinRequests()); + } + button.setTooltip(Tooltip.create(base.copy().append(getStatus(team, type) ? ALLOWED : DISALLOWED))); + SkyGUIs.getNetwork().toggleState(team, type); + } + + public static boolean getStatus(Team team, Type type) { + return switch (type) { + case VISITS -> team.allowsVisits(); + case JOIN_REQUEST -> team.allowsJoinRequests(); + }; + } + + public enum Type { + VISITS, + JOIN_REQUEST + } +} diff --git a/src/main/resources/assets/skyguis/lang/en_us.json b/src/main/resources/assets/skyguis/lang/en_us.json index 018be54..da797e9 100644 --- a/src/main/resources/assets/skyguis/lang/en_us.json +++ b/src/main/resources/assets/skyguis/lang/en_us.json @@ -7,6 +7,8 @@ "screen.skyguis.title.all_teams": "All Teams", "screen.skyguis.title.invitations": "Your Invitations", + "screen.skyguis.text.allowed": "allowed", + "screen.skyguis.text.disallowed": "disallowed", "screen.skyguis.text.name": "Name", "screen.skyguis.text.team_id": "Team ID", "screen.skyguis.text.members": "Members", @@ -37,11 +39,16 @@ "screen.skyguis.text.you_sure_ignore": "Do you really want to ignore invitation by \"%s\"?", "screen.skyguis.text.empty_templates": "No templates available", "screen.skyguis.text.missing_permissions": "You do not have permissions to perform this action", + "screen.skyguis.text.requests": "Requests", + "screen.skyguis.text.allow_visits": "Visits", + "screen.skyguis.text.allow_requests": "Join requests", "screen.skyguis.button.create": "Create", "screen.skyguis.button.confirm": "Confirm", "screen.skyguis.button.abort": "Abort", "screen.skyguis.button.ok": "OK", + "screen.skyguis.button.allow_visits": "Visits are", + "screen.skyguis.button.allow_requests": "Join requests are", "skyguis.key.all_teams_screen": "Open main screen" } \ No newline at end of file