Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1c0b8c857 | ||
|
|
0442ccf58f | ||
|
|
1c1a796610 | ||
|
|
eacb243493 | ||
|
|
7bbed31d4e | ||
|
|
58bccf3cd7 | ||
|
|
4502e1e311 | ||
|
|
054a8d5a5e | ||
|
|
dbdd4785ba | ||
|
|
35f800b62a | ||
|
|
bb7c300074 | ||
|
|
b003ec96f7 |
@@ -61,7 +61,7 @@ allprojects {
|
||||
maven("https://maven.enginehub.org/repo/")
|
||||
|
||||
// FactionsUUID
|
||||
maven("https://ci.ender.zone/plugin/repository/everything/")
|
||||
//maven("https://ci.ender.zone/plugin/repository/everything/")
|
||||
|
||||
// NoCheatPlus
|
||||
maven("https://repo.md-5.net/content/repositories/snapshots/")
|
||||
@@ -77,6 +77,9 @@ allprojects {
|
||||
|
||||
// LibsDisguises
|
||||
maven("https://repo.md-5.net/content/groups/public/")
|
||||
|
||||
// FabledSkyblock
|
||||
maven("https://repo.songoda.com/repository/public/")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
||||
import com.willfp.eco.core.placeholder.Placeholder;
|
||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
||||
@@ -11,11 +12,13 @@ import com.willfp.eco.core.placeholder.PlayerPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@@ -23,6 +26,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Class to handle placeholder integrations.
|
||||
@@ -56,11 +61,17 @@ public final class PlaceholderManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
public @NotNull
|
||||
List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* The default PlaceholderAPI pattern; brought in for compatibility.
|
||||
*/
|
||||
private static final Pattern PATTERN = Pattern.compile("[%]([^%]+)[%]");
|
||||
|
||||
/**
|
||||
* Register a new placeholder integration.
|
||||
*
|
||||
@@ -192,7 +203,45 @@ public final class PlaceholderManager {
|
||||
public static String translatePlaceholders(@NotNull final String text,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context) {
|
||||
return translatePlaceholders(text, player, context, new ArrayList<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate all placeholders with respect to a player.
|
||||
*
|
||||
* @param text The text that may contain placeholders to translate.
|
||||
* @param player The player to translate the placeholders with respect to.
|
||||
* @param context The injectable context.
|
||||
* @param additionalPlayers Additional players to translate placeholders for.
|
||||
* @return The text, translated.
|
||||
*/
|
||||
public static String translatePlaceholders(@NotNull final String text,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context,
|
||||
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
||||
String processed = text;
|
||||
|
||||
// Prevent running 2 scans if there are no additional players.
|
||||
if (!additionalPlayers.isEmpty()) {
|
||||
List<String> found = findPlaceholdersIn(text);
|
||||
|
||||
for (AdditionalPlayer additionalPlayer : additionalPlayers) {
|
||||
for (String placeholder : found) {
|
||||
String prefix = "%" + additionalPlayer.getIdentifier() + "_";
|
||||
|
||||
if (placeholder.startsWith(prefix)) {
|
||||
processed = processed.replace(
|
||||
placeholder,
|
||||
translatePlaceholders(
|
||||
"%" + StringUtils.removePrefix(prefix, placeholder),
|
||||
additionalPlayer.getPlayer()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||
processed = integration.translate(processed, player);
|
||||
}
|
||||
@@ -214,12 +263,21 @@ public final class PlaceholderManager {
|
||||
* @return The placeholders.
|
||||
*/
|
||||
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
||||
List<String> found = new ArrayList<>();
|
||||
Set<String> found = new HashSet<>();
|
||||
|
||||
// Mock PAPI for those without it installed
|
||||
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
||||
Matcher matcher = PATTERN.matcher(text);
|
||||
while (matcher.find()) {
|
||||
found.add(matcher.group());
|
||||
}
|
||||
}
|
||||
|
||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||
found.addAll(integration.findPlaceholdersIn(text));
|
||||
}
|
||||
|
||||
return found;
|
||||
return new ArrayList<>(found);
|
||||
}
|
||||
|
||||
private record EntryWithPlayer(@NotNull PlayerPlaceholder entry,
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.willfp.eco.core.placeholder;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* An additional player with an identifier to parse placeholders for the player.
|
||||
*/
|
||||
public class AdditionalPlayer {
|
||||
/**
|
||||
* The player.
|
||||
*/
|
||||
private final Player player;
|
||||
|
||||
/**
|
||||
* The identifier.
|
||||
*/
|
||||
private final String identifier;
|
||||
|
||||
/**
|
||||
* Create a new additional player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param identifier The identifier.
|
||||
*/
|
||||
public AdditionalPlayer(@NotNull final Player player,
|
||||
@NotNull final String identifier) {
|
||||
this.player = player;
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player.
|
||||
*
|
||||
* @return The player.
|
||||
*/
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the identifier.
|
||||
*
|
||||
* @return The identifier.
|
||||
*/
|
||||
public String getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||
@@ -11,6 +12,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -263,7 +265,8 @@ public final class NumberUtils {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
public @NotNull
|
||||
List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
});
|
||||
@@ -282,7 +285,7 @@ public final class NumberUtils {
|
||||
public static double evaluateExpression(@NotNull final String expression,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Iterable<StaticPlaceholder> statics) {
|
||||
return crunch.evaluate(expression, player, new PlaceholderInjectable() {
|
||||
return evaluateExpression(expression, player, new PlaceholderInjectable() {
|
||||
@Override
|
||||
public void clearInjectedPlaceholders() {
|
||||
// Do nothing.
|
||||
@@ -304,13 +307,29 @@ public final class NumberUtils {
|
||||
*
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param context The injectable placeholders.
|
||||
* @param context The injectable placeholders.
|
||||
* @return The value of the expression, or zero if invalid.
|
||||
*/
|
||||
public static double evaluateExpression(@NotNull final String expression,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context) {
|
||||
return crunch.evaluate(expression, player, context);
|
||||
return evaluateExpression(expression, player, context, new ArrayList<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluate an expression with respect to a player (for placeholders).
|
||||
*
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param context The injectable placeholders.
|
||||
* @param additionalPlayers Additional players to parse placeholders for.
|
||||
* @return The value of the expression, or zero if invalid.
|
||||
*/
|
||||
public static double evaluateExpression(@NotNull final String expression,
|
||||
@Nullable final Player player,
|
||||
@NotNull final PlaceholderInjectable context,
|
||||
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
||||
return crunch.evaluate(expression, player, context, additionalPlayers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -332,14 +351,16 @@ public final class NumberUtils {
|
||||
/**
|
||||
* Evaluate an expression.
|
||||
*
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param injectable The injectable placeholders.
|
||||
* @param expression The expression.
|
||||
* @param player The player.
|
||||
* @param injectable The injectable placeholders.
|
||||
* @param additionalPlayers The additional players.
|
||||
* @return The value of the expression, or zero if invalid.
|
||||
*/
|
||||
double evaluate(@NotNull String expression,
|
||||
@Nullable Player player,
|
||||
@NotNull PlaceholderInjectable injectable);
|
||||
@NotNull PlaceholderInjectable injectable,
|
||||
@NotNull Collection<AdditionalPlayer> additionalPlayers);
|
||||
}
|
||||
|
||||
private NumberUtils() {
|
||||
|
||||
@@ -25,7 +25,6 @@ dependencies {
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:5.0.0-SNAPSHOT'
|
||||
compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.7-SNAPSHOT'
|
||||
compileOnly 'com.github.TechFortress:GriefPrevention:16.17.1'
|
||||
compileOnly 'com.massivecraft:Factions:1.6.9.5-U0.5.10'
|
||||
compileOnly 'com.github.cryptomorin:kingdoms:1.12.3'
|
||||
compileOnly('com.github.TownyAdvanced:Towny:0.97.2.6') {
|
||||
exclude group: 'com.zaxxer', module: 'HikariCP'
|
||||
@@ -42,6 +41,7 @@ dependencies {
|
||||
compileOnly 'com.gmail.filoghost.holographicdisplays:holographicdisplays-api:2.4.0'
|
||||
compileOnly 'com.github.EssentialsX:Essentials:2.18.2'
|
||||
compileOnly 'com.bgsoftware:SuperiorSkyblockAPI:1.8.3'
|
||||
compileOnly 'com.songoda:skyblock:2.3.30'
|
||||
compileOnly 'com.github.MilkBowl:VaultAPI:1.7'
|
||||
compileOnly 'com.github.WhipDevelopment:CrashClaim:f9cd7d92eb'
|
||||
compileOnly 'com.wolfyscript.wolfyutilities:wolfyutilities:3.16.0.0'
|
||||
|
||||
@@ -84,6 +84,7 @@ import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCombatLogX
|
||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCombatLogXV11
|
||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCrashClaim
|
||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefDeluxeCombat
|
||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefFabledSkyBlock
|
||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefFactionsUUID
|
||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefGriefPrevention
|
||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefIridiumSkyblock
|
||||
@@ -183,7 +184,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
|
||||
val tpsProxy = getProxy(TPSProxy::class.java)
|
||||
ServerUtils.initialize { tpsProxy.getTPS() }
|
||||
|
||||
NumberUtils.initCrunch { expression, player, context -> evaluateExpression(expression, player, context) }
|
||||
NumberUtils.initCrunch(::evaluateExpression)
|
||||
|
||||
MenuUtils.initialize { it.openInventory.topInventory.getMenu() }
|
||||
|
||||
@@ -264,6 +265,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
|
||||
IntegrationLoader("IridiumSkyblock") { AntigriefManager.register(AntigriefIridiumSkyblock()) },
|
||||
IntegrationLoader("DeluxeCombat") { AntigriefManager.register(AntigriefDeluxeCombat()) },
|
||||
IntegrationLoader("SuperiorSkyblock2") { AntigriefManager.register(AntigriefSuperiorSkyblock2()) },
|
||||
IntegrationLoader("FabledSkyBlock") { AntigriefManager.register(AntigriefFabledSkyBlock()) },
|
||||
IntegrationLoader("BentoBox") { AntigriefManager.register(AntigriefBentoBox()) },
|
||||
IntegrationLoader("WorldGuard") { AntigriefManager.register(AntigriefWorldGuard()) },
|
||||
IntegrationLoader("GriefPrevention") { AntigriefManager.register(AntigriefGriefPrevention()) },
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.willfp.eco.internal.spigot.integrations.antigrief
|
||||
|
||||
import com.songoda.skyblock.SkyBlock
|
||||
import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.entity.LivingEntity
|
||||
import org.bukkit.entity.Monster
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class AntigriefFabledSkyBlock : AntigriefIntegration {
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "FabledSkyBlock"
|
||||
}
|
||||
|
||||
override fun canBreakBlock(player: Player, block: Block): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = skyblock.islandManager.getIslandAtLocation(block.location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.destroy")) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "Destroy", island.getRole(player))) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun canCreateExplosion(player: Player, location: Location): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = skyblock.islandManager.getIslandAtLocation(location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.explosions")) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "Explosions", island.getRole(player))) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun canPlaceBlock(player: Player, block: Block): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = skyblock.islandManager.getIslandAtLocation(block.location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.place")) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "Place", island.getRole(player))) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun canInjure(player: Player, victim: LivingEntity): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = SkyBlock.getInstance().islandManager.getIslandAtLocation(victim.location) ?: return true
|
||||
|
||||
if (victim is Player) return skyblock.permissionManager.hasPermission(island, "PvP", island.getRole(player))
|
||||
|
||||
val islandPermission = when (victim) {
|
||||
is Monster -> "MonsterHurting"
|
||||
else -> "MobHurting"
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, islandPermission, island.getRole(player))) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun canPickupItem(player: Player, location: Location): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = SkyBlock.getInstance().islandManager.getIslandAtLocation(location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.itempickup")) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "ItemPickup", island.getRole(player))) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import com.massivecraft.factions.FLocation
|
||||
import com.massivecraft.factions.FPlayer
|
||||
import com.massivecraft.factions.FPlayers
|
||||
import com.massivecraft.factions.Faction
|
||||
import com.massivecraft.factions.perms.PermissibleAction
|
||||
import com.massivecraft.factions.perms.PermissibleActions
|
||||
import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.block.Block
|
||||
@@ -20,7 +20,7 @@ class AntigriefFactionsUUID : AntigriefIntegration {
|
||||
val fplayer: FPlayer = FPlayers.getInstance().getByPlayer(player)
|
||||
val flocation = FLocation(block.location)
|
||||
val faction: Faction = Board.getInstance().getFactionAt(flocation)
|
||||
return if (!faction.hasAccess(fplayer, PermissibleAction.DESTROY)) {
|
||||
return if (!faction.hasAccess(fplayer, PermissibleActions.DESTROY, flocation)) {
|
||||
fplayer.isAdminBypassing
|
||||
} else true
|
||||
}
|
||||
@@ -41,7 +41,7 @@ class AntigriefFactionsUUID : AntigriefIntegration {
|
||||
val fplayer: FPlayer = FPlayers.getInstance().getByPlayer(player)
|
||||
val flocation = FLocation(block.location)
|
||||
val faction: Faction = Board.getInstance().getFactionAt(flocation)
|
||||
return if (!faction.hasAccess(fplayer, PermissibleAction.BUILD)) {
|
||||
return if (!faction.hasAccess(fplayer, PermissibleActions.BUILD, flocation)) {
|
||||
fplayer.isAdminBypassing
|
||||
} else true
|
||||
}
|
||||
@@ -58,7 +58,7 @@ class AntigriefFactionsUUID : AntigriefIntegration {
|
||||
return fplayer.isAdminBypassing
|
||||
}
|
||||
} else {
|
||||
if (faction.hasAccess(fplayer, PermissibleAction.DESTROY)) {
|
||||
if (faction.hasAccess(fplayer, PermissibleActions.DESTROY, flocation)) {
|
||||
return fplayer.isAdminBypassing
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.willfp.eco.internal.spigot.math
|
||||
import com.github.benmanes.caffeine.cache.Cache
|
||||
import com.github.benmanes.caffeine.cache.Caffeine
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.placeholder.AdditionalPlayer
|
||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable
|
||||
import org.bukkit.entity.Player
|
||||
import redempt.crunch.CompiledExpression
|
||||
@@ -13,9 +14,9 @@ import redempt.crunch.functional.EvaluationEnvironment
|
||||
private val cache: Cache<String, CompiledExpression> = Caffeine.newBuilder().build()
|
||||
private val goToZero = Crunch.compileExpression("0")
|
||||
|
||||
fun evaluateExpression(expression: String, player: Player?, context: PlaceholderInjectable): Double {
|
||||
fun evaluateExpression(expression: String, player: Player?, context: PlaceholderInjectable, additional: Collection<AdditionalPlayer>): Double {
|
||||
val placeholderValues = PlaceholderManager.findPlaceholdersIn(expression)
|
||||
.map { PlaceholderManager.translatePlaceholders(it, player, context) }
|
||||
.map { PlaceholderManager.translatePlaceholders(it, player, context, additional) }
|
||||
.map { runCatching { FastNumberParsing.parseDouble(it) }.getOrDefault(0.0) }
|
||||
.toDoubleArray()
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ softdepend:
|
||||
- DeluxeCombat
|
||||
- IridiumSkyblock
|
||||
- SuperiorSkyblock2
|
||||
- FabledSkyBlock
|
||||
- CrashClaim
|
||||
- DecentHolograms
|
||||
- MythicMobs
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version = 6.38.3
|
||||
version = 6.39.0
|
||||
plugin-name = eco
|
||||
kotlin.code.style = official
|
||||
BIN
lib/FactionsUUID.jar
Normal file
BIN
lib/FactionsUUID.jar
Normal file
Binary file not shown.
Reference in New Issue
Block a user