Bring develop up to date

This commit is contained in:
often
2024-01-08 04:31:28 +03:00
97 changed files with 1726 additions and 315 deletions

View File

@@ -30,11 +30,13 @@ import com.willfp.eco.core.placeholder.context.PlaceholderContext;
import com.willfp.eco.core.proxy.ProxyFactory;
import com.willfp.eco.core.scheduling.Scheduler;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.NamespacedKey;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Mob;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@@ -587,6 +589,19 @@ public interface Eco {
@NotNull String args,
@NotNull PlaceholderContext context);
/**
* Set a client-side entity display name.
*
* @param entity The entity.
* @param player The player.
* @param name The display name.
* @param visible If the display name should be forcibly visible.
*/
void setClientsideDisplayName(@NotNull LivingEntity entity,
@NotNull Player player,
@NotNull Component name,
boolean visible);
/**
* Get the instance of eco; the bridge between the api frontend and the implementation backend.
*

View File

@@ -55,7 +55,7 @@ public final class PluginProps {
private final Map<String, String> environment = new HashMap<>();
/**
* If the plugin uses reflective reload (via {@link com.willfp.eco.core.config.updating.ConfigUpdater}).
* If the plugin uses reflective reload.
*/
private boolean usesReflectiveReload = true;

View File

@@ -37,6 +37,14 @@ public class Prerequisite {
"Requires server to have ProtocolLib"
);
/**
* Requires the server to be running 1.20.3.
*/
public static final Prerequisite HAS_1_20_3 = new Prerequisite(
() -> ProxyConstants.NMS_VERSION.contains("20_R3"),
"Requires server to be running 1.20.3+"
);
/**
* Requires the server to be running 1.20.
*/

View File

@@ -29,6 +29,22 @@ public interface LoadableConfig extends Config {
*/
void save() throws IOException;
/**
* Save the config asynchronously.
*/
default void saveAsync() {
// This default implementation exists purely for backwards compatibility
// with legacy Config implementations that don't have saveAsync().
// Default eco implementations of Config have saveAsync() implemented.
new Thread(() -> {
try {
this.save();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
/**
* Get the config file.
*

View File

@@ -38,12 +38,16 @@ import java.lang.annotation.Target;
* <p>
* By having a plugin as a parameter, you shouldn't really need getInstance()
* calls in your code.
*
* <p>
* While flexible, this can lead to long initialization times, so this feature
* can be disabled in eco.yml with the uses-reflective-reload option.
*
* @deprecated This has been deprecated due to the poor control flow and long startup times.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Deprecated(since = "6.67.0", forRemoval = true)
@SuppressWarnings("DeprecatedIsStillUsed")
public @interface ConfigUpdater {
}

View File

@@ -32,7 +32,7 @@ public final class PersistentDataKey<T> {
/**
* If the key uses local storage.
*/
private final boolean local;
private final boolean isLocal;
/**
* Create a new Persistent Data Key.
@@ -40,16 +40,16 @@ public final class PersistentDataKey<T> {
* @param key The key.
* @param type The data type.
* @param defaultValue The default value.
* @param local If the key uses local storage.
* @param isLocal If the key uses local storage.
*/
public PersistentDataKey(@NotNull final NamespacedKey key,
@NotNull final PersistentDataKeyType<T> type,
@NotNull final T defaultValue,
final boolean local) {
final boolean isLocal) {
this.key = key;
this.defaultValue = defaultValue;
this.type = type;
this.local = local;
this.isLocal = isLocal;
Eco.get().registerPersistentKey(this);
}
@@ -67,7 +67,7 @@ public final class PersistentDataKey<T> {
this.key = key;
this.defaultValue = defaultValue;
this.type = type;
this.local = false;
this.isLocal = false;
Eco.get().registerPersistentKey(this);
}
@@ -108,7 +108,14 @@ public final class PersistentDataKey<T> {
return this.type;
}
public boolean isLocalStorage() { return this.local; }
/**
* Get if the key uses local storage.
*
* @return If the key uses local storage.
*/
public boolean isLocal() {
return this.isLocal;
}
/**
* Get all persistent data keys.

View File

@@ -196,6 +196,7 @@ public interface SlotBuilder {
* @deprecated Use {@link SlotBuilder#setUpdater(SlotUpdater)} instead.
*/
@Deprecated
@SuppressWarnings("DeprecatedIsStillUsed")
default SlotBuilder setModifier(@NotNull SlotModifier modifier) {
return setUpdater((player, menu, previous) -> {
modifier.modify(player, menu, previous);

View File

@@ -150,6 +150,7 @@ public final class PlaceholderManager {
*/
@Deprecated(since = "6.56.0", forRemoval = true)
@NotNull
@SuppressWarnings("DeprecatedIsStillUsed")
public static String translatePlaceholders(@NotNull final String text,
@Nullable final Player player) {
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
@@ -166,6 +167,7 @@ public final class PlaceholderManager {
*/
@Deprecated(since = "6.56.0", forRemoval = true)
@NotNull
@SuppressWarnings("DeprecatedIsStillUsed")
public static String translatePlaceholders(@NotNull final String text,
@Nullable final Player player,
@NotNull final PlaceholderInjectable context) {
@@ -192,6 +194,7 @@ public final class PlaceholderManager {
*/
@Deprecated(since = "6.56.0", forRemoval = true)
@NotNull
@SuppressWarnings("DeprecatedIsStillUsed")
public static String translatePlaceholders(@NotNull final String text,
@Nullable final Player player,
@NotNull final PlaceholderInjectable context,

View File

@@ -120,8 +120,12 @@ public final class ConfiguredPrice implements Price {
*/
public String getDisplay(@NotNull final Player player,
final double multiplier) {
double value = this.getPrice().getValue(player, multiplier);
return StringUtils.format(
formatString.replace("%value%", NumberUtils.format(this.getPrice().getValue(player, multiplier))),
formatString
.replace("%value%", NumberUtils.format(value))
.replace("%value_commas%", NumberUtils.formatWithCommas(value)),
player,
StringUtils.FormatOption.WITH_PLACEHOLDERS
);

View File

@@ -25,7 +25,8 @@ public final class ProxyConstants {
"v1_19_R2",
"v1_19_R3",
"v1_20_R1",
"v1_20_R2"
"v1_20_R2",
"v1_20_R3"
);
private ProxyConstants() {

View File

@@ -1,13 +1,13 @@
package com.willfp.eco.core.web;
import com.willfp.eco.core.EcoPlugin;
import org.bukkit.util.Consumer;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;
import java.util.function.Consumer;
/**
* Class to check for updates of a plugin on spigot.

View File

@@ -0,0 +1,31 @@
package com.willfp.eco.util;
import com.willfp.eco.core.Eco;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
/**
* Utilities / API methods for entities.
*/
public final class EntityUtils {
/**
* Set a client-side entity display name.
*
* @param entity The entity.
* @param player The player.
* @param name The display name.
* @param visible If the display name should be forcibly visible.
*/
public static void setClientsideDisplayName(@NotNull final LivingEntity entity,
@NotNull final Player player,
@NotNull final Component name,
final boolean visible) {
Eco.get().setClientsideDisplayName(entity, player, name, visible);
}
private EntityUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
}

View File

@@ -203,6 +203,20 @@ public final class NumberUtils {
return formatted.endsWith("00") ? String.valueOf((int) toFormat) : formatted;
}
/**
* Format double to string with commas.
*
* @param toFormat The number to format.
* @return Formatted.
*/
@NotNull
public static String formatWithCommas(final double toFormat) {
DecimalFormat df = new DecimalFormat("#,##0.00");
String formatted = df.format(toFormat);
return formatted.endsWith(".00") ? formatted.substring(0, formatted.length() - 3) : formatted;
}
/**
* Evaluate an expression.
*

View File

@@ -15,7 +15,7 @@ public final class PatternUtils {
* Cache of compiled literal patterns.
*/
private static final Cache<String, Pattern> LITERAL_PATTERN_CACHE = Caffeine.newBuilder()
.expireAfterAccess(1, TimeUnit.MINUTES)
.expireAfterAccess(15, TimeUnit.MINUTES)
.build();
/**

View File

@@ -13,6 +13,7 @@ public final class PotionUtils {
* @param data The data.
* @return The duration.
*/
@SuppressWarnings("deprecation")
public static int getDuration(@NotNull final PotionData data) {
if (data.isExtended()) {
return switch (data.getType()) {

View File

@@ -0,0 +1,12 @@
@file:JvmName("EntityUtilsExtensions")
package com.willfp.eco.util
import net.kyori.adventure.text.Component
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
/** @see EntityUtils.setClientsideDisplayName */
fun LivingEntity.setClientsideDisplayName(player: Player, displayName: Component, visible: Boolean) {
EntityUtils.setClientsideDisplayName(this, player, displayName, visible)
}

View File

@@ -8,6 +8,10 @@ import com.willfp.eco.core.placeholder.context.PlaceholderContext
fun Number.toNumeral(): String =
NumberUtils.toNumeral(this.toInt())
/** @see NumberUtils.formatWithCommas */
fun Number.formatWithCommas(): String =
NumberUtils.formatWithCommas(this.toDouble())
/** @see NumberUtils.fromNumeral */
fun String.parseNumeral(): Int =
NumberUtils.fromNumeral(this)

View File

@@ -2,8 +2,8 @@
package com.willfp.eco.util
import org.bukkit.potion.PotionData
/** @see PotionData.duration */
val PotionData.duration: Int
/** @see PotionUtils.getDuration */
@Suppress("DEPRECATION")
val org.bukkit.potion.PotionData.duration: Int
get() = PotionUtils.getDuration(this)