Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
# Conflicts:
#	gradle.properties
  • Loading branch information
WillFP committed Mar 29, 2024
2 parents 8a8606b + 2829baf commit 9bd5cb5
Show file tree
Hide file tree
Showing 36 changed files with 522 additions and 90 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/java-ci.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Java CI

on: [ push, pull_request ]
on: [ push, pull_request, workflow_dispatch ]

jobs:
build:
Expand Down
3 changes: 3 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ allprojects {

// IridiumSkyblock
maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/")

// HuskPlugins
maven("https://repo.william278.net/releases")
}

dependencies {
Expand Down
24 changes: 22 additions & 2 deletions eco-api/src/main/java/com/willfp/eco/core/EcoPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
/**
* The tasks to run on task creation.
*/
private final ListMap<LifecyclePosition, Runnable> createTasks = new ListMap<>();
private final ListMap<LifecyclePosition, Runnable> onCreateTasks = new ListMap<>();

/**
* Create a new plugin.
Expand Down Expand Up @@ -638,7 +638,7 @@ public final void reload(final boolean cancelTasks) {
this.handleLifecycle(this.onReload, this::handleReload);

if (cancelTasks) {
this.handleLifecycle(this.createTasks, this::createTasks);
this.handleLifecycle(this.onCreateTasks, this::createTasks);
}

for (Extension extension : this.extensionLoader.getLoadedExtensions()) {
Expand Down Expand Up @@ -666,6 +666,26 @@ public final void onReload(@NotNull final LifecyclePosition position,
this.onReload.append(position, task);
}

/**
* Add new task to run on createTasks.
*
* @param task The task.
*/
public final void onCreateTasks(@NotNull final Runnable task) {
this.onCreateTasks(LifecyclePosition.END, task);
}

/**
* Add new task to run on createTasks.
*
* @param position The position to run the task.
* @param task The task.
*/
public final void onCreateTasks(@NotNull final LifecyclePosition position,
@NotNull final Runnable task) {
this.onCreateTasks.append(position, task);
}

/**
* Reload the plugin and return the time taken to reload.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ private SlotHandler dispatchCommandHandler(@NotNull final String configKey) {
for (String command : config.getStrings(configKey)) {
if (command.startsWith("console:")) {
commands.add(new CommandToDispatch(
StringUtils.removePrefix("console:", command),
StringUtils.removePrefix(command, "console:"),
true
));
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,12 @@ public String getDisplay(@NotNull final Player player) {
*/
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
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.willfp.eco.core.proxy;

import com.willfp.eco.core.version.Version;
import org.bukkit.Bukkit;

import java.util.Arrays;
Expand All @@ -12,7 +13,7 @@ public final class ProxyConstants {
/**
* The NMS version that the server is running on.
*/
public static final String NMS_VERSION = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
public static final String NMS_VERSION;

/**
* All supported NMS versions.
Expand All @@ -32,4 +33,17 @@ public final class ProxyConstants {
private ProxyConstants() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}

static {
String currentMinecraftVersion = Bukkit.getServer().getBukkitVersion().split("-")[0];
String nmsVersion;

if (new Version(currentMinecraftVersion).compareTo(new Version("1.20.5")) < 0) {
nmsVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
} else {
nmsVersion = currentMinecraftVersion.replace(".", "_");
}

NMS_VERSION = nmsVersion;
}
}
14 changes: 14 additions & 0 deletions eco-api/src/main/java/com/willfp/eco/util/NumberUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,20 @@ public static String format(final double toFormat) {
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.
*
Expand Down
3 changes: 2 additions & 1 deletion eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.willfp.eco.core.Eco;
import org.jetbrains.annotations.NotNull;

import java.util.concurrent.TimeUnit;
Expand All @@ -15,7 +16,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(Eco.get().getEcoPlugin().getConfigYml().getInt("literal-cache-ttl"), TimeUnit.MINUTES)
.build();

/**
Expand Down
5 changes: 5 additions & 0 deletions eco-api/src/main/kotlin/com/willfp/eco/core/items/Items.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,14 @@ fun ItemStack.toSNBT() =
Items.toSNBT(this)

/** @see Items.isEmpty */
@Deprecated("Use ItemStack.isEcoEmpty", ReplaceWith("Items.isEmpty(this)"))
val ItemStack?.isEmpty: Boolean
get() = Items.isEmpty(this)

/** @see Items.isEmpty */
val ItemStack?.isEcoEmpty: Boolean
get() = Items.isEmpty(this)

/** @see Items.matchesAny */
fun Collection<TestableItem>.matches(item: ItemStack): Boolean =
Items.matchesAny(item, this)
Expand Down
4 changes: 4 additions & 0 deletions eco-api/src/main/kotlin/com/willfp/eco/util/NumberUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.willfp.eco.internal.command
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandBase
import com.willfp.eco.core.command.NotificationException
import com.willfp.eco.core.config.base.LangYml
import org.bukkit.Bukkit
import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.willfp.eco.internal.config

import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.placeholder.InjectablePlaceholder
import java.util.concurrent.ConcurrentHashMap

class EcoConfigSection(
type: ConfigType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import java.nio.channels.AsynchronousFileChannel
import java.nio.file.Files
import java.nio.file.StandardOpenOption

@Suppress("UNCHECKED_CAST")
open class EcoLoadableConfig(
type: ConfigType,
configName: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class EcoExtensionLoader(
}
}

@Suppress("DEPRECATION")
@Throws(MalformedExtensionException::class)
private fun loadExtension(extensionJar: File) {
val url = extensionJar.toURI().toURL()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ class FastInternalNamespacedKeyFactory : InternalNamespacedKeyFactory {

class SafeInternalNamespacedKeyFactory : InternalNamespacedKeyFactory {
override fun create(namespace: String, key: String): NamespacedKey {
@Suppress("DEPRECATION")
return NamespacedKey(namespace, key)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.willfp.eco.internal.gui.menu

import com.willfp.eco.core.gui.menu.events.CaptiveItemChangeEvent
import com.willfp.eco.core.items.isEmpty
import com.willfp.eco.core.items.isEcoEmpty
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.util.MenuUtils
import com.willfp.eco.util.openMenu
Expand Down Expand Up @@ -55,7 +55,7 @@ class RenderedInventory(
val actualItem = inventory.getItem(bukkit) ?: continue

if (slot.isCaptiveFromEmpty) {
if (!actualItem.isEmpty) {
if (!actualItem.isEcoEmpty) {
newCaptive[position] = actualItem
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.willfp.eco.core.placeholder.context.placeholderContext
import me.clip.placeholderapi.expansion.PlaceholderExpansion
import org.bukkit.entity.Player

@Suppress("DEPRECATION")
class PAPIExpansion(private val plugin: EcoPlugin) : PlaceholderExpansion() {
init {
register()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.willfp.eco.internal.items

import com.willfp.eco.core.items.args.LookupArgParser
import org.bukkit.block.CreatureSpawner
import org.bukkit.entity.EntityType
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.BlockStateMeta
import org.bukkit.inventory.meta.ItemMeta
import java.util.function.Predicate

object ArgParserEntity : LookupArgParser {
override fun parseArguments(args: Array<out String>, meta: ItemMeta): Predicate<ItemStack>? {
if (meta !is BlockStateMeta) {
return null
}

if (meta.hasBlockState() || meta.blockState !is CreatureSpawner) {
return null
}

val state = meta.blockState as CreatureSpawner

var type: String? = null

for (arg in args) {
val argSplit = arg.split(":")
if (!argSplit[0].equals("entity", ignoreCase = true)) {
continue
}
if (argSplit.size < 2) {
continue
}
type = argSplit[1]
}

type ?: return null

val entityType = runCatching { EntityType.valueOf(type.uppercase()) }.getOrNull() ?: return null

state.spawnedType = entityType

meta.blockState = state

return Predicate {
val testMeta = ((it.itemMeta as? BlockStateMeta) as? CreatureSpawner) ?: return@Predicate false

testMeta.spawnedType?.name?.equals(type, true) == true
}
}

override fun serializeBack(meta: ItemMeta): String? {
if (meta !is BlockStateMeta) {
return null
}

if (meta.hasBlockState() || meta.blockState !is CreatureSpawner) {
return null
}

val state = meta.blockState as CreatureSpawner

return state.spawnedType?.let { "entity:${state.spawnedType!!.name}" } ?: return null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ object ArgParserHead : LookupArgParser {

playerName ?: return null

@Suppress("DEPRECATION")
val player = Bukkit.getOfflinePlayer(playerName)

meta.owningPlayer = player
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.willfp.eco.internal.items

import com.willfp.eco.core.items.args.LookupArgParser
import org.bukkit.Color
import org.bukkit.NamespacedKey
import org.bukkit.Registry
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ArmorMeta
import org.bukkit.inventory.meta.ItemMeta
import org.bukkit.inventory.meta.LeatherArmorMeta
import org.bukkit.inventory.meta.trim.ArmorTrim
import org.bukkit.inventory.meta.trim.TrimMaterial
import org.bukkit.inventory.meta.trim.TrimPattern
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import com.willfp.eco.core.placeholder.InjectablePlaceholder
import com.willfp.eco.core.placeholder.Placeholder
import com.willfp.eco.core.placeholder.context.PlaceholderContext
import com.willfp.eco.util.StringUtils
import com.willfp.eco.util.evaluateExpression
import com.willfp.eco.util.toNiceString
import java.util.concurrent.TimeUnit

/*
Expand All @@ -19,6 +21,8 @@ but it's still best to minimise the memory overhead.

class PlaceholderParser {
private val placeholderRegex = Regex("%([^% ]+)%")
private val prettyMathExpressionRegex = Regex("(\\{\\^\\{)(.)+(}})")
private val mathExpressionRegex = Regex("(\\{\\{)(.)+(}})")

private val placeholderLookupCache = Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.SECONDS)
Expand All @@ -34,6 +38,29 @@ class PlaceholderParser {
injections: Collection<InjectablePlaceholder>,
translateEcoPlaceholders: Boolean = true
): String {
var processed = text

// Only evaluate math expressions if there might be any
// Checking { as a char is faster than checking a string sequence,
// even if it might lead to false positives.
if ('{' in processed) {
if ('^' in processed) {
// Evaluate pretty math expressions
processed = prettyMathExpressionRegex.findAll(processed).fold(processed) { acc, matchResult ->
val expression = matchResult.value.substring(3, matchResult.value.length - 2)
val result = evaluateExpression(expression, context)
acc.replace(matchResult.value, result.toNiceString())
}
}

// Evaluate math expressions
processed = mathExpressionRegex.findAll(processed).fold(processed) { acc, matchResult ->
val expression = matchResult.value.substring(2, matchResult.value.length - 2)
val result = evaluateExpression(expression, context)
acc.replace(matchResult.value, result.toString())
}
}

/*
Why am I doing injections at the start, and again at the end?
Expand All @@ -55,7 +82,7 @@ class PlaceholderParser {
*/

// Apply injections first
var processed = injections.fold(text) { acc, injection ->
processed = injections.fold(processed) { acc, injection ->
injection.tryTranslateQuickly(acc, context)
}

Expand Down
Loading

0 comments on commit 9bd5cb5

Please sign in to comment.