Skip to content

Commit

Permalink
feat: enable showing familiar type in familiar ring tooltip
Browse files Browse the repository at this point in the history
Closes #907
  • Loading branch information
klikli-dev committed Apr 26, 2023
1 parent 5a8657d commit 55e03a7
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 20 deletions.
4 changes: 3 additions & 1 deletion src/generated/resources/assets/occultism/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,9 @@
"item.occultism.divination_rod.tooltip.linked_block": "Attuned to %s.",
"item.occultism.divination_rod.tooltip.no_linked_block": "Not attuned to any material.",
"item.occultism.familiar_ring": "Familiar Ring",
"item.occultism.familiar_ring.tooltip": "Occupied by the familiar %s",
"item.occultism.familiar_ring.tooltip": "Occupied by the familiar %s %s",
"item.occultism.familiar_ring.tooltip.empty": "Does not contain any familiar.",
"item.occultism.familiar_ring.tooltip.familiar_type": "[Type: %s]",
"item.occultism.gold_dust": "Gold Dust",
"item.occultism.iesnium_dust": "Iesnium Dust",
"item.occultism.iesnium_ingot": "Iesnium Ingot",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import com.github.klikli_dev.occultism.registry.OccultismAdvancements;
import com.github.klikli_dev.occultism.util.ItemNBTUtil;
import com.github.klikli_dev.occultism.util.TextUtil;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
Expand All @@ -42,16 +44,18 @@
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.INBTSerializable;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.loading.FMLLoader;
import org.jetbrains.annotations.Nullable;
import top.theillusivec4.curios.api.CuriosCapability;
import top.theillusivec4.curios.api.SlotContext;
import top.theillusivec4.curios.api.type.capability.ICurio;

import javax.annotation.Nullable;
import java.util.List;
import java.util.function.Function;

Expand All @@ -61,20 +65,60 @@ public FamiliarRingItem(Properties properties) {
super(properties);
}

private static Curio getCurio(ItemStack stack) {
ICurio curio = stack.getCapability(CuriosCapability.ITEM).orElse(null);
if (curio != null && curio instanceof Curio)
return (Curio) curio;
return null;
}

public static IFamiliar getFamiliar(ItemStack stack, Level level) {
Curio curio = getCurio(stack);
return curio == null ? null : curio.getFamiliar(level);
}

@Override
public @Nullable CompoundTag getShareTag(ItemStack stack) {
var tag = super.getShareTag(stack);

if (tag != null) {
tag.put("familiar", getCurio(stack).serializeNBT());
}

return tag;
}

@Override
public void readShareTag(ItemStack stack, @Nullable CompoundTag nbt) {
super.readShareTag(stack, nbt);
if (nbt != null && nbt.contains("familiar")) {
getCurio(stack).deserializeNBT(nbt.getCompound("familiar"));
}
}

@Override
public boolean isFoil(ItemStack pStack) {
if (FMLLoader.getDist() == Dist.CLIENT)
return DistHelper.isFoil(pStack);
return false;
}

@Override
public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List<Component> tooltip,
TooltipFlag flagIn) {
super.appendHoverText(stack, worldIn, tooltip, flagIn);
if (stack.getOrCreateTag().getBoolean("occupied"))
tooltip.add(Component.translatable(this.getDescriptionId() + ".tooltip",
TextUtil.formatDemonName(ItemNBTUtil.getBoundSpiritName(stack))));
if (stack.getOrCreateTag().getBoolean("occupied")) {
DistHelper.appendHoverText(stack, worldIn, tooltip, flagIn);
} else {
tooltip.add(Component.translatable(
stack.getDescriptionId() + ".tooltip.empty"));
}
}

@Override
public InteractionResult interactLivingEntity(ItemStack stack, Player playerIn, LivingEntity target,
InteractionHand hand) {
if (!playerIn.level.isClientSide && target instanceof IFamiliar) {
IFamiliar familiar = (IFamiliar) target;
if (!playerIn.level.isClientSide && target instanceof IFamiliar familiar) {
if ((familiar.getFamiliarOwner() == playerIn || familiar.getFamiliarOwner() == null) && getCurio(stack).captureFamiliar(playerIn.level, familiar)) {
OccultismAdvancements.FAMILIAR.trigger(playerIn, FamiliarTrigger.Type.CAPTURE);
CompoundTag tag = stack.getOrCreateTag();
Expand All @@ -100,23 +144,11 @@ public InteractionResult useOn(UseOnContext pContext) {
return InteractionResult.CONSUME;
}

private static Curio getCurio(ItemStack stack) {
ICurio curio = stack.getCapability(CuriosCapability.ITEM).orElse(null);
if (curio != null && curio instanceof Curio)
return (Curio) curio;
return null;
}

@Override
public ICapabilityProvider initCapabilities(ItemStack stack, CompoundTag nbt) {
return new Provider(stack);
}

public static IFamiliar getFamiliar(ItemStack stack, Level level) {
Curio curio = getCurio(stack);
return curio == null ? null : curio.getFamiliar(level);
}

private static class Curio implements ICurio, INBTSerializable<CompoundTag> {
private final ItemStack stack;
private IFamiliar familiar;
Expand Down Expand Up @@ -254,4 +286,37 @@ private Curio get() {

}

public static class DistHelper {

public static void appendHoverText(ItemStack stack, @Nullable Level worldIn, List<Component> tooltip,
TooltipFlag flagIn) {
if (worldIn != null) {
var familiar = getFamiliar(stack, worldIn);
if (familiar != null) {
var type = familiar.getFamiliarEntity().getType();
tooltip.add(Component.translatable(
stack.getDescriptionId() + ".tooltip",
TextUtil.formatDemonName(ItemNBTUtil.getBoundSpiritName(stack)),
Component.translatable(
stack.getDescriptionId() + ".tooltip.familiar_type",
TextUtil.formatDemonType(type.getDescription(), type)
).withStyle(ChatFormatting.ITALIC)
));
}
}
}

public static boolean isFoil(ItemStack pStack) {
var level = Minecraft.getInstance().level;
if (level == null)
return false;

var familiar = getFamiliar(pStack, level);
if (familiar != null) {
return familiar.isEffectEnabled(Minecraft.getInstance().player);
}
return false;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,9 @@ public void addItemTooltips() {
this.add("item.occultism.book_of_calling_djinni" + ".tooltip_dead", "%s has left this plane of existence.");
this.add("item.occultism.book_of_calling_djinni" + ".tooltip.extract", "Extracts from: %s.");
this.add("item.occultism.book_of_calling_djinni" + ".tooltip.deposit", "Deposits to: % s");
this.add(OccultismItems.FAMILIAR_RING.get().getDescriptionId() + ".tooltip", "Occupied by the familiar %s");
this.add(OccultismItems.FAMILIAR_RING.get().getDescriptionId() + ".tooltip", "Occupied by the familiar %s %s");
this.add(OccultismItems.FAMILIAR_RING.get().getDescriptionId() + ".tooltip.familiar_type", "[Type: %s]");
this.add(OccultismItems.FAMILIAR_RING.get().getDescriptionId() + ".tooltip.empty", "Does not contain any familiar.");

this.add("item.minecraft.diamond_sword.occultism_spirit_tooltip", "%s is bound to this sword. May your foes tremor before its glory.");

Expand Down
16 changes: 16 additions & 0 deletions src/main/java/com/github/klikli_dev/occultism/util/TextUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,17 @@
package com.github.klikli_dev.occultism.util;

import com.github.klikli_dev.occultism.Occultism;
import com.github.klikli_dev.occultism.registry.OccultismEntities;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextColor;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.SpawnEggItem;
import net.minecraft.world.level.block.Block;
import net.minecraftforge.common.ForgeSpawnEggItem;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.forgespi.language.IModInfo;
import net.minecraftforge.registries.ForgeRegistries;
Expand Down Expand Up @@ -58,6 +64,7 @@ public class TextUtil {
private static final String[] SYLLABLE2 = {"air", "ir", "mi", "sor", "mee", "clo", "red", "cra", "ark", "arc", "miri", "lori", "cres", "mur", "zer", "marac", "zoir", "slamar", "salmar", "urak", "tim", "jor", "vyr", "dor", "thor", "kyl", "lyn", "wyn", "wynn", "lond", "rond", "vond", "dorn", "korn", "morn", "gorn", "thorn", "worn", "norn", "rinn", "dell", "bell", "vell", "fell", "kell", "zell", "nir", "fir", "mir", "tir", "sir", "vir", "zir", "lir", "jyr", "ryl", "rym", "lym", "lyn", "ryn", "myr", "myl", "myn", "ryn"};
private static final String[] SYLLABLE3 = {"d", "ed", "ark", "arc", "es", "er", "der", "tron", "med", "ure", "zur", "cred", "mur", "aeus", "th", "vyr", "dor", "morn", "born", "thorn", "fyr", "lyr", "ryth", "ryn", "drin", "dryn", "kyr", "kyn", "lynd", "lind", "lyne", "line", "ryne", "rine", "thyr", "thyre", "vyn", "vin", "vyne", "vine", "rynne", "rinne", "syr", "syrn", "zirn", "zirne", "kyl", "kylle", "dor", "dorne", "lor", "lorne", "morn", "morne", "thorn", "thorne", "vyrn", "vyrne", "wyrm"};
private static final Random random = new Random();

private static boolean modNamesInitialized = false;

public static void initializeModNames() {
Expand Down Expand Up @@ -117,6 +124,15 @@ public static MutableComponent formatDemonName(MutableComponent name) {
return name.withStyle(ChatFormatting.GOLD, ChatFormatting.BOLD);
}

/**
* Formats the given spirit type name in a color based on the type.
*/
public static MutableComponent formatDemonType(Component name, EntityType<?> type) {
var egg = ForgeSpawnEggItem.fromEntityType(type);
var color = egg != null ? egg.getColor(0) : 0xffffff;
return Component.empty().append(name).withStyle(style -> style.withColor(color));
}

/**
* Formats the given number for human friendly display. Rounds high numbers.
*
Expand Down

0 comments on commit 55e03a7

Please sign in to comment.