superb-warfare/src/main/java/net/mcreator/superbwarfare/tools/TooltipTool.java
2024-09-09 19:57:52 +08:00

243 lines
12 KiB
Java

package net.mcreator.superbwarfare.tools;
import net.mcreator.superbwarfare.entity.DroneEntity;
import net.mcreator.superbwarfare.init.ModPerks;
import net.mcreator.superbwarfare.perk.AmmoPerk;
import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import java.text.DecimalFormat;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
public class TooltipTool {
public static void addHideText(List<Component> tooltip, Component text) {
if (Screen.hasShiftDown()) {
tooltip.add(text);
}
}
public static void addGunTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal(""));
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN)));
addLevelTips(tooltip, stack);
addBypassTips(tooltip, stack);
addPerkTips(tooltip, stack);
}
public static void addShotgunTips(List<Component> tooltip, ItemStack stack, int count) {
tooltip.add(Component.literal(""));
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage) + " * " + count).withStyle(ChatFormatting.GREEN)));
addLevelTips(tooltip, stack);
addBypassTips(tooltip, stack);
addPerkTips(tooltip, stack);
}
private static void addLevelTips(List<Component> tooltip, ItemStack stack) {
int level = (int) ItemNBTTool.getDouble(stack, "level", 0);
double rate = ItemNBTTool.getDouble(stack, "damagenow", 0) / ItemNBTTool.getDouble(stack, "damageneed", 1);
ChatFormatting formatting;
if (level < 10) {
formatting = ChatFormatting.WHITE;
} else if (level < 20) {
formatting = ChatFormatting.AQUA;
} else if (level < 30) {
formatting = ChatFormatting.LIGHT_PURPLE;
} else if (level < 40) {
formatting = ChatFormatting.GOLD;
} else {
formatting = ChatFormatting.RED;
}
tooltip.add(Component.translatable("des.superbwarfare.tips.level").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(level + " " + new DecimalFormat("##.##").format(rate * 100) + "%").withStyle(formatting).withStyle(ChatFormatting.BOLD)));
int upgradePoint = Mth.floor(ItemNBTTool.getDouble(stack, "UpgradePoint", 0));
tooltip.add(Component.translatable("des.superbwarfare.tips.upgradepoint").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(String.valueOf(upgradePoint)).withStyle(ChatFormatting.GRAY).withStyle(ChatFormatting.BOLD)));
}
private static void addBypassTips(List<Component> tooltip, ItemStack stack) {
double perkbypassArmorRate = 0;
var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO);
if (perk instanceof AmmoPerk ammoPerk) {
int level = PerkHelper.getItemPerkLevel(perk, stack);
perkbypassArmorRate = ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
}
double byPassRate = Math.max(ItemNBTTool.getDouble(stack, "BypassesArmor", 0) + perkbypassArmorRate, 0);
tooltip.add(Component.translatable("des.superbwarfare.tips.bypass").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.##").format(byPassRate * 100) + "%").withStyle(ChatFormatting.GOLD).withStyle(ChatFormatting.BOLD)));
}
private static void addPerkTips(List<Component> tooltip, ItemStack stack) {
CompoundTag ammoTag = PerkHelper.getPerkTag(stack, Perk.Type.AMMO);
CompoundTag functionalTag = PerkHelper.getPerkTag(stack, Perk.Type.FUNCTIONAL);
CompoundTag damageTag = PerkHelper.getPerkTag(stack, Perk.Type.DAMAGE);
if (!ammoTag.isEmpty() || !functionalTag.isEmpty() || !damageTag.isEmpty()) {
tooltip.add(Component.literal(""));
tooltip.add(Component.translatable("perk.superbwarfare.tips").withStyle(ChatFormatting.GOLD));
}
if (!ammoTag.isEmpty()) {
String id = ammoTag.getString("id").split(":")[1];
tooltip.add(Component.translatable("perk.superbwarfare.slot_Ammo").withStyle(ChatFormatting.YELLOW)
.append(Component.literal(" >> "))
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE))
.append(Component.literal(" Lvl. " + ammoTag.getInt("level")).withStyle(ChatFormatting.WHITE)));
addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
}
if (!functionalTag.isEmpty()) {
String id = functionalTag.getString("id").split(":")[1];
tooltip.add(Component.translatable("perk.superbwarfare.slot_Functional").withStyle(ChatFormatting.GREEN)
.append(Component.literal(" >> "))
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE))
.append(Component.literal(" Lvl. " + functionalTag.getInt("level")).withStyle(ChatFormatting.WHITE)));
addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
}
if (!damageTag.isEmpty()) {
String id = damageTag.getString("id").split(":")[1];
tooltip.add(Component.translatable("perk.superbwarfare.slot_Damage").withStyle(ChatFormatting.RED)
.append(Component.literal(" >> "))
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.translatable("item.superbwarfare." + id).withStyle(ChatFormatting.WHITE))
.append(Component.literal(" Lvl. " + damageTag.getInt("level")).withStyle(ChatFormatting.WHITE)));
addHideText(tooltip, Component.translatable("des.superbwarfare." + id).withStyle(ChatFormatting.GRAY));
}
}
public static void addBocekTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal(""));
double total = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(total * 0.1) + " * 10").withStyle(ChatFormatting.GREEN))
.append(Component.literal(" / ").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(total)).withStyle(ChatFormatting.GREEN)));
addLevelTips(tooltip, stack);
addBypassTips(tooltip, stack);
addPerkTips(tooltip, stack);
}
public static void addSentinelTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal(""));
AtomicBoolean flag = new AtomicBoolean(false);
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
e -> flag.set(e.getEnergyStored() > 0)
);
if (flag.get()) {
double damage = (ItemNBTTool.getDouble(stack, "damage", 0) +
ItemNBTTool.getDouble(stack, "sentinelChargeDamage", 0))
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.AQUA).withStyle(ChatFormatting.BOLD)));
} else {
double damage = ItemNBTTool.getDouble(stack, "damage", 0) * ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN)));
}
addLevelTips(tooltip, stack);
addBypassTips(tooltip, stack);
addPerkTips(tooltip, stack);
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
e -> tooltip.add(Component.literal(e.getEnergyStored() + " / " + e.getMaxEnergyStored() + " FE").withStyle(ChatFormatting.GRAY))
);
}
public static void addTaserTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal(""));
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN)));
addLevelTips(tooltip, stack);
addPerkTips(tooltip, stack);
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
e -> tooltip.add(Component.literal(e.getEnergyStored() + " / " + e.getMaxEnergyStored() + " FE").withStyle(ChatFormatting.GRAY))
);
}
public static void addLauncherTips(List<Component> tooltip, ItemStack stack) {
tooltip.add(Component.literal(""));
double damage = ItemNBTTool.getDouble(stack, "damage", 0)
* ItemNBTTool.getDouble(stack, "levelDamageMultiple", 1);
tooltip.add(Component.translatable("des.superbwarfare.tips.damage").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(new DecimalFormat("##.#").format(damage)).withStyle(ChatFormatting.GREEN)));
addLevelTips(tooltip, stack);
addPerkTips(tooltip, stack);
}
public static void addMonitorTips(List<Component> tooltip, String id) {
if (id.equals("none")) return;
Player player = Minecraft.getInstance().player;
if (player == null) return;
DroneEntity entity = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512))
.stream().filter(e -> e.getStringUUID().equals(id)).findFirst().orElse(null);
if (entity == null) return;
tooltip.add(Component.translatable("des.superbwarfare.tips.distance").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal("Distance:" + new DecimalFormat("##.#").format(player.distanceTo(entity)) + "M").withStyle(ChatFormatting.GRAY)));
}
}