diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 997fd551..9ce04621 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,38 +3,37 @@ anvilgui = "1.10.3-SNAPSHOT" compose = "1.8.2" coroutines = "1.10.2" # @pin -creative = "1.9.4" +creative = "1.11.8" customblockdata = "2.2.4" dataframe = "0.15.0" dependencyversions = "0.52.0" -dokka = "2.0.0" +dokka = "2.1.0" exposed = "1.0.0-beta-3" -fastutil = "8.5.16" -fawe = "2.13.0" -itemsadder = "3.6.1" +fastutil = "8.5.18" +fawe = "2.14.3" java = "21" junit = "5.12.0" jvm-for-kotlin-multiplatform = "21" -kaml = "0.85.0" -kotest = "6.0.0.M4" +kaml = "0.104.0" +kotest = "6.0.7" # ENSURE KOTLIN MATCHES THE VERSION IN GRADLE-CONVENTIONS REPO. # @pin -kotlin = "2.2.0" -kotlinxIO = "0.8.0" -logback = "1.5.18" +kotlin = "2.3.0" +kotlinxIO = "0.8.2" +logback = "1.5.23" mccoroutine = "2.22.0" # @pin -minecraft = "1.21.8-R0.1-SNAPSHOT" +minecraft = "1.21.11-R0.1-SNAPSHOT" mockbukkit = "4.64.0" -mockk = "1.14.4" -modelengine = "R4.0.9" +mockk = "1.14.7" +modelengine = "R4.1.0" morepersistentdatatypes = "2.4.0" -mythic-dist = "5.9.5" -mythiccrucible = "2.2.0-SNAPSHOT" -nexo = "1.8.0" +mythic-dist = "5.11.0" +mythiccrucible = "2.4.0-SNAPSHOT" +nexo = "1.17.0" reflections = "0.10.2" -serialization = "1.9.0" -shadowjar = "9.0.1" +serialization = "1.10.0-RC" +shadowjar = "9.3.0" sqlite-jdbc = "3.50.2.0" sqlite = "2.5.2" vault = "1.7" @@ -79,9 +78,7 @@ minecraft-papermc = { module = "io.papermc.paper:paper-api", version.ref = "mine #minecraft-cartridge = { module = "com.mineinabyss.cartridge:cartridge-api", version.ref = "minecraft" } minecraft-plugin-fawe-bukkit = { module = "com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit", version.ref = "fawe" } minecraft-plugin-fawe-core = { module = "com.fastasyncworldedit:FastAsyncWorldEdit-Core", version.ref = "fawe" } -minecraft-plugin-itemsadder = { module = "com.github.LoneDev6:api-itemsadder", version.ref = "itemsadder" } minecraft-plugin-modelengine = { module = "com.ticxo.modelengine:ModelEngine", version.ref = "modelengine" } -minecraft-plugin-mythic-crucible = { module = "io.lumine:MythicCrucible", version.ref = "mythiccrucible" } minecraft-plugin-mythic-dist = { module = "io.lumine:Mythic-Dist", version.ref = "mythic-dist" } minecraft-plugin-nexo = { module = "com.nexomc:nexo", version.ref = "nexo" } minecraft-plugin-vault = { module = "com.github.MilkBowl:VaultAPI", version.ref = "vault" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2a84e188..bad7c246 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/Packets.kt b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/Packets.kt index 23256219..d4b49f09 100644 --- a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/Packets.kt +++ b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/Packets.kt @@ -8,9 +8,7 @@ import it.unimi.dsi.fastutil.ints.IntList import net.kyori.adventure.key.Key import net.minecraft.network.Connection import net.minecraft.network.protocol.Packet -import net.minecraft.network.protocol.game.ClientGamePacketListener -import net.minecraft.resources.ResourceLocation -import net.minecraft.server.network.ServerGamePacketListenerImpl +import net.minecraft.resources.Identifier import net.minecraft.tags.TagNetworkSerialization.NetworkPayload import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin @@ -55,8 +53,8 @@ fun JavaPlugin.interceptServerbound(key: String = "read_packet_interceptor", int private val networkPayloadTagsField = NetworkPayload::class.java.getDeclaredField("tags").also { it.isAccessible = true } private val networkPayloadConstructor = NetworkPayload::class.java.declaredConstructors.first().also { it.isAccessible = true } -fun NetworkPayload.tags() = (networkPayloadTagsField.get(this) as Map).toMutableMap() -fun Map.networkPayload() = networkPayloadConstructor.newInstance(this) as NetworkPayload +fun NetworkPayload.tags() = (networkPayloadTagsField.get(this) as Map).toMutableMap() +fun Map.networkPayload() = networkPayloadConstructor.newInstance(this) as NetworkPayload object PacketListener { diff --git a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/aliases/EntityAliases.kt b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/aliases/EntityAliases.kt index be0ad066..d0c637c3 100644 --- a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/aliases/EntityAliases.kt +++ b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/aliases/EntityAliases.kt @@ -2,7 +2,7 @@ package com.mineinabyss.idofront.nms.aliases import net.minecraft.server.level.ServerPlayer import net.minecraft.world.entity.* -import net.minecraft.world.entity.projectile.Snowball +import net.minecraft.world.entity.projectile.throwableitemprojectile.Snowball import org.bukkit.entity.Creature typealias NMSEntity = Entity diff --git a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/OfflinePDC.kt b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/OfflinePDC.kt index 50dcb9f1..f63a9266 100644 --- a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/OfflinePDC.kt +++ b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/OfflinePDC.kt @@ -2,6 +2,7 @@ package com.mineinabyss.idofront.nms.nbt import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.NbtIo +import net.minecraft.server.players.NameAndId import net.minecraft.util.ProblemReporter import org.bukkit.Bukkit import org.bukkit.OfflinePlayer @@ -15,7 +16,7 @@ import kotlin.jvm.optionals.getOrNull * Gets the PlayerData from file for this UUID. */ fun OfflinePlayer.getOfflinePlayerData(): CompoundTag? = - (Bukkit.getServer() as CraftServer).server.playerDataStorage.load(name ?: "Unknown Player Name", uniqueId.toString(), ProblemReporter.DISCARDING).getOrNull() + (Bukkit.getServer() as CraftServer).server.playerDataStorage.load(NameAndId(uniqueId, name ?: "Unknown Player Name")).getOrNull() /** * Gets a copy of the WrappedPDC for this OfflinePlayer. diff --git a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/WrappedPDC.kt b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/WrappedPDC.kt index 51ea27d1..365536b5 100644 --- a/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/WrappedPDC.kt +++ b/idofront-nms/src/main/kotlin/com/mineinabyss/idofront/nms/nbt/WrappedPDC.kt @@ -77,6 +77,10 @@ class WrappedPDC( } } + override fun getSize(): Int { + return compoundTag.size() + } + override fun readFromBytes(bytes: ByteArray, clear: Boolean) { if (clear) compoundTag.keySet().forEach(compoundTag::remove) DataInputStream(ByteArrayInputStream(bytes)).use { dataInput -> diff --git a/idofront-serializers/build.gradle.kts b/idofront-serializers/build.gradle.kts index 4c2beb4c..224d3309 100644 --- a/idofront-serializers/build.gradle.kts +++ b/idofront-serializers/build.gradle.kts @@ -10,9 +10,7 @@ dependencies { compileOnly(libs.kotlinx.serialization.json) compileOnly(libs.kotlinx.serialization.kaml) compileOnly(libs.minecraft.plugin.mythic.dist) - compileOnly(libs.minecraft.plugin.mythic.crucible) compileOnly(libs.minecraft.plugin.nexo) - compileOnly(libs.minecraft.plugin.itemsadder) compileOnly(libs.creative.api) { isTransitive = true } implementation(projects.idofrontUtil) implementation(projects.idofrontLogging) diff --git a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/JukeboxPlayableSerializer.kt b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/JukeboxPlayableSerializer.kt deleted file mode 100644 index 3fe04026..00000000 --- a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/JukeboxPlayableSerializer.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.mineinabyss.idofront.serialization - -import io.papermc.paper.registry.RegistryAccess -import io.papermc.paper.registry.RegistryKey -import kotlinx.serialization.KSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import net.kyori.adventure.key.Key -import org.bukkit.Material -import org.bukkit.NamespacedKey -import org.bukkit.Registry -import org.bukkit.inventory.ItemStack -import org.bukkit.inventory.meta.components.FoodComponent -import org.bukkit.inventory.meta.components.JukeboxPlayableComponent - -@Serializable -@SerialName("JukeboxPlayable") -private class JukeboxPlayableSurrogate( - val song: @Serializable(KeySerializer::class) Key, - val showInTooltip: Boolean = true -) { - init { - val registry = RegistryAccess.registryAccess().getRegistry(RegistryKey.JUKEBOX_SONG) - require(registry.get(song) != null) { "Invalid song $song, valid ones are ${registry.map { it.key() }.joinToString()}" } - } -} - -object JukeboxPlayableSerializer : KSerializer { - override val descriptor: SerialDescriptor = JukeboxPlayableSurrogate.serializer().descriptor - override fun serialize(encoder: Encoder, value: JukeboxPlayableComponent) { - val surrogate = JukeboxPlayableSurrogate(value.songKey, value.isShowInTooltip) - encoder.encodeSerializableValue(JukeboxPlayableSurrogate.serializer(), surrogate) - } - - override fun deserialize(decoder: Decoder): JukeboxPlayableComponent { - return ItemStack(Material.MUSIC_DISC_CREATOR).itemMeta.jukeboxPlayable.apply { - val surrogate = decoder.decodeSerializableValue(JukeboxPlayableSurrogate.serializer()) - songKey = NamespacedKey.fromString(surrogate.song.asString())!! - isShowInTooltip = surrogate.showInTooltip - } - } -} \ No newline at end of file diff --git a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableDataTypes.kt b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableDataTypes.kt index 6f53885f..eff7bf72 100644 --- a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableDataTypes.kt +++ b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableDataTypes.kt @@ -1,9 +1,12 @@ package com.mineinabyss.idofront.serialization import com.mineinabyss.idofront.serialization.SerializableDataTypes.ConsumeEffect.ClearAllEffectsConsumeEffect.toSerializable +import com.mineinabyss.idofront.serialization.SerializableDataTypes.Profile.ProfileProperty +import com.nexomc.nexo.utils.ticks import io.papermc.paper.datacomponent.DataComponentType import io.papermc.paper.datacomponent.DataComponentTypes import io.papermc.paper.datacomponent.item.* +import io.papermc.paper.datacomponent.item.Equippable.equippable import io.papermc.paper.datacomponent.item.MapDecorations.DecorationEntry import io.papermc.paper.datacomponent.item.Tool.Rule import io.papermc.paper.datacomponent.item.consumable.ItemUseAnimation @@ -30,6 +33,7 @@ import org.bukkit.inventory.meta.trim.ArmorTrim import org.bukkit.map.MapCursor import org.bukkit.potion.PotionEffect import org.bukkit.potion.PotionEffectType +import java.util.UUID import kotlin.time.Duration import kotlin.time.DurationUnit @@ -554,7 +558,7 @@ object SerializableDataTypes { @Serializable data class Consumable( val duration: @Serializable(DurationSerializer::class) Duration = 1.6f.toDuration(DurationUnit.SECONDS), - val sound: @Serializable(KeySerializer::class) Key? = Sound.ENTITY_GENERIC_EAT.key(), + val sound: @Serializable(KeySerializer::class) Key? = Registry.SOUNDS.getKey(Sound.ENTITY_GENERIC_EAT), val animation: ItemUseAnimation = ItemUseAnimation.EAT, val particles: Boolean = true, val consumeEffects: List = listOf() @@ -631,14 +635,14 @@ object SerializableDataTypes { val slot: EquipmentSlot, val model: @Serializable(KeySerializer::class) Key? = null, val cameraOverlay: @Serializable(KeySerializer::class) Key? = null, - val equipSound: @Serializable(KeySerializer::class) Key? = Sound.ITEM_ARMOR_EQUIP_GENERIC.key(), + val equipSound: @Serializable(KeySerializer::class) Key? = Registry.SOUNDS.getKey(Sound.ITEM_ARMOR_EQUIP_GENERIC), val allowedEntities: List? = null, val damageOnHurt: Boolean = true, val swappable: Boolean = true, val dispensable: Boolean = true, val equipOnInteract: Boolean = true, val canBeSheared: Boolean = true, - val shearingsound: @Serializable(KeySerializer::class) Key? = Sound.ITEM_SHEARS_SNIP.key() + val shearingsound: @Serializable(KeySerializer::class) Key? = Registry.SOUNDS.getKey(Sound.ITEM_SHEARS_SNIP) ) : DataType { constructor(equippable: io.papermc.paper.datacomponent.item.Equippable) : this( equippable.slot(), equippable.assetId(), equippable.cameraOverlay(), equippable.equipSound(), @@ -763,7 +767,120 @@ object SerializableDataTypes { } } + @Serializable + data class Profile(val name: String?, val uuid: @Serializable(UUIDSerializer::class) UUID?, val properties: List) : DataType { + + constructor(profile: ResolvableProfile) : this(profile.name(), profile.uuid(), profile.properties().map(::ProfileProperty)) + + override fun setDataType(itemStack: ItemStack) { + val profile = ResolvableProfile.resolvableProfile() + .name(name).uuid(uuid) + .addProperties(properties.map { it.toPaper() }) + itemStack.setData(DataComponentTypes.PROFILE, profile.build()) + } + + @Serializable + data class ProfileProperty(val name: String, val value: String, val signature: String? = null) { + + constructor(property: com.destroystokyo.paper.profile.ProfileProperty) : this(property.name, property.value, property.signature) + + fun toPaper(): com.destroystokyo.paper.profile.ProfileProperty { + return com.destroystokyo.paper.profile.ProfileProperty(name, value, signature) + } + } + } + + @Serializable + data class KineticWeapon( + val delay: @Serializable(DurationSerializer::class) Duration, + val contactDelay: @Serializable(DurationSerializer::class) Duration, + val forwardMovement: Float, val damageMultiplier: Float, + val sound: Key?, val hitSound: Key?, + val damageConditions: Condition?, + val dismountConditions: Condition?, + val knockbackConditions: Condition? + ) : DataType { + + constructor(kineticWeapon: io.papermc.paper.datacomponent.item.KineticWeapon) : this( + kineticWeapon.delayTicks().ticks, kineticWeapon.contactCooldownTicks().ticks, + kineticWeapon.forwardMovement(), kineticWeapon.damageMultiplier(), + kineticWeapon.sound(), kineticWeapon.hitSound(), + kineticWeapon.damageConditions()?.let(::Condition), + kineticWeapon.dismountConditions()?.let(::Condition), + kineticWeapon.knockbackConditions()?.let(::Condition), + ) + + override fun setDataType(itemStack: ItemStack) { + val kinetic = io.papermc.paper.datacomponent.item.KineticWeapon.kineticWeapon() + .delayTicks(delay.ticks).contactCooldownTicks(contactDelay.ticks) + .forwardMovement(forwardMovement).damageMultiplier(damageMultiplier) + .sound(sound).hitSound(hitSound) + .damageConditions(damageConditions?.toPaper()) + .dismountConditions(dismountConditions?.toPaper()) + .knockbackConditions(knockbackConditions?.toPaper()) + itemStack.setData(DataComponentTypes.KINETIC_WEAPON, kinetic.build()) + } + + @Serializable + data class Condition(val maxDuration: @Serializable(DurationSerializer::class) Duration, val minSpeed: Float = 0f, val minRelativeSpeed: Float = 0f) { + + constructor(condition: io.papermc.paper.datacomponent.item.KineticWeapon.Condition) : this( + condition.maxDurationTicks().ticks, condition.minSpeed(), condition.minRelativeSpeed() + ) + + fun toPaper(): io.papermc.paper.datacomponent.item.KineticWeapon.Condition { + return io.papermc.paper.datacomponent.item.KineticWeapon.condition(maxDuration.ticks, minSpeed, minRelativeSpeed) + } + } + } + + @Serializable + data class PiercingWeapon(val dealsKnockback: Boolean = true, val dismounts: Boolean = false, val sound: Key?, val hitSound: Key?) : DataType { + + constructor(piercing: io.papermc.paper.datacomponent.item.PiercingWeapon) : this( + piercing.dealsKnockback(), piercing.dismounts(), piercing.sound(), piercing.hitSound() + ) + + override fun setDataType(itemStack: ItemStack) { + val piercing = io.papermc.paper.datacomponent.item.PiercingWeapon.piercingWeapon() + .dealsKnockback(dealsKnockback).dismounts(dismounts).sound(sound).hitSound(hitSound) + itemStack.setData(DataComponentTypes.PIERCING_WEAPON, piercing.build()) + } + } + + @Serializable + data class SwingAnimation( + val type: io.papermc.paper.datacomponent.item.SwingAnimation.Animation, + val duration: @Serializable(DurationSerializer::class) Duration + ) : DataType { + + constructor(swingAnimation: io.papermc.paper.datacomponent.item.SwingAnimation) : this(swingAnimation.type(), swingAnimation.duration().ticks) + + override fun setDataType(itemStack: ItemStack) { + val swingAnimation = io.papermc.paper.datacomponent.item.SwingAnimation.swingAnimation() + .type(type).duration(duration.ticks).build() + itemStack.setData(DataComponentTypes.SWING_ANIMATION, swingAnimation) + } + } + + @Serializable + data class UseEffects( + val canSprint: Boolean = false, + val speedMultiplier: Float = 0.2f, + val interactVibrations: Boolean = true + ) : DataType { + + constructor(useEffects: io.papermc.paper.datacomponent.item.UseEffects) : this( + useEffects.canSprint(), useEffects.speedMultiplier(), useEffects.interactVibrations() + ) + + override fun setDataType(itemStack: ItemStack) { + val useEffects = io.papermc.paper.datacomponent.item.UseEffects.useEffects() + .canSprint(canSprint).speedMultiplier(speedMultiplier).interactVibrations(interactVibrations).build() + itemStack.setData(DataComponentTypes.USE_EFFECTS, useEffects) + } + } @Serializable data class PotDecorations( diff --git a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStack.kt b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStack.kt index 65f65b51..be5272a3 100644 --- a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStack.kt +++ b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStack.kt @@ -9,32 +9,58 @@ import com.mineinabyss.idofront.serialization.recipes.options.IngredientOption import com.mineinabyss.idofront.textcomponents.miniMsg import com.mineinabyss.idofront.textcomponents.serialize import com.mineinabyss.idofront.util.ifNotEmpty -import com.nexomc.nexo.NexoPlugin import com.nexomc.nexo.api.NexoItems -import dev.lone.itemsadder.api.CustomStack -import io.lumine.mythiccrucible.MythicCrucible +import com.nexomc.protectionlib.ProtectionLib.canBreak +import io.lumine.mythic.bukkit.utils.lib.jooq.impl.DSL.type import io.papermc.paper.datacomponent.DataComponentType import io.papermc.paper.datacomponent.DataComponentTypes +import io.papermc.paper.datacomponent.item.BlocksAttacks.blocksAttacks +import io.papermc.paper.datacomponent.item.BundleContents.bundleContents +import io.papermc.paper.datacomponent.item.ChargedProjectiles.chargedProjectiles +import io.papermc.paper.datacomponent.item.Consumable.consumable +import io.papermc.paper.datacomponent.item.DamageResistant.damageResistant +import io.papermc.paper.datacomponent.item.Enchantable.enchantable +import io.papermc.paper.datacomponent.item.Equippable.equippable +import io.papermc.paper.datacomponent.item.FoodProperties.food import io.papermc.paper.datacomponent.item.ItemLore +import io.papermc.paper.datacomponent.item.JukeboxPlayable.jukeboxPlayable +import io.papermc.paper.datacomponent.item.KineticWeapon.kineticWeapon import io.papermc.paper.datacomponent.item.MapDecorations +import io.papermc.paper.datacomponent.item.MapDecorations.mapDecorations +import io.papermc.paper.datacomponent.item.MapId.mapId +import io.papermc.paper.datacomponent.item.PiercingWeapon.piercingWeapon +import io.papermc.paper.datacomponent.item.PotionContents.potionContents +import io.papermc.paper.datacomponent.item.Repairable.repairable +import io.papermc.paper.datacomponent.item.SwingAnimation +import io.papermc.paper.datacomponent.item.SwingAnimation.swingAnimation +import io.papermc.paper.datacomponent.item.Tool.tool +import io.papermc.paper.datacomponent.item.TooltipDisplay.tooltipDisplay +import io.papermc.paper.datacomponent.item.UseCooldown.useCooldown +import io.papermc.paper.datacomponent.item.UseRemainder.useRemainder +import io.papermc.paper.datacomponent.item.Weapon.weapon import io.papermc.paper.item.MapPostProcessing import io.papermc.paper.registry.RegistryAccess import io.papermc.paper.registry.RegistryKey import kotlinx.serialization.Contextual -import kotlinx.serialization.* +import kotlinx.serialization.EncodeDefault import kotlinx.serialization.EncodeDefault.Mode.NEVER +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import kotlinx.serialization.UseSerializers import net.kyori.adventure.key.Key import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.Art import org.bukkit.Bukkit import org.bukkit.Keyed import org.bukkit.Material import org.bukkit.NamespacedKey import org.bukkit.Registry +import org.bukkit.damage.DamageType import org.bukkit.inventory.ItemRarity import org.bukkit.inventory.ItemStack import org.bukkit.inventory.RecipeChoice +import team.unnamed.creative.item.tint.TintSource.mapColor typealias SerializableItemStack = @Serializable(with = SerializableItemStackSerializer::class) BaseSerializableItemStack @@ -99,6 +125,14 @@ data class BaseSerializableItemStack( @EncodeDefault(NEVER) val mapId: SerializableDataTypes.MapId? = null, @EncodeDefault(NEVER) val mapPostProcessing: MapPostProcessing? = null, + @EncodeDefault(NEVER) val profile: SerializableDataTypes.Profile? = null, + @EncodeDefault(NEVER) val damageType: DamageType? = null, + @EncodeDefault(NEVER) val kineticWeapon: SerializableDataTypes.KineticWeapon? = null, + @EncodeDefault(NEVER) val piercingWeapon: SerializableDataTypes.PiercingWeapon? = null, + @EncodeDefault(NEVER) val swingAnimation: SerializableDataTypes.SwingAnimation? = null, + @EncodeDefault(NEVER) val useEffects: SerializableDataTypes.UseEffects? = null, + @EncodeDefault(NEVER) val minimumAttackCharge: Float? = null, + // Block-specific DataTypes //@EncodeDefault(NEVER) val lock: String? = null, @EncodeDefault(NEVER) val noteBlockSound: @Serializable(KeySerializer::class) Key? = null, @@ -115,9 +149,7 @@ data class BaseSerializableItemStack( @EncodeDefault(NEVER) val unbreakable: SerializableDataTypes.Unbreakable? = null, // Third-party plugins - @EncodeDefault(NEVER) val crucibleItem: String = "", @EncodeDefault(NEVER) val nexoItem: String = "", - @EncodeDefault(NEVER) val itemsadderItem: String = "", ) { private fun Component.removeItalics() = Component.text().decoration(TextDecoration.ITALIC, false).build().append(this) @@ -132,16 +164,6 @@ data class BaseSerializableItemStack( */ fun toItemStack(applyTo: ItemStack = ItemStack.of(type ?: Material.AIR)): ItemStack { // Import ItemStack from Crucible - crucibleItem.ifNotEmpty { id -> - if (Plugins.isEnabled("MythicCrucible")) { - MythicCrucible.core().itemManager.getItemStack(id)?.let { - applyTo.type = it.type - applyTo.copyDataFrom(it) { true } - } ?: idofrontLogger.w("No Crucible item found with id $id") - } else { - idofrontLogger.w("Tried to import Crucible item, but MythicCrucible was not enabled") - } - } // Import ItemStack from Nexo nexoItem.ifNotEmpty { id -> @@ -155,18 +177,6 @@ data class BaseSerializableItemStack( } } - // Import ItemStack from ItemsAdder - itemsadderItem.ifNotEmpty { id -> - if (Plugins.isEnabled("ItemsAdder")) { - CustomStack.getInstance(id)?.itemStack?.let { - applyTo.type = it.type - applyTo.copyDataFrom(it) { true } - } ?: idofrontLogger.w("No ItemsAdder item found with id $id") - } else { - idofrontLogger.w("Tried to import ItemsAdder item, but ItemsAdder was not enabled") - } - } - // Support for our prefab system in geary. prefab?.let { encodePrefab.invoke(applyTo, it) } ?: applyTo @@ -179,8 +189,10 @@ data class BaseSerializableItemStack( SerializableDataTypes.setData(applyTo, DataComponentTypes.LORE, lore?.let(ItemLore::lore)) SerializableDataTypes.setData(applyTo, DataComponentTypes.ITEM_MODEL, itemModel) SerializableDataTypes.setData(applyTo, DataComponentTypes.TOOLTIP_STYLE, tooltipStyle) - instrument?.let(Registry.INSTRUMENT::get)?.also { SerializableDataTypes.setData(applyTo, DataComponentTypes.INSTRUMENT, it) } breakSound?.also { SerializableDataTypes.setData(applyTo, DataComponentTypes.BREAK_SOUND, it) } + instrument?.let(RegistryAccess.registryAccess().getRegistry(RegistryKey.INSTRUMENT)::get)?.also { + SerializableDataTypes.setData(applyTo, DataComponentTypes.INSTRUMENT, it) + } paintingVariant?.setDataType(applyTo) enchantments?.setDataType(applyTo) @@ -221,11 +233,19 @@ data class BaseSerializableItemStack( mapColor?.setDataType(applyTo) mapId?.setDataType(applyTo) + profile?.setDataType(applyTo) + kineticWeapon?.setDataType(applyTo) + piercingWeapon?.setDataType(applyTo) + swingAnimation?.setDataType(applyTo) + useEffects?.setDataType(applyTo) + SerializableDataTypes.setData(applyTo, DataComponentTypes.MINIMUM_ATTACK_CHARGE, minimumAttackCharge) + + mapPostProcessing?.let { applyTo.setData(DataComponentTypes.MAP_POST_PROCESSING, it) } mapDecorations?.let { applyTo.setData( DataComponentTypes.MAP_DECORATIONS, - MapDecorations.mapDecorations(SerializableDataTypes.MapDecoration.toPaperDecorations(mapDecorations)) + mapDecorations(SerializableDataTypes.MapDecoration.toPaperDecorations(mapDecorations)) ) } @@ -314,6 +334,13 @@ fun ItemStack.toSerializable(): SerializableItemStack = with(itemMeta) { tooltipDisplay = dataIfOverriden(DataComponentTypes.TOOLTIP_DISPLAY)?.let(SerializableDataTypes::TooltipDisplay), paintingVariant = dataIfOverriden(DataComponentTypes.PAINTING_VARIANT)?.let(SerializableDataTypes::PaintingVariant), + profile = dataIfOverriden(DataComponentTypes.PROFILE)?.let(SerializableDataTypes::Profile), + kineticWeapon = dataIfOverriden(DataComponentTypes.KINETIC_WEAPON)?.let(SerializableDataTypes::KineticWeapon), + piercingWeapon = dataIfOverriden(DataComponentTypes.PIERCING_WEAPON)?.let(SerializableDataTypes::PiercingWeapon), + swingAnimation = dataIfOverriden(DataComponentTypes.SWING_ANIMATION)?.let(SerializableDataTypes::SwingAnimation), + useEffects = dataIfOverriden(DataComponentTypes.USE_EFFECTS)?.let(SerializableDataTypes::UseEffects), + minimumAttackCharge = dataIfOverriden(DataComponentTypes.MINIMUM_ATTACK_CHARGE), + mapPostProcessing = dataIfOverriden(DataComponentTypes.MAP_POST_PROCESSING), mapDecorations = dataIfOverriden(DataComponentTypes.MAP_DECORATIONS)?.decorations()?.values?.map(SerializableDataTypes::MapDecoration), diff --git a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStackSerializer.kt b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStackSerializer.kt index 3fb3388f..40c16492 100644 --- a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStackSerializer.kt +++ b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/SerializableItemStackSerializer.kt @@ -39,10 +39,6 @@ class SerializableItemStackSerializer : KSerializer { ) ) - stringShorthand.startsWith("crucible ") -> BaseSerializableItemStack( - crucibleItem = stringShorthand.removePrefix("crucible ") - ) - stringShorthand.startsWith("nexo ") -> BaseSerializableItemStack( nexoItem = stringShorthand.removePrefix("nexo ") )