Merge pull request #344 from Auxilor/develop

Additions and fixes
This commit is contained in:
Will FP
2024-02-08 14:20:20 +00:00
committed by GitHub
13 changed files with 413 additions and 62 deletions

View File

@@ -89,6 +89,9 @@ allprojects {
// IridiumSkyblock
maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/")
// HuskPlugins
maven("https://repo.william278.net/releases")
}
dependencies {

View File

@@ -86,7 +86,7 @@ public class ConfigSlot extends CustomSlot {
for (String command : config.getStrings(configKey)) {
if (command.startsWith("console:")) {
commands.add(new CommandToDispatch(
StringUtils.removePrefix("console:", command),
StringUtils.removePrefix(command, "console:"),
true
));
} else {
@@ -127,12 +127,16 @@ public class ConfigSlot extends CustomSlot {
* @param player The player.
*/
void dispatch(@NotNull final Player player) {
System.out.println("DISPATCHING " + command);
if (console()) {
System.out.println("CONSOLE");
Bukkit.dispatchCommand(
Bukkit.getConsoleSender(),
command().replace("%player%", player.getName())
);
} else {
System.out.println("NON-CONSOLE");
Bukkit.dispatchCommand(
player,
command().replace("%player%", player.getName())

View File

@@ -2,6 +2,7 @@ package com.willfp.eco.util;
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;
@@ -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(""), TimeUnit.MINUTES)
.build();
/**

View File

@@ -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
}
}

View File

@@ -62,6 +62,9 @@ dependencies {
exclude(group = "*", module = "*")
}
compileOnly("com.iridium:IridiumSkyblock:4.0.8")
compileOnly("net.william278.huskclaims:huskclaims-bukkit:1.0.1")
compileOnly("net.william278:husktowns:2.6.1")
compileOnly("com.github.jojodmo:ItemBridge:b0054538c1")
compileOnly(fileTree("../../lib") {
include("*.jar")

View File

@@ -22,34 +22,8 @@ import com.willfp.eco.core.particle.Particles
import com.willfp.eco.core.price.Prices
import com.willfp.eco.internal.data.MavenVersionToStringAdapter
import com.willfp.eco.internal.data.VersionToStringAdapter
import com.willfp.eco.internal.entities.EntityArgParserAdult
import com.willfp.eco.internal.entities.EntityArgParserAttackDamage
import com.willfp.eco.internal.entities.EntityArgParserAttackSpeed
import com.willfp.eco.internal.entities.EntityArgParserBaby
import com.willfp.eco.internal.entities.EntityArgParserCharged
import com.willfp.eco.internal.entities.EntityArgParserEquipment
import com.willfp.eco.internal.entities.EntityArgParserExplosionRadius
import com.willfp.eco.internal.entities.EntityArgParserFlySpeed
import com.willfp.eco.internal.entities.EntityArgParserFollowRange
import com.willfp.eco.internal.entities.EntityArgParserHealth
import com.willfp.eco.internal.entities.EntityArgParserJumpStrength
import com.willfp.eco.internal.entities.EntityArgParserKnockback
import com.willfp.eco.internal.entities.EntityArgParserKnockbackResistance
import com.willfp.eco.internal.entities.EntityArgParserName
import com.willfp.eco.internal.entities.EntityArgParserNoAI
import com.willfp.eco.internal.entities.EntityArgParserSilent
import com.willfp.eco.internal.entities.EntityArgParserSize
import com.willfp.eco.internal.entities.EntityArgParserSpawnReinforcements
import com.willfp.eco.internal.entities.EntityArgParserSpeed
import com.willfp.eco.internal.items.ArgParserColor
import com.willfp.eco.internal.items.ArgParserCustomModelData
import com.willfp.eco.internal.items.ArgParserEnchantment
import com.willfp.eco.internal.items.ArgParserFlag
import com.willfp.eco.internal.items.ArgParserHead
import com.willfp.eco.internal.items.ArgParserName
import com.willfp.eco.internal.items.ArgParserTexture
import com.willfp.eco.internal.items.ArgParserTrim
import com.willfp.eco.internal.items.ArgParserUnbreakable
import com.willfp.eco.internal.entities.*
import com.willfp.eco.internal.items.*
import com.willfp.eco.internal.lookup.SegmentParserGroup
import com.willfp.eco.internal.lookup.SegmentParserUseIfPresent
import com.willfp.eco.internal.particle.ParticleFactoryRGB
@@ -69,37 +43,10 @@ import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener
import com.willfp.eco.internal.spigot.gui.GUIListener
import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationCMI
import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationEssentials
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatAAC
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatAlice
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatMatrix
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatNCP
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatSpartan
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatVulcan
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefBentoBox
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCombatLogXV10
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
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefKingdoms
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefLands
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefPvPManager
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefRPGHorses
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefSuperiorSkyblock2
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefTowny
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefWorldGuard
import com.willfp.eco.internal.spigot.integrations.anticheat.*
import com.willfp.eco.internal.spigot.integrations.antigrief.*
import com.willfp.eco.internal.spigot.integrations.customentities.CustomEntitiesMythicMobs
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsCustomCrafting
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsDenizen
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsExecutableItems
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsHeadDatabase
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsAdder
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsMythicMobs
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsScyther
import com.willfp.eco.internal.spigot.integrations.customitems.*
import com.willfp.eco.internal.spigot.integrations.customrecipes.CustomRecipeCustomCrafting
import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault
import com.willfp.eco.internal.spigot.integrations.entitylookup.EntityLookupModelEngine
@@ -149,6 +96,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
Items.registerArgParser(ArgParserUnbreakable)
Items.registerArgParser(ArgParserName)
Items.registerArgParser(ArgParserHead)
Items.registerArgParser(ArgParserEntity)
if (Prerequisite.HAS_1_20.isMet) {
Items.registerArgParser(ArgParserTrim)
}
@@ -296,6 +244,8 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
IntegrationLoader("Kingdoms") { AntigriefManager.register(AntigriefKingdoms()) },
IntegrationLoader("RPGHorses") { AntigriefManager.register(AntigriefRPGHorses()) },
IntegrationLoader("CrashClaim") { AntigriefManager.register(AntigriefCrashClaim()) },
IntegrationLoader("HuskTowns") { AntigriefManager.register(AntigriefHuskTowns()) },
IntegrationLoader("HuskClaims") { AntigriefManager.register(AntigriefHuskClaims()) },
IntegrationLoader("CombatLogX") {
val pluginManager = Bukkit.getPluginManager()
val combatLogXPlugin = pluginManager.getPlugin("CombatLogX") ?: return@IntegrationLoader
@@ -335,6 +285,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
IntegrationLoader("MythicMobs") { CustomItemsManager.register(CustomItemsMythicMobs(this)) },
IntegrationLoader("Scyther") { CustomItemsManager.register(CustomItemsScyther()) },
IntegrationLoader("Denizen") { CustomItemsManager.register(CustomItemsDenizen()) },
IntegrationLoader("ItemBridge") { CustomItemsManager.register(CustomItemsItemBridge()) },
// Shop
IntegrationLoader("ShopGUIPlus") { ShopManager.register(ShopShopGuiPlus()) },

View File

@@ -0,0 +1,135 @@
package com.willfp.eco.internal.spigot.integrations.antigrief
import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration
import net.crashcraft.crashclaim.CrashClaim
import net.crashcraft.crashclaim.permissions.PermissionRoute
import net.william278.huskclaims.api.HuskClaimsAPI
import net.william278.huskclaims.libraries.cloplib.operation.Operation
import net.william278.huskclaims.libraries.cloplib.operation.OperationPosition
import net.william278.huskclaims.libraries.cloplib.operation.OperationType
import net.william278.huskclaims.position.Position
import net.william278.huskclaims.position.World
import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Monster
import org.bukkit.entity.Player
import kotlin.jvm.optionals.getOrElse
class AntigriefHuskClaims : AntigriefIntegration {
override fun canBreakBlock(
player: Player,
block: Block
): Boolean {
val api = HuskClaimsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player.uniqueId) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
OperationType.BLOCK_BREAK,
Position.at(
block.x.toDouble(),
block.y.toDouble(),
block.z.toDouble(),
api.getWorld(block.location.world.name)
),
true
)
)
}
override fun canCreateExplosion(
player: Player,
location: Location
): Boolean {
val api = HuskClaimsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player.uniqueId) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
OperationType.EXPLOSION_DAMAGE_ENTITY,
Position.at(
location.x,
location.y,
location.z,
api.getWorld(location.world.name)
),
true
)
)
}
override fun canPlaceBlock(
player: Player,
block: Block
): Boolean {
val api = HuskClaimsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player.uniqueId) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
OperationType.BLOCK_PLACE,
Position.at(
block.x.toDouble(),
block.y.toDouble(),
block.z.toDouble(),
api.getWorld(block.location.world.name)
),
true
)
)
}
override fun canInjure(
player: Player,
victim: LivingEntity
): Boolean {
val api = HuskClaimsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player.uniqueId) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
when (victim) {
is Monster -> OperationType.PLAYER_DAMAGE_MONSTER
is Player -> OperationType.PLAYER_DAMAGE_PLAYER
else -> OperationType.PLAYER_DAMAGE_ENTITY
},
Position.at(
victim.x,
victim.y,
victim.z,
api.getWorld(victim.location.world.name)
),
true
)
)
}
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
override fun getPluginName(): String {
return "HuskClaims"
}
override fun equals(other: Any?): Boolean {
if (other !is AntigriefIntegration) {
return false
}
return other.pluginName == this.pluginName
}
override fun hashCode(): Int {
return this.pluginName.hashCode()
}
}

View File

@@ -0,0 +1,129 @@
package com.willfp.eco.internal.spigot.integrations.antigrief
import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration
import net.william278.husktowns.api.HuskTownsAPI
import net.william278.husktowns.claim.Position
import net.william278.husktowns.listener.Operation
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 AntigriefHuskTowns : AntigriefIntegration {
override fun canBreakBlock(
player: Player,
block: Block
): Boolean {
val api = HuskTownsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
Operation.Type.BLOCK_BREAK,
Position.at(
block.location.x,
block.location.y,
block.location.z,
api.getWorld(block.world)
),
true
)
)
}
override fun canCreateExplosion(
player: Player,
location: Location
): Boolean {
val api = HuskTownsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
Operation.Type.EXPLOSION_DAMAGE_ENTITY,
Position.at(
location.x,
location.y,
location.z,
api.getWorld(location.world)
),
true
)
)
}
override fun canPlaceBlock(
player: Player,
block: Block
): Boolean {
val api = HuskTownsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
Operation.Type.BLOCK_PLACE,
Position.at(
block.location.x,
block.location.y,
block.location.z,
api.getWorld(block.world)
),
true
)
)
}
override fun canInjure(
player: Player,
victim: LivingEntity
): Boolean {
val api = HuskTownsAPI.getInstance() ?: return true
val user = api.getOnlineUser(player) ?: return true
return api.isOperationAllowed(
Operation.of(
user,
when(victim) {
is Monster -> Operation.Type.PLAYER_DAMAGE_MONSTER
is Player -> Operation.Type.PLAYER_DAMAGE_PLAYER
else -> Operation.Type.PLACE_HANGING_ENTITY
},
Position.at(
player.location.x,
player.location.y,
player.location.z,
api.getWorld(player.world)
),
true
)
)
}
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
override fun getPluginName(): String {
return "HuskTowns"
}
override fun equals(other: Any?): Boolean {
if (other !is AntigriefIntegration) {
return false
}
return other.pluginName == this.pluginName
}
override fun hashCode(): Int {
return this.pluginName.hashCode()
}
}

View File

@@ -0,0 +1,47 @@
package com.willfp.eco.internal.spigot.integrations.customitems
import com.jojodmo.itembridge.ItemBridge
import com.willfp.eco.core.integrations.customitems.CustomItemsIntegration
import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.TestableItem
import com.willfp.eco.core.items.provider.ItemProvider
import com.willfp.eco.util.namespacedKeyOf
import org.bukkit.inventory.ItemStack
class CustomItemsItemBridge : CustomItemsIntegration {
override fun registerProvider() {
Items.registerItemProvider(ItemBridgeProvider())
}
override fun getPluginName(): String {
return "ItemBridge"
}
private class ItemBridgeProvider : ItemProvider("itembridge") {
override fun provideForKey(key: String): TestableItem? {
val split = key.split(":").toMutableList()
if (split.size < 2) {
return null
}
val itemKey = split[0]
val item = split[1]
val stack = ItemBridge.getItemStack(itemKey, item) ?: kotlin.run {
return null
}
return CustomItem(
namespacedKeyOf("eco:${key.lowercase().replace(":", "__")}"),
{ test: ItemStack ->
ItemBridge.isItemStack(test, itemKey, item)
},
stack
)
}
}
}

View File

@@ -5,6 +5,7 @@ import com.github.benmanes.caffeine.cache.Caffeine
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
import com.willfp.eco.core.placeholder.context.PlaceholderContext
import com.willfp.eco.internal.placeholder.PlaceholderParser
import com.willfp.eco.util.randDouble
import redempt.crunch.CompiledExpression
import redempt.crunch.Crunch
import redempt.crunch.functional.EvaluationEnvironment
@@ -22,6 +23,10 @@ private val max = Function("max", 2) {
max(it[0], it[1])
}
private val rand = Function("random", 2) {
randDouble(it[0], it[1])
}
interface ExpressionHandler {
fun evaluate(expression: String, context: PlaceholderContext): Double?
}
@@ -77,7 +82,7 @@ class ImmediatePlaceholderTranslationExpressionHandler(
.build()
private val env = EvaluationEnvironment().apply {
addFunctions(min, max)
addFunctions(min, max, rand)
}
override fun evaluate(expression: String, context: PlaceholderContext): Double? {
@@ -106,7 +111,7 @@ class LazyPlaceholderTranslationExpressionHandler(
val compiled = cache.getOrPut(expression) {
val env = EvaluationEnvironment()
env.setVariableNames(*placeholders.toTypedArray())
env.addFunctions(min, max)
env.addFunctions(rand, min, max)
runCatching { Crunch.compileExpression(expression, env) }.getOrNull()
}

View File

@@ -96,6 +96,11 @@ use-immediate-placeholder-translation-for-math: false
# less reactive values.
math-cache-ttl: 200
# The time (in minutes) for literal patterns to be cached for. Higher values will lead to
# faster evaluation times (less CPU usage) at the expense of slightly more memory usage and
# less reactive values. (Do not change unless you are told to).
literal-cache-ttl: 1
# If anonymous usage statistics should be tracked. This is very valuable information as it
# helps understand how eco and other plugins are being used by logging player and server
# counts. This is completely anonymous and no personal information is logged. This data

View File

@@ -18,6 +18,10 @@ loadbefore:
- SCore
- ExecutableItems
softdepend:
- ItemBridge
- HuskClaims
- HuskTowns
- Terra
- ProtocolLib
- WorldGuard
- GriefPrevention

BIN
lib/fabledskyblock3.jar Normal file

Binary file not shown.