Compare commits

..

19 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
17 changed files with 114 additions and 36 deletions

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ dependencies {
implementation("org.reflections:reflections:0.9.12") implementation("org.reflections:reflections:0.9.12")
implementation("org.objenesis:objenesis:3.2") 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("me.clip:placeholderapi:2.10.10")
compileOnly("net.kyori:adventure-text-minimessage:4.10.0") compileOnly("net.kyori:adventure-text-minimessage:4.10.0")
compileOnly("net.kyori:adventure-platform-bukkit:4.1.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 representer.defaultFlowStyle = DumperOptions.FlowStyle.BLOCK
return Yaml( return Yaml(
@Suppress("DEPRECATION")
YamlConstructor(), YamlConstructor(),
representer, representer,
yamlOptions, yamlOptions,

View File

@@ -16,11 +16,16 @@ open class EcoConfig(
private val values = ConcurrentHashMap<String, Any?>() private val values = ConcurrentHashMap<String, Any?>()
@Transient @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.clear()
this.values.putAll(values.normalizeToConfig(this.type)) this.values.putAll(values.normalizeToConfig(this.type))
this.addInjectablePlaceholder(injections.values)
} }
override fun toPlaintext(): String { override fun toPlaintext(): String {
@@ -179,6 +184,7 @@ open class EcoConfig(
override fun addInjectablePlaceholder(placeholders: Iterable<InjectablePlaceholder>) { override fun addInjectablePlaceholder(placeholders: Iterable<InjectablePlaceholder>) {
for (placeholder in placeholders) { for (placeholder in placeholders) {
injections[placeholder.pattern.pattern()] = placeholder injections[placeholder.pattern.pattern()] = placeholder
injectionHash = injectionHash xor placeholder.hashCode()
} }
} }
@@ -188,6 +194,7 @@ open class EcoConfig(
override fun clearInjectedPlaceholders() { override fun clearInjectedPlaceholders() {
injections.clear() injections.clear()
injectionHash = 0 // Reset the hash
} }
override fun toMap(): MutableMap<String, Any?> { override fun toMap(): MutableMap<String, Any?> {
@@ -239,18 +246,6 @@ open class EcoConfig(
} }
override fun hashCode(): Int { 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? // 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 // Fucking filthy to use identityHashCode here, but it should be extremely fast
val identityHash = System.identityHashCode(this) val identityHash = System.identityHashCode(this)

View File

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

View File

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

View File

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

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.Gypopo:EconomyShopGUI-API:1.4.6")
compileOnly("com.github.N0RSKA:ScytherAPI:55a") compileOnly("com.github.N0RSKA:ScytherAPI:55a")
compileOnly("com.ticxo.modelengine:api:R3.0.1") compileOnly("com.ticxo.modelengine:api:R3.0.1")
compileOnly("me.TechsCode:UltraEconomyAPI:1.0.0")
compileOnly("org.black_ixx:playerpoints:3.2.5") compileOnly("org.black_ixx:playerpoints:3.2.5")
compileOnly("com.github.Ssomar-Developement:SCore:3.4.7") compileOnly("com.github.Ssomar-Developement:SCore:3.4.7")
compileOnly("io.lumine:Mythic:5.3.5") 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.ArgParserHead
import com.willfp.eco.internal.items.ArgParserName import com.willfp.eco.internal.items.ArgParserName
import com.willfp.eco.internal.items.ArgParserTexture 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.items.ArgParserUnbreakable
import com.willfp.eco.internal.lookup.SegmentParserGroup import com.willfp.eco.internal.lookup.SegmentParserGroup
import com.willfp.eco.internal.lookup.SegmentParserUseIfPresent 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.ProfileHandler
import com.willfp.eco.internal.spigot.data.storage.ProfileSaver import com.willfp.eco.internal.spigot.data.storage.ProfileSaver
import com.willfp.eco.internal.spigot.drops.CollatedRunnable import com.willfp.eco.internal.spigot.drops.CollatedRunnable
import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners import com.willfp.eco.internal.spigot.eventlisteners.*
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.armor.ArmorChangeEventListeners import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorChangeEventListeners
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener
import com.willfp.eco.internal.spigot.gui.GUIListener import com.willfp.eco.internal.spigot.gui.GUIListener
@@ -152,6 +149,9 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
Items.registerArgParser(ArgParserUnbreakable) Items.registerArgParser(ArgParserUnbreakable)
Items.registerArgParser(ArgParserName) Items.registerArgParser(ArgParserName)
Items.registerArgParser(ArgParserHead) Items.registerArgParser(ArgParserHead)
if (Prerequisite.HAS_1_20.isMet) {
Items.registerArgParser(ArgParserTrim)
}
Entities.registerArgParser(EntityArgParserName) Entities.registerArgParser(EntityArgParserName)
Entities.registerArgParser(EntityArgParserNoAI) Entities.registerArgParser(EntityArgParserNoAI)
@@ -390,7 +390,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
val listeners = mutableListOf( val listeners = mutableListOf(
ArmorListener(), ArmorListener(),
EntityDeathByEntityListeners(this), EntityDeathByEntityListeners(this),
CraftingRecipeListener(), CraftingRecipeListener(this),
StackedRecipeListener(this), StackedRecipeListener(this),
GUIListener(this), GUIListener(this),
ArrowDataListener(this), ArrowDataListener(this),

View File

@@ -15,6 +15,7 @@ import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.inventory.ClickType import org.bukkit.event.inventory.ClickType
import org.bukkit.event.inventory.InventoryAction
import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.InventoryCloseEvent import org.bukkit.event.inventory.InventoryCloseEvent
import org.bukkit.event.inventory.InventoryDragEvent 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() { private fun Player.renderActiveMenu() {
val rendered = this.renderedInventory ?: return val rendered = this.renderedInventory ?: return

View File

@@ -32,15 +32,15 @@ class PriceFactoryUltraEconomy(private val currency: Currency) : PriceFactory {
get() = api.accounts.uuid(this.uniqueId).orElse(null) get() = api.accounts.uuid(this.uniqueId).orElse(null)
override fun canAfford(player: Player, multiplier: Double): Boolean { 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) { 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) { 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 { override fun getValue(player: Player, multiplier: Double): Double {

View File

@@ -1,15 +1,17 @@
package com.willfp.eco.internal.spigot.recipes package com.willfp.eco.internal.spigot.recipes
import com.willfp.eco.core.Eco
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.recipe.Recipes import com.willfp.eco.core.recipe.Recipes
import org.bukkit.Keyed import org.bukkit.Keyed
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.inventory.CraftItemEvent import org.bukkit.event.inventory.CraftItemEvent
import org.bukkit.event.inventory.PrepareItemCraftEvent import org.bukkit.event.inventory.PrepareItemCraftEvent
import org.bukkit.event.player.PlayerRecipeDiscoverEvent import org.bukkit.event.player.PlayerRecipeDiscoverEvent
class CraftingRecipeListener : Listener { class CraftingRecipeListener(val plugin: EcoPlugin) : Listener {
@EventHandler @EventHandler
fun preventLearningDisplayedRecipes(event: PlayerRecipeDiscoverEvent) { fun preventLearningDisplayedRecipes(event: PlayerRecipeDiscoverEvent) {
if (!EcoPlugin.getPluginNames().contains(event.recipe.namespace)) { if (!EcoPlugin.getPluginNames().contains(event.recipe.namespace)) {
@@ -22,6 +24,16 @@ class CraftingRecipeListener : Listener {
@EventHandler @EventHandler
fun processListeners(event: PrepareItemCraftEvent) { 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 var recipe = event.recipe as? Keyed
if (recipe == null) { 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 # counts. This is completely anonymous and no personal information is logged. This data
# is primarily used for optimisation and server insights. # is primarily used for optimisation and server insights.
playerflow: true 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.2 version = 6.65.4
plugin-name = eco plugin-name = eco
kotlin.code.style = official kotlin.code.style = official

Binary file not shown.