diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java index ca0135c..cd0db10 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/AbstractArmorStandScreen.java @@ -4,10 +4,8 @@ import me.roundaround.armorstands.ArmorStandsMod; import me.roundaround.armorstands.client.ArmorStandsClientMod; import me.roundaround.armorstands.client.gui.MessageRenderer; -import me.roundaround.armorstands.client.gui.MessageRenderer.HasMessageRenderer; import me.roundaround.armorstands.client.gui.widget.HelpButtonWidget; import me.roundaround.armorstands.client.gui.widget.IconButtonWidget; -import me.roundaround.armorstands.client.gui.widget.LabelWidget; import me.roundaround.armorstands.client.gui.widget.NavigationButtonWidget; import me.roundaround.armorstands.client.network.ClientNetworking; import me.roundaround.armorstands.mixin.ArmorStandEntityAccessor; @@ -17,7 +15,7 @@ import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.network.UtilityAction; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; -import me.roundaround.armorstands.util.HasArmorStand; +import me.roundaround.roundalib.client.gui.GuiUtil; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; @@ -37,20 +35,16 @@ import java.util.Objects; import java.util.Optional; -public abstract class AbstractArmorStandScreen extends HandledScreen implements HasArmorStand, - HasMessageRenderer, +public abstract class AbstractArmorStandScreen extends HandledScreen implements PassesEventsThrough { protected static final Identifier SELECTION_TEXTURE = new Identifier( ArmorStandsMod.MOD_ID, "textures/gui/selection_frame.png"); - protected static final int SCREEN_EDGE_PAD = 4; - protected static final int BETWEEN_PAD = 2; protected static final int NAV_BUTTON_BOTTOM_PADDING = 1; protected static final int NAV_BUTTON_SPACING = 0; protected final ArmorStandEntity armorStand; protected final MessageRenderer messageRenderer; - protected final ArrayList labels = new ArrayList<>(); protected final ArrayList navigationButtons = new ArrayList<>(); protected NavigationButtonWidget activeButton; @@ -71,17 +65,10 @@ protected AbstractArmorStandScreen(ArmorStandScreenHandler handler, Text title) public abstract ScreenType getScreenType(); - protected LabelWidget addLabel(LabelWidget label) { - this.labels.add(label); - return label; - } - - @Override public ArmorStandEntity getArmorStand() { return this.armorStand; } - @Override public MessageRenderer getMessageRenderer() { return this.messageRenderer; } @@ -129,11 +116,6 @@ public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) RenderSystem.enableBlend(); ((InGameHudAccessor) this.client.inGameHud).invokeRenderVignetteOverlay(drawContext, this.client.getCameraEntity()); - // Render labels before all other widgets so they are rendered on bottom - for (LabelWidget label : this.labels) { - label.render(drawContext, adjustedMouseX, adjustedMouseY, delta); - } - super.render(drawContext, adjustedMouseX, adjustedMouseY, delta); renderActivePageButtonHighlight(drawContext); @@ -374,7 +356,6 @@ public void updateDisabledSlotsOnClient(int disabledSlots) { } protected void initStart() { - this.labels.clear(); this.navigationButtons.clear(); } @@ -383,23 +364,24 @@ protected void initUtilityButtons() { return; } - addDrawableChild(new HelpButtonWidget(SCREEN_EDGE_PAD, SCREEN_EDGE_PAD)); - addDrawableChild(new IconButtonWidget(SCREEN_EDGE_PAD + IconButtonWidget.WIDTH + BETWEEN_PAD, SCREEN_EDGE_PAD, 14, - Text.translatable("armorstands.utility.copy"), - (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.COPY) - )); + addDrawableChild(new HelpButtonWidget(GuiUtil.PADDING, GuiUtil.PADDING)); + addDrawableChild( + new IconButtonWidget(GuiUtil.PADDING + IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2), GuiUtil.PADDING, 14, + Text.translatable("armorstands.utility.copy"), + (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.COPY) + )); addDrawableChild( - new IconButtonWidget(SCREEN_EDGE_PAD + 2 * (IconButtonWidget.WIDTH + BETWEEN_PAD), SCREEN_EDGE_PAD, 15, - Text.translatable("armorstands.utility.paste"), + new IconButtonWidget(GuiUtil.PADDING + 2 * (IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2)), GuiUtil.PADDING, + 15, Text.translatable("armorstands.utility.paste"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.PASTE) )); addDrawableChild( - new IconButtonWidget(SCREEN_EDGE_PAD + 3 * (IconButtonWidget.WIDTH + BETWEEN_PAD), SCREEN_EDGE_PAD, 17, - Text.translatable("armorstands.utility.undo"), (button) -> ClientNetworking.sendUndoPacket(false) + new IconButtonWidget(GuiUtil.PADDING + 3 * (IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2)), GuiUtil.PADDING, + 17, Text.translatable("armorstands.utility.undo"), (button) -> ClientNetworking.sendUndoPacket(false) )); addDrawableChild( - new IconButtonWidget(SCREEN_EDGE_PAD + 4 * (IconButtonWidget.WIDTH + BETWEEN_PAD), SCREEN_EDGE_PAD, 18, - Text.translatable("armorstands.utility.redo"), (button) -> ClientNetworking.sendUndoPacket(true) + new IconButtonWidget(GuiUtil.PADDING + 4 * (IconButtonWidget.WIDTH + (GuiUtil.PADDING / 2)), GuiUtil.PADDING, + 18, Text.translatable("armorstands.utility.redo"), (button) -> ClientNetworking.sendUndoPacket(true) )); } diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java index e5a5c1d..512ebb2 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandInventoryScreen.java @@ -8,6 +8,7 @@ import me.roundaround.armorstands.network.ArmorStandFlag; import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; +import me.roundaround.roundalib.client.gui.GuiUtil; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.entity.EquipmentSlot; @@ -17,8 +18,8 @@ public class ArmorStandInventoryScreen extends AbstractArmorStandScreen { private static final int BACKGROUND_WIDTH = 176; private static final int BACKGROUND_HEIGHT = 166; - private static final Identifier CUSTOM_TEXTURE = - new Identifier(ArmorStandsMod.MOD_ID, "textures/gui/container/inventory.png"); + private static final Identifier CUSTOM_TEXTURE = new Identifier( + ArmorStandsMod.MOD_ID, "textures/gui/container/inventory.png"); private float mouseX; private float mouseY; @@ -39,16 +40,14 @@ public ScreenType getScreenType() { @Override protected void initRight() { - this.showArmsToggle = addDrawableChild(new FlagToggleWidget(this.textRenderer, - ArmorStandFlag.SHOW_ARMS, - ArmorStandFlag.SHOW_ARMS.getValue(this.armorStand), - this.width - SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 2 * FlagToggleWidget.WIDGET_HEIGHT - BETWEEN_PAD)); - this.lockInventoryToggle = addDrawableChild(new FlagToggleWidget(this.textRenderer, - ArmorStandFlag.LOCK_INVENTORY, - ArmorStandFlag.LOCK_INVENTORY.getValue(this.armorStand), - this.width - SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - FlagToggleWidget.WIDGET_HEIGHT)); + this.showArmsToggle = addDrawableChild(new FlagToggleWidget(this.textRenderer, ArmorStandFlag.SHOW_ARMS, + ArmorStandFlag.SHOW_ARMS.getValue(this.armorStand), this.width - GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 2 * FlagToggleWidget.WIDGET_HEIGHT - (GuiUtil.PADDING / 2) + )); + this.lockInventoryToggle = addDrawableChild(new FlagToggleWidget(this.textRenderer, ArmorStandFlag.LOCK_INVENTORY, + ArmorStandFlag.LOCK_INVENTORY.getValue(this.armorStand), this.width - GuiUtil.PADDING, + this.height - GuiUtil.PADDING - FlagToggleWidget.WIDGET_HEIGHT + )); } @Override @@ -74,36 +73,19 @@ public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) protected void drawBackground(DrawContext drawContext, float delta, int mouseX, int mouseY) { RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - drawContext.drawTexture(CUSTOM_TEXTURE, - this.x, - this.y, - 0, - 0, - BACKGROUND_WIDTH, - BACKGROUND_HEIGHT); + drawContext.drawTexture(CUSTOM_TEXTURE, this.x, this.y, 0, 0, BACKGROUND_WIDTH, BACKGROUND_HEIGHT); ImmutableList> armorSlots = this.handler.getArmorSlots(); for (int index = 0; index < armorSlots.size(); index++) { Slot slot = armorSlots.get(index).getFirst(); EquipmentSlot equipmentSlot = armorSlots.get(index).getSecond(); if (ArmorStandScreenHandler.isSlotDisabled(armorStand, equipmentSlot)) { - drawContext.fill(x + slot.x, - this.y + slot.y, - this.x + slot.x + 16, - y + slot.y + 16, - 0x80000000); + drawContext.fill(x + slot.x, this.y + slot.y, this.x + slot.x + 16, y + slot.y + 16, 0x80000000); } } - InventoryScreen.drawEntity(drawContext, - this.x + 62, - this.y + 8, - this.x + 114, - this.y + 78, - 30, - 0.0625f, - this.mouseX, - this.mouseY, - this.armorStand); + InventoryScreen.drawEntity(drawContext, this.x + 62, this.y + 8, this.x + 114, this.y + 78, 30, 0.0625f, + this.mouseX, this.mouseY, this.armorStand + ); } } diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java index 1f666ca..9c3de8d 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandMoveScreen.java @@ -1,7 +1,6 @@ package me.roundaround.armorstands.client.gui.screen; import me.roundaround.armorstands.client.gui.widget.IconButtonWidget; -import me.roundaround.armorstands.client.gui.widget.LabelWidget; import me.roundaround.armorstands.client.gui.widget.MoveButtonWidget; import me.roundaround.armorstands.client.network.ClientNetworking; import me.roundaround.armorstands.network.ScreenType; @@ -9,6 +8,8 @@ import me.roundaround.armorstands.screen.ArmorStandScreenHandler; import me.roundaround.armorstands.util.MoveMode; import me.roundaround.armorstands.util.MoveUnits; +import me.roundaround.roundalib.client.gui.GuiUtil; +import me.roundaround.roundalib.client.gui.widget.LabelWidget; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.CyclingButtonWidget; import net.minecraft.entity.Entity; @@ -64,67 +65,75 @@ protected void initLeft() { } private void initCurrentStatus() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.current.player"), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); - - this.playerPosLabel = addLabel(LabelWidget.builder(getCurrentPosText(client.player), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 2 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); + ArrayList playerLines = new ArrayList<>(); + playerLines.add(Text.translatable("armorstands.current.player")); + playerLines.add(this.getCurrentPosText(this.client.player)); + playerLines.add(this.getCurrentBlockPosText(this.client.player)); + this.addDrawable(LabelWidget.builder(this.textRenderer, playerLines) + .refPosition(this.width, 0) + .alignedTop() + .justifiedRight() + .build()); - this.playerBlockPosLabel = addLabel(LabelWidget.builder(getCurrentBlockPosText(client.player), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 3 * LabelWidget.HEIGHT_WITH_PADDING - ).alignedTop().justifiedLeft().shiftForPadding().build()); + ArrayList standLines = new ArrayList<>(); + standLines.add(Text.translatable("armorstands.current.stand")); + standLines.add(this.getCurrentPosText(this.armorStand)); + standLines.add(this.getCurrentBlockPosText(this.armorStand)); + this.addDrawable(LabelWidget.builder(this.textRenderer, standLines) + .refPosition(this.width, 0) + .alignedTop() + .justifiedRight() + .build()); - addLabel(LabelWidget.builder(Text.translatable("armorstands.current.stand"), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 5 * LabelWidget.HEIGHT_WITH_PADDING + addLabel(LabelWidget.builder(Text.translatable("armorstands.current.stand"), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 5 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); - this.standPosLabel = addLabel(LabelWidget.builder(getCurrentPosText(this.armorStand), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 6 * LabelWidget.HEIGHT_WITH_PADDING + this.standPosLabel = addLabel(LabelWidget.builder(getCurrentPosText(this.armorStand), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 6 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); - this.standBlockPosLabel = addLabel(LabelWidget.builder(getCurrentBlockPosText(this.armorStand), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 7 * LabelWidget.HEIGHT_WITH_PADDING + this.standBlockPosLabel = addLabel(LabelWidget.builder(getCurrentBlockPosText(this.armorStand), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 7 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); } private void initSnapButtons() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.move.snap"), SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 2 * (BUTTON_HEIGHT + BETWEEN_PAD) + addLabel(LabelWidget.builder(Text.translatable("armorstands.move.snap"), GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 2 * (BUTTON_HEIGHT + (GuiUtil.PADDING / 2)) ).shiftForPadding().justifiedLeft().alignedBottom().build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.standing"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_STANDING) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, this.height - SCREEN_EDGE_PAD - 2 * BUTTON_HEIGHT - BETWEEN_PAD) + .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2)) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.sitting"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_SITTING) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + BUTTON_WIDTH + BETWEEN_PAD, - this.height - SCREEN_EDGE_PAD - 2 * BUTTON_HEIGHT - BETWEEN_PAD + .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), + this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2) ) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.corner"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_CORNER) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.center"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_CENTER) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + BUTTON_WIDTH + BETWEEN_PAD, this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.move.snap.player"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.SNAP_PLAYER) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + 2 * (BUTTON_WIDTH + BETWEEN_PAD), this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING + 2 * (BUTTON_WIDTH + (GuiUtil.PADDING / 2)), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .build()); } @@ -132,13 +141,13 @@ private void initSnapButtons() { protected void initRight() { super.initRight(); - int topOfMoveButtons = this.height - SCREEN_EDGE_PAD - 6 * MINI_BUTTON_HEIGHT - 5 * BETWEEN_PAD; + int topOfMoveButtons = this.height - GuiUtil.PADDING - 6 * MINI_BUTTON_HEIGHT - 5 * (GuiUtil.PADDING / 2); addDrawableChild(CyclingButtonWidget.builder(MoveMode::getOptionValueText) .values(MoveMode.values()) .initially(this.mode) - .build(this.width - SCREEN_EDGE_PAD - 120, - topOfMoveButtons - LabelWidget.HEIGHT_WITH_PADDING - 3 * BETWEEN_PAD - 2 * MINI_BUTTON_HEIGHT, 120, + .build(this.width - GuiUtil.PADDING - 120, + topOfMoveButtons - LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2) - 2 * MINI_BUTTON_HEIGHT, 120, MINI_BUTTON_HEIGHT, MoveMode.getOptionLabelText(), (button, mode) -> { this.mode = mode; this.units = this.mode.getDefaultUnits(); @@ -159,8 +168,8 @@ protected void initRight() { this.unitsButton = addDrawableChild(CyclingButtonWidget.builder(MoveUnits::getOptionValueText) .values(MoveUnits.values()) .initially(this.units) - .build(this.width - SCREEN_EDGE_PAD - 120, - topOfMoveButtons - LabelWidget.HEIGHT_WITH_PADDING - 2 * BETWEEN_PAD - MINI_BUTTON_HEIGHT, 120, + .build(this.width - GuiUtil.PADDING - 120, + topOfMoveButtons - LabelWidget.HEIGHT_WITH_PADDING - 2 * (GuiUtil.PADDING / 2) - MINI_BUTTON_HEIGHT, 120, MINI_BUTTON_HEIGHT, MoveUnits.getOptionLabelText(), (button, units) -> { this.units = units; this.moveButtons.forEach((moveButton) -> { @@ -171,7 +180,7 @@ protected void initRight() { this.facingLabel = addLabel(LabelWidget.builder( getCurrentFacingText(this.mode.equals(MoveMode.LOCAL_TO_STAND) ? this.armorStand : this.client.player), - this.width - SCREEN_EDGE_PAD, topOfMoveButtons - BETWEEN_PAD + this.width - GuiUtil.PADDING, topOfMoveButtons - (GuiUtil.PADDING / 2) ).shiftForPadding().alignedBottom().justifiedRight().build()); Direction[] directions = new Direction[]{ @@ -183,21 +192,21 @@ protected void initRight() { } private void addRowOfButtons(Direction direction, int index) { - int refX = this.width - SCREEN_EDGE_PAD; - int refY = this.height - SCREEN_EDGE_PAD - MINI_BUTTON_HEIGHT - index * (BETWEEN_PAD + MINI_BUTTON_HEIGHT); + int refX = this.width - GuiUtil.PADDING; + int refY = this.height - GuiUtil.PADDING - MINI_BUTTON_HEIGHT - index * ((GuiUtil.PADDING / 2) + MINI_BUTTON_HEIGHT); directionLabels.put(direction, addLabel( - LabelWidget.builder(this.mode.getDirectionText(direction), refX - 3 * (BETWEEN_PAD + MINI_BUTTON_WIDTH), + LabelWidget.builder(this.mode.getDirectionText(direction), refX - 3 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY + MINI_BUTTON_HEIGHT / 2 ).justifiedRight().alignedMiddle().shiftForPadding().build())); moveButtons.add(addDrawableChild( - new MoveButtonWidget(refX - 3 * MINI_BUTTON_WIDTH - 2 * BETWEEN_PAD, refY, MINI_BUTTON_WIDTH, + new MoveButtonWidget(refX - 3 * MINI_BUTTON_WIDTH - 2 * (GuiUtil.PADDING / 2), refY, MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT, direction, 1, this.mode, this.units ))); moveButtons.add(addDrawableChild( - new MoveButtonWidget(refX - 2 * MINI_BUTTON_WIDTH - BETWEEN_PAD, refY, MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT, + new MoveButtonWidget(refX - 2 * MINI_BUTTON_WIDTH - (GuiUtil.PADDING / 2), refY, MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT, direction, 2, this.mode, this.units ))); diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java index 688184f..1380d9d 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPoseScreen.java @@ -10,6 +10,7 @@ import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; import me.roundaround.armorstands.util.Pose; +import me.roundaround.roundalib.client.gui.GuiUtil; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; @@ -66,8 +67,8 @@ protected void initLeft() { int offset = (CONTROL_WIDTH - 3 * IconButtonWidget.WIDTH - 2 * PART_PAD_HORIZONTAL) / 2; IconButtonWidget headButton = new IconButtonWidget( - offset + SCREEN_EDGE_PAD + IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL, - this.height - SCREEN_EDGE_PAD - 3 * IconButtonWidget.HEIGHT - 2 * PART_PAD_VERTICAL - PART_PAD_VERTICAL - + offset + GuiUtil.PADDING + IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL, + this.height - GuiUtil.PADDING - 3 * IconButtonWidget.HEIGHT - 2 * PART_PAD_VERTICAL - PART_PAD_VERTICAL - BUTTON_HEIGHT, 6, PosePart.HEAD.getDisplayName(), (button) -> { setActivePosePart(PosePart.HEAD); this.activePosePartButton.active = true; @@ -79,8 +80,8 @@ protected void initLeft() { this.activePosePartButton = headButton; addDrawableChild(headButton); - IconButtonWidget rightArmButton = new IconButtonWidget(offset + SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - + IconButtonWidget rightArmButton = new IconButtonWidget(offset + GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - BUTTON_HEIGHT, 8, PosePart.RIGHT_ARM.getDisplayName(), (button) -> { setActivePosePart(PosePart.RIGHT_ARM); this.activePosePartButton.active = true; @@ -91,8 +92,8 @@ protected void initLeft() { addDrawableChild(rightArmButton); IconButtonWidget bodyButton = new IconButtonWidget( - offset + SCREEN_EDGE_PAD + IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL, - this.height - SCREEN_EDGE_PAD - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - + offset + GuiUtil.PADDING + IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL, + this.height - GuiUtil.PADDING - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - BUTTON_HEIGHT, 7, PosePart.BODY.getDisplayName(), (button) -> { setActivePosePart(PosePart.BODY); this.activePosePartButton.active = true; @@ -103,8 +104,8 @@ protected void initLeft() { addDrawableChild(bodyButton); IconButtonWidget leftArmButton = new IconButtonWidget( - offset + SCREEN_EDGE_PAD + 2 * IconButtonWidget.WIDTH + 2 * PART_PAD_HORIZONTAL, - this.height - SCREEN_EDGE_PAD - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - + offset + GuiUtil.PADDING + 2 * IconButtonWidget.WIDTH + 2 * PART_PAD_HORIZONTAL, + this.height - GuiUtil.PADDING - 2 * IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - PART_PAD_VERTICAL - BUTTON_HEIGHT, 9, PosePart.LEFT_ARM.getDisplayName(), (button) -> { setActivePosePart(PosePart.LEFT_ARM); this.activePosePartButton.active = true; @@ -115,8 +116,8 @@ protected void initLeft() { addDrawableChild(leftArmButton); IconButtonWidget rightLegButton = new IconButtonWidget( - offset + SCREEN_EDGE_PAD + (IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL) / 2, - this.height - SCREEN_EDGE_PAD - IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - BUTTON_HEIGHT, 11, + offset + GuiUtil.PADDING + (IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL) / 2, + this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - BUTTON_HEIGHT, 11, PosePart.RIGHT_LEG.getDisplayName(), (button) -> { setActivePosePart(PosePart.RIGHT_LEG); this.activePosePartButton.active = true; @@ -127,9 +128,9 @@ protected void initLeft() { addDrawableChild(rightLegButton); IconButtonWidget leftLegButton = new IconButtonWidget( - offset + SCREEN_EDGE_PAD + (IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL) / 2 + IconButtonWidget.WIDTH + + offset + GuiUtil.PADDING + (IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL) / 2 + IconButtonWidget.WIDTH + PART_PAD_HORIZONTAL, - this.height - SCREEN_EDGE_PAD - IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - BUTTON_HEIGHT, 10, + this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT - PART_PAD_VERTICAL - BUTTON_HEIGHT, 10, PosePart.LEFT_LEG.getDisplayName(), (button) -> { setActivePosePart(PosePart.LEFT_LEG); this.activePosePartButton.active = true; @@ -147,7 +148,7 @@ protected void initLeft() { this.rollSlider.refresh(); }) .size(CONTROL_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .build()); } @@ -159,8 +160,8 @@ protected void initRight() { .initially(SliderRange.FULL) .values(SliderRange.values()) .omitKeyText() - .build(this.width - SCREEN_EDGE_PAD - CONTROL_WIDTH, - this.height - SCREEN_EDGE_PAD - 3 * SLIDER_HEIGHT - 3 * BUTTON_HEIGHT - 3 * BETWEEN_PAD - 3 * ROW_PAD - + .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, + this.height - GuiUtil.PADDING - 3 * SLIDER_HEIGHT - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - 3 * ROW_PAD - 2 * LabelWidget.HEIGHT_WITH_PADDING, CONTROL_WIDTH, BUTTON_HEIGHT, Text.translatable("armorstands.pose.range"), (button, value) -> { this.pitchSlider.setRange(value.getMin(), value.getMax()); @@ -171,8 +172,8 @@ protected void initRight() { this.posePartLabel = addLabel( LabelWidget.builder(Text.translatable("armorstands.pose.editing", this.posePart.getDisplayName().getString()), - this.width - SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 3 * SLIDER_HEIGHT - 3 * BUTTON_HEIGHT - 4 * BETWEEN_PAD - 3 * ROW_PAD - + this.width - GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 3 * SLIDER_HEIGHT - 3 * BUTTON_HEIGHT - 4 * (GuiUtil.PADDING / 2) - 3 * ROW_PAD - 2 * LabelWidget.HEIGHT_WITH_PADDING ).shiftForPadding().alignedBottom().justifiedRight().build()); @@ -182,33 +183,33 @@ protected void initRight() { } private AdjustPoseSliderWidget addAdjustSlider(EulerAngleParameter parameter, int index) { - int refRight = this.width - SCREEN_EDGE_PAD; + int refRight = this.width - GuiUtil.PADDING; int refLeft = refRight - CONTROL_WIDTH; int refY = - this.height - SCREEN_EDGE_PAD - SLIDER_HEIGHT - index * (SLIDER_HEIGHT + BUTTON_HEIGHT + BETWEEN_PAD + ROW_PAD); + this.height - GuiUtil.PADDING - SLIDER_HEIGHT - index * (SLIDER_HEIGHT + BUTTON_HEIGHT + (GuiUtil.PADDING / 2) + ROW_PAD); AdjustPoseSliderWidget slider = new AdjustPoseSliderWidget(refLeft, refY, CONTROL_WIDTH, SLIDER_HEIGHT, this.posePart, parameter, this.armorStand ); - addLabel(LabelWidget.builder(parameter.getDisplayName(), refLeft, refY - BETWEEN_PAD) + addLabel(LabelWidget.builder(parameter.getDisplayName(), refLeft, refY - (GuiUtil.PADDING / 2)) .alignedBottom() .justifiedLeft() .shiftForPadding() .build()); addDrawableChild(ButtonWidget.builder(Text.literal("-"), (button) -> slider.decrement()) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(refRight - 3 * BUTTON_WIDTH - 2 * BETWEEN_PAD, refY - BETWEEN_PAD - BUTTON_HEIGHT) + .position(refRight - 3 * BUTTON_WIDTH - 2 * (GuiUtil.PADDING / 2), refY - (GuiUtil.PADDING / 2) - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.pose.subtract"))) .build()); addDrawableChild(ButtonWidget.builder(Text.literal("+"), (button) -> slider.increment()) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(refRight - 2 * BUTTON_WIDTH - BETWEEN_PAD, refY - BETWEEN_PAD - BUTTON_HEIGHT) + .position(refRight - 2 * BUTTON_WIDTH - (GuiUtil.PADDING / 2), refY - (GuiUtil.PADDING / 2) - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.pose.add"))) .build()); addDrawableChild(ButtonWidget.builder(Text.literal("0"), (button) -> slider.zero()) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(refRight - BUTTON_WIDTH, refY - BETWEEN_PAD - BUTTON_HEIGHT) + .position(refRight - BUTTON_WIDTH, refY - (GuiUtil.PADDING / 2) - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.pose.zero"))) .build()); addDrawableChild(slider); diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java index f4976cb..94ce1d7 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandPresetsScreen.java @@ -1,216 +1,192 @@ -package me.roundaround.armorstands.client.gui.screen; - -import me.roundaround.armorstands.client.gui.widget.IconButtonWidget; -import me.roundaround.armorstands.client.gui.widget.LabelWidget; -import me.roundaround.armorstands.client.gui.widget.PresetPoseButtonWidget; -import me.roundaround.armorstands.network.ScreenType; -import me.roundaround.armorstands.screen.ArmorStandScreenHandler; -import me.roundaround.armorstands.util.PosePreset; -import me.roundaround.armorstands.util.PosePreset.Category; -import me.roundaround.armorstands.util.PosePreset.Source; -import net.minecraft.client.gui.widget.CyclingButtonWidget; -import net.minecraft.text.Text; -import net.minecraft.util.math.MathHelper; - -import java.util.ArrayList; -import java.util.List; - -public class ArmorStandPresetsScreen extends AbstractArmorStandScreen { - private static final int CONTROL_WIDTH = 120; - private static final int CONTROL_HEIGHT = 16; - private static final int BUTTONS_PER_PAGE = 6; - - private final ArrayList presetButtons = new ArrayList<>(); - - private IconButtonWidget prevPageButton; - private IconButtonWidget nextPageButton; - private LabelWidget pageLabel; - private int page = 0; - private Source source = Source.ALL; - private Category category = Category.ALL; - private List matchingPresets = new ArrayList<>(); - - public ArmorStandPresetsScreen(ArmorStandScreenHandler handler) { - super(handler, ScreenType.PRESETS.getDisplayName()); - this.supportsUndoRedo = true; - } - - @Override - public ScreenType getScreenType() { - return ScreenType.PRESETS; - } - - @Override - protected void initStart() { - super.initStart(); - - this.presetButtons.clear(); - } - - @Override - protected void initRight() { - super.initRight(); - - addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.source.label"), - this.width - SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - - (BUTTONS_PER_PAGE + 3) * BETWEEN_PAD - IconButtonWidget.HEIGHT - CONTROL_HEIGHT - - LabelWidget.HEIGHT_WITH_PADDING - 3 * BETWEEN_PAD) - .alignedBottom() - .justifiedRight() - .shiftForPadding() - .build()); - addDrawableChild(CyclingButtonWidget.builder(Source::getDisplayName) - .values(Source.getSources()) - .initially(Source.ALL) - .omitKeyText() - .build(this.width - SCREEN_EDGE_PAD - CONTROL_WIDTH, - this.height - SCREEN_EDGE_PAD - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - - (BUTTONS_PER_PAGE + 2) * BETWEEN_PAD - IconButtonWidget.HEIGHT - CONTROL_HEIGHT - - LabelWidget.HEIGHT_WITH_PADDING - 3 * BETWEEN_PAD, - CONTROL_WIDTH, - CONTROL_HEIGHT, - Text.translatable("armorstands.presets.source.label"), - (button, source) -> { - filter(source); - })); - - addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.category.label"), - this.width - SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - - (BUTTONS_PER_PAGE + 3) * BETWEEN_PAD - IconButtonWidget.HEIGHT) - .alignedBottom() - .justifiedRight() - .shiftForPadding() - .build()); - addDrawableChild(CyclingButtonWidget.builder(Category::getDisplayName) - .values(Category.getCategories()) - .initially(Category.ALL) - .omitKeyText() - .build(this.width - SCREEN_EDGE_PAD - CONTROL_WIDTH, - this.height - SCREEN_EDGE_PAD - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - - (BUTTONS_PER_PAGE + 2) * BETWEEN_PAD - IconButtonWidget.HEIGHT, - CONTROL_WIDTH, - CONTROL_HEIGHT, - Text.translatable("armorstands.presets.category.label"), - (button, category) -> { - filter(category); - })); - - for (int i = BUTTONS_PER_PAGE; i > 0; i--) { - this.presetButtons.add(addDrawableChild(new PresetPoseButtonWidget( - this.width - SCREEN_EDGE_PAD - CONTROL_WIDTH, - this.height - SCREEN_EDGE_PAD - i * CONTROL_HEIGHT - i * BETWEEN_PAD - - IconButtonWidget.HEIGHT, - CONTROL_WIDTH, - CONTROL_HEIGHT))); - } - - this.prevPageButton = - addDrawableChild(new IconButtonWidget(this.width - SCREEN_EDGE_PAD - CONTROL_WIDTH, - this.height - SCREEN_EDGE_PAD - IconButtonWidget.HEIGHT, - 12, - Text.translatable("armorstands.presets.previous"), - (button) -> previousPage())); - this.nextPageButton = - addDrawableChild(new IconButtonWidget(this.width - SCREEN_EDGE_PAD - IconButtonWidget.WIDTH, - this.height - SCREEN_EDGE_PAD - IconButtonWidget.HEIGHT, - 13, - Text.translatable("armorstands.presets.next"), - (button) -> nextPage())); - - int maxPage = MathHelper.ceil( - PosePreset.getPresets(this.source, this.category).size() / (float) BUTTONS_PER_PAGE) - 1; - this.pageLabel = addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.page", - this.page + 1, - maxPage + 1), - this.width - SCREEN_EDGE_PAD - CONTROL_WIDTH / 2, - this.height - SCREEN_EDGE_PAD - IconButtonWidget.HEIGHT / 2) - .alignedMiddle() - .justifiedCenter() - .build()); - } - - @Override - protected void initEnd() { - updateFilters(); - } - - @Override - public boolean mouseScrolled( - double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - if (isMouseOverList(mouseX, mouseY)) { - if (verticalAmount < 0) { - nextPage(); - } else { - previousPage(); - } - return true; - } - return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); - } - - private void filter(Source source) { - this.source = source; - updateFilters(); - } - - private void filter(Category category) { - this.category = category; - updateFilters(); - } - - private void updateFilters() { - this.matchingPresets = PosePreset.getPresets(this.source, this.category); - setPage(0); - } - - private void setPage(int page) { - int maxPage = - Math.max(0, MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1); - - this.page = page; - List presets = this.matchingPresets.subList(page * BUTTONS_PER_PAGE, - Math.min((page + 1) * BUTTONS_PER_PAGE, this.matchingPresets.size())); - - for (int i = 0; i < BUTTONS_PER_PAGE; i++) { - if (i < presets.size()) { - this.presetButtons.get(i).setPose(presets.get(i)); - this.presetButtons.get(i).visible = true; - } else { - this.presetButtons.get(i).visible = false; - } - } - - if (this.presetButtons.contains(getFocused())) { - setFocused(this.presetButtons.get(0)); - } - - this.prevPageButton.active = this.page > 0; - this.nextPageButton.active = this.page < maxPage; - this.pageLabel.setText(Text.translatable("armorstands.presets.page", - this.page + 1, - maxPage + 1)); - } - - private void nextPage() { - int maxPage = MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1; - if (this.page < maxPage) { - setPage(this.page + 1); - } - } - - private void previousPage() { - if (this.page > 0) { - setPage(this.page - 1); - } - } - - private boolean isMouseOverList(double mouseX, double mouseY) { - return mouseX >= this.width - SCREEN_EDGE_PAD - CONTROL_WIDTH && - mouseX < this.width - SCREEN_EDGE_PAD && mouseY >= - this.height - SCREEN_EDGE_PAD - IconButtonWidget.HEIGHT - - BUTTONS_PER_PAGE * CONTROL_HEIGHT - (BUTTONS_PER_PAGE + 1) * BETWEEN_PAD && - mouseY < this.height - SCREEN_EDGE_PAD - IconButtonWidget.HEIGHT; - } -} +package me.roundaround.armorstands.client.gui.screen; + +import me.roundaround.armorstands.client.gui.widget.IconButtonWidget; +import me.roundaround.armorstands.client.gui.widget.LabelWidget; +import me.roundaround.armorstands.client.gui.widget.PresetPoseButtonWidget; +import me.roundaround.armorstands.network.ScreenType; +import me.roundaround.armorstands.screen.ArmorStandScreenHandler; +import me.roundaround.armorstands.util.PosePreset; +import me.roundaround.armorstands.util.PosePreset.Category; +import me.roundaround.armorstands.util.PosePreset.Source; +import me.roundaround.roundalib.client.gui.GuiUtil; +import net.minecraft.client.gui.widget.CyclingButtonWidget; +import net.minecraft.text.Text; +import net.minecraft.util.math.MathHelper; + +import java.util.ArrayList; +import java.util.List; + +public class ArmorStandPresetsScreen extends AbstractArmorStandScreen { + private static final int CONTROL_WIDTH = 120; + private static final int CONTROL_HEIGHT = 16; + private static final int BUTTONS_PER_PAGE = 6; + + private final ArrayList presetButtons = new ArrayList<>(); + + private IconButtonWidget prevPageButton; + private IconButtonWidget nextPageButton; + private LabelWidget pageLabel; + private int page = 0; + private Source source = Source.ALL; + private Category category = Category.ALL; + private List matchingPresets = new ArrayList<>(); + + public ArmorStandPresetsScreen(ArmorStandScreenHandler handler) { + super(handler, ScreenType.PRESETS.getDisplayName()); + this.supportsUndoRedo = true; + } + + @Override + public ScreenType getScreenType() { + return ScreenType.PRESETS; + } + + @Override + protected void initStart() { + super.initStart(); + + this.presetButtons.clear(); + } + + @Override + protected void initRight() { + super.initRight(); + + addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.source.label"), this.width - GuiUtil.PADDING, + this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - (BUTTONS_PER_PAGE + 3) * (GuiUtil.PADDING / 2) - + IconButtonWidget.HEIGHT - CONTROL_HEIGHT - LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2) + ).alignedBottom().justifiedRight().shiftForPadding().build()); + addDrawableChild(CyclingButtonWidget.builder(Source::getDisplayName) + .values(Source.getSources()) + .initially(Source.ALL) + .omitKeyText() + .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, + this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - + (BUTTONS_PER_PAGE + 2) * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT - CONTROL_HEIGHT - + LabelWidget.HEIGHT_WITH_PADDING - 3 * (GuiUtil.PADDING / 2), CONTROL_WIDTH, CONTROL_HEIGHT, + Text.translatable("armorstands.presets.source.label"), (button, source) -> { + filter(source); + } + )); + + addLabel(LabelWidget.builder(Text.translatable("armorstands.presets.category.label"), this.width - GuiUtil.PADDING, + this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - (BUTTONS_PER_PAGE + 3) * (GuiUtil.PADDING / 2) - + IconButtonWidget.HEIGHT + ).alignedBottom().justifiedRight().shiftForPadding().build()); + addDrawableChild(CyclingButtonWidget.builder(Category::getDisplayName) + .values(Category.getCategories()) + .initially(Category.ALL) + .omitKeyText() + .build(this.width - GuiUtil.PADDING - CONTROL_WIDTH, + this.height - GuiUtil.PADDING - (BUTTONS_PER_PAGE + 2) * CONTROL_HEIGHT - + (BUTTONS_PER_PAGE + 2) * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT, CONTROL_WIDTH, CONTROL_HEIGHT, + Text.translatable("armorstands.presets.category.label"), (button, category) -> { + filter(category); + } + )); + + for (int i = BUTTONS_PER_PAGE; i > 0; i--) { + this.presetButtons.add(addDrawableChild(new PresetPoseButtonWidget(this.width - GuiUtil.PADDING - CONTROL_WIDTH, + this.height - GuiUtil.PADDING - i * CONTROL_HEIGHT - i * (GuiUtil.PADDING / 2) - IconButtonWidget.HEIGHT, CONTROL_WIDTH, + CONTROL_HEIGHT + ))); + } + + this.prevPageButton = addDrawableChild(new IconButtonWidget(this.width - GuiUtil.PADDING - CONTROL_WIDTH, + this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT, 12, Text.translatable("armorstands.presets.previous"), + (button) -> previousPage() + )); + this.nextPageButton = addDrawableChild(new IconButtonWidget(this.width - GuiUtil.PADDING - IconButtonWidget.WIDTH, + this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT, 13, Text.translatable("armorstands.presets.next"), + (button) -> nextPage() + )); + + int maxPage = + MathHelper.ceil(PosePreset.getPresets(this.source, this.category).size() / (float) BUTTONS_PER_PAGE) - 1; + this.pageLabel = addLabel( + LabelWidget.builder(Text.translatable("armorstands.presets.page", this.page + 1, maxPage + 1), + this.width - GuiUtil.PADDING - CONTROL_WIDTH / 2, + this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT / 2 + ).alignedMiddle().justifiedCenter().build()); + } + + @Override + protected void initEnd() { + updateFilters(); + } + + @Override + public boolean mouseScrolled( + double mouseX, double mouseY, double horizontalAmount, double verticalAmount + ) { + if (isMouseOverList(mouseX, mouseY)) { + if (verticalAmount < 0) { + nextPage(); + } else { + previousPage(); + } + return true; + } + return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); + } + + private void filter(Source source) { + this.source = source; + updateFilters(); + } + + private void filter(Category category) { + this.category = category; + updateFilters(); + } + + private void updateFilters() { + this.matchingPresets = PosePreset.getPresets(this.source, this.category); + setPage(0); + } + + private void setPage(int page) { + int maxPage = Math.max(0, MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1); + + this.page = page; + List presets = this.matchingPresets.subList(page * BUTTONS_PER_PAGE, + Math.min((page + 1) * BUTTONS_PER_PAGE, this.matchingPresets.size()) + ); + + for (int i = 0; i < BUTTONS_PER_PAGE; i++) { + if (i < presets.size()) { + this.presetButtons.get(i).setPose(presets.get(i)); + this.presetButtons.get(i).visible = true; + } else { + this.presetButtons.get(i).visible = false; + } + } + + if (this.presetButtons.contains(getFocused())) { + setFocused(this.presetButtons.get(0)); + } + + this.prevPageButton.active = this.page > 0; + this.nextPageButton.active = this.page < maxPage; + this.pageLabel.setText(Text.translatable("armorstands.presets.page", this.page + 1, maxPage + 1)); + } + + private void nextPage() { + int maxPage = MathHelper.ceil(this.matchingPresets.size() / (float) BUTTONS_PER_PAGE) - 1; + if (this.page < maxPage) { + setPage(this.page + 1); + } + } + + private void previousPage() { + if (this.page > 0) { + setPage(this.page - 1); + } + } + + private boolean isMouseOverList(double mouseX, double mouseY) { + return mouseX >= this.width - GuiUtil.PADDING - CONTROL_WIDTH && mouseX < this.width - GuiUtil.PADDING && mouseY >= + this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT - BUTTONS_PER_PAGE * CONTROL_HEIGHT - + (BUTTONS_PER_PAGE + 1) * (GuiUtil.PADDING / 2) && mouseY < this.height - GuiUtil.PADDING - IconButtonWidget.HEIGHT; + } +} diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java index fe60761..f1579bb 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandRotateScreen.java @@ -7,6 +7,7 @@ import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.network.UtilityAction; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; +import me.roundaround.roundalib.client.gui.GuiUtil; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.entity.Entity; import net.minecraft.text.Text; @@ -21,7 +22,7 @@ public class ArmorStandRotateScreen extends AbstractArmorStandScreen { private static final int DIRECTION_BUTTON_WIDTH = 70; private static final int MINI_BUTTON_WIDTH = 24; private static final int MINI_BUTTON_HEIGHT = 16; - private static final int SLIDER_WIDTH = 4 * MINI_BUTTON_WIDTH + 3 * BETWEEN_PAD; + private static final int SLIDER_WIDTH = 4 * MINI_BUTTON_WIDTH + 3 * (GuiUtil.PADDING / 2); private static final int SLIDER_HEIGHT = 16; private LabelWidget playerFacingLabel; @@ -50,50 +51,50 @@ protected void initLeft() { } private void initCurrentStatus() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.current.player"), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + LabelWidget.HEIGHT_WITH_PADDING + addLabel(LabelWidget.builder(Text.translatable("armorstands.current.player"), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); - this.playerFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.client.player), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 2 * LabelWidget.HEIGHT_WITH_PADDING + this.playerFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.client.player), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 2 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); - this.playerRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.client.player), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 3 * LabelWidget.HEIGHT_WITH_PADDING + this.playerRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.client.player), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 3 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); - addLabel(LabelWidget.builder(Text.translatable("armorstands.current.stand"), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 5 * LabelWidget.HEIGHT_WITH_PADDING + addLabel(LabelWidget.builder(Text.translatable("armorstands.current.stand"), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 5 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); - this.standFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.armorStand), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 6 * LabelWidget.HEIGHT_WITH_PADDING + this.standFacingLabel = addLabel(LabelWidget.builder(getCurrentFacingText(this.armorStand), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 6 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); - this.standRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.armorStand), SCREEN_EDGE_PAD, - SCREEN_EDGE_PAD + IconButtonWidget.HEIGHT + 7 * LabelWidget.HEIGHT_WITH_PADDING + this.standRotationLabel = addLabel(LabelWidget.builder(getCurrentRotationText(this.armorStand), GuiUtil.PADDING, + GuiUtil.PADDING + IconButtonWidget.HEIGHT + 7 * LabelWidget.HEIGHT_WITH_PADDING ).alignedTop().justifiedLeft().shiftForPadding().build()); } private void initSnapButtons() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.snap"), SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 3 * BUTTON_HEIGHT - 4 * BETWEEN_PAD - LabelWidget.HEIGHT_WITH_PADDING + addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.snap"), GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 4 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING ).shiftForPadding().justifiedLeft().alignedBottom().build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.SOUTH.getName()), (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.SOUTH.asRotation())) ) .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 3 * BUTTON_HEIGHT - 3 * BETWEEN_PAD - LabelWidget.HEIGHT_WITH_PADDING + .position(GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING ) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.NORTH.getName()), (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.NORTH.asRotation())) ) .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + DIRECTION_BUTTON_WIDTH + BETWEEN_PAD, - this.height - SCREEN_EDGE_PAD - 3 * BUTTON_HEIGHT - 3 * BETWEEN_PAD - LabelWidget.HEIGHT_WITH_PADDING + .position(GuiUtil.PADDING + DIRECTION_BUTTON_WIDTH + (GuiUtil.PADDING / 2), + this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING ) .build()); @@ -101,41 +102,41 @@ private void initSnapButtons() { (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.EAST.asRotation())) ) .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 2 * BUTTON_HEIGHT - 2 * BETWEEN_PAD - LabelWidget.HEIGHT_WITH_PADDING + .position(GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING ) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.snap." + Direction.WEST.getName()), (button) -> ClientNetworking.sendSetYawPacket(MathHelper.wrapDegrees(Direction.WEST.asRotation())) ) .size(DIRECTION_BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + DIRECTION_BUTTON_WIDTH + BETWEEN_PAD, - this.height - SCREEN_EDGE_PAD - 2 * BUTTON_HEIGHT - 2 * BETWEEN_PAD - LabelWidget.HEIGHT_WITH_PADDING + .position(GuiUtil.PADDING + DIRECTION_BUTTON_WIDTH + (GuiUtil.PADDING / 2), + this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) - LabelWidget.HEIGHT_WITH_PADDING ) .build()); } private void initFaceButtons() { - addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.face"), SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT - BETWEEN_PAD + addLabel(LabelWidget.builder(Text.translatable("armorstands.rotate.face"), GuiUtil.PADDING, + this.height - GuiUtil.PADDING - BUTTON_HEIGHT - (GuiUtil.PADDING / 2) ).shiftForPadding().justifiedLeft().alignedBottom().build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.toward"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_TOWARD) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.away"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_AWAY) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + BUTTON_WIDTH + BETWEEN_PAD, this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.rotate.face.with"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.FACE_WITH) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + 2 * (BUTTON_WIDTH + BETWEEN_PAD), this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING + 2 * (BUTTON_WIDTH + (GuiUtil.PADDING / 2)), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .build()); } @@ -146,18 +147,18 @@ protected void initRight() { addRowOfButtons(RotateDirection.CLOCKWISE, 1); addRowOfButtons(RotateDirection.COUNTERCLOCKWISE, 0); - this.rotateSlider = addDrawableChild(new RotateSliderWidget(this, this.width - SCREEN_EDGE_PAD - SLIDER_WIDTH, - this.height - SCREEN_EDGE_PAD - SLIDER_HEIGHT, SLIDER_WIDTH, SLIDER_HEIGHT, this.armorStand + this.rotateSlider = addDrawableChild(new RotateSliderWidget(this, this.width - GuiUtil.PADDING - SLIDER_WIDTH, + this.height - GuiUtil.PADDING - SLIDER_HEIGHT, SLIDER_WIDTH, SLIDER_HEIGHT, this.armorStand )); } private void addRowOfButtons(RotateDirection direction, int index) { - int refX = this.width - SCREEN_EDGE_PAD - MINI_BUTTON_WIDTH; - int refY = this.height - SCREEN_EDGE_PAD - SLIDER_HEIGHT - 2 * BETWEEN_PAD - MINI_BUTTON_HEIGHT - - index * (2 * BETWEEN_PAD + MINI_BUTTON_HEIGHT + LabelWidget.HEIGHT_WITH_PADDING); + int refX = this.width - GuiUtil.PADDING - MINI_BUTTON_WIDTH; + int refY = this.height - GuiUtil.PADDING - SLIDER_HEIGHT - 2 * (GuiUtil.PADDING / 2) - MINI_BUTTON_HEIGHT - + index * (2 * (GuiUtil.PADDING / 2) + MINI_BUTTON_HEIGHT + LabelWidget.HEIGHT_WITH_PADDING); String modifier = direction.equals(RotateDirection.CLOCKWISE) ? "+" : "-"; - addLabel(LabelWidget.builder(direction.getLabel(), this.width - SCREEN_EDGE_PAD, refY - BETWEEN_PAD) + addLabel(LabelWidget.builder(direction.getLabel(), this.width - GuiUtil.PADDING, refY - (GuiUtil.PADDING / 2)) .justifiedRight() .alignedBottom() .shiftForPadding() @@ -166,19 +167,19 @@ private void addRowOfButtons(RotateDirection direction, int index) { (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset()) ) .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) - .position(refX - 3 * (BETWEEN_PAD + MINI_BUTTON_WIDTH), refY) + .position(refX - 3 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) .build()); addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "5"), (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 5) ) .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) - .position(refX - 2 * (BETWEEN_PAD + MINI_BUTTON_WIDTH), refY) + .position(refX - 2 * ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) .build()); addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "15"), (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 15) ) .size(MINI_BUTTON_WIDTH, MINI_BUTTON_HEIGHT) - .position(refX - (BETWEEN_PAD + MINI_BUTTON_WIDTH), refY) + .position(refX - ((GuiUtil.PADDING / 2) + MINI_BUTTON_WIDTH), refY) .build()); addDrawableChild(ButtonWidget.builder(Text.literal(modifier + "45"), (button) -> ClientNetworking.sendAdjustYawPacket(direction.offset() * 45) diff --git a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java index 68d7fa5..93975b9 100644 --- a/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java +++ b/src/main/java/me/roundaround/armorstands/client/gui/screen/ArmorStandUtilitiesScreen.java @@ -7,6 +7,7 @@ import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.network.UtilityAction; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; +import me.roundaround.roundalib.client.gui.GuiUtil; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.text.Text; @@ -45,22 +46,22 @@ protected void initStart() { protected void initLeft() { super.initLeft(); - addLabel(LabelWidget.builder(Text.translatable("armorstands.utility.setup"), SCREEN_EDGE_PAD, - this.height - SCREEN_EDGE_PAD - 3 * BUTTON_HEIGHT - 3 * BETWEEN_PAD + addLabel(LabelWidget.builder(Text.translatable("armorstands.utility.setup"), GuiUtil.PADDING, + this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 3 * (GuiUtil.PADDING / 2) ).alignedBottom().justifiedLeft().shiftForPadding().build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.prepare"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.PREPARE) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, this.height - SCREEN_EDGE_PAD - 3 * BUTTON_HEIGHT - 2 * BETWEEN_PAD) + .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2)) .tooltip(Tooltip.of(Text.translatable("armorstands.utility.prepare.tooltip"))) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.toolRack"), (button) -> ClientNetworking.sendUtilityActionPacket(UtilityAction.TOOL_RACK) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + BUTTON_WIDTH + BETWEEN_PAD, - this.height - SCREEN_EDGE_PAD - 3 * BUTTON_HEIGHT - 2 * BETWEEN_PAD + .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), + this.height - GuiUtil.PADDING - 3 * BUTTON_HEIGHT - 2 * (GuiUtil.PADDING / 2) ) .tooltip(Tooltip.of(Text.translatable("armorstands.utility.toolRack.tooltip"))) .build()); @@ -69,7 +70,7 @@ protected void initLeft() { UtilityAction.UPRIGHT_ITEM.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, this.height - SCREEN_EDGE_PAD - 2 * BUTTON_HEIGHT - BETWEEN_PAD) + .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2)) .tooltip(Tooltip.of(Text.translatable("armorstands.utility.uprightItem.tooltip"))) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.flatItem"), @@ -77,8 +78,8 @@ protected void initLeft() { UtilityAction.FLAT_ITEM.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + BUTTON_WIDTH + BETWEEN_PAD, - this.height - SCREEN_EDGE_PAD - 2 * BUTTON_HEIGHT - BETWEEN_PAD + .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), + this.height - GuiUtil.PADDING - 2 * BUTTON_HEIGHT - (GuiUtil.PADDING / 2) ) .tooltip(Tooltip.of(Text.translatable("armorstands.utility.flatItem.tooltip"))) .build()); @@ -87,7 +88,7 @@ protected void initLeft() { UtilityAction.BLOCK.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD, this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING, this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.utility.block.tooltip"))) .build()); addDrawableChild(ButtonWidget.builder(Text.translatable("armorstands.utility.tool"), @@ -95,7 +96,7 @@ protected void initLeft() { UtilityAction.TOOL.forSmall(ArmorStandFlag.SMALL.getValue(armorStand))) ) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .position(SCREEN_EDGE_PAD + BUTTON_WIDTH + BETWEEN_PAD, this.height - SCREEN_EDGE_PAD - BUTTON_HEIGHT) + .position(GuiUtil.PADDING + BUTTON_WIDTH + (GuiUtil.PADDING / 2), this.height - GuiUtil.PADDING - BUTTON_HEIGHT) .tooltip(Tooltip.of(Text.translatable("armorstands.utility.tool.tooltip"))) .build()); } @@ -133,8 +134,8 @@ private void refreshFlags() { } private void addFlagToggleWidget(ArmorStandFlag flag, int index) { - int xPos = this.width - SCREEN_EDGE_PAD; - int yPos = this.height - (index + 1) * (SCREEN_EDGE_PAD + FlagToggleWidget.WIDGET_HEIGHT); + int xPos = this.width - GuiUtil.PADDING; + int yPos = this.height - (index + 1) * (GuiUtil.PADDING + FlagToggleWidget.WIDGET_HEIGHT); FlagToggleWidget widget = new FlagToggleWidget(this.textRenderer, flag, this.currentValues.get(flag), xPos, yPos); diff --git a/src/main/java/me/roundaround/armorstands/mixin/ArmorStandEntityAccessor.java b/src/main/java/me/roundaround/armorstands/mixin/ArmorStandEntityAccessor.java index 15b4beb..9dd3586 100644 --- a/src/main/java/me/roundaround/armorstands/mixin/ArmorStandEntityAccessor.java +++ b/src/main/java/me/roundaround/armorstands/mixin/ArmorStandEntityAccessor.java @@ -11,23 +11,23 @@ @Mixin(ArmorStandEntity.class) public interface ArmorStandEntityAccessor { @Invoker("setSmall") - public void invokeSetSmall(boolean small); + void invokeSetSmall(boolean small); @Invoker("setShowArms") - public void invokeSetShowArms(boolean showArms); + void invokeSetShowArms(boolean showArms); @Invoker("setHideBasePlate") - public void invokeSetHideBasePlate(boolean hideBasePlate); + void invokeSetHideBasePlate(boolean hideBasePlate); @Accessor("heldItems") - public DefaultedList getHeldItems(); + DefaultedList getHeldItems(); @Accessor("armorItems") - public DefaultedList getArmorItems(); + DefaultedList getArmorItems(); @Accessor("disabledSlots") - public int getDisabledSlots(); + int getDisabledSlots(); @Accessor("disabledSlots") - public void setDisabledSlots(int disabledSlots); + void setDisabledSlots(int disabledSlots); } diff --git a/src/main/java/me/roundaround/armorstands/mixin/InGameHudAccessor.java b/src/main/java/me/roundaround/armorstands/mixin/InGameHudAccessor.java index 8e6dc0a..d4369dc 100644 --- a/src/main/java/me/roundaround/armorstands/mixin/InGameHudAccessor.java +++ b/src/main/java/me/roundaround/armorstands/mixin/InGameHudAccessor.java @@ -9,8 +9,8 @@ @Mixin(InGameHud.class) public interface InGameHudAccessor { @Invoker("updateVignetteDarkness") - public void invokeUpdateVignetteDarkness(Entity entity); + void invokeUpdateVignetteDarkness(Entity entity); @Invoker("renderVignetteOverlay") - public void invokeRenderVignetteOverlay(DrawContext context, Entity entity); + void invokeRenderVignetteOverlay(DrawContext context, Entity entity); } diff --git a/src/main/java/me/roundaround/armorstands/mixin/MinecraftClientMixin.java b/src/main/java/me/roundaround/armorstands/mixin/MinecraftClientMixin.java index ecac1c0..16e3e1c 100644 --- a/src/main/java/me/roundaround/armorstands/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/roundaround/armorstands/mixin/MinecraftClientMixin.java @@ -17,7 +17,7 @@ @Mixin(MinecraftClient.class) public abstract class MinecraftClientMixin { @Shadow - private Screen currentScreen; + public Screen currentScreen; @Inject(method = "hasOutline", at = @At(value = "HEAD"), cancellable = true) private void hasOutline(Entity entity, CallbackInfoReturnable info) { diff --git a/src/main/java/me/roundaround/armorstands/mixin/ServerPropertiesHandlerMixin.java b/src/main/java/me/roundaround/armorstands/mixin/ServerPropertiesHandlerMixin.java index 3241859..5210a22 100644 --- a/src/main/java/me/roundaround/armorstands/mixin/ServerPropertiesHandlerMixin.java +++ b/src/main/java/me/roundaround/armorstands/mixin/ServerPropertiesHandlerMixin.java @@ -1,15 +1,18 @@ package me.roundaround.armorstands.mixin; -import me.roundaround.armorstands.server.ServerPropertiesWithArmorStands; +import me.roundaround.armorstands.server.EnforceArmorStandPermissions; import net.minecraft.server.dedicated.AbstractPropertiesHandler; import net.minecraft.server.dedicated.ServerPropertiesHandler; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import java.util.Properties; @Mixin(ServerPropertiesHandler.class) +@SuppressWarnings("AddedMixinMembersNamePattern") public abstract class ServerPropertiesHandlerMixin extends AbstractPropertiesHandler implements - ServerPropertiesWithArmorStands { + EnforceArmorStandPermissions { + @Unique public final boolean enforceArmorStandPermissions = this.parseBoolean("enforce-armor-stand-permissions", true); public ServerPropertiesHandlerMixin(Properties properties) { diff --git a/src/main/java/me/roundaround/armorstands/screen/ArmorStandScreenHandler.java b/src/main/java/me/roundaround/armorstands/screen/ArmorStandScreenHandler.java index 181ddb2..be53174 100644 --- a/src/main/java/me/roundaround/armorstands/screen/ArmorStandScreenHandler.java +++ b/src/main/java/me/roundaround/armorstands/screen/ArmorStandScreenHandler.java @@ -8,8 +8,6 @@ import me.roundaround.armorstands.network.ScreenType; import me.roundaround.armorstands.server.network.ServerNetworking; import me.roundaround.armorstands.util.ArmorStandEditor; -import me.roundaround.armorstands.util.HasArmorStand; -import me.roundaround.armorstands.util.HasArmorStandEditor; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.decoration.ArmorStandEntity; @@ -28,7 +26,7 @@ import java.util.ArrayList; -public class ArmorStandScreenHandler extends ScreenHandler implements HasArmorStand, HasArmorStandEditor { +public class ArmorStandScreenHandler extends ScreenHandler { private static final Identifier EMPTY_MAINHAND_ARMOR_SLOT = new Identifier("item/empty_slot_sword"); private static final Identifier[] EMPTY_ARMOR_SLOT_TEXTURES = new Identifier[]{ @@ -186,12 +184,10 @@ public ScreenType getScreenType() { return this.screenType; } - @Override public ArmorStandEntity getArmorStand() { return this.armorStand; } - @Override public ArmorStandEditor getEditor() { return this.editor; } diff --git a/src/main/java/me/roundaround/armorstands/server/ArmorStandUsers.java b/src/main/java/me/roundaround/armorstands/server/ArmorStandUsers.java index 1b40040..64f902c 100644 --- a/src/main/java/me/roundaround/armorstands/server/ArmorStandUsers.java +++ b/src/main/java/me/roundaround/armorstands/server/ArmorStandUsers.java @@ -1,7 +1,5 @@ package me.roundaround.armorstands.server; -import java.io.File; - import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.Whitelist; @@ -9,6 +7,8 @@ import net.minecraft.server.dedicated.ServerPropertiesHandler; import net.minecraft.server.network.ServerPlayerEntity; +import java.io.File; + public class ArmorStandUsers { private static final File FILE = new File("armorstandsusers.json"); @@ -19,15 +19,16 @@ public static boolean isExplicitlyListed(ServerPlayerEntity player) { return WHITELIST.isAllowed(player.getGameProfile()); } - public static boolean canEditArmorStands(PlayerEntity player) { - if (!(player instanceof ServerPlayerEntity)) { + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public static boolean canEditArmorStands(PlayerEntity playerEntity) { + if (!(playerEntity instanceof ServerPlayerEntity player)) { return false; } - MinecraftServer server = ((ServerPlayerEntity) player).getServer(); - if (server.isDedicated()) { - ServerPropertiesHandler propertiesHandler = ((MinecraftDedicatedServer) server).getProperties(); - if (!((ServerPropertiesWithArmorStands) propertiesHandler).getEnforceArmorStandPermissions()) { + MinecraftServer server = player.getServer(); + if (server instanceof MinecraftDedicatedServer dedicatedServer) { + ServerPropertiesHandler propertiesHandler = dedicatedServer.getProperties(); + if (!propertiesHandler.getEnforceArmorStandPermissions()) { return true; } } @@ -36,7 +37,7 @@ public static boolean canEditArmorStands(PlayerEntity player) { return true; } - return isExplicitlyListed((ServerPlayerEntity) player); + return isExplicitlyListed(player); } public static String[] getNames() { diff --git a/src/main/java/me/roundaround/armorstands/server/EnforceArmorStandPermissions.java b/src/main/java/me/roundaround/armorstands/server/EnforceArmorStandPermissions.java new file mode 100644 index 0000000..5c64f49 --- /dev/null +++ b/src/main/java/me/roundaround/armorstands/server/EnforceArmorStandPermissions.java @@ -0,0 +1,7 @@ +package me.roundaround.armorstands.server; + +public interface EnforceArmorStandPermissions { + default boolean getEnforceArmorStandPermissions() { + return false; + } +} diff --git a/src/main/java/me/roundaround/armorstands/server/ServerPropertiesWithArmorStands.java b/src/main/java/me/roundaround/armorstands/server/ServerPropertiesWithArmorStands.java deleted file mode 100644 index a573f26..0000000 --- a/src/main/java/me/roundaround/armorstands/server/ServerPropertiesWithArmorStands.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.roundaround.armorstands.server; - -public interface ServerPropertiesWithArmorStands { - boolean getEnforceArmorStandPermissions(); -} diff --git a/src/main/java/me/roundaround/armorstands/server/network/ServerNetworking.java b/src/main/java/me/roundaround/armorstands/server/network/ServerNetworking.java index a1cc235..ec23502 100644 --- a/src/main/java/me/roundaround/armorstands/server/network/ServerNetworking.java +++ b/src/main/java/me/roundaround/armorstands/server/network/ServerNetworking.java @@ -3,7 +3,6 @@ import me.roundaround.armorstands.network.Networking; import me.roundaround.armorstands.screen.ArmorStandScreenHandler; import me.roundaround.armorstands.util.ArmorStandEditor; -import me.roundaround.armorstands.util.HasArmorStandEditor; import me.roundaround.armorstands.util.LastUsedScreen; import me.roundaround.armorstands.util.actions.AdjustPosAction; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -57,7 +56,7 @@ public static void registerReceivers() { private static void handleAdjustPose(Networking.AdjustPoseC2S payload, ServerPlayNetworking.Context context) { context.player().server.execute(() -> { ScreenHandler currentScreenHandler = context.player().currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -69,7 +68,7 @@ private static void handleAdjustPose(Networking.AdjustPoseC2S payload, ServerPla private static void handleAdjustPos(Networking.AdjustPosC2S payload, ServerPlayNetworking.Context context) { context.player().server.execute(() -> { ScreenHandler currentScreenHandler = context.player().currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -85,7 +84,7 @@ private static void handleAdjustPos(Networking.AdjustPosC2S payload, ServerPlayN private static void handleAdjustYaw(Networking.AdjustYawC2S payload, ServerPlayNetworking.Context context) { context.player().server.execute(() -> { ScreenHandler currentScreenHandler = context.player().currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -123,7 +122,7 @@ private static void handleSetFlag(Networking.SetFlagC2S payload, ServerPlayNetwo context.player().server.execute(() -> { ServerPlayerEntity player = context.player(); ScreenHandler currentScreenHandler = player.currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -137,7 +136,7 @@ private static void handleSetFlag(Networking.SetFlagC2S payload, ServerPlayNetwo private static void handleSetPose(Networking.SetPoseC2S payload, ServerPlayNetworking.Context context) { context.player().server.execute(() -> { ScreenHandler currentScreenHandler = context.player().currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -151,7 +150,7 @@ private static void handleSetPose(Networking.SetPoseC2S payload, ServerPlayNetwo private static void handleSetPosePreset(Networking.SetPosePresetC2S payload, ServerPlayNetworking.Context context) { context.player().server.execute(() -> { ScreenHandler currentScreenHandler = context.player().currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -163,7 +162,7 @@ private static void handleSetPosePreset(Networking.SetPosePresetC2S payload, Ser private static void handleSetYaw(Networking.SetYawC2S payload, ServerPlayNetworking.Context context) { context.player().server.execute(() -> { ScreenHandler currentScreenHandler = context.player().currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -176,7 +175,7 @@ private static void handleUndo(Networking.UndoC2S payload, ServerPlayNetworking. context.player().server.execute(() -> { ServerPlayerEntity player = context.player(); ScreenHandler currentScreenHandler = player.currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } @@ -197,7 +196,7 @@ private static void handleUtilityAction(Networking.UtilityActionC2S payload, Ser context.player().server.execute(() -> { ServerPlayerEntity player = context.player(); ScreenHandler currentScreenHandler = player.currentScreenHandler; - if (!(currentScreenHandler instanceof HasArmorStandEditor screenHandler)) { + if (!(currentScreenHandler instanceof ArmorStandScreenHandler screenHandler)) { return; } diff --git a/src/main/java/me/roundaround/armorstands/util/ArmorStandEditor.java b/src/main/java/me/roundaround/armorstands/util/ArmorStandEditor.java index f4f789a..cae817d 100644 --- a/src/main/java/me/roundaround/armorstands/util/ArmorStandEditor.java +++ b/src/main/java/me/roundaround/armorstands/util/ArmorStandEditor.java @@ -1,18 +1,9 @@ package me.roundaround.armorstands.util; -import java.util.HashMap; -import java.util.Stack; -import java.util.UUID; - import me.roundaround.armorstands.network.ArmorStandFlag; import me.roundaround.armorstands.network.EulerAngleParameter; import me.roundaround.armorstands.network.PosePart; -import me.roundaround.armorstands.util.actions.AdjustPoseAction; -import me.roundaround.armorstands.util.actions.ArmorStandAction; -import me.roundaround.armorstands.util.actions.FlagAction; -import me.roundaround.armorstands.util.actions.MoveAction; -import me.roundaround.armorstands.util.actions.PoseAction; -import me.roundaround.armorstands.util.actions.RotateAction; +import me.roundaround.armorstands.util.actions.*; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Pair; @@ -20,8 +11,12 @@ import net.minecraft.util.math.EulerAngle; import net.minecraft.util.math.Vec3d; +import java.util.HashMap; +import java.util.Stack; +import java.util.UUID; + public class ArmorStandEditor { - private static HashMap> editors = new HashMap<>(); + private static final HashMap> editors = new HashMap<>(); private final ServerPlayerEntity player; private final ArmorStandEntity armorStand; @@ -123,6 +118,14 @@ public void setRotation(float rotation) { applyAction(RotateAction.absolute(rotation)); } + public void scale(float scale) { + applyAction(ScaleAction.relative(scale)); + } + + public void setScale(float scale) { + applyAction(ScaleAction.absolute(scale)); + } + public void toggleFlag(ArmorStandFlag flag) { applyAction(FlagAction.toggle(flag)); } @@ -136,12 +139,8 @@ public void setPose(Pose pose) { } public void setPose( - EulerAngle head, - EulerAngle body, - EulerAngle rightArm, - EulerAngle leftArm, - EulerAngle rightLeg, - EulerAngle leftLeg) { + EulerAngle head, EulerAngle body, EulerAngle rightArm, EulerAngle leftArm, EulerAngle rightLeg, EulerAngle leftLeg + ) { setPose(new Pose(head, body, rightArm, leftArm, rightLeg, leftLeg)); } diff --git a/src/main/java/me/roundaround/armorstands/util/HasArmorStand.java b/src/main/java/me/roundaround/armorstands/util/HasArmorStand.java deleted file mode 100644 index 4bd16ee..0000000 --- a/src/main/java/me/roundaround/armorstands/util/HasArmorStand.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.roundaround.armorstands.util; - -import net.minecraft.entity.decoration.ArmorStandEntity; - -public interface HasArmorStand { - public ArmorStandEntity getArmorStand(); -} diff --git a/src/main/java/me/roundaround/armorstands/util/HasArmorStandEditor.java b/src/main/java/me/roundaround/armorstands/util/HasArmorStandEditor.java deleted file mode 100644 index 6e96f7c..0000000 --- a/src/main/java/me/roundaround/armorstands/util/HasArmorStandEditor.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.roundaround.armorstands.util; - -public interface HasArmorStandEditor { - public ArmorStandEditor getEditor(); -} diff --git a/src/main/java/me/roundaround/armorstands/util/actions/HoldingAction.java b/src/main/java/me/roundaround/armorstands/util/actions/HoldingAction.java index dfd8493..8aab704 100644 --- a/src/main/java/me/roundaround/armorstands/util/actions/HoldingAction.java +++ b/src/main/java/me/roundaround/armorstands/util/actions/HoldingAction.java @@ -1,71 +1,71 @@ -package me.roundaround.armorstands.util.actions; - -import java.util.List; - -import me.roundaround.armorstands.network.ArmorStandFlag; -import me.roundaround.armorstands.util.Pose; -import net.minecraft.entity.decoration.ArmorStandEntity; -import net.minecraft.text.Text; -import net.minecraft.util.math.EulerAngle; -import net.minecraft.util.math.Vec3d; - -public class HoldingAction extends ComboAction { - private static final EulerAngle ROT_EMPTY = new EulerAngle(0f, 0f, 0f); - private static final Vec3d POS_UPRIGHT_ITEM = new Vec3d(0.36, -1.41, -0.5625); - private static final EulerAngle ROT_UPRIGHT_ITEM = new EulerAngle(-90f, 0f, 0f); - private static final Vec3d POS_FLAT_ITEM = new Vec3d(0.385, -0.78, -0.295); - private static final EulerAngle ROT_FLAT_ITEM = new EulerAngle(0f, 0f, 0f); - private static final Vec3d POS_BLOCK = new Vec3d(0.5725, -0.655, 0.352); - private static final EulerAngle ROT_BLOCK = new EulerAngle(-15f, 135f, 0f); - private static final Vec3d POS_TOOL = new Vec3d(-0.17, -1.285, -0.44); - private static final EulerAngle ROT_TOOL = new EulerAngle(-10f, 0f, -90f); - - private HoldingAction(ArmorStandEntity armorStand, boolean small, Vec3d pos, EulerAngle rot) { - super(Text.translatable("armorstands.action.holding"), List.of( - FlagAction.set(ArmorStandFlag.INVISIBLE, true), - FlagAction.set(ArmorStandFlag.HIDE_BASE_PLATE, true), - FlagAction.set(ArmorStandFlag.NAME, false), - FlagAction.set(ArmorStandFlag.SMALL, small), - SnapToGroundAction.standing(), - MoveAction.local(small ? pos.multiply(0.5) : pos), - PoseAction.fromPose(new Pose( - ROT_EMPTY, - ROT_EMPTY, - rot, - ROT_EMPTY, - ROT_EMPTY, - ROT_EMPTY)))); - } - - public static HoldingAction uprightItem(ArmorStandEntity armorStand) { - return uprightItem(armorStand, false); - } - - public static HoldingAction uprightItem(ArmorStandEntity armorStand, boolean small) { - return new HoldingAction(armorStand, small, POS_UPRIGHT_ITEM, ROT_UPRIGHT_ITEM); - } - - public static HoldingAction flatItem(ArmorStandEntity armorStand) { - return flatItem(armorStand, false); - } - - public static HoldingAction flatItem(ArmorStandEntity armorStand, boolean small) { - return new HoldingAction(armorStand, small, POS_FLAT_ITEM, ROT_FLAT_ITEM); - } - - public static HoldingAction block(ArmorStandEntity armorStand) { - return block(armorStand, false); - } - - public static HoldingAction block(ArmorStandEntity armorStand, boolean small) { - return new HoldingAction(armorStand, small, POS_BLOCK, ROT_BLOCK); - } - - public static HoldingAction tool(ArmorStandEntity armorStand) { - return tool(armorStand, false); - } - - public static HoldingAction tool(ArmorStandEntity armorStand, boolean small) { - return new HoldingAction(armorStand, small, POS_TOOL, ROT_TOOL); - } -} +package me.roundaround.armorstands.util.actions; + +import me.roundaround.armorstands.network.ArmorStandFlag; +import me.roundaround.armorstands.util.Pose; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.text.Text; +import net.minecraft.util.math.EulerAngle; +import net.minecraft.util.math.Vec3d; + +import java.util.List; + +public class HoldingAction extends ComboAction { + private static final EulerAngle ROT_EMPTY = new EulerAngle(0f, 0f, 0f); + private static final Vec3d POS_UPRIGHT_ITEM = new Vec3d(0.36, -1.41, -0.5625); + private static final EulerAngle ROT_UPRIGHT_ITEM = new EulerAngle(-90f, 0f, 0f); + private static final Vec3d POS_FLAT_ITEM = new Vec3d(0.385, -0.78, -0.295); + private static final EulerAngle ROT_FLAT_ITEM = new EulerAngle(0f, 0f, 0f); + private static final Vec3d POS_BLOCK = new Vec3d(0.5725, -0.655, 0.352); + private static final EulerAngle ROT_BLOCK = new EulerAngle(-15f, 135f, 0f); + private static final Vec3d POS_TOOL = new Vec3d(-0.17, -1.285, -0.44); + private static final EulerAngle ROT_TOOL = new EulerAngle(-10f, 0f, -90f); + + private HoldingAction(ArmorStandEntity armorStand, boolean small, Vec3d pos, EulerAngle rot) { + super(Text.translatable("armorstands.action.holding"), List.of( + FlagAction.set(ArmorStandFlag.INVISIBLE, true), + FlagAction.set(ArmorStandFlag.HIDE_BASE_PLATE, true), + FlagAction.set(ArmorStandFlag.NAME, false), + FlagAction.set(ArmorStandFlag.SMALL, small), + SnapToGroundAction.standing(), + MoveAction.local(small ? pos.multiply(0.5) : pos), + PoseAction.fromPose(new Pose( + ROT_EMPTY, + ROT_EMPTY, + rot, + ROT_EMPTY, + ROT_EMPTY, + ROT_EMPTY)))); + } + + public static HoldingAction uprightItem(ArmorStandEntity armorStand) { + return uprightItem(armorStand, false); + } + + public static HoldingAction uprightItem(ArmorStandEntity armorStand, boolean small) { + return new HoldingAction(armorStand, small, POS_UPRIGHT_ITEM, ROT_UPRIGHT_ITEM); + } + + public static HoldingAction flatItem(ArmorStandEntity armorStand) { + return flatItem(armorStand, false); + } + + public static HoldingAction flatItem(ArmorStandEntity armorStand, boolean small) { + return new HoldingAction(armorStand, small, POS_FLAT_ITEM, ROT_FLAT_ITEM); + } + + public static HoldingAction block(ArmorStandEntity armorStand) { + return block(armorStand, false); + } + + public static HoldingAction block(ArmorStandEntity armorStand, boolean small) { + return new HoldingAction(armorStand, small, POS_BLOCK, ROT_BLOCK); + } + + public static HoldingAction tool(ArmorStandEntity armorStand) { + return tool(armorStand, false); + } + + public static HoldingAction tool(ArmorStandEntity armorStand, boolean small) { + return new HoldingAction(armorStand, small, POS_TOOL, ROT_TOOL); + } +} diff --git a/src/main/java/me/roundaround/armorstands/util/actions/MoveAction.java b/src/main/java/me/roundaround/armorstands/util/actions/MoveAction.java index 7c0c27f..5ae95e7 100644 --- a/src/main/java/me/roundaround/armorstands/util/actions/MoveAction.java +++ b/src/main/java/me/roundaround/armorstands/util/actions/MoveAction.java @@ -1,7 +1,5 @@ package me.roundaround.armorstands.util.actions; -import java.util.Optional; - import me.roundaround.armorstands.util.ArmorStandHelper; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.entity.player.PlayerEntity; @@ -9,6 +7,8 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import java.util.Optional; + public class MoveAction implements ArmorStandAction { private final Vec3d argument; private final MoveType moveType; @@ -74,15 +74,9 @@ public void apply(PlayerEntity player, ArmorStandEntity armorStand) { Vec3d position = switch (moveType) { case ABSOLUTE -> argument; - case RELATIVE -> { - yield originalPosition.get().add(argument); - } - case LOCAL -> { - yield originalPosition.get().add(ArmorStandHelper.localToRelative( - localToPlayer ? player : armorStand, - argument - )); - } + case RELATIVE -> originalPosition.get().add(argument); + case LOCAL -> + originalPosition.get().add(ArmorStandHelper.localToRelative(localToPlayer ? player : armorStand, argument)); }; if (roundToPixel) { @@ -121,14 +115,12 @@ public static void setPosition(ArmorStandEntity armorStand, double x, double y, armorStand.setPosition(new Vec3d(x, y, z)); } - public static enum MoveType { - ABSOLUTE("absolute"), - RELATIVE("relative"), - LOCAL("local"); + public enum MoveType { + ABSOLUTE("absolute"), RELATIVE("relative"), LOCAL("local"); private final String id; - private MoveType(String id) { + MoveType(String id) { this.id = id; } diff --git a/src/main/java/me/roundaround/armorstands/util/actions/ScaleAction.java b/src/main/java/me/roundaround/armorstands/util/actions/ScaleAction.java new file mode 100644 index 0000000..5bd9bd5 --- /dev/null +++ b/src/main/java/me/roundaround/armorstands/util/actions/ScaleAction.java @@ -0,0 +1,82 @@ +package me.roundaround.armorstands.util.actions; + +import net.minecraft.entity.attribute.EntityAttributeInstance; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.math.MathHelper; + +public class ScaleAction implements ArmorStandAction { + private final float argument; + private final boolean absolute; + private final boolean round; + private Float originalScale = null; + + private ScaleAction(float argument, boolean absolute, boolean round) { + this.argument = argument; + this.absolute = absolute; + this.round = round; + } + + public static ScaleAction absolute(float scale) { + return absolute(scale, false); + } + + public static ScaleAction absolute(float scale, boolean round) { + return new ScaleAction(scale, true, round); + } + + public static ScaleAction relative(float scale) { + return relative(scale, true); + } + + public static ScaleAction relative(float scale, boolean round) { + return new ScaleAction(scale, false, round); + } + + @Override + public Text getName(ArmorStandEntity armorStand) { + return Text.translatable("armorstands.action.scale"); + } + + @Override + public void apply(PlayerEntity player, ArmorStandEntity armorStand) { + this.originalScale = armorStand.getScale(); + + float scale = this.argument; + if (!this.absolute) { + scale += this.originalScale; + } + + setScale(armorStand, scale, this.round); + } + + @Override + public void undo(PlayerEntity player, ArmorStandEntity armorStand) { + if (this.originalScale == null) { + return; + } + setScale(armorStand, this.originalScale); + } + + public static void setScale(ArmorStandEntity armorStand, float scale) { + setScale(armorStand, scale, false); + } + + public static void setScale(ArmorStandEntity armorStand, float scale, boolean round) { + float target = MathHelper.clamp(scale, 0.01f, 10f); + if (round) { + if (target < 1) { + target = Math.round(target * 4) / 4f; + } else { + target = Math.round(target * 2) / 2f; + } + } + + EntityAttributeInstance attribute = armorStand.getAttributes().getCustomInstance(EntityAttributes.GENERIC_SCALE); + if (attribute != null) { + attribute.setBaseValue(target); + } + } +} diff --git a/src/main/java/me/roundaround/armorstands/util/actions/ToolRackAction.java b/src/main/java/me/roundaround/armorstands/util/actions/ToolRackAction.java index 20876aa..f3a6b07 100644 --- a/src/main/java/me/roundaround/armorstands/util/actions/ToolRackAction.java +++ b/src/main/java/me/roundaround/armorstands/util/actions/ToolRackAction.java @@ -1,68 +1,69 @@ -package me.roundaround.armorstands.util.actions; - -import java.util.ArrayList; -import java.util.Collection; - -import me.roundaround.armorstands.network.ArmorStandFlag; -import me.roundaround.armorstands.util.Pose; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.TripwireHookBlock; -import net.minecraft.entity.decoration.ArmorStandEntity; -import net.minecraft.text.Text; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.EulerAngle; - -public class ToolRackAction extends ComboAction { - private ToolRackAction(Collection actions) { - super(Text.translatable("armorstands.action.toolRack"), actions); - } - - public static ToolRackAction create(ArmorStandEntity armorStand) { - BlockPos hookPos = findTripwireHook(armorStand); - - if (hookPos == null) { - return null; - } - - ArrayList actions = new ArrayList<>(); - - actions.add(FlagAction.set(ArmorStandFlag.INVISIBLE, true)); - actions.add(FlagAction.set(ArmorStandFlag.HIDE_BASE_PLATE, true)); - actions.add(FlagAction.set(ArmorStandFlag.NO_GRAVITY, true)); - actions.add(FlagAction.set(ArmorStandFlag.NAME, false)); - actions.add(FlagAction.set(ArmorStandFlag.SMALL, false)); - actions.add(RotateAction.absolute(armorStand.getWorld() - .getBlockState(hookPos) - .get(TripwireHookBlock.FACING).asRotation())); - actions.add(MoveAction.absolute( - hookPos.getX() + 0.5, - hookPos.getY() - 1, - hookPos.getZ() + 0.5)); - actions.add(MoveAction.local(-0.17, 0.24, -0.05)); - actions.add(PoseAction.fromPose(new Pose( - new EulerAngle(0f, 0.001f, 0f), - new EulerAngle(0f, 0.001f, 0f), - new EulerAngle(-100f, 90f, 180f), - new EulerAngle(0f, 0f, 0f), - new EulerAngle(0f, 0f, 0f), - new EulerAngle(0f, 0f, 0f)))); - - return new ToolRackAction(actions); - } - - private static BlockPos findTripwireHook(ArmorStandEntity armorStand) { - BlockPos pos = armorStand.getBlockPos(); - BlockPos.Mutable mutable = new BlockPos.Mutable(); - - for (int i = 1; i <= 3; i++) { - mutable.set(pos.getX(), pos.getY() + i, pos.getZ()); - BlockState state = armorStand.getWorld().getBlockState(mutable); - if (state.isOf(Blocks.TRIPWIRE_HOOK)) { - return mutable.toImmutable(); - } - } - - return null; - } -} +package me.roundaround.armorstands.util.actions; + +import java.util.ArrayList; +import java.util.Collection; + +import me.roundaround.armorstands.network.ArmorStandFlag; +import me.roundaround.armorstands.util.Pose; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.TripwireHookBlock; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.EulerAngle; + +public class ToolRackAction extends ComboAction { + private ToolRackAction(Collection actions) { + super(Text.translatable("armorstands.action.toolRack"), actions); + } + + public static ToolRackAction create(ArmorStandEntity armorStand) { + BlockPos hookPos = findTripwireHook(armorStand); + + if (hookPos == null) { + return null; + } + + ArrayList actions = new ArrayList<>(); + + actions.add(FlagAction.set(ArmorStandFlag.INVISIBLE, true)); + actions.add(FlagAction.set(ArmorStandFlag.HIDE_BASE_PLATE, true)); + actions.add(FlagAction.set(ArmorStandFlag.NO_GRAVITY, true)); + actions.add(FlagAction.set(ArmorStandFlag.NAME, false)); + actions.add(FlagAction.set(ArmorStandFlag.SMALL, false)); + actions.add(RotateAction.absolute(armorStand.getWorld() + .getBlockState(hookPos) + .get(TripwireHookBlock.FACING).asRotation())); + actions.add(ScaleAction.absolute(1f)); + actions.add(MoveAction.absolute( + hookPos.getX() + 0.5, + hookPos.getY() - 1, + hookPos.getZ() + 0.5)); + actions.add(MoveAction.local(-0.17, 0.24, -0.05)); + actions.add(PoseAction.fromPose(new Pose( + new EulerAngle(0f, 0.001f, 0f), + new EulerAngle(0f, 0.001f, 0f), + new EulerAngle(-100f, 90f, 180f), + new EulerAngle(0f, 0f, 0f), + new EulerAngle(0f, 0f, 0f), + new EulerAngle(0f, 0f, 0f)))); + + return new ToolRackAction(actions); + } + + private static BlockPos findTripwireHook(ArmorStandEntity armorStand) { + BlockPos pos = armorStand.getBlockPos(); + BlockPos.Mutable mutable = new BlockPos.Mutable(); + + for (int i = 1; i <= 3; i++) { + mutable.set(pos.getX(), pos.getY() + i, pos.getZ()); + BlockState state = armorStand.getWorld().getBlockState(mutable); + if (state.isOf(Blocks.TRIPWIRE_HOOK)) { + return mutable.toImmutable(); + } + } + + return null; + } +} diff --git a/src/main/resources/assets/armorstands/lang/en_us.json b/src/main/resources/assets/armorstands/lang/en_us.json index 81d77a4..71f2135 100644 --- a/src/main/resources/assets/armorstands/lang/en_us.json +++ b/src/main/resources/assets/armorstands/lang/en_us.json @@ -193,6 +193,7 @@ "armorstands.action.pose": "", "armorstands.action.prepare": "", "armorstands.action.rotate": "", + "armorstands.action.scale": "", "armorstands.action.snapToGround": "", "armorstands.action.toolRack": "" } \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 88f9a02..6b134ed 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -26,6 +26,13 @@ "mixins": [ "armorstands.mixins.json" ], + "custom": { + "loom:injected_interfaces": { + "net/minecraft/class_3806": [ + "me/roundaround/armorstands/server/EnforceArmorStandPermissions" + ] + } + }, "depends": { "fabricloader": ">=0.15.11", "fabric-api": "*",