Skip to content

Commit

Permalink
Move invite text into translation strings
Browse files Browse the repository at this point in the history
  • Loading branch information
Gegy committed Oct 27, 2023
1 parent 7141416 commit fd36374
Show file tree
Hide file tree
Showing 10 changed files with 210 additions and 8 deletions.
4 changes: 4 additions & 0 deletions src/generated/resources/assets/ltextras/lang/en_ud.json
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@
"entity.ltextras.collectible": "ǝןqıʇɔǝןןoƆ",
"entity.ltextras.hologram": "ɯɐɹboןoH",
"entity.ltextras.party_beam": "ɯɐǝᗺ ʎʇɹɐԀ",
"invite.ltextras.club_1.bottom": "¿ɟooɹdǝɹıɟ ǝɹɐ sǝsınbsıp ʍouʞ noʎ pıᗡ",
"invite.ltextras.club_1.top": "˙buıɥɔʇɐʍ ǝɹɐ ʎǝɥ⟘\n˙ǝsınbsıp ɐ ɹɐǝM\n˙noʎ pǝǝu ǝM",
"invite.ltextras.club_2.bottom": "˙poob s,ǝpɐǝɯıꞀ ǝɥʇ ɹɐǝɥ I",
"invite.ltextras.club_2.top": "˙ʞuıɹp ɐ qɐɹ⅁\n˙ǝsınbsıp ɐ ɹɐǝM\n˙ǝɹǝɥʇ noʎ ǝǝS",
"item.ltextras.collectible_basket": "ʇǝʞsɐᗺ ǝןqıʇɔǝןןoƆ",
"item.ltextras.entity_wand": "puɐM ʎʇıʇuƎ",
"item.ltextras.image": "ǝbɐɯI",
Expand Down
4 changes: 4 additions & 0 deletions src/generated/resources/assets/ltextras/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@
"entity.ltextras.collectible": "Collectible",
"entity.ltextras.hologram": "Hologram",
"entity.ltextras.party_beam": "Party Beam",
"invite.ltextras.club_1.bottom": "Did you know disguises are fireproof?",
"invite.ltextras.club_1.top": "We need you.\nWear a disguise.\nThey are watching.",
"invite.ltextras.club_2.bottom": "I hear the Limeade's good.",
"invite.ltextras.club_2.top": "See you there.\nWear a disguise.\nGrab a drink.",
"item.ltextras.collectible_basket": "Collectible Basket",
"item.ltextras.entity_wand": "Entity Wand",
"item.ltextras.image": "Image",
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/com/lovetropics/extras/ExtraItems.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,15 @@ public class ExtraItems {
})
.register();

public static final ItemEntry<InviteItem> INVITE = REGISTRATE.item("invite", InviteItem::new).register();
public static final ItemEntry<InviteItem> INVITE = REGISTRATE.item("invite", InviteItem::new)
.tab(LTExtras.TAB_KEY, modifier -> {
for (final ImageData preset : InviteItem.PRESETS) {
final ItemStack stack = new ItemStack(ExtraItems.INVITE.get());
ImageData.set(stack, preset);
modifier.accept(stack);
}
})
.register();

public static void init() {
}
Expand Down
40 changes: 40 additions & 0 deletions src/main/java/com/lovetropics/extras/ExtraLangKeys.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.lovetropics.extras;

import com.tterrag.registrate.Registrate;
import com.tterrag.registrate.providers.ProviderType;
import net.minecraft.Util;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceLocation;

public enum ExtraLangKeys {
CLUB_INVITE_1_TOP("invite", "club_1.top", "We need you.\nWear a disguise.\nThey are watching."),
CLUB_INVITE_1_BOTTOM("invite", "club_1.bottom", "Did you know disguises are fireproof?"),
CLUB_INVITE_2_TOP("invite", "club_2.top", "See you there.\nWear a disguise.\nGrab a drink."),
CLUB_INVITE_2_BOTTOM("invite", "club_2.bottom", "I hear the Limeade's good."),
;

private final String key;
private final String value;

ExtraLangKeys(final String type, final String key, final String value) {
this.key = Util.makeDescriptionId(type, new ResourceLocation(LTExtras.MODID, key));
this.value = value;
}

public MutableComponent get() {
return Component.translatable(key);
}

public MutableComponent format(final Object... args) {
return Component.translatable(key, args);
}

public static void init(final Registrate registrate) {
registrate.addDataGenerator(ProviderType.LANG, prov -> {
for (final ExtraLangKeys lang : values()) {
prov.add(lang.key, lang.value);
}
});
}
}
3 changes: 2 additions & 1 deletion src/main/java/com/lovetropics/extras/LTExtras.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ public LTExtras() {

MinecraftForge.EVENT_BUS.addListener(this::onRegisterCommands);

registrate()
ExtraLangKeys.init(registrate());
registrate()
.addDataGenerator(ProviderType.LANG, p -> {
p.add(ExtraEffects.FISH_EYE.get(), "Fish Eye");
p.add("toast.collectible.title", "New Collectible!");
Expand Down
39 changes: 36 additions & 3 deletions src/main/java/com/lovetropics/extras/client/InviteOverlay.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
import com.lovetropics.extras.LTExtras;
import com.lovetropics.extras.item.ImageData;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.util.CommonColors;
import net.minecraft.util.FormattedCharSequence;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist;
Expand All @@ -14,6 +17,8 @@
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.util.List;

@Mod.EventBusSubscriber(modid = LTExtras.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
public class InviteOverlay {
private static final int PADDING = 10;
Expand All @@ -28,17 +33,45 @@ public static void onRegisterOverlays(final RegisterGuiOverlaysEvent event) {
}
final ItemStack item = player.getMainHandItem();
if (item.is(ExtraItems.INVITE.get())) {
ImageData.get(item).ifPresent(image -> drawImage(graphics, screenWidth, screenHeight, image));
ImageData.get(item).ifPresent(image -> drawImage(graphics, gui.getFont(), screenWidth, screenHeight, image));
}
});
}

private static void drawImage(final GuiGraphics graphics, final int screenWidth, final int screenHeight, final ImageData image) {
private static void drawImage(final GuiGraphics graphics, final Font font, final int screenWidth, final int screenHeight, final ImageData image) {
final int height = Math.min((int) image.height(), screenHeight - PADDING * 2);
final int width = Mth.floor(height * image.width() / image.height());
final float scale = height / image.height();

final int width = Mth.floor(image.width() * scale);

final int left = (screenWidth - width) / 2;
final int top = (screenHeight - height) / 2;
graphics.blit(image.texture(), left, top, width, height, 0, 0, 1, 1, 1, 1);

graphics.pose().pushPose();
graphics.pose().translate(left, top, 0.0f);
graphics.pose().scale(scale, scale, scale);

for (final ImageData.TextElement text : image.text()) {
final int maxWidth = text.maxWidth() != Float.MAX_VALUE ? Mth.floor(text.maxWidth()) : Integer.MAX_VALUE;
final List<FormattedCharSequence> lines = font.split(text.text(), maxWidth);

float textWidth = 0.0f;
for (final FormattedCharSequence line : lines) {
textWidth = Math.max(textWidth, font.width(line));
}

final float lineSpacing = text.lineSpacing();
final float textHeight = lines.size() * lineSpacing;

float lineTop = text.alignVertical().resolve(text.y(), textHeight);
for (final FormattedCharSequence line : lines) {
final float lineLeft = text.alignHorizontal().resolve(text.x(), font.width(line));
graphics.drawString(font, line, Mth.floor(lineLeft), Mth.floor(lineTop), CommonColors.WHITE);
lineTop += lineSpacing;
}
}

graphics.pose().popPose();
}
}
68 changes: 65 additions & 3 deletions src/main/java/com/lovetropics/extras/item/ImageData.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,26 @@
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.ExtraCodecs;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.item.ItemStack;
import org.w3c.dom.Text;

import java.util.List;
import java.util.Optional;

public record ImageData(Optional<Component> name, ResourceLocation texture, float width, float height) {
public record ImageData(Optional<Component> name, ResourceLocation texture, float width, float height, List<TextElement> text) {
public static final Codec<ImageData> CODEC = RecordCodecBuilder.create(i -> i.group(
ExtraCodecs.COMPONENT.optionalFieldOf("name").forGetter(ImageData::name),
ResourceLocation.CODEC.fieldOf("texture").forGetter(ImageData::texture),
Codec.FLOAT.fieldOf("width").forGetter(ImageData::width),
Codec.FLOAT.fieldOf("height").forGetter(ImageData::height)
Codec.FLOAT.fieldOf("height").forGetter(ImageData::height),
TextElement.CODEC.listOf().optionalFieldOf("text", List.of()).forGetter(ImageData::text)
).apply(i, ImageData::new));

private static final String TAG_IMAGE = "image";

public ImageData(final Component name, final ResourceLocation texture, final float width, final float height) {
this(Optional.of(name), texture, width, height);
this(Optional.of(name), texture, width, height, List.of());
}

public static Optional<ImageData> get(final ItemStack stack) {
Expand All @@ -37,4 +41,62 @@ public static Optional<ImageData> get(final ItemStack stack) {
public static void set(final ItemStack stack, final ImageData data) {
stack.getOrCreateTag().put(TAG_IMAGE, Util.getOrThrow(ImageData.CODEC.encodeStart(NbtOps.INSTANCE, data), IllegalStateException::new));
}

public static TextElement text(final Component text, final float x, final float y) {
return new TextElement(text, x, y, Float.MAX_VALUE, TextElement.DEFAULT_LINE_SPACING, Align.START, Align.START);
}

public record TextElement(Component text, float x, float y, float maxWidth, float lineSpacing, Align alignHorizontal, Align alignVertical) {
private static final float DEFAULT_LINE_SPACING = 9;

public static final Codec<TextElement> CODEC = RecordCodecBuilder.create(i -> i.group(
ExtraCodecs.COMPONENT.fieldOf("text").forGetter(TextElement::text),
Codec.FLOAT.fieldOf("x").forGetter(TextElement::x),
Codec.FLOAT.fieldOf("y").forGetter(TextElement::y),
Codec.FLOAT.optionalFieldOf("max_width", Float.MAX_VALUE).forGetter(TextElement::maxWidth),
Codec.FLOAT.optionalFieldOf("line_spacing", DEFAULT_LINE_SPACING).forGetter(TextElement::lineSpacing),
Align.CODEC.fieldOf("align_horizontal").forGetter(TextElement::alignHorizontal),
Align.CODEC.fieldOf("align_vertical").forGetter(TextElement::alignVertical)
).apply(i, TextElement::new));

public TextElement align(final Align horizontal, final Align vertical) {
return new TextElement(text, x, y, maxWidth, lineSpacing, horizontal, vertical);
}

public TextElement maxWidth(final float maxWidth) {
return new TextElement(text, x, y, maxWidth, lineSpacing, alignHorizontal, alignVertical);
}

public TextElement lineSpacing(final float lineSpacing) {
return new TextElement(text, x, y, maxWidth, lineSpacing, alignHorizontal, alignVertical);
}
}

public enum Align implements StringRepresentable {
START("start"),
CENTER("center"),
END("end"),
;

public static final Codec<Align> CODEC = StringRepresentable.fromEnum(Align::values);

private final String name;

Align(final String name) {
this.name = name;
}

public float resolve(final float min, final float size) {
return switch (this) {
case START -> min;
case CENTER -> min - size / 2.0f;
case END -> min - size;
};
}

@Override
public String getSerializedName() {
return name;
}
}
}
50 changes: 50 additions & 0 deletions src/main/java/com/lovetropics/extras/item/InviteItem.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,55 @@
package com.lovetropics.extras.item;

import com.lovetropics.extras.ExtraLangKeys;
import com.lovetropics.extras.LTExtras;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Optional;

public class InviteItem extends Item {
public static final List<ImageData> PRESETS = List.of(
new ImageData(
Optional.of(Component.literal("1").withStyle(ChatFormatting.DARK_PURPLE)),
new ResourceLocation(LTExtras.MODID, "textures/images/ccfucc_invite_1.png"),
371,
292,
List.of(
ImageData.text(ExtraLangKeys.CLUB_INVITE_1_TOP.get().withStyle(s -> s.withColor(0xd6b3e0)), 287, 153)
.align(ImageData.Align.CENTER, ImageData.Align.END)
.lineSpacing(18)
.maxWidth(125),
ImageData.text(ExtraLangKeys.CLUB_INVITE_1_BOTTOM.get().withStyle(s -> s.withColor(0xd6b3e0)), 287, 191)
.align(ImageData.Align.CENTER, ImageData.Align.START)
.lineSpacing(18)
.maxWidth(125)
)
),
new ImageData(
Optional.of(Component.literal("2").withStyle(ChatFormatting.DARK_PURPLE)),
new ResourceLocation(LTExtras.MODID, "textures/images/ccfucc_invite_2.png"),
371,
292,
List.of(
ImageData.text(ExtraLangKeys.CLUB_INVITE_2_TOP.get().withStyle(s -> s.withColor(0xd6b3e0)), 287, 153)
.align(ImageData.Align.CENTER, ImageData.Align.END)
.lineSpacing(18)
.maxWidth(125),
ImageData.text(ExtraLangKeys.CLUB_INVITE_2_BOTTOM.get().withStyle(s -> s.withColor(0xd6b3e0)), 287, 191)
.align(ImageData.Align.CENTER, ImageData.Align.START)
.lineSpacing(18)
.maxWidth(135)
)
)
);

public InviteItem(final Properties properties) {
super(properties);
}
Expand All @@ -14,4 +58,10 @@ public InviteItem(final Properties properties) {
public Component getName(final ItemStack stack) {
return super.getName(stack).copy().withStyle(ChatFormatting.OBFUSCATED);
}

@Override
public void appendHoverText(final ItemStack stack, @Nullable final Level level, final List<Component> lines, final TooltipFlag flag) {
super.appendHoverText(stack, level, lines, flag);
ImageData.get(stack).flatMap(ImageData::name).ifPresent(lines::add);
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit fd36374

Please sign in to comment.