Compare commits

..

34 Commits

Author SHA1 Message Date
Auxilor
ed41c1091c Suppression 2023-07-31 16:17:49 +02:00
Auxilor
4fcf8c0368 Updated to 6.65.4 2023-07-31 16:13:16 +02:00
Auxilor
4ae4af6f1d Fixed UltraEconomy 2023-07-31 16:10:32 +02:00
Auxilor
bba0900183 Fixed UltraEconomy build 2023-07-31 16:04:23 +02:00
Auxilor
641aee3965 Patched an exploit 2023-07-31 15:38:42 +02:00
Auxilor
18ea6cc568 Clarifications and fixes for other commits 2023-07-31 15:14:01 +02:00
Auxilor
8335f6bae5 Added quick patch for an exploit 2023-07-31 15:13:45 +02:00
Auxilor
514a8e76f9 Revert "Reworked EntityDamageByEntityEvent, finally"
This reverts commit 5cfb87e0
2023-07-31 15:12:48 +02:00
_OfTeN_
f34af36690 Added ArmorTrim arg parser (now without NMS) 2023-07-30 21:27:09 +03:00
_OfTeN_
143148d93e Made backend use 1.20 API 2023-07-30 21:26:21 +03:00
_OfTeN_
4f6c023217 Stupidity fix 2023-07-30 20:44:45 +03:00
_OfTeN_
620e1d3042 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt
#	eco-core/core-plugin/src/main/resources/config.yml
2023-07-30 20:39:00 +03:00
_OfTeN_
d3c831c19b Added a config option to enforce additional crafting recipe check (in case you're encountering issues with 3d party custom item plugins like ItemsAdder or Oraxen) 2023-07-30 20:38:09 +03:00
Auxilor
22d9dbdf66 Added display-without-meta option 2023-07-22 16:13:31 +01:00
Auxilor
238ea86e09 Merge branch 'master' into develop 2023-07-22 14:16:42 +01:00
Auxilor
5cfb87e03c Reworked EntityDamageByEntityEvent, finally 2023-07-22 14:16:34 +01:00
Auxilor
ff61527939 Updated to 6.65.3 2023-07-20 13:01:19 +01:00
Auxilor
7ff578f89b Fixed clearInjectedPlaceholders 2023-07-20 12:36:41 +01:00
Auxilor
27da03e8db Optimised config hashing 2023-07-20 12:19:10 +01:00
Auxilor
f1bef38046 Updated to 6.65.2 2023-07-16 13:03:50 +01:00
Auxilor
ee237f9c58 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	eco-api/src/main/java/com/willfp/eco/core/config/interfaces/Config.java
2023-07-16 13:01:28 +01:00
Auxilor
0a80518755 Merge remote-tracking branch 'origin/develop' into develop 2023-07-13 15:17:13 +01:00
Auxilor
134859fea0 Extremely obvious optimisation to expression parsing 2023-07-13 15:16:23 +01:00
_OfTeN_
5c267d500a Fixed head arg parser breaking back serialization when used with texture 2023-07-12 23:42:52 +03:00
Auxilor
4c9735583c Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/math/ExpressionHandlers.kt
2023-07-10 15:07:15 +01:00
Auxilor
739d9cfffb Optimised Config#getDoubleFromExpression for constant values 2023-07-06 17:35:52 +01:00
Auxilor
4301d83e91 Removed ItemMetaProxy, can be reimplemented much better without NMS 2023-07-06 17:33:44 +01:00
Auxilor
84d5c5e665 Merge branch 'master' into develop 2023-07-05 15:33:07 +01:00
_OfTeN_
cd8ed5a823 Implemented ItemMetaProxy with an ability to set/get trim from the 1.20 armor meta
Added an ArgParserTrim to add trims to armor via item lookup strings
2023-06-24 16:38:10 +03:00
_OfTeN_
795ead57bf Fixed MythicMobs mob test predicate 2023-06-23 11:24:03 +03:00
_OfTeN_
910cdaf992 Updated KingdomsX antigrief integration 2023-06-23 10:41:15 +03:00
_OfTeN_
85c02d3402 Merge remote-tracking branch 'origin/master' into develop 2023-06-23 09:42:26 +03:00
Auxilor
7e5e5162c3 LazyPlaceholderTranslationExpressionHandler now uses a regular map rather than a caffeine cache 2023-06-18 22:03:48 +02:00
Auxilor
09417d0834 Expressions that are just numbers will be immediately converted rather than being evaluated 2023-06-18 21:11:14 +02:00
22 changed files with 141 additions and 55 deletions

View File

@@ -81,9 +81,6 @@ allprojects {
// LibsDisguises
maven("https://repo.md-5.net/content/groups/public/")
// UltraEconomy
maven("https://repo.techscode.com/repository/maven-releases/")
// PlayerPoints
maven("https://repo.rosewooddev.io/repository/public/")

View File

@@ -597,7 +597,10 @@ public interface Config extends Cloneable, PlaceholderInjectable {
*/
default double getDoubleFromExpression(@NotNull String path,
@NotNull PlaceholderContext context) {
return NumberUtils.evaluateExpression(this.getString(path), context.withInjectableContext(this));
return Objects.requireNonNullElseGet(
this.getDoubleOrNull(path),
() -> NumberUtils.evaluateExpression(this.getString(path), context.withInjectableContext(this))
);
}
/**

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.display;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.fast.FastItemStack;
import com.willfp.eco.core.integrations.guidetection.GUIDetectionManager;
import com.willfp.eco.util.NamespacedKeyUtils;
@@ -68,8 +69,10 @@ public final class Display {
Display.revert(itemStack);
if (!itemStack.hasItemMeta()) {
return itemStack;
if (!Eco.get().getEcoPlugin().getConfigYml().getBool("display-without-meta")) {
if (!itemStack.hasItemMeta()) {
return itemStack;
}
}
ItemStack original = itemStack.clone();

View File

@@ -6,7 +6,7 @@ dependencies {
implementation("org.reflections:reflections:0.9.12")
implementation("org.objenesis:objenesis:3.2")
compileOnly("org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT")
compileOnly("org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.10.10")
compileOnly("net.kyori:adventure-text-minimessage:4.10.0")
compileOnly("net.kyori:adventure-platform-bukkit:4.1.0")

View File

@@ -112,6 +112,7 @@ private object YamlConfigTypeHandler : ConfigTypeHandler(ConfigType.YAML) {
representer.defaultFlowStyle = DumperOptions.FlowStyle.BLOCK
return Yaml(
@Suppress("DEPRECATION")
YamlConstructor(),
representer,
yamlOptions,

View File

@@ -16,11 +16,16 @@ open class EcoConfig(
private val values = ConcurrentHashMap<String, Any?>()
@Transient
var injections = ConcurrentHashMap<String, InjectablePlaceholder>()
private val injections = mutableMapOf<String, InjectablePlaceholder>()
fun init(values: Map<String, Any?>) {
@Transient
private var injectionHash = 0
fun init(values: Map<String, Any?>, injections: Map<String, InjectablePlaceholder>) {
this.values.clear()
this.values.putAll(values.normalizeToConfig(this.type))
this.addInjectablePlaceholder(injections.values)
}
override fun toPlaintext(): String {
@@ -179,6 +184,7 @@ open class EcoConfig(
override fun addInjectablePlaceholder(placeholders: Iterable<InjectablePlaceholder>) {
for (placeholder in placeholders) {
injections[placeholder.pattern.pattern()] = placeholder
injectionHash = injectionHash xor placeholder.hashCode()
}
}
@@ -188,6 +194,7 @@ open class EcoConfig(
override fun clearInjectedPlaceholders() {
injections.clear()
injectionHash = 0 // Reset the hash
}
override fun toMap(): MutableMap<String, Any?> {
@@ -239,18 +246,6 @@ open class EcoConfig(
}
override fun hashCode(): Int {
/*
The keys are completely redundant, as they are only used to prevent
duplicate keys in the map. Therefore, we can ignore them and just
hash the actual placeholder values.
*/
var injectionHash = 0
injections.forEachValue(5) {
injectionHash = injectionHash xor (it.hashCode() shl 5)
}
// hashCode() has to compute extremely quickly, so we're using bitwise, because why not?
// Fucking filthy to use identityHashCode here, but it should be extremely fast
val identityHash = System.identityHashCode(this)

View File

@@ -10,7 +10,6 @@ class EcoConfigSection(
injections: Map<String, InjectablePlaceholder> = emptyMap()
) : EcoConfig(type) {
init {
this.init(values)
this.injections = ConcurrentHashMap(injections)
this.init(values, injections)
}
}

View File

@@ -91,7 +91,7 @@ open class EcoLoadableConfig(
protected fun init(reader: Reader) {
val string = reader.readToString()
makeHeader(string)
super.init(type.toMap(string))
super.init(type.toMap(string), emptyMap())
}
fun init(file: File) {

View File

@@ -50,7 +50,7 @@ open class EcoUpdatableConfig(
val reader = BufferedReader(InputStreamReader(newIn, StandardCharsets.UTF_8))
val config = EcoConfigSection(type, emptyMap())
config.init(type.toMap(reader.readToString()))
config.init(type.toMap(reader.readToString()), emptyMap())
return config
}

View File

@@ -48,6 +48,10 @@ object ArgParserHead : LookupArgParser {
return null
}
if (meta.owningPlayer!!.name.equals("null", true) || meta.owningPlayer!!.name == null) {
return null
}
return "head:${meta.owningPlayer?.name}"
}
}

View File

@@ -0,0 +1,50 @@
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
import java.util.function.Predicate
object ArgParserTrim : LookupArgParser {
override fun parseArguments(args: Array<out String>, meta: ItemMeta): Predicate<ItemStack>? {
if (meta !is ArmorMeta) return null
var material: TrimMaterial? = null
var pattern: TrimPattern? = null
for (arg in args) {
val argSplit = arg.split(":")
if (!argSplit[0].equals("trim", ignoreCase = true)) {
continue
}
material = Registry.TRIM_MATERIAL.get(NamespacedKey.minecraft(argSplit.getOrElse(1) {""}))
pattern = Registry.TRIM_PATTERN.get(NamespacedKey.minecraft(argSplit.getOrElse(2) {""}))
}
if (material == null || pattern == null) return null
meta.trim = ArmorTrim(material, pattern)
return Predicate {
val testMeta = it.itemMeta as? ArmorMeta ?: return@Predicate false
val trim = testMeta.trim ?: return@Predicate false
return@Predicate trim.material == material
&& trim.pattern == pattern
}
}
override fun serializeBack(meta: ItemMeta): String? {
val trim = (meta as? ArmorMeta)?.trim ?: return null
return "trim:${trim.material.key.key.lowercase()}:${trim.pattern.key.key.lowercase()}"
}
}

View File

@@ -51,7 +51,6 @@ dependencies {
compileOnly("com.github.Gypopo:EconomyShopGUI-API:1.4.6")
compileOnly("com.github.N0RSKA:ScytherAPI:55a")
compileOnly("com.ticxo.modelengine:api:R3.0.1")
compileOnly("me.TechsCode:UltraEconomyAPI:1.0.0")
compileOnly("org.black_ixx:playerpoints:3.2.5")
compileOnly("com.github.Ssomar-Developement:SCore:3.4.7")
compileOnly("io.lumine:Mythic:5.3.5")

View File

@@ -48,6 +48,7 @@ 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.lookup.SegmentParserGroup
import com.willfp.eco.internal.lookup.SegmentParserUseIfPresent
@@ -62,11 +63,7 @@ import com.willfp.eco.internal.spigot.data.PlayerBlockListener
import com.willfp.eco.internal.spigot.data.ProfileHandler
import com.willfp.eco.internal.spigot.data.storage.ProfileSaver
import com.willfp.eco.internal.spigot.drops.CollatedRunnable
import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersPaper
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersSpigot
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersPaper
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersSpigot
import com.willfp.eco.internal.spigot.eventlisteners.*
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorChangeEventListeners
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener
import com.willfp.eco.internal.spigot.gui.GUIListener
@@ -152,6 +149,9 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
Items.registerArgParser(ArgParserUnbreakable)
Items.registerArgParser(ArgParserName)
Items.registerArgParser(ArgParserHead)
if (Prerequisite.HAS_1_20.isMet) {
Items.registerArgParser(ArgParserTrim)
}
Entities.registerArgParser(EntityArgParserName)
Entities.registerArgParser(EntityArgParserNoAI)
@@ -390,7 +390,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
val listeners = mutableListOf(
ArmorListener(),
EntityDeathByEntityListeners(this),
CraftingRecipeListener(),
CraftingRecipeListener(this),
StackedRecipeListener(this),
GUIListener(this),
ArrowDataListener(this),

View File

@@ -15,6 +15,7 @@ import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.inventory.ClickType
import org.bukkit.event.inventory.InventoryAction
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.InventoryCloseEvent
import org.bukkit.event.inventory.InventoryDragEvent
@@ -216,6 +217,17 @@ class GUIListener(private val plugin: EcoPlugin) : Listener {
}
}
@EventHandler
fun temporaryExploitPatch(event: InventoryClickEvent) {
if (event.player.renderedInventory == null) {
return
}
if (event.action == InventoryAction.COLLECT_TO_CURSOR) {
event.isCancelled = true
}
}
private fun Player.renderActiveMenu() {
val rendered = this.renderedInventory ?: return

View File

@@ -6,11 +6,11 @@ import org.bukkit.block.Block
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import org.kingdoms.constants.group.Kingdom
import org.kingdoms.constants.group.model.relationships.StandardRelationAttribute
import org.kingdoms.constants.land.Land
import org.kingdoms.constants.land.location.SimpleChunkLocation
import org.kingdoms.constants.player.KingdomPlayer
import org.kingdoms.constants.player.StandardKingdomPermission
import org.kingdoms.managers.PvPManager
import org.kingdoms.managers.land.BuildingProcessor
class AntigriefKingdoms : AntigriefIntegration {
override fun canBreakBlock(
@@ -21,34 +21,35 @@ class AntigriefKingdoms : AntigriefIntegration {
if (kp.isAdmin) {
return true
}
val kingdom: Kingdom = kp.kingdom ?: return false
val land = Land.getLand(block) ?: return true
val permission = if (land.isNexusLand) {
StandardKingdomPermission.NEXUS_BUILD
} else StandardKingdomPermission.BUILD
return if (!kp.hasPermission(permission)) {
return BuildingProcessor(
player,
kp,
SimpleChunkLocation.of(block),
false
} else kingdom.hasAttribute(land.kingdom, StandardRelationAttribute.BUILD)
).process().isSuccessful
}
override fun canCreateExplosion(
player: Player,
location: Location
): Boolean {
val land = Land.getLand(location) ?: return true
if (!land.isClaimed) {
return true
}
val kingdom: Kingdom = land.kingdom
return kingdom.isMember(player)
return canBreakBlock(player, location.block)
}
override fun canPlaceBlock(
player: Player,
block: Block
): Boolean {
return canBreakBlock(player, block)
val kp: KingdomPlayer = KingdomPlayer.getKingdomPlayer(player)
if (kp.isAdmin) {
return true
}
return BuildingProcessor(
player,
kp,
SimpleChunkLocation.of(block),
true
).process().isSuccessful
}
override fun canInjure(

View File

@@ -17,7 +17,7 @@ class CustomEntitiesMythicMobs : CustomEntitiesIntegration {
CustomEntity(
key,
{
val entityId = api.getMythicMobInstance(it)?.type?.entityType?.name ?: return@CustomEntity false
val entityId = api.getMythicMobInstance(it)?.type?.internalName ?: return@CustomEntity false
entityId.equals(id, ignoreCase = true)
},
{

View File

@@ -32,15 +32,15 @@ class PriceFactoryUltraEconomy(private val currency: Currency) : PriceFactory {
get() = api.accounts.uuid(this.uniqueId).orElse(null)
override fun canAfford(player: Player, multiplier: Double): Boolean {
return (player.account?.getBalance(currency)?.onHand ?: 0f) >= getValue(player, multiplier)
return (player.account?.getBalance(currency)?.onHand ?: 0.0) >= getValue(player, multiplier)
}
override fun pay(player: Player, multiplier: Double) {
player.account?.getBalance(currency)?.removeHand(getValue(player, multiplier).toFloat())
player.account?.getBalance(currency)?.removeHand(getValue(player, multiplier))
}
override fun giveTo(player: Player, multiplier: Double) {
player.account?.getBalance(currency)?.addHand(getValue(player, multiplier).toFloat())
player.account?.getBalance(currency)?.addHand(getValue(player, multiplier))
}
override fun getValue(player: Player, multiplier: Double): Double {

View File

@@ -1,15 +1,17 @@
package com.willfp.eco.internal.spigot.recipes
import com.willfp.eco.core.Eco
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.recipe.Recipes
import org.bukkit.Keyed
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.inventory.CraftItemEvent
import org.bukkit.event.inventory.PrepareItemCraftEvent
import org.bukkit.event.player.PlayerRecipeDiscoverEvent
class CraftingRecipeListener : Listener {
class CraftingRecipeListener(val plugin: EcoPlugin) : Listener {
@EventHandler
fun preventLearningDisplayedRecipes(event: PlayerRecipeDiscoverEvent) {
if (!EcoPlugin.getPluginNames().contains(event.recipe.namespace)) {
@@ -22,6 +24,16 @@ class CraftingRecipeListener : Listener {
@EventHandler
fun processListeners(event: PrepareItemCraftEvent) {
handlePrepare(event)
if (plugin.configYml.getBool("enforce-preparing-recipes")) {
plugin.scheduler.runLater(1) {
handlePrepare(event)
}
}
}
private fun handlePrepare(event: PrepareItemCraftEvent) {
var recipe = event.recipe as? Keyed
if (recipe == null) {

View File

@@ -97,3 +97,13 @@ math-cache-ttl: 200
# counts. This is completely anonymous and no personal information is logged. This data
# is primarily used for optimisation and server insights.
playerflow: true
# If the packet display system should activate on items that have no meta. This is disabled
# by default for performance reasons, but if you want to use the packet display system on
# items that have no meta, then you can enable this option.
display-without-meta: false
# If eco should enforce its recipes against other plugins. Turn this on if use custom items from
# non eco-based plugins in recipes and are encountering issues with invisible items or similar.
# This may cause issues with other plugins, so only enable this if you're having issues.
enforce-preparing-recipes: false

View File

@@ -1,3 +1,3 @@
version = 6.65.1
version = 6.65.4
plugin-name = eco
kotlin.code.style = official

Binary file not shown.