diff --git a/src/main/java/com/mraof/minestuck/client/gui/DialogueScreen.java b/src/main/java/com/mraof/minestuck/client/gui/DialogueScreen.java index ee77a6b997..6391539739 100644 --- a/src/main/java/com/mraof/minestuck/client/gui/DialogueScreen.java +++ b/src/main/java/com/mraof/minestuck/client/gui/DialogueScreen.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mraof.minestuck.entity.dialogue.Dialogue; -import com.mraof.minestuck.entity.dialogue.DialogueAnimation; +import com.mraof.minestuck.entity.dialogue.DialogueAnimationData; import com.mraof.minestuck.network.DialoguePackets; import com.mraof.minestuck.network.MSPacketHandler; import net.minecraft.client.gui.GuiGraphics; @@ -31,7 +31,7 @@ public class DialogueScreen extends Screen private final int dialogueId; private final Dialogue.DialogueData dialogueData; - private final DialogueAnimation animation; + private final DialogueAnimationData animationData; private int xOffset; private int yOffset; @@ -52,14 +52,14 @@ public class DialogueScreen extends Screen this.dialogueId = dialogueId; this.dialogueData = dialogueData; - this.animation = dialogueData.animation(); + this.animationData = dialogueData.animationData(); } @Override public void init() { yOffset = (this.height / 2) - (GUI_HEIGHT / 2); - xOffset = (this.width / 2) - (GUI_WIDTH / 2) - (animation.spriteWidth() / 2); + xOffset = (this.width / 2) - (GUI_WIDTH / 2) - (animationData.spriteWidth() / 2) - animationData.xOffset(); this.messageLines = font.split(this.dialogueData.message(), GUI_WIDTH - 20); @@ -193,11 +193,14 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partia */ private void renderAnimation(GuiGraphics guiGraphics) { - ResourceLocation sprite = animation.getRenderPath(dialogueData.spriteType()); + ResourceLocation sprite = animationData.getRenderPath(dialogueData.spriteType()); + float scale = animationData.scale(); + int moddedWidth = (int) (animationData.spriteWidth() * scale); + int moddedHeight = (int) (animationData.spriteHeight() * scale); //if there is a .png.mcmeta file associated with the sprite, the animation for it is updated here AnimatableTexture.setAndUpdate(sprite, animationTick); - guiGraphics.blit(sprite, xOffset + GUI_WIDTH, (this.height / 2) - (animation.spriteHeight() / 2), 0, 0, animation.spriteWidth(), animation.spriteHeight(), animation.spriteWidth(), animation.spriteHeight()); + guiGraphics.blit(sprite, xOffset + GUI_WIDTH + animationData.xOffset(), (this.height / 2) - (animationData.spriteHeight() / 2), 0, 0, moddedWidth, moddedHeight, moddedWidth, moddedHeight); animationTick++; } diff --git a/src/main/java/com/mraof/minestuck/data/dialogue/DialogueProvider.java b/src/main/java/com/mraof/minestuck/data/dialogue/DialogueProvider.java index 70e15b1f3c..217f05f926 100644 --- a/src/main/java/com/mraof/minestuck/data/dialogue/DialogueProvider.java +++ b/src/main/java/com/mraof/minestuck/data/dialogue/DialogueProvider.java @@ -4,7 +4,7 @@ import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; import com.mraof.minestuck.entity.dialogue.Dialogue; -import com.mraof.minestuck.entity.dialogue.DialogueAnimation; +import com.mraof.minestuck.entity.dialogue.DialogueAnimationData; import com.mraof.minestuck.entity.dialogue.DialogueMessage; import com.mraof.minestuck.entity.dialogue.Trigger; import com.mraof.minestuck.entity.dialogue.condition.Condition; @@ -139,7 +139,7 @@ public Dialogue.NodeSelector buildSelector(ResourceLocation id, BiConsumer> messages = new ArrayList<>(); - private DialogueAnimation animation = DialogueAnimation.DEFAULT_ANIMATION; + private DialogueAnimationData animation = DialogueAnimationData.DEFAULT_ANIMATION; private ResourceLocation guiPath = Dialogue.DEFAULT_GUI; private final List responses = new ArrayList<>(); @@ -164,12 +164,12 @@ public NodeBuilder addDescription(MessageProducer message) return this; } - public NodeBuilder animation(DialogueAnimation.Emotion emotion) + public NodeBuilder animation(DialogueAnimationData.Emotion emotion) { - return animation(new DialogueAnimation(emotion.getSerializedName(), DialogueAnimation.DEFAULT_SPRITE_HEIGHT, DialogueAnimation.DEFAULT_SPRITE_WIDTH)); + return animation(new DialogueAnimationData(emotion.getSerializedName(), DialogueAnimationData.DEFAULT_SPRITE_HEIGHT, DialogueAnimationData.DEFAULT_SPRITE_WIDTH, 0, 0, 1.0F)); } - public NodeBuilder animation(DialogueAnimation animation) + public NodeBuilder animation(DialogueAnimationData animation) { this.animation = animation; return this; diff --git a/src/main/java/com/mraof/minestuck/entity/dialogue/Dialogue.java b/src/main/java/com/mraof/minestuck/entity/dialogue/Dialogue.java index fbd6707f7e..8a0c6ba92b 100644 --- a/src/main/java/com/mraof/minestuck/entity/dialogue/Dialogue.java +++ b/src/main/java/com/mraof/minestuck/entity/dialogue/Dialogue.java @@ -83,7 +83,7 @@ public record NodeReference(ResourceLocation dialoguePath, int nodeIndex) { } - public record Node(List> messages, DialogueAnimation animation, ResourceLocation guiPath, List responses) + public record Node(List> messages, DialogueAnimationData animation, ResourceLocation guiPath, List responses) { private static final Codec> MESSAGE_CODEC = Codec.mapPair(MessageType.CODEC.fieldOf("type"), DialogueMessage.CODEC.fieldOf("message")).codec(); private static final MapCodec>> MESSAGES_MAP_CODEC = Codec.mapEither(DialogueMessage.CODEC.fieldOf("message"), MESSAGE_CODEC.listOf().fieldOf("messages")) @@ -91,7 +91,7 @@ public record Node(List> messages, DialogueAn messages -> messages.size() == 1 && messages.get(0).getFirst() == MessageType.ENTITY ? Either.left(messages.get(0).getSecond()): Either.right(messages)); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( MESSAGES_MAP_CODEC.forGetter(Node::messages), - PreservingOptionalFieldCodec.withDefault(DialogueAnimation.CODEC, "animation", DialogueAnimation.DEFAULT_ANIMATION).forGetter(Node::animation), + PreservingOptionalFieldCodec.withDefault(DialogueAnimationData.CODEC, "animation", DialogueAnimationData.DEFAULT_ANIMATION).forGetter(Node::animation), PreservingOptionalFieldCodec.withDefault(ResourceLocation.CODEC, "gui", DEFAULT_GUI).forGetter(Node::guiPath), PreservingOptionalFieldCodec.forList(Response.LIST_CODEC, "responses").forGetter(Node::responses) ).apply(instance, Node::new)); @@ -243,14 +243,14 @@ public record SelectableDialogue(ResourceLocation dialogueId, Condition conditio ).apply(instance, SelectableDialogue::new)); } - public record DialogueData(Component message, ResourceLocation guiBackground, List responses, DialogueAnimation animation, String spriteType) + public record DialogueData(Component message, ResourceLocation guiBackground, List responses, DialogueAnimationData animationData, String spriteType) { public static DialogueData read(FriendlyByteBuf buffer) { Component message = buffer.readComponent(); ResourceLocation guiBackground = buffer.readResourceLocation(); List responses = buffer.readList(ResponseData::read); - DialogueAnimation animation = DialogueAnimation.read(buffer); + DialogueAnimationData animation = DialogueAnimationData.read(buffer); String spriteType = buffer.readUtf(25); return new DialogueData(message, guiBackground, responses, animation, spriteType); @@ -261,7 +261,7 @@ public void write(FriendlyByteBuf buffer) buffer.writeComponent(this.message); buffer.writeResourceLocation(this.guiBackground); buffer.writeCollection(this.responses, (byteBuf, responseData) -> responseData.write(byteBuf)); - this.animation.write(buffer); + this.animationData.write(buffer); buffer.writeUtf(this.spriteType, 25); } } diff --git a/src/main/java/com/mraof/minestuck/entity/dialogue/DialogueAnimation.java b/src/main/java/com/mraof/minestuck/entity/dialogue/DialogueAnimationData.java similarity index 71% rename from src/main/java/com/mraof/minestuck/entity/dialogue/DialogueAnimation.java rename to src/main/java/com/mraof/minestuck/entity/dialogue/DialogueAnimationData.java index 57255a1967..b36a253b59 100644 --- a/src/main/java/com/mraof/minestuck/entity/dialogue/DialogueAnimation.java +++ b/src/main/java/com/mraof/minestuck/entity/dialogue/DialogueAnimationData.java @@ -14,26 +14,32 @@ import java.util.Locale; -public record DialogueAnimation(String emotion, int spriteHeight, int spriteWidth) +public record DialogueAnimationData(String emotion, int spriteHeight, int spriteWidth, int xOffset, int yOffset, float scale) { public static final int DEFAULT_SPRITE_WIDTH = 128; public static final int DEFAULT_SPRITE_HEIGHT = 128; - public static final DialogueAnimation DEFAULT_ANIMATION = new DialogueAnimation(Emotion.GENERIC.getSerializedName(), DEFAULT_SPRITE_HEIGHT, DEFAULT_SPRITE_WIDTH); + public static final DialogueAnimationData DEFAULT_ANIMATION = new DialogueAnimationData(Emotion.GENERIC.getSerializedName(), DEFAULT_SPRITE_HEIGHT, DEFAULT_SPRITE_WIDTH, 0, 0, 1.0F); - public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - PreservingOptionalFieldCodec.withDefault(Codec.STRING, "emotion", Emotion.GENERIC.getSerializedName()).forGetter(DialogueAnimation::emotion), - PreservingOptionalFieldCodec.withDefault(Codec.INT, "height", DEFAULT_SPRITE_HEIGHT).forGetter(DialogueAnimation::spriteHeight), - PreservingOptionalFieldCodec.withDefault(Codec.INT, "width", DEFAULT_SPRITE_WIDTH).forGetter(DialogueAnimation::spriteWidth) - ).apply(instance, DialogueAnimation::new)); + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + PreservingOptionalFieldCodec.withDefault(Codec.STRING, "emotion", Emotion.GENERIC.getSerializedName()).forGetter(DialogueAnimationData::emotion), + PreservingOptionalFieldCodec.withDefault(Codec.INT, "height", DEFAULT_SPRITE_HEIGHT).forGetter(DialogueAnimationData::spriteHeight), + PreservingOptionalFieldCodec.withDefault(Codec.INT, "width", DEFAULT_SPRITE_WIDTH).forGetter(DialogueAnimationData::spriteWidth), + PreservingOptionalFieldCodec.withDefault(Codec.INT, "x_offset", 0).forGetter(DialogueAnimationData::xOffset), + PreservingOptionalFieldCodec.withDefault(Codec.INT, "y_offset", 0).forGetter(DialogueAnimationData::yOffset), + PreservingOptionalFieldCodec.withDefault(Codec.FLOAT, "scale", 1.0F).forGetter(DialogueAnimationData::scale) + ).apply(instance, DialogueAnimationData::new)); - public static DialogueAnimation read(FriendlyByteBuf buffer) + public static DialogueAnimationData read(FriendlyByteBuf buffer) { String emotion = buffer.readUtf(25); int height = buffer.readInt(); int width = buffer.readInt(); + int xOffset = buffer.readInt(); + int yOffset = buffer.readInt(); + float scale = buffer.readFloat(); - return new DialogueAnimation(emotion, height, width); + return new DialogueAnimationData(emotion, height, width, xOffset, yOffset, scale); } public void write(FriendlyByteBuf buffer) @@ -41,6 +47,9 @@ public void write(FriendlyByteBuf buffer) buffer.writeUtf(this.emotion, 25); buffer.writeInt(this.spriteHeight); buffer.writeInt(this.spriteWidth); + buffer.writeInt(this.xOffset); + buffer.writeInt(this.yOffset); + buffer.writeFloat(this.scale); } /**