Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
5595e95701 Bump com.github.EssentialsX:Essentials from 2.18.2 to 2.20.0
Bumps com.github.EssentialsX:Essentials from 2.18.2 to 2.20.0.

---
updated-dependencies:
- dependency-name: com.github.EssentialsX:Essentials
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 21:53:46 +00:00
71 changed files with 42 additions and 1391 deletions

View File

@@ -29,7 +29,6 @@ dependencies {
implementation(project(path = ":eco-core:core-nms:v1_19_R3", configuration = "reobf")) implementation(project(path = ":eco-core:core-nms:v1_19_R3", configuration = "reobf"))
implementation(project(path = ":eco-core:core-nms:v1_20_R1", configuration = "reobf")) implementation(project(path = ":eco-core:core-nms:v1_20_R1", configuration = "reobf"))
implementation(project(path = ":eco-core:core-nms:v1_20_R2", configuration = "reobf")) implementation(project(path = ":eco-core:core-nms:v1_20_R2", configuration = "reobf"))
implementation(project(path = ":eco-core:core-nms:v1_20_R3", configuration = "reobf"))
} }
allprojects { allprojects {
@@ -42,8 +41,11 @@ allprojects {
repositories { repositories {
mavenCentral() mavenCentral()
mavenLocal() mavenLocal()
maven("https://repo.auxilor.io/repository/maven-public/")
maven("https://jitpack.io") maven("https://jitpack.io")
maven("https://repo.auxilor.io/repository/maven-public/")
// CustomCrafting
maven("https://maven.wolfyscript.com/repository/public/")
// SuperiorSkyblock2 // SuperiorSkyblock2
maven("https://repo.bg-software.com/repository/api/") maven("https://repo.bg-software.com/repository/api/")
@@ -86,9 +88,6 @@ allprojects {
// Denizen // Denizen
maven("https://maven.citizensnpcs.co/repo") maven("https://maven.citizensnpcs.co/repo")
// IridiumSkyblock
maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/")
} }
dependencies { dependencies {

View File

@@ -37,14 +37,6 @@ public class Prerequisite {
"Requires server to have ProtocolLib" "Requires server to have ProtocolLib"
); );
/**
* Requires the server to be running 1.20.3.
*/
public static final Prerequisite HAS_1_20_3 = new Prerequisite(
() -> ProxyConstants.NMS_VERSION.contains("20_R3"),
"Requires server to be running 1.20.3+"
);
/** /**
* Requires the server to be running 1.20. * Requires the server to be running 1.20.
*/ */

View File

@@ -29,22 +29,6 @@ public interface LoadableConfig extends Config {
*/ */
void save() throws IOException; void save() throws IOException;
/**
* Save the config asynchronously.
*/
default void saveAsync() {
// This default implementation exists purely for backwards compatibility
// with legacy Config implementations that don't have saveAsync().
// Default eco implementations of Config have saveAsync() implemented.
new Thread(() -> {
try {
this.save();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
/** /**
* Get the config file. * Get the config file.
* *

View File

@@ -120,12 +120,8 @@ public final class ConfiguredPrice implements Price {
*/ */
public String getDisplay(@NotNull final Player player, public String getDisplay(@NotNull final Player player,
final double multiplier) { final double multiplier) {
double value = this.getPrice().getValue(player, multiplier);
return StringUtils.format( return StringUtils.format(
formatString formatString.replace("%value%", NumberUtils.format(this.getPrice().getValue(player, multiplier))),
.replace("%value%", NumberUtils.format(value))
.replace("%value_commas%", NumberUtils.formatWithCommas(value)),
player, player,
StringUtils.FormatOption.WITH_PLACEHOLDERS StringUtils.FormatOption.WITH_PLACEHOLDERS
); );

View File

@@ -25,8 +25,7 @@ public final class ProxyConstants {
"v1_19_R2", "v1_19_R2",
"v1_19_R3", "v1_19_R3",
"v1_20_R1", "v1_20_R1",
"v1_20_R2", "v1_20_R2"
"v1_20_R3"
); );
private ProxyConstants() { private ProxyConstants() {

View File

@@ -203,20 +203,6 @@ public final class NumberUtils {
return formatted.endsWith("00") ? String.valueOf((int) toFormat) : formatted; 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. * Evaluate an expression.
* *

View File

@@ -8,10 +8,6 @@ import com.willfp.eco.core.placeholder.context.PlaceholderContext
fun Number.toNumeral(): String = fun Number.toNumeral(): String =
NumberUtils.toNumeral(this.toInt()) NumberUtils.toNumeral(this.toInt())
/** @see NumberUtils.formatWithCommas */
fun Number.formatWithCommas(): String =
NumberUtils.formatWithCommas(this.toDouble())
/** @see NumberUtils.fromNumeral */ /** @see NumberUtils.fromNumeral */
fun String.parseNumeral(): Int = fun String.parseNumeral(): Int =
NumberUtils.fromNumeral(this) NumberUtils.fromNumeral(this)

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("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.11.4") compileOnly("me.clip:placeholderapi:2.11.4")
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

@@ -3,6 +3,7 @@ package com.willfp.eco.internal.command
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandBase import com.willfp.eco.core.command.CommandBase
import com.willfp.eco.core.command.NotificationException import com.willfp.eco.core.command.NotificationException
import com.willfp.eco.core.config.base.LangYml
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.command.Command import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandExecutor

View File

@@ -2,6 +2,7 @@ package com.willfp.eco.internal.config
import com.willfp.eco.core.config.ConfigType import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.placeholder.InjectablePlaceholder import com.willfp.eco.core.placeholder.InjectablePlaceholder
import java.util.concurrent.ConcurrentHashMap
class EcoConfigSection( class EcoConfigSection(
type: ConfigType, type: ConfigType,

View File

@@ -10,11 +10,10 @@ import java.io.IOException
import java.io.InputStreamReader import java.io.InputStreamReader
import java.io.OutputStream import java.io.OutputStream
import java.io.Reader import java.io.Reader
import java.nio.ByteBuffer
import java.nio.channels.AsynchronousFileChannel
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.StandardOpenOption import java.nio.file.StandardOpenOption
@Suppress("UNCHECKED_CAST")
open class EcoLoadableConfig( open class EcoLoadableConfig(
type: ConfigType, type: ConfigType,
configName: String, configName: String,
@@ -75,20 +74,6 @@ open class EcoLoadableConfig(
} }
} }
override fun saveAsync() {
// Save asynchronously using NIO
AsynchronousFileChannel.open(
configFile.toPath(),
StandardOpenOption.WRITE,
StandardOpenOption.CREATE
).use { channel ->
channel.write(
ByteBuffer.wrap(this.toPlaintext().toByteArray()),
0
)
}
}
private fun makeHeader(contents: String) { private fun makeHeader(contents: String) {
header.clear() header.clear()

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.internal.drops package com.willfp.eco.internal.drops
import com.willfp.eco.core.Prerequisite
import com.willfp.eco.core.drops.DropQueue import com.willfp.eco.core.drops.DropQueue
import com.willfp.eco.core.events.DropQueuePushEvent import com.willfp.eco.core.events.DropQueuePushEvent
import com.willfp.eco.core.integrations.antigrief.AntigriefManager import com.willfp.eco.core.integrations.antigrief.AntigriefManager
@@ -73,17 +72,10 @@ open class EcoDropQueue(val player: Player) : DropQueue() {
world.dropItem(location, drop!!).velocity = Vector() world.dropItem(location, drop!!).velocity = Vector()
} }
if (xp > 0) { if (xp > 0) {
if (Prerequisite.HAS_PAPER.isMet) { val orb =
player.giveExp(xp, true) world.spawnEntity(player.location.add(0.0, 0.2, 0.0), EntityType.EXPERIENCE_ORB) as ExperienceOrb
} else { orb.velocity = Vector(0, 0, 0)
val orb = orb.experience = xp
world.spawnEntity(
player.location.add(0.0, 0.2, 0.0),
EntityType.EXPERIENCE_ORB
) as ExperienceOrb
orb.velocity = Vector(0, 0, 0)
orb.experience = xp
}
} }
} else { } else {
for (drop in items) { for (drop in items) {

View File

@@ -19,7 +19,6 @@ object EntityArgParserName : EntityArgParser {
val formatted = StringUtils.format(name) val formatted = StringUtils.format(name)
@Suppress("DEPRECATION")
return EntityArgParseResult( return EntityArgParseResult(
{ it.customName == formatted }, { it.customName == formatted },
{ {

View File

@@ -42,7 +42,6 @@ class EcoExtensionLoader(
} }
} }
@Suppress("DEPRECATION")
@Throws(MalformedExtensionException::class) @Throws(MalformedExtensionException::class)
private fun loadExtension(extensionJar: File) { private fun loadExtension(extensionJar: File) {
val url = extensionJar.toURI().toURL() val url = extensionJar.toURI().toURL()

View File

@@ -7,6 +7,6 @@ import org.bukkit.NamespacedKey
class EcoNamespacedKeyFactory(private val plugin: EcoPlugin) : NamespacedKeyFactory { class EcoNamespacedKeyFactory(private val plugin: EcoPlugin) : NamespacedKeyFactory {
override fun create(key: String): NamespacedKey { override fun create(key: String): NamespacedKey {
return NamespacedKeyUtils.create(plugin.id, key) return NamespacedKeyUtils.create(plugin.name, key)
} }
} }

View File

@@ -25,6 +25,7 @@ class FastInternalNamespacedKeyFactory : InternalNamespacedKeyFactory {
class SafeInternalNamespacedKeyFactory : InternalNamespacedKeyFactory { class SafeInternalNamespacedKeyFactory : InternalNamespacedKeyFactory {
override fun create(namespace: String, key: String): NamespacedKey { override fun create(namespace: String, key: String): NamespacedKey {
@Suppress("DEPRECATION")
return NamespacedKey(namespace, key) return NamespacedKey(namespace, key)
} }
} }

View File

@@ -43,7 +43,6 @@ class EcoMenu(
getPossiblyReactiveSlot(row, column, player) getPossiblyReactiveSlot(row, column, player)
override fun open(player: Player): Inventory { override fun open(player: Player): Inventory {
@Suppress("DEPRECATION")
val inventory = if (columns == 9) { val inventory = if (columns == 9) {
Bukkit.createInventory(null, rows * columns, title) Bukkit.createInventory(null, rows * columns, title)
} else { } else {

View File

@@ -1,6 +1,7 @@
package com.willfp.eco.internal.gui.menu package com.willfp.eco.internal.gui.menu
import com.willfp.eco.core.gui.menu.events.CaptiveItemChangeEvent import com.willfp.eco.core.gui.menu.events.CaptiveItemChangeEvent
import com.willfp.eco.core.items.isEmpty
import com.willfp.eco.core.recipe.parts.EmptyTestableItem import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.util.MenuUtils import com.willfp.eco.util.MenuUtils
import com.willfp.eco.util.openMenu import com.willfp.eco.util.openMenu

View File

@@ -6,7 +6,6 @@ import com.willfp.eco.core.placeholder.context.placeholderContext
import me.clip.placeholderapi.expansion.PlaceholderExpansion import me.clip.placeholderapi.expansion.PlaceholderExpansion
import org.bukkit.entity.Player import org.bukkit.entity.Player
@Suppress("DEPRECATION")
class PAPIExpansion(private val plugin: EcoPlugin) : PlaceholderExpansion() { class PAPIExpansion(private val plugin: EcoPlugin) : PlaceholderExpansion() {
init { init {
register() register()

View File

@@ -28,6 +28,7 @@ object ArgParserHead : LookupArgParser {
playerName ?: return null playerName ?: return null
@Suppress("DEPRECATION")
val player = Bukkit.getOfflinePlayer(playerName) val player = Bukkit.getOfflinePlayer(playerName)
meta.owningPlayer = player meta.owningPlayer = player

View File

@@ -22,13 +22,12 @@ object ArgParserName : LookupArgParser {
val formatted = StringUtils.format(name) val formatted = StringUtils.format(name)
// I don't know why it says it's redundant, the compiler yells at me // I don't know why it says it's redundant, the compiler yells at me
@Suppress("UsePropertyAccessSyntax", "RedundantSuppression", "DEPRECATION") @Suppress("UsePropertyAccessSyntax", "RedundantSuppression")
meta.setDisplayName(formatted) meta.setDisplayName(formatted)
return Predicate { return Predicate {
val testMeta = it.itemMeta ?: return@Predicate false val testMeta = it.itemMeta ?: return@Predicate false
@Suppress("DEPRECATION")
testMeta.displayName == formatted testMeta.displayName == formatted
} }
} }
@@ -38,7 +37,6 @@ object ArgParserName : LookupArgParser {
return null return null
} }
@Suppress("DEPRECATION")
return "name:\"${meta.displayName}\"" return "name:\"${meta.displayName}\""
} }
} }

View File

@@ -1,11 +1,13 @@
package com.willfp.eco.internal.items package com.willfp.eco.internal.items
import com.willfp.eco.core.items.args.LookupArgParser import com.willfp.eco.core.items.args.LookupArgParser
import org.bukkit.Color
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey
import org.bukkit.Registry import org.bukkit.Registry
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ArmorMeta import org.bukkit.inventory.meta.ArmorMeta
import org.bukkit.inventory.meta.ItemMeta 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.ArmorTrim
import org.bukkit.inventory.meta.trim.TrimMaterial import org.bukkit.inventory.meta.trim.TrimMaterial
import org.bukkit.inventory.meta.trim.TrimPattern import org.bukkit.inventory.meta.trim.TrimPattern

View File

@@ -1,12 +1,9 @@
package com.willfp.eco.internal.spigot.proxy.common package com.willfp.eco.internal.spigot.proxy.common
import com.willfp.eco.core.Prerequisite
import com.willfp.eco.core.entities.ai.EntityGoal import com.willfp.eco.core.entities.ai.EntityGoal
import com.willfp.eco.core.entities.ai.TargetGoal import com.willfp.eco.core.entities.ai.TargetGoal
import com.willfp.eco.internal.spigot.proxy.common.ai.EntityGoalFactory import com.willfp.eco.internal.spigot.proxy.common.ai.EntityGoalFactory
import com.willfp.eco.internal.spigot.proxy.common.ai.TargetGoalFactory import com.willfp.eco.internal.spigot.proxy.common.ai.TargetGoalFactory
import io.papermc.paper.adventure.PaperAdventure
import net.kyori.adventure.text.Component
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
@@ -71,9 +68,6 @@ fun CompoundTag.setPdc(pdc: PersistentDataContainer?, item: net.minecraft.world.
fun Player.toNMS(): ServerPlayer = fun Player.toNMS(): ServerPlayer =
impl.toNMS(this) impl.toNMS(this)
fun Component.toNMS(): net.minecraft.network.chat.Component =
if (Prerequisite.HAS_PAPER.isMet) PaperAdventure.asVanilla(this) else impl.toNMS(this)
interface CommonsProvider { interface CommonsProvider {
val nbtTagString: Int val nbtTagString: Int
@@ -107,8 +101,6 @@ interface CommonsProvider {
fun toNMS(player: Player): ServerPlayer fun toNMS(player: Player): ServerPlayer
fun toNMS(component: Component): net.minecraft.network.chat.Component
companion object { companion object {
fun setIfNeeded(provider: CommonsProvider) { fun setIfNeeded(provider: CommonsProvider) {
if (::impl.isInitialized) { if (::impl.isInitialized) {

View File

@@ -5,8 +5,6 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import net.minecraft.core.Registry import net.minecraft.core.Registry
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -157,10 +155,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = GsonComponentSerializer.gson().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -1,83 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_17_R1
import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import it.unimi.dsi.fastutil.ints.Int2ObjectMap
import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftLivingEntity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import java.util.Optional
@Suppress("UNCHECKED_CAST")
class DisplayName : DisplayNameProxy {
private val displayNameAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[2]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Optional<net.minecraft.network.chat.Component>>
private val customNameVisibleAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[3]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Boolean>
private val itemsByIDMapField = SynchedEntityData::class.java
.declaredFields
.filter { it.type == Int2ObjectMap::class.java }
.toList()[0]
.apply { isAccessible = true }
override fun setClientsideDisplayName(
entity: LivingEntity,
player: Player,
displayName: Component,
visible: Boolean
) {
if (entity !is CraftLivingEntity) {
return
}
val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData(nmsEntity)
entityData.forceSet(displayNameAccessor, Optional.of(nmsComponent))
entityData.forceSet(customNameVisibleAccessor, visible)
val packet = ClientboundSetEntityDataPacket(
nmsEntity.id,
entityData,
true
)
player.sendPacket(Packet(packet))
}
private fun <T : Any> SynchedEntityData.forceSet(
accessor: EntityDataAccessor<T>,
value: T
) {
if (!this.hasItem(accessor)) {
this.define(accessor, value)
}
this[accessor] = value
this.markDirty(accessor)
}
private fun <T : Any> SynchedEntityData.hasItem(accessor: EntityDataAccessor<T>): Boolean {
val itemsByIDMap = itemsByIDMapField.get(this) as Int2ObjectMap<Any>
return itemsByIDMap.containsKey(accessor.id)
}
}

View File

@@ -5,8 +5,6 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import net.minecraft.core.Registry import net.minecraft.core.Registry
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -157,10 +155,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = GsonComponentSerializer.gson().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -1,83 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_18_R1
import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import it.unimi.dsi.fastutil.ints.Int2ObjectMap
import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftLivingEntity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import java.util.Optional
@Suppress("UNCHECKED_CAST")
class DisplayName : DisplayNameProxy {
private val displayNameAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[2]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Optional<net.minecraft.network.chat.Component>>
private val customNameVisibleAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[3]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Boolean>
private val itemsByIDMapField = SynchedEntityData::class.java
.declaredFields
.filter { it.type == Int2ObjectMap::class.java }
.toList()[0]
.apply { isAccessible = true }
override fun setClientsideDisplayName(
entity: LivingEntity,
player: Player,
displayName: Component,
visible: Boolean
) {
if (entity !is CraftLivingEntity) {
return
}
val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData(nmsEntity)
entityData.forceSet(displayNameAccessor, Optional.of(nmsComponent))
entityData.forceSet(customNameVisibleAccessor, visible)
val packet = ClientboundSetEntityDataPacket(
nmsEntity.id,
entityData,
true
)
player.sendPacket(Packet(packet))
}
private fun <T : Any> SynchedEntityData.forceSet(
accessor: EntityDataAccessor<T>,
value: T
) {
if (!this.hasItem(accessor)) {
this.define(accessor, value)
}
this[accessor] = value
this.markDirty(accessor)
}
private fun <T : Any> SynchedEntityData.hasItem(accessor: EntityDataAccessor<T>): Boolean {
val itemsByIDMap = itemsByIDMapField.get(this) as Int2ObjectMap<Any>
return itemsByIDMap.containsKey(accessor.id)
}
}

View File

@@ -5,8 +5,6 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import net.minecraft.core.Registry import net.minecraft.core.Registry
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -157,10 +155,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = GsonComponentSerializer.gson().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -1,83 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_18_R2
import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import it.unimi.dsi.fastutil.ints.Int2ObjectMap
import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftLivingEntity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import java.util.Optional
@Suppress("UNCHECKED_CAST")
class DisplayName : DisplayNameProxy {
private val displayNameAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[2]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Optional<net.minecraft.network.chat.Component>>
private val customNameVisibleAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[3]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Boolean>
private val itemsByIDMapField = SynchedEntityData::class.java
.declaredFields
.filter { it.type == Int2ObjectMap::class.java }
.toList()[0]
.apply { isAccessible = true }
override fun setClientsideDisplayName(
entity: LivingEntity,
player: Player,
displayName: Component,
visible: Boolean
) {
if (entity !is CraftLivingEntity) {
return
}
val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData(nmsEntity)
entityData.forceSet(displayNameAccessor, Optional.of(nmsComponent))
entityData.forceSet(customNameVisibleAccessor, visible)
val packet = ClientboundSetEntityDataPacket(
nmsEntity.id,
entityData,
true
)
player.sendPacket(Packet(packet))
}
private fun <T : Any> SynchedEntityData.forceSet(
accessor: EntityDataAccessor<T>,
value: T
) {
if (!this.hasItem(accessor)) {
this.define(accessor, value)
}
this[accessor] = value
this.markDirty(accessor)
}
private fun <T : Any> SynchedEntityData.hasItem(accessor: EntityDataAccessor<T>): Boolean {
val itemsByIDMap = itemsByIDMapField.get(this) as Int2ObjectMap<Any>
return itemsByIDMap.containsKey(accessor.id)
}
}

View File

@@ -5,8 +5,6 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import net.minecraft.core.Registry import net.minecraft.core.Registry
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -157,10 +155,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = GsonComponentSerializer.gson().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -1,83 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_19_R1
import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import it.unimi.dsi.fastutil.ints.Int2ObjectMap
import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftLivingEntity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import java.util.Optional
@Suppress("UNCHECKED_CAST")
class DisplayName : DisplayNameProxy {
private val displayNameAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[2]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Optional<net.minecraft.network.chat.Component>>
private val customNameVisibleAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[3]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Boolean>
private val itemsByIDMapField = SynchedEntityData::class.java
.declaredFields
.filter { it.type == Int2ObjectMap::class.java }
.toList()[0]
.apply { isAccessible = true }
override fun setClientsideDisplayName(
entity: LivingEntity,
player: Player,
displayName: Component,
visible: Boolean
) {
if (entity !is CraftLivingEntity) {
return
}
val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData(nmsEntity)
entityData.forceSet(displayNameAccessor, Optional.of(nmsComponent))
entityData.forceSet(customNameVisibleAccessor, visible)
val packet = ClientboundSetEntityDataPacket(
nmsEntity.id,
entityData,
true
)
player.sendPacket(Packet(packet))
}
private fun <T : Any> SynchedEntityData.forceSet(
accessor: EntityDataAccessor<T>,
value: T
) {
if (!this.hasItem(accessor)) {
this.define(accessor, value)
}
this[accessor] = value
this.markDirty(accessor)
}
private fun <T : Any> SynchedEntityData.hasItem(accessor: EntityDataAccessor<T>): Boolean {
val itemsByIDMap = itemsByIDMapField.get(this) as Int2ObjectMap<Any>
return itemsByIDMap.containsKey(accessor.id)
}
}

View File

@@ -6,8 +6,6 @@ import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import io.netty.channel.Channel import io.netty.channel.Channel
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -159,10 +157,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = GsonComponentSerializer.gson().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -1,82 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_19_R2
import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import it.unimi.dsi.fastutil.ints.Int2ObjectMap
import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftLivingEntity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import java.util.Optional
@Suppress("UNCHECKED_CAST")
class DisplayName : DisplayNameProxy {
private val displayNameAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[2]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Optional<net.minecraft.network.chat.Component>>
private val customNameVisibleAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[3]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Boolean>
private val itemsByIDMapField = SynchedEntityData::class.java
.declaredFields
.filter { it.type == Int2ObjectMap::class.java }
.toList()[0]
.apply { isAccessible = true }
override fun setClientsideDisplayName(
entity: LivingEntity,
player: Player,
displayName: Component,
visible: Boolean
) {
if (entity !is CraftLivingEntity) {
return
}
val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData(nmsEntity)
entityData.forceSet(displayNameAccessor, Optional.of(nmsComponent))
entityData.forceSet(customNameVisibleAccessor, visible)
val packet = ClientboundSetEntityDataPacket(
nmsEntity.id,
entityData.packDirty() ?: throw IllegalStateException("No packed entity data")
)
player.sendPacket(Packet(packet))
}
private fun <T : Any> SynchedEntityData.forceSet(
accessor: EntityDataAccessor<T>,
value: T
) {
if (!this.hasItem(accessor)) {
this.define(accessor, value)
}
this[accessor] = value
this.markDirty(accessor)
}
private fun <T : Any> SynchedEntityData.hasItem(accessor: EntityDataAccessor<T>): Boolean {
val itemsByIDMap = itemsByIDMapField.get(this) as Int2ObjectMap<Any>
return itemsByIDMap.containsKey(accessor.id)
}
}

View File

@@ -5,8 +5,6 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -157,10 +155,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = GsonComponentSerializer.gson().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -1,82 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import it.unimi.dsi.fastutil.ints.Int2ObjectMap
import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftLivingEntity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import java.util.Optional
@Suppress("UNCHECKED_CAST")
class DisplayName : DisplayNameProxy {
private val displayNameAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[2]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Optional<net.minecraft.network.chat.Component>>
private val customNameVisibleAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[3]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Boolean>
private val itemsByIDMapField = SynchedEntityData::class.java
.declaredFields
.filter { it.type == Int2ObjectMap::class.java }
.toList()[0]
.apply { isAccessible = true }
override fun setClientsideDisplayName(
entity: LivingEntity,
player: Player,
displayName: Component,
visible: Boolean
) {
if (entity !is CraftLivingEntity) {
return
}
val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData(nmsEntity)
entityData.forceSet(displayNameAccessor, Optional.of(nmsComponent))
entityData.forceSet(customNameVisibleAccessor, visible)
val packet = ClientboundSetEntityDataPacket(
nmsEntity.id,
entityData.packDirty() ?: throw IllegalStateException("No packed entity data")
)
player.sendPacket(Packet(packet))
}
private fun <T : Any> SynchedEntityData.forceSet(
accessor: EntityDataAccessor<T>,
value: T
) {
if (!this.hasItem(accessor)) {
this.define(accessor, value)
}
this[accessor] = value
this.markDirty(accessor)
}
private fun <T : Any> SynchedEntityData.hasItem(accessor: EntityDataAccessor<T>): Boolean {
val itemsByIDMap = itemsByIDMapField.get(this) as Int2ObjectMap<Any>
return itemsByIDMap.containsKey(accessor.id)
}
}

View File

@@ -5,8 +5,6 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -157,10 +155,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = JSONComponentSerializer.json().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -3,7 +3,6 @@ package com.willfp.eco.internal.spigot.proxy.v1_20_R1
import com.willfp.eco.core.packet.Packet import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import io.papermc.paper.adventure.PaperAdventure import io.papermc.paper.adventure.PaperAdventure
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
@@ -41,7 +40,8 @@ class DisplayName : DisplayNameProxy {
return return
} }
val nmsComponent = displayName.toNMS() val nmsComponent = PaperAdventure.asVanilla(displayName)
?: throw IllegalStateException("Display name component is null!")
val nmsEntity = entity.handle val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible nmsEntity.isCustomNameVisible

View File

@@ -5,8 +5,6 @@ import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
@@ -157,10 +155,5 @@ class CommonsInitializer : CommonsInitializerProxy {
override fun toNMS(player: Player): ServerPlayer { override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle return (player as CraftPlayer).handle
} }
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = JSONComponentSerializer.json().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
} }
} }

View File

@@ -3,7 +3,6 @@ package com.willfp.eco.internal.spigot.proxy.v1_20_R2
import com.willfp.eco.core.packet.Packet import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import io.papermc.paper.adventure.PaperAdventure import io.papermc.paper.adventure.PaperAdventure
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
@@ -38,7 +37,8 @@ class DisplayName : DisplayNameProxy {
return return
} }
val nmsComponent = displayName.toNMS() val nmsComponent = PaperAdventure.asVanilla(displayName)
?: throw IllegalStateException("Display name component is null!")
val nmsEntity = entity.handle val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible nmsEntity.isCustomNameVisible

View File

@@ -1,39 +0,0 @@
plugins {
id("io.papermc.paperweight.userdev")
}
group = "com.willfp"
version = rootProject.version
dependencies {
implementation(project(":eco-core:core-nms:nms-common"))
paperweight.paperDevBundle("1.20.3-R0.1-SNAPSHOT")
implementation("net.kyori:adventure-text-minimessage:4.11.0") {
version {
strictly("4.11.0")
}
exclude(group = "net.kyori", module = "adventure-api")
}
}
tasks {
build {
dependsOn(reobfJar)
}
reobfJar {
mustRunAfter(shadowJar)
}
shadowJar {
relocate(
"com.willfp.eco.internal.spigot.proxy.common",
"com.willfp.eco.internal.spigot.proxy.v1_20_R3.common"
)
relocate(
"net.kyori.adventure.text.minimessage",
"com.willfp.eco.internal.spigot.proxy.v1_20_R3.minimessage"
)
}
}

View File

@@ -1,35 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.command.PluginCommandBase
import com.willfp.eco.internal.spigot.proxy.BukkitCommandsProxy
import org.bukkit.Bukkit
import org.bukkit.command.Command
import org.bukkit.command.SimpleCommandMap
import org.bukkit.craftbukkit.v1_20_R3.CraftServer
import java.lang.reflect.Field
class BukkitCommands : BukkitCommandsProxy {
private val knownCommandsField: Field by lazy {
SimpleCommandMap::class.java.getDeclaredField("knownCommands")
.apply {
isAccessible = true
}
}
@Suppress("UNCHECKED_CAST")
private val knownCommands: MutableMap<String, Command>
get() = knownCommandsField.get(getCommandMap()) as MutableMap<String, Command>
override fun getCommandMap(): SimpleCommandMap {
return (Bukkit.getServer() as CraftServer).commandMap
}
override fun syncCommands() {
(Bukkit.getServer() as CraftServer).syncCommands()
}
override fun unregisterCommand(command: PluginCommandBase) {
knownCommands.remove(command.name)
knownCommands.remove("${command.plugin.name.lowercase()}:${command.name}")
}
}

View File

@@ -1,166 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy
import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider
import com.willfp.eco.internal.spigot.proxy.common.packet.PacketInjectorListener
import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.PathfinderMob
import net.minecraft.world.item.Item
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.NamespacedKey
import org.bukkit.craftbukkit.v1_20_R3.CraftServer
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMob
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_20_R3.persistence.CraftPersistentDataContainer
import org.bukkit.craftbukkit.v1_20_R3.persistence.CraftPersistentDataTypeRegistry
import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers
import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Mob
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataContainer
import java.lang.reflect.Field
class CommonsInitializer : CommonsInitializerProxy {
override fun init(plugin: EcoPlugin) {
CommonsProvider.setIfNeeded(CommonsProviderImpl)
plugin.onEnable {
plugin.eventManager.registerListener(PacketInjectorListener)
}
}
object CommonsProviderImpl : CommonsProvider {
private val cisHandle: Field = CraftItemStack::class.java.getDeclaredField("handle").apply {
isAccessible = true
}
private val pdcRegsitry = Class.forName("org.bukkit.craftbukkit.v1_20_R3.inventory.CraftMetaItem")
.getDeclaredField("DATA_TYPE_REGISTRY")
.apply { isAccessible = true }
.get(null) as CraftPersistentDataTypeRegistry
override val nbtTagString = CraftMagicNumbers.NBT.TAG_STRING
override fun toPathfinderMob(mob: Mob): PathfinderMob? {
val craft = mob as? CraftMob ?: return null
return craft.handle as? PathfinderMob
}
override fun toResourceLocation(namespacedKey: NamespacedKey): ResourceLocation =
CraftNamespacedKey.toMinecraft(namespacedKey)
override fun asNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack {
return if (itemStack !is CraftItemStack) {
CraftItemStack.asNMSCopy(itemStack)
} else {
cisHandle[itemStack] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(itemStack)
}
}
override fun asBukkitStack(itemStack: net.minecraft.world.item.ItemStack): ItemStack {
return CraftItemStack.asCraftMirror(itemStack)
}
override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) {
if (itemStack !is CraftItemStack) {
itemStack.itemMeta = CraftItemStack.asCraftMirror(nmsStack).itemMeta
}
}
override fun toBukkitEntity(entity: net.minecraft.world.entity.LivingEntity): LivingEntity? =
CraftEntity.getEntity(Bukkit.getServer() as CraftServer, entity) as? LivingEntity
override fun makePdc(tag: CompoundTag, base: Boolean): PersistentDataContainer {
fun emptyPdc(): CraftPersistentDataContainer = CraftPersistentDataContainer(pdcRegsitry)
fun CompoundTag?.toPdc(): PersistentDataContainer {
val pdc = emptyPdc()
this ?: return pdc
val keys = this.allKeys
for (key in keys) {
pdc.put(key, this[key])
}
return pdc
}
return if (base) {
tag.toPdc()
} else {
if (tag.contains("PublicBukkitValues")) {
tag.getCompound("PublicBukkitValues").toPdc()
} else {
emptyPdc()
}
}
}
override fun setPdc(
tag: CompoundTag,
pdc: PersistentDataContainer?,
item: net.minecraft.world.item.ItemStack?
) {
fun CraftPersistentDataContainer.toTag(): CompoundTag {
val compound = CompoundTag()
val rawPublicMap: Map<String, Tag> = this.raw
for ((key, value) in rawPublicMap) {
compound.put(key, value)
}
return compound
}
val container = when (pdc) {
is CraftPersistentDataContainer? -> pdc
else -> null
}
if (item != null) {
if (container != null && !container.isEmpty) {
for (key in tag.allKeys.toSet()) {
tag.remove(key)
}
tag.merge(container.toTag())
} else {
item.tag = null
}
} else {
if (container != null && !container.isEmpty) {
tag.put("PublicBukkitValues", container.toTag())
} else {
tag.remove("PublicBukkitValues")
}
}
}
override fun materialToItem(material: Material): Item =
BuiltInRegistries.ITEM.getOptional(material.key.toResourceLocation())
.orElseThrow { IllegalArgumentException("Material is not item!") }
override fun itemToMaterial(item: Item) =
Material.getMaterial(BuiltInRegistries.ITEM.getKey(item).path.uppercase())
?: throw IllegalArgumentException("Invalid material!")
override fun toNMS(player: Player): ServerPlayer {
return (player as CraftPlayer).handle
}
override fun toNMS(component: Component): net.minecraft.network.chat.Component {
val json = JSONComponentSerializer.json().serialize(component)
return net.minecraft.network.chat.Component.Serializer.fromJson(json)!!
}
}
}

View File

@@ -1,68 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.packet.Packet
import com.willfp.eco.core.packet.sendPacket
import com.willfp.eco.internal.spigot.proxy.DisplayNameProxy
import com.willfp.eco.internal.spigot.proxy.common.toNMS
import io.papermc.paper.adventure.PaperAdventure
import net.kyori.adventure.text.Component
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket
import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.world.entity.Entity
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftLivingEntity
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftMob
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Mob
import org.bukkit.entity.Player
import java.util.Optional
@Suppress("UNCHECKED_CAST")
class DisplayName : DisplayNameProxy {
private val displayNameAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[2]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Optional<net.minecraft.network.chat.Component>>
private val customNameVisibleAccessor = Entity::class.java
.declaredFields
.filter { it.type == EntityDataAccessor::class.java }
.toList()[3]
.apply { isAccessible = true }
.get(null) as EntityDataAccessor<Boolean>
override fun setClientsideDisplayName(entity: LivingEntity, player: Player, displayName: Component, visible: Boolean) {
if (entity !is CraftLivingEntity) {
return
}
val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData(nmsEntity)
entityData.forceSet(displayNameAccessor, Optional.of(nmsComponent))
entityData.forceSet(customNameVisibleAccessor, visible)
val packet = ClientboundSetEntityDataPacket(
nmsEntity.id,
entityData.packDirty() ?: throw IllegalStateException("No packed entity data")
)
player.sendPacket(Packet(packet))
}
private fun <T: Any> SynchedEntityData.forceSet(
accessor: EntityDataAccessor<T>,
value: T
) {
if (!this.hasItem(accessor)) {
this.define(accessor, value)
}
this[accessor] = value
this.markDirty(accessor)
}
}

View File

@@ -1,16 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.internal.entities.EcoDummyEntity
import com.willfp.eco.internal.spigot.proxy.DummyEntityFactoryProxy
import org.bukkit.Location
import org.bukkit.craftbukkit.v1_20_R3.CraftWorld
import org.bukkit.entity.Entity
import org.bukkit.entity.EntityType
import org.bukkit.entity.Zombie
class DummyEntityFactory : DummyEntityFactoryProxy {
override fun createDummyEntity(location: Location): Entity {
val world = location.world as CraftWorld
return EcoDummyEntity(world.createEntity(location, Zombie::class.java))
}
}

View File

@@ -1,12 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.entities.ai.EntityController
import com.willfp.eco.internal.spigot.proxy.EntityControllerFactoryProxy
import com.willfp.eco.internal.spigot.proxy.v1_20_R3.entity.EcoEntityController
import org.bukkit.entity.Mob
class EntityControllerFactory : EntityControllerFactoryProxy {
override fun <T : Mob> createEntityController(entity: T): EntityController<T> {
return EcoEntityController(entity)
}
}

View File

@@ -1,82 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.data.ExtendedPersistentDataContainer
import com.willfp.eco.internal.spigot.proxy.ExtendedPersistentDataContainerFactoryProxy
import net.minecraft.nbt.Tag
import org.bukkit.Material
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_20_R3.persistence.CraftPersistentDataContainer
import org.bukkit.craftbukkit.v1_20_R3.persistence.CraftPersistentDataTypeRegistry
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataContainer
import org.bukkit.persistence.PersistentDataType
class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy {
private val registry: CraftPersistentDataTypeRegistry
init {
/*
Can't grab actual instance since it's in CraftMetaItem (which is package-private)
And getting it would mean more janky reflection
*/
val item = CraftItemStack.asCraftCopy(ItemStack(Material.STONE))
val pdc = item.itemMeta!!.persistentDataContainer
this.registry = CraftPersistentDataContainer::class.java.getDeclaredField("registry")
.apply { isAccessible = true }.get(pdc) as CraftPersistentDataTypeRegistry
}
override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer {
return when (pdc) {
is CraftPersistentDataContainer -> EcoPersistentDataContainer(pdc)
else -> throw IllegalArgumentException("Custom PDC instance ims not supported!")
}
}
override fun newPdc(): PersistentDataContainer {
return CraftPersistentDataContainer(registry)
}
inner class EcoPersistentDataContainer(
private val handle: CraftPersistentDataContainer
) : ExtendedPersistentDataContainer {
@Suppress("UNCHECKED_CAST")
private val customDataTags: MutableMap<String, Tag> =
CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags")
.apply { isAccessible = true }.get(handle) as MutableMap<String, Tag>
override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) {
customDataTags[key] =
registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, handle.adapterContext))
}
override fun <T : Any, Z : Any> has(key: String, dataType: PersistentDataType<T, Z>): Boolean {
val value = customDataTags[key] ?: return false
return registry.isInstanceOf(dataType.primitiveType, value)
}
override fun <T : Any, Z : Any> get(key: String, dataType: PersistentDataType<T, Z>): Z? {
val value = customDataTags[key] ?: return null
return dataType.fromPrimitive(registry.extract(dataType.primitiveType, value), handle.adapterContext)
}
override fun <T : Any, Z : Any> getOrDefault(
key: String,
dataType: PersistentDataType<T, Z>,
defaultValue: Z
): Z {
return get(key, dataType) ?: defaultValue
}
override fun remove(key: String) {
customDataTags.remove(key)
}
override fun getAllKeys(): MutableSet<String> {
return customDataTags.keys
}
override fun getBase(): PersistentDataContainer {
return handle
}
}
}

View File

@@ -1,12 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.fast.FastItemStack
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
import com.willfp.eco.internal.spigot.proxy.common.item.EcoFastItemStack
import org.bukkit.inventory.ItemStack
class FastItemStackFactory : FastItemStackFactoryProxy {
override fun create(itemStack: ItemStack): FastItemStack {
return EcoFastItemStack(itemStack)
}
}

View File

@@ -1,33 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.display.Display
import com.willfp.eco.internal.spigot.proxy.MiniMessageTranslatorProxy
import com.willfp.eco.util.toLegacy
import net.kyori.adventure.text.minimessage.MiniMessage
class MiniMessageTranslator : MiniMessageTranslatorProxy {
override fun format(message: String): String {
var mut = message
val startsWithPrefix = mut.startsWith(Display.PREFIX)
if (startsWithPrefix) {
mut = mut.substring(2)
}
mut = mut.replace('§', '&')
val miniMessage = runCatching {
MiniMessage.miniMessage().deserialize(
mut
).toLegacy()
}.getOrNull() ?: mut
mut = if (startsWithPrefix) {
Display.PREFIX + miniMessage
} else {
miniMessage
}
return mut
}
}

View File

@@ -1,46 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.packet.PacketListener
import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketAutoRecipe
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketHeldItemSlot
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketOpenWindowMerchant
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetCreativeSlot
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetSlot
import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketWindowItems
import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.clearFrames
import net.minecraft.network.protocol.Packet
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer
import org.bukkit.entity.Player
class PacketHandler : PacketHandlerProxy {
override fun sendPacket(player: Player, packet: com.willfp.eco.core.packet.Packet) {
if (player !is CraftPlayer) {
return
}
val handle = packet.handle
if (handle !is Packet<*>) {
return
}
player.handle.connection.send(handle)
}
override fun clearDisplayFrames() {
clearFrames()
}
override fun getPacketListeners(plugin: EcoPlugin): List<PacketListener> {
return listOf(
PacketAutoRecipe(plugin),
PacketHeldItemSlot,
PacketOpenWindowMerchant,
PacketSetCreativeSlot,
PacketSetSlot,
PacketWindowItems(plugin)
)
}
}

View File

@@ -1,52 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.core.items.TestableItem
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.internal.spigot.proxy.SNBTConverterProxy
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.SnbtPrinterTagVisitor
import net.minecraft.nbt.TagParser
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack
import org.bukkit.inventory.ItemStack
class SNBTConverter : SNBTConverterProxy {
override fun fromSNBT(snbt: String): ItemStack? {
val nbt = runCatching { TagParser.parseTag(snbt) }.getOrNull() ?: return null
val nms = net.minecraft.world.item.ItemStack.of(nbt)
return CraftItemStack.asBukkitCopy(nms)
}
override fun toSNBT(itemStack: ItemStack): String {
val nms = CraftItemStack.asNMSCopy(itemStack)
return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag()))
}
override fun makeSNBTTestable(snbt: String): TestableItem {
val nbt = runCatching { TagParser.parseTag(snbt) }.getOrNull() ?: return EmptyTestableItem()
val nms = net.minecraft.world.item.ItemStack.of(nbt)
if (nms == net.minecraft.world.item.ItemStack.EMPTY) {
return EmptyTestableItem()
}
nbt.remove("Count")
return SNBTTestableItem(CraftItemStack.asBukkitCopy(nms), nbt)
}
class SNBTTestableItem(
private val item: ItemStack,
private val tag: CompoundTag
) : TestableItem {
override fun matches(itemStack: ItemStack?): Boolean {
if (itemStack == null) {
return false
}
val nms = CraftItemStack.asNMSCopy(itemStack)
val nmsTag = nms.save(CompoundTag())
nmsTag.remove("Count")
return tag.copy().merge(nmsTag) == nmsTag && itemStack.type == item.type
}
override fun getItem(): ItemStack = item
}
}

View File

@@ -1,18 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.internal.spigot.proxy.SkullProxy
import com.willfp.eco.internal.spigot.proxy.common.texture
import org.bukkit.inventory.meta.SkullMeta
class Skull : SkullProxy {
override fun setSkullTexture(
meta: SkullMeta,
base64: String
) {
meta.texture = base64
}
override fun getSkullTexture(
meta: SkullMeta
): String? = meta.texture
}

View File

@@ -1,11 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.internal.spigot.proxy.TPSProxy
import org.bukkit.Bukkit
import org.bukkit.craftbukkit.v1_20_R3.CraftServer
class TPS : TPSProxy {
override fun getTPS(): Double {
return (Bukkit.getServer() as CraftServer).handle.server.recentTps[0]
}
}

View File

@@ -1,95 +0,0 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3.entity
import com.willfp.eco.core.entities.ai.CustomGoal
import com.willfp.eco.core.entities.ai.EntityController
import com.willfp.eco.core.entities.ai.EntityGoal
import com.willfp.eco.core.entities.ai.TargetGoal
import com.willfp.eco.internal.spigot.proxy.common.ai.CustomGoalFactory
import com.willfp.eco.internal.spigot.proxy.common.ai.getGoalFactory
import com.willfp.eco.internal.spigot.proxy.common.toPathfinderMob
import net.minecraft.world.entity.PathfinderMob
import net.minecraft.world.entity.ai.goal.Goal
import org.bukkit.entity.Mob
class EcoEntityController<T : Mob>(
private val handle: T
) : EntityController<T> {
override fun addEntityGoal(priority: Int, goal: EntityGoal<in T>): EntityController<T> {
val nms = getNms() ?: return this
nms.goalSelector.addGoal(
priority,
goal.getGoalFactory()?.create(goal, nms) ?: return this
)
return this
}
override fun removeEntityGoal(goal: EntityGoal<in T>): EntityController<T> {
val nms = getNms() ?: return this
val predicate: (Goal) -> Boolean = if (goal is CustomGoal<*>) {
{ CustomGoalFactory.isGoalOfType(it, goal) }
} else {
{ goal.getGoalFactory()?.isGoalOfType(it) == true }
}
for (wrapped in nms.goalSelector.availableGoals.toSet()) {
if (predicate(wrapped.goal)) {
nms.goalSelector.removeGoal(wrapped.goal)
}
}
return this
}
override fun clearEntityGoals(): EntityController<T> {
val nms = getNms() ?: return this
nms.goalSelector.availableGoals.clear()
return this
}
override fun addTargetGoal(priority: Int, goal: TargetGoal<in T>): EntityController<T> {
val nms = getNms() ?: return this
nms.targetSelector.addGoal(
priority, goal.getGoalFactory()?.create(goal, nms) ?: return this
)
nms.targetSelector
return this
}
override fun removeTargetGoal(goal: TargetGoal<in T>): EntityController<T> {
val nms = getNms() ?: return this
val predicate: (Goal) -> Boolean = if (goal is CustomGoal<*>) {
{ CustomGoalFactory.isGoalOfType(it, goal) }
} else {
{ goal.getGoalFactory()?.isGoalOfType(it) == true }
}
for (wrapped in nms.targetSelector.availableGoals.toSet()) {
if (predicate(wrapped.goal)) {
nms.targetSelector.removeGoal(wrapped.goal)
}
}
return this
}
override fun clearTargetGoals(): EntityController<T> {
val nms = getNms() ?: return this
nms.targetSelector.availableGoals.clear()
return this
}
private fun getNms(): PathfinderMob? {
return handle.toPathfinderMob()
}
override fun getEntity(): T {
return handle
}
}

View File

@@ -40,15 +40,17 @@ dependencies {
compileOnly("com.github.jiangdashao:matrix-api-repo:317d4635fd") compileOnly("com.github.jiangdashao:matrix-api-repo:317d4635fd")
compileOnly("com.gmail.nossr50.mcMMO:mcMMO:2.1.202") compileOnly("com.gmail.nossr50.mcMMO:mcMMO:2.1.202")
compileOnly("me.clip:placeholderapi:2.11.4") compileOnly("me.clip:placeholderapi:2.11.4")
compileOnly("com.github.oraxen:oraxen:1.155.0")
compileOnly("com.github.brcdev-minecraft:shopgui-api:3.0.0") compileOnly("com.github.brcdev-minecraft:shopgui-api:3.0.0")
compileOnly("com.github.LoneDev6:API-ItemsAdder:2.4.7") compileOnly("com.github.LoneDev6:API-ItemsAdder:2.4.7")
compileOnly("com.arcaniax:HeadDatabase-API:1.3.1") compileOnly("com.arcaniax:HeadDatabase-API:1.3.1")
compileOnly("com.gmail.filoghost.holographicdisplays:holographicdisplays-api:2.4.0") compileOnly("com.gmail.filoghost.holographicdisplays:holographicdisplays-api:2.4.0")
compileOnly("com.github.EssentialsX:Essentials:2.18.2") compileOnly("com.github.EssentialsX:Essentials:2.20.0")
compileOnly("com.bgsoftware:SuperiorSkyblockAPI:1.8.3") compileOnly("com.bgsoftware:SuperiorSkyblockAPI:1.8.3")
compileOnly("com.github.MilkBowl:VaultAPI:1.7") compileOnly("com.github.MilkBowl:VaultAPI:1.7")
compileOnly("com.github.WhipDevelopment:CrashClaim:f9cd7d92eb") compileOnly("com.github.WhipDevelopment:CrashClaim:f9cd7d92eb")
compileOnly("com.github.decentsoftware-eu:decentholograms:2.8.5") compileOnly("com.wolfyscript.wolfyutilities:wolfyutilities:3.16.0.0")
compileOnly("com.github.decentsoftware-eu:decentholograms:2.1.2")
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("org.black_ixx:playerpoints:3.2.5") compileOnly("org.black_ixx:playerpoints:3.2.5")
@@ -61,7 +63,6 @@ dependencies {
compileOnly("com.denizenscript:denizen:1.2.7-SNAPSHOT") { compileOnly("com.denizenscript:denizen:1.2.7-SNAPSHOT") {
exclude(group = "*", module = "*") exclude(group = "*", module = "*")
} }
compileOnly("com.iridium:IridiumSkyblock:4.0.8")
compileOnly(fileTree("../../lib") { compileOnly(fileTree("../../lib") {
include("*.jar") include("*.jar")

View File

@@ -352,5 +352,7 @@ class EcoImpl : EcoSpigotPlugin(), Eco {
placeholderParser.getPlaceholderResult(plugin, args, context) placeholderParser.getPlaceholderResult(plugin, args, context)
override fun setClientsideDisplayName(entity: LivingEntity, player: Player, name: Component, visible: Boolean) = override fun setClientsideDisplayName(entity: LivingEntity, player: Player, name: Component, visible: Boolean) =
this.getProxy(DisplayNameProxy::class.java).setClientsideDisplayName(entity, player, name, visible) if (Prerequisite.HAS_PAPER.isMet && Prerequisite.HAS_1_20.isMet)
this.getProxy(DisplayNameProxy::class.java).setClientsideDisplayName(entity, player, name, visible)
else Unit
} }

View File

@@ -261,8 +261,6 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
profileHandler.migrateIfNeeded() profileHandler.migrateIfNeeded()
} }
profileHandler.startAutosaving()
ProfileSaver(this, profileHandler).startTicking() ProfileSaver(this, profileHandler).startTicking()
this.scheduler.runTimer( this.scheduler.runTimer(

View File

@@ -169,17 +169,4 @@ class ProfileHandler(
localHandler.initialize() localHandler.initialize()
} }
} }
fun startAutosaving() {
if (!plugin.configYml.getBool("yaml.autosave")) {
return
}
val interval = plugin.configYml.getInt("yaml.autosave-interval") * 20L
plugin.scheduler.runTimer(20, interval) {
handler.saveAsync()
localHandler.saveAsync()
}
}
} }

View File

@@ -27,10 +27,6 @@ abstract class DataHandler(
} }
open fun saveAsync() {
}
open fun initialize() { open fun initialize() {
} }

View File

@@ -18,10 +18,6 @@ class YamlDataHandler(
dataYml.save() dataYml.save()
} }
override fun saveAsync() {
dataYml.saveAsync()
}
override fun <T : Any> read(uuid: UUID, key: PersistentDataKey<T>): T? { override fun <T : Any> read(uuid: UUID, key: PersistentDataKey<T>): T? {
// Separate `as T?` for each branch to prevent compiler warnings. // Separate `as T?` for each branch to prevent compiler warnings.
val value = when (key.type) { val value = when (key.type) {

View File

@@ -1,7 +1,7 @@
package com.willfp.eco.internal.spigot.integrations.antigrief package com.willfp.eco.internal.spigot.integrations.antigrief
import com.iridium.iridiumskyblock.PermissionType
import com.iridium.iridiumskyblock.api.IridiumSkyblockAPI import com.iridium.iridiumskyblock.api.IridiumSkyblockAPI
import com.iridium.iridiumteams.PermissionType
import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.block.Block import org.bukkit.block.Block
@@ -49,13 +49,8 @@ class AntigriefIridiumSkyblock : AntigriefIntegration {
} }
override fun canPickupItem(player: Player, location: Location): Boolean { override fun canPickupItem(player: Player, location: Location): Boolean {
return true
/*
val api = IridiumSkyblockAPI.getInstance() val api = IridiumSkyblockAPI.getInstance()
return api.getIslandPermission(api.getIslandViaLocation(location).orElse(null) ?: return true, api.getUser(player), PermissionType.PICKUP_ITEMS) return api.getIslandPermission(api.getIslandViaLocation(location).orElse(null) ?: return true, api.getUser(player), PermissionType.PICKUP_ITEMS)
PICKUP_ITEMS was removed in Iridium v4
*/
} }
override fun getPluginName(): String { override fun getPluginName(): String {

View File

@@ -7,7 +7,7 @@ import org.bukkit.Location
import java.util.UUID import java.util.UUID
class HologramDecentHolograms : HologramIntegration { class HologramDecentHolograms : HologramIntegration {
override fun createHologram(location: Location, contents: List<String>): Hologram { override fun createHologram(location: Location, contents: MutableList<String>): Hologram {
val id = UUID.randomUUID().toString() val id = UUID.randomUUID().toString()
DHAPI.createHologram(id, location, contents) DHAPI.createHologram(id, location, contents)
@@ -26,7 +26,7 @@ class HologramDecentHolograms : HologramIntegration {
DHAPI.getHologram(id)?.destroy() DHAPI.getHologram(id)?.destroy()
} }
override fun setContents(contents: List<String>) { override fun setContents(contents: MutableList<String>) {
DHAPI.setHologramLines(DHAPI.getHologram(id), contents) DHAPI.setHologramLines(DHAPI.getHologram(id), contents)
} }
} }

View File

@@ -30,10 +30,6 @@ mysql:
user: username user: username
password: passy password: passy
yaml:
autosave: true # If data should be saved automatically
autosave-interval: 1800 # How often data should be saved (in seconds)
# How many ticks to wait between committing data to a database. This doesn't # How many ticks to wait between committing data to a database. This doesn't
# affect yaml storage, only MySQL and MongoDB. By default, data is committed # affect yaml storage, only MySQL and MongoDB. By default, data is committed
# every tick, but you can increase this to be every x ticks, for example 20 # every tick, but you can increase this to be every x ticks, for example 20

View File

@@ -2,7 +2,6 @@ multiple-in-craft: '&l&c! &fThis recipe requires &a%amount%&f of this item.'
# Specify default display names for prices made through ConfiguredPrice#create # Specify default display names for prices made through ConfiguredPrice#create
# These will override any custom configured price display names. # These will override any custom configured price display names.
# You can use %value% and %value_commas% as placeholders.
price-display: price-display:
- type: example_type - type: example_type
display: "&e%value% Price" display: "&e%value% Price"

View File

@@ -5,24 +5,18 @@ api-version: 1.17
authors: [ Auxilor ] authors: [ Auxilor ]
website: willfp.com website: willfp.com
load: STARTUP load: STARTUP
# Fixes some plugins breaking load order
loadbefore:
- Spartan
- CustomCrafting
- Lands
- EconomyShopGUI
- EconomyShopGUI-Premium
softdepend: softdepend:
- ProtocolLib - ProtocolLib
- WorldGuard - WorldGuard
- GriefPrevention - GriefPrevention
- Towny - Towny
- FactionsUUID - FactionsUUID
- Lands
- Kingdoms - Kingdoms
- NoCheatPlus - NoCheatPlus
- AAC - AAC
- Matrix - Matrix
- Spartan
- Vulcan - Vulcan
- PlaceholderAPI - PlaceholderAPI
- mcMMO - mcMMO
@@ -46,8 +40,11 @@ softdepend:
- CrashClaim - CrashClaim
- DecentHolograms - DecentHolograms
- MythicMobs - MythicMobs
- CustomCrafting
- ExecutableItems - ExecutableItems
- RPGHorses - RPGHorses
- EconomyShopGUI
- EconomyShopGUI-Premium
- zShop - zShop
- DeluxeSellwands - DeluxeSellwands
- Scyther - Scyther

View File

@@ -1,2 +1,2 @@
version = 6.68.2 version = 6.67.0
kotlin.incremental.useClasspathSnapshot=false kotlin.incremental.useClasspathSnapshot=false

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -20,7 +20,6 @@ include(":eco-core:core-nms:v1_19_R2")
include(":eco-core:core-nms:v1_19_R3") include(":eco-core:core-nms:v1_19_R3")
include(":eco-core:core-nms:v1_20_R1") include(":eco-core:core-nms:v1_20_R1")
include(":eco-core:core-nms:v1_20_R2") include(":eco-core:core-nms:v1_20_R2")
include(":eco-core:core-nms:v1_20_R3")
include(":eco-core:core-proxy") include(":eco-core:core-proxy")
include(":eco-core:core-plugin") include(":eco-core:core-plugin")
include(":eco-core:core-backend") include(":eco-core:core-backend")