mirror of
https://github.com/itHotL/PlayerStats.git
synced 2024-11-22 11:55:17 +01:00
Made hoverText with the full statNumber, with dynamic color, added config support for distance- and damage-units, started on adding unit to hoverText as well
This commit is contained in:
parent
77808da3a3
commit
a05a97617b
@ -93,14 +93,19 @@ public class ConfigHandler {
|
||||
}
|
||||
|
||||
public Unit getDistanceUnit() {
|
||||
String unit = config.getString("distance-unit", "blocks");
|
||||
if (unit.equalsIgnoreCase("cm")) {
|
||||
return Unit.CM;
|
||||
} else if (unit.equalsIgnoreCase("km")) {
|
||||
return Unit.KM;
|
||||
} else {
|
||||
return Unit.BLOCK;
|
||||
}
|
||||
return getUnitFromString(config.getString("distance-unit", "blocks"), Unit.BLOCK);
|
||||
}
|
||||
|
||||
public Unit getDistanceUnitHoverText() {
|
||||
return getUnitFromString(config.getString("distance-unit-hover-text", "km"), Unit.KM);
|
||||
}
|
||||
|
||||
public Unit getDamageUnit() {
|
||||
return getUnitFromString(config.getString("damage-unit", "hearts"), Unit.HEART);
|
||||
}
|
||||
|
||||
public Unit getDamageUnitHoverText() {
|
||||
return getUnitFromString(config.getString("damage-unit-hover-text", "hp"), Unit.HP);
|
||||
}
|
||||
|
||||
/** Whether to use TranslatableComponents for statistic, block, item and entity names.
|
||||
@ -265,6 +270,32 @@ public class ConfigHandler {
|
||||
return section != null ? section.getString(path, defaultValue) : null;
|
||||
}
|
||||
|
||||
private Unit getUnitFromString(String unitString, Unit defaultUnit) {
|
||||
switch (unitString.toLowerCase()) {
|
||||
case "cm" -> {
|
||||
return Unit.CM;
|
||||
}
|
||||
case "m", "block", "blocks" -> {
|
||||
return Unit.BLOCK;
|
||||
}
|
||||
case "mile", "miles" -> {
|
||||
return Unit.MILE;
|
||||
}
|
||||
case "km" -> {
|
||||
return Unit.KM;
|
||||
}
|
||||
case "hp" -> {
|
||||
return Unit.HP;
|
||||
}
|
||||
case "heart", "hearts" -> {
|
||||
return Unit.HEART;
|
||||
}
|
||||
default -> {
|
||||
return defaultUnit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns the config section that contains the relevant color or style option. */
|
||||
private @Nullable ConfigurationSection getRelevantSection(Target selection) {
|
||||
switch (selection) {
|
||||
|
@ -3,6 +3,7 @@ package com.gmail.artemis.the.gr8.playerstats.enums;
|
||||
public enum Unit {
|
||||
CM,
|
||||
BLOCK,
|
||||
MILE,
|
||||
KM,
|
||||
HP,
|
||||
HEART,
|
||||
|
@ -8,9 +8,11 @@ import com.gmail.artemis.the.gr8.playerstats.msg.msgutils.LanguageKeyHandler;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.TranslatableComponent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.util.HSVLike;
|
||||
import net.kyori.adventure.util.Index;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@ -174,14 +176,16 @@ public class ComponentFactory {
|
||||
.args(subStat));
|
||||
}
|
||||
|
||||
//TODO Make this dark gray (or at least darker than statNumber, and at least for time statistics)
|
||||
public TextComponent statUnitComponent(String statName, Target selection) {
|
||||
if (!statName.toLowerCase().contains("one_cm")) {
|
||||
if (!statName.toLowerCase().contains("one_cm") && !statName.toLowerCase().contains("damage")) {
|
||||
return Component.empty();
|
||||
}
|
||||
String key;
|
||||
switch (config.getDistanceUnit()) {
|
||||
case CM -> key = "cm";
|
||||
case KM -> key = "km";
|
||||
case MILE -> key = "Miles";
|
||||
default -> key = config.useTranslatableComponents() ? languageKeyHandler.getDistanceKey() : "Blocks";
|
||||
}
|
||||
return getComponentBuilder(null,
|
||||
@ -195,9 +199,17 @@ public class ComponentFactory {
|
||||
|
||||
//TODO Add hoverComponent with full number
|
||||
public TextComponent statNumberComponent(long number, String statName, Target selection) {
|
||||
return getComponent(format.format(statName, number),
|
||||
getColorFromString(config.getStatNumberFormatting(selection, false)),
|
||||
getStyleFromString(config.getStatNumberFormatting(selection, true)));
|
||||
TextColor baseColor = getColorFromString(config.getStatNumberFormatting(selection, false));
|
||||
TextDecoration style = getStyleFromString(config.getStatNumberFormatting(selection, true));
|
||||
TextComponent.Builder statNumber = getComponentBuilder(format.formatMainNumber(statName, number), baseColor, style);
|
||||
|
||||
if (config.useHoverText()) {
|
||||
statNumber.hoverEvent(HoverEvent.showText(getComponent(format.formatHoverNumber(statName, number),
|
||||
getLighterColor(baseColor), style)
|
||||
.append(space())
|
||||
.append(statUnitComponent(statName, selection))));
|
||||
}
|
||||
return statNumber.build();
|
||||
}
|
||||
|
||||
public TextComponent titleComponent(String content, Target selection) {
|
||||
@ -271,6 +283,12 @@ public class ComponentFactory {
|
||||
return names.value(textColor);
|
||||
}
|
||||
|
||||
private TextColor getLighterColor(TextColor color) {
|
||||
HSVLike oldColor = HSVLike.fromRGB(color.red(), color.green(), color.blue());
|
||||
HSVLike newColor = HSVLike.hsvLike(oldColor.h(), 0.45F, oldColor.v());
|
||||
return TextColor.color(newColor);
|
||||
}
|
||||
|
||||
private @Nullable TextDecoration getStyleFromString(@NotNull String configString) {
|
||||
if (configString.equalsIgnoreCase("none")) {
|
||||
return null;
|
||||
|
@ -19,15 +19,33 @@ public class NumberFormatter {
|
||||
format.setGroupingSize(3);
|
||||
}
|
||||
|
||||
public String format(String statName, long number) {
|
||||
/** Turns the input number into a more readable format depending on its type
|
||||
(number-or-times, time-, damage- or distance-based) according to the
|
||||
corresponding config settings, and adds commas in groups of 3.*/
|
||||
public String formatMainNumber(String statName, long number) {
|
||||
return format(statName, number, false);
|
||||
}
|
||||
|
||||
/** Turns the input number into a more readable format depending on its type
|
||||
(number-or-times, time-, damage- or distance-based) according to the
|
||||
corresponding config settings, and adds commas in groups of 3.*/
|
||||
public String formatHoverNumber(String statName, long number) {
|
||||
return format(statName, number, true);
|
||||
}
|
||||
|
||||
/** Formats the input based on the desired config settings from *-unit or *-unit-hover-text.
|
||||
@param statName the Statistic enum name in String format
|
||||
@param number the statistic number
|
||||
@param isHoverText boolean that indicates whether this number will be displayed in a HoverComponent or not*/
|
||||
private String format(String statName, long number, boolean isHoverText) {
|
||||
if (EnumHandler.isDistanceStatistic(statName)) {
|
||||
return formatDistance(number);
|
||||
return formatDistance(number, isHoverText);
|
||||
}
|
||||
else if (EnumHandler.isDamageStatistic(statName)) {
|
||||
return formatDamage(number);
|
||||
return formatDamage(number, isHoverText);
|
||||
}
|
||||
else if (EnumHandler.isTimeStatistic(statName)) {
|
||||
return formatTime(number);
|
||||
return formatTime(number, isHoverText);
|
||||
}
|
||||
else {
|
||||
return format.format(number);
|
||||
@ -36,19 +54,26 @@ public class NumberFormatter {
|
||||
|
||||
/** The unit of damage-based statistics is half a heart by default.
|
||||
This method turns the number into hearts. */
|
||||
private String formatDamage(long number) { //7 statistics
|
||||
return format.format(Math.round(number / 2.0));
|
||||
private String formatDamage(long number, boolean isHoverText) { //7 statistics
|
||||
Unit unit = isHoverText ? config.getDamageUnitHoverText() : config.getDamageUnit();
|
||||
if (unit == Unit.HEART) {
|
||||
return format.format(Math.round(number / 2.0));
|
||||
} else {
|
||||
return format.format(number);
|
||||
}
|
||||
}
|
||||
|
||||
//TODO add cm and km
|
||||
/** The unit of distance-based statistics is cm by default. This method turns it into blocks by default,
|
||||
and turns it into km or leaves it as cm otherwise, depending on the config settings. */
|
||||
private String formatDistance(long number) { //15 statistics
|
||||
Unit unit = config.getDistanceUnit();
|
||||
private String formatDistance(long number, boolean isHoverText) { //15 statistics
|
||||
Unit unit = isHoverText ? config.getDistanceUnitHoverText() : config.getDistanceUnit();
|
||||
switch (unit) {
|
||||
case CM -> {
|
||||
return format.format(number);
|
||||
}
|
||||
case MILE -> {
|
||||
return format.format(Math.round(number / 160900.0)); //to get from CM to Miles
|
||||
}
|
||||
case KM -> {
|
||||
return format.format(Math.round(number / 100000.0)); //divide by 100 to get M, divide by 1000 to get KM
|
||||
}
|
||||
@ -59,7 +84,7 @@ public class NumberFormatter {
|
||||
}
|
||||
|
||||
/** The unit of time-based statistics is ticks by default.*/
|
||||
private String formatTime(long number) { //5 statistics
|
||||
private String formatTime(long number, boolean isHoverText) { //5 statistics
|
||||
if (number == 0) {
|
||||
return "-";
|
||||
}
|
||||
@ -69,7 +94,7 @@ public class NumberFormatter {
|
||||
if (leftover >= 86400) {
|
||||
double days = leftover / 60 / 60 / 24;
|
||||
if (days > 999) {
|
||||
output.append(format.format(days));
|
||||
output.append(format.format(Math.round(days)));
|
||||
}
|
||||
else {
|
||||
output.append(days);
|
||||
|
@ -28,8 +28,13 @@ number-of-days-since-last-joined: 0
|
||||
# # ------------------------------- # #
|
||||
|
||||
# The unit to display certain statistics in.
|
||||
# Minecraft measures distance in cm. PlayerStats supports the following units: blocks, cm, m (= blocks), km
|
||||
# Minecraft measures distance in cm. PlayerStats supports the following units: blocks, cm, m (= blocks), miles & km
|
||||
distance-unit: blocks
|
||||
distance-unit-hover-text: km
|
||||
|
||||
# Minecraft measures damage in 0.5 hearts (1HP). PlayerStats supports the following units: hp, hearts
|
||||
damage-unit: hearts
|
||||
damage-unit-hover-text: hp
|
||||
|
||||
# Display all statistic, block, item and entity names in the client language of the receiving player
|
||||
# The actual translation is handled by the Minecraft language files and happens automatically
|
||||
|
Loading…
Reference in New Issue
Block a user