From f0cb0b1f95f1762302f78eda864fd1d71e79cad0 Mon Sep 17 00:00:00 2001 From: Fabien Date: Sat, 6 Jul 2024 23:16:38 +0200 Subject: [PATCH] feat : add 1.21 compatibility --- common/build.gradle.kts | 1 + .../pickspawner/PickSpawner.kt | 12 +++--- .../pickspawner/command/BuyCommand.kt | 23 +++++++---- .../command/CommandsRegistration.kt | 4 +- .../pickspawner/command/GiveCommand.kt | 8 ++-- .../module/commodore/CommodoreService.kt | 16 ++++++++ install-dependency-in-cache.sh | 1 + .../pickspawner/nms/Utils_1_20_R4.kt | 3 +- nms/v1_21_R1/build.gradle.kts | 9 +++++ .../pickspawner/nms/Utils_1_21_R1.kt | 38 +++++++++++++++++++ settings.gradle.kts | 1 + 11 files changed, 94 insertions(+), 22 deletions(-) create mode 100644 common/src/main/kotlin/fr/fabienhebuterne/pickspawner/module/commodore/CommodoreService.kt create mode 100644 nms/v1_21_R1/build.gradle.kts create mode 100644 nms/v1_21_R1/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_21_R1.kt diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 81303c8..47b9a91 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation(project(":nms:v1_20_R2")) implementation(project(":nms:v1_20_R3")) implementation(project(":nms:v1_20_R4")) + implementation(project(":nms:v1_21_R1")) } tasks.processResources { diff --git a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/PickSpawner.kt b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/PickSpawner.kt index 5d2344e..acd2abb 100644 --- a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/PickSpawner.kt +++ b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/PickSpawner.kt @@ -1,6 +1,5 @@ package fr.fabienhebuterne.pickspawner -import com.mojang.brigadier.builder.LiteralArgumentBuilder import fr.fabienhebuterne.pickspawner.command.CommandsRegistration import fr.fabienhebuterne.pickspawner.config.* import fr.fabienhebuterne.pickspawner.module.ItemInitService @@ -8,6 +7,7 @@ import fr.fabienhebuterne.pickspawner.module.breakspawner.* import fr.fabienhebuterne.pickspawner.module.cancelenchant.EnchantItemEventListener import fr.fabienhebuterne.pickspawner.module.cancelrepair.PlayerCommandPreprocessListener import fr.fabienhebuterne.pickspawner.module.cancelrepair.PrepareAnvilEventListener +import fr.fabienhebuterne.pickspawner.module.commodore.CommodoreService import fr.fabienhebuterne.pickspawner.module.entitydamage.EntityDamageByEntityEventListener import fr.fabienhebuterne.pickspawner.module.interactspawner.PlayerInteractEventListener import fr.fabienhebuterne.pickspawner.module.pickaxeMigration.PickaxeMigrationPlayerInteractEventListener @@ -58,6 +58,7 @@ class PickSpawner : JavaPlugin() { // checking version in class name has changed since 1.20.6 when (minecraftVersion) { "1.20.6-R0.1-SNAPSHOT" -> Utils_1_20_R4() + "1.21-R0.1-SNAPSHOT" -> Utils_1_21_R1() else -> { Bukkit.getLogger().severe("Your server version $currentVersion / $minecraftVersion isn't compatible with PickSpawner") server.pluginManager.disablePlugin(this) @@ -108,17 +109,16 @@ class PickSpawner : JavaPlugin() { private fun registerCommands(itemInitService: ItemInitService) { val baseCommand = "pickspawner" - val pickSpawnerBaseCommodore = LiteralArgumentBuilder.literal(baseCommand) - val commandsRegistration = CommandsRegistration(this, itemInitService, pickSpawnerBaseCommodore) + val commandsRegistration = CommandsRegistration(this, itemInitService, baseCommand) // Register base command val command = getCommand(baseCommand) command?.setExecutor(commandsRegistration) // Register commodore - val commodoreBuild = commandsRegistration.getCommodoreBuild() - val commodore = CommodoreProvider.getCommodore(this) - commodore.register(command, commodoreBuild) { commandsRegistration.hasCommodorePermission(it) } + if (CommodoreProvider.isSupported()) { + CommodoreService().init(this, commandsRegistration, command) + } } private fun setupEconomy(): Boolean { diff --git a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/BuyCommand.kt b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/BuyCommand.kt index 6a4608d..c3921a3 100644 --- a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/BuyCommand.kt +++ b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/BuyCommand.kt @@ -53,8 +53,7 @@ class BuyCommand( } private fun buyCustomPickaxe(playerSender: Player, quantity: Int) { - if(!playerSender.hasPermission("pickspawner.buy.pickaxe")) - { + if (!playerSender.hasPermission("pickspawner.buy.pickaxe")) { playerSender.sendMessage(instance.translationConfig.errors.missingPermission.toColorHex()) return } @@ -121,8 +120,7 @@ class BuyCommand( } private fun buyCustomPickaxeDurability(playerSender: Player, durability: Int) { - if(!playerSender.hasPermission("pickspawner.buy.durability")) - { + if (!playerSender.hasPermission("pickspawner.buy.durability")) { playerSender.sendMessage(instance.translationConfig.errors.missingPermission.toColorHex()) return } @@ -138,8 +136,7 @@ class BuyCommand( val damage = (itemMeta as Damageable).damage val totalDurability = (maxDurability - damage) + durability - if(durability <= 0) - { + if (durability <= 0) { playerSender.sendMessage(instance.translationConfig.errors.cancelBuyDurabilityBadDurability.toColorHex()) return } @@ -195,7 +192,12 @@ class BuyCommand( playerSender.inventory.removeItem(ItemStack(materialName, quantityToBuy)) itemMeta.damage = damage - durability itemInMainHand.itemMeta = itemInitService.refreshDurabilityOnItemMetaLore(itemMeta, maxDurability.toInt()) - playerSender.sendMessage(instance.translationConfig.buyCustomPickaxeDurability.replace("{{durability}}", durability.toString()).toColorHex()) + playerSender.sendMessage( + instance.translationConfig.buyCustomPickaxeDurability.replace( + "{{durability}}", + durability.toString() + ).toColorHex() + ) } private fun buyCustomPickaxeDurabilityOnMoneyEconomy( @@ -220,7 +222,12 @@ class BuyCommand( if (withdrawPlayer.transactionSuccess()) { itemMeta.damage = damage - durability itemInMainHand.itemMeta = itemInitService.refreshDurabilityOnItemMetaLore(itemMeta, maxDurability.toInt()) - playerSender.sendMessage(instance.translationConfig.buyCustomPickaxeDurability.replace("{{durability}}", durability.toString()).toColorHex()) + playerSender.sendMessage( + instance.translationConfig.buyCustomPickaxeDurability.replace( + "{{durability}}", + durability.toString() + ).toColorHex() + ) } } diff --git a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/CommandsRegistration.kt b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/CommandsRegistration.kt index 6b4fb45..1d798ba 100644 --- a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/CommandsRegistration.kt +++ b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/CommandsRegistration.kt @@ -19,9 +19,9 @@ typealias CommandName = String class CommandsRegistration( private val instance: PickSpawner, itemInitService: ItemInitService, - private val pickSpawnerBaseCommodore: LiteralArgumentBuilder + baseCommand: String ) : CommandExecutor { - + private val pickSpawnerBaseCommodore = LiteralArgumentBuilder.literal(baseCommand) private val commands: MutableMap = mutableMapOf() init { diff --git a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/GiveCommand.kt b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/GiveCommand.kt index 0f9fccf..2686309 100644 --- a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/GiveCommand.kt +++ b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/command/GiveCommand.kt @@ -40,7 +40,7 @@ class GiveCommand( ) private fun LiteralArgumentBuilder.entityTypesToCommodore(): LiteralArgumentBuilder { - return EntityType.values().fold(this) { accumulator, entity -> + return EntityType.entries.fold(this) { accumulator, entity -> accumulator.then(LiteralArgumentBuilder.literal(entity.name)) } } @@ -72,8 +72,7 @@ class GiveCommand( ) { val damage = args.getOrNull(2)?.toIntOrNull() ?: 0 val result = player.inventory.addItem(itemInitService.initCustomPickaxeItemStack(damage)) - if(!result.isEmpty()) - { + if (result.isNotEmpty()) { result.forEach { (_: Int, itemStack: ItemStack) -> player.world.dropItem(player.location, itemStack); } @@ -88,8 +87,7 @@ class GiveCommand( ) { val entityType = EntityType.valueOf(args[2].uppercase()) val result = player.inventory.addItem(itemInitService.initSpawnerItemStack(entityType)) - if(!result.isEmpty()) - { + if (result.isNotEmpty()) { result.forEach { (_: Int, itemStack: ItemStack) -> player.world.dropItem(player.location, itemStack); } diff --git a/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/module/commodore/CommodoreService.kt b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/module/commodore/CommodoreService.kt new file mode 100644 index 0000000..6a44734 --- /dev/null +++ b/common/src/main/kotlin/fr/fabienhebuterne/pickspawner/module/commodore/CommodoreService.kt @@ -0,0 +1,16 @@ +package fr.fabienhebuterne.pickspawner.module.commodore + +import fr.fabienhebuterne.pickspawner.command.CommandsRegistration +import me.lucko.commodore.CommodoreProvider +import org.bukkit.command.PluginCommand +import org.bukkit.plugin.java.JavaPlugin + +class CommodoreService { + + fun init(plugin: JavaPlugin, commandsRegistration: CommandsRegistration, command: PluginCommand?) { + val commodoreBuild = commandsRegistration.getCommodoreBuild() + val commodore = CommodoreProvider.getCommodore(plugin) + commodore.register(command, commodoreBuild) { commandsRegistration.hasCommodorePermission(it) } + } + +} \ No newline at end of file diff --git a/install-dependency-in-cache.sh b/install-dependency-in-cache.sh index be8339f..b518801 100644 --- a/install-dependency-in-cache.sh +++ b/install-dependency-in-cache.sh @@ -22,6 +22,7 @@ versionsMd5=( '1.20.2:spigot-1.20.2-R0.1-SNAPSHOT.jar:e7c864e4a13e2486e4509bf8cc89af3e' '1.20.4:spigot-1.20.4-R0.1-SNAPSHOT.jar:44282b85c0c886d5abb812b13c8667de' '1.20.6:spigot-1.20.6-R0.1-SNAPSHOT.jar:80814391c6c38ebcb1ea1b98632a9590' + '1.21:spigot-1.21-R0.1-SNAPSHOT.jar:9961507a636e6704086c0cf5705d8443' ) for versionWithMd5 in "${versionsMd5[@]}"; do diff --git a/nms/v1_20_R4/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_20_R4.kt b/nms/v1_20_R4/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_20_R4.kt index 9c07e51..fc7b4b1 100644 --- a/nms/v1_20_R4/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_20_R4.kt +++ b/nms/v1_20_R4/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_20_R4.kt @@ -18,7 +18,8 @@ class Utils_1_20_R4 : Utils { /** * DataComponents.c is maxStackSize, other var is default value for blocks, see [DataComponents.af] */ - val dataComponentsUpdated: DataComponentMap = DataComponentMap.a().a(DataComponents.c, 1) + val dataComponentsUpdated: DataComponentMap = DataComponentMap.a() + .a(DataComponents.c, maxStack) .a(DataComponents.i, ItemLore.a) .a(DataComponents.k, ItemEnchantments.a) .a(DataComponents.r, 0) diff --git a/nms/v1_21_R1/build.gradle.kts b/nms/v1_21_R1/build.gradle.kts new file mode 100644 index 0000000..e330684 --- /dev/null +++ b/nms/v1_21_R1/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + kotlin("jvm") +} + +dependencies { + compileOnly(project(":nms:interfaces")) + compileOnly("org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") + compileOnly(files("../../tmp/1.21/spigot-1.21-R0.1-SNAPSHOT.jar")) +} \ No newline at end of file diff --git a/nms/v1_21_R1/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_21_R1.kt b/nms/v1_21_R1/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_21_R1.kt new file mode 100644 index 0000000..86a3271 --- /dev/null +++ b/nms/v1_21_R1/src/main/kotlin/fr/fabienhebuterne/pickspawner/nms/Utils_1_21_R1.kt @@ -0,0 +1,38 @@ +package fr.fabienhebuterne.pickspawner.nms + +import net.minecraft.core.component.DataComponentMap +import net.minecraft.core.component.DataComponents +import net.minecraft.world.item.EnumItemRarity +import net.minecraft.world.item.Item +import net.minecraft.world.item.component.ItemAttributeModifiers +import net.minecraft.world.item.component.ItemLore +import net.minecraft.world.item.enchantment.ItemEnchantments +import net.minecraft.world.level.block.Blocks +import org.bukkit.Bukkit +import java.lang.reflect.Field + +class Utils_1_21_R1 : Utils { + + override fun setMaxStackSize(maxStack: Int) { + try { + /** + * DataComponents.c is maxStackSize, other var is default value for blocks, see [DataComponents.ag] + */ + val dataComponentsUpdated: DataComponentMap = DataComponentMap.a() + .a(DataComponents.c, maxStack) + .a(DataComponents.i, ItemLore.a) + .a(DataComponents.k, ItemEnchantments.a) + .a(DataComponents.r, 0) + .a(DataComponents.n, ItemAttributeModifiers.a) + .a(DataComponents.j, EnumItemRarity.a) + .a() + val dataComponentMapField: Field = Item::class.java.getDeclaredField("c") + dataComponentMapField.isAccessible = true + dataComponentMapField.set(Blocks.ct.r(), dataComponentsUpdated) + } catch (e: Exception) { + Bukkit.getLogger().warning("Can't update maxStackSize for spawner because : $e") + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 58da7b4..06bbaac 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,4 +10,5 @@ include( "nms:v1_20_R2", "nms:v1_20_R3", "nms:v1_20_R4", + "nms:v1_21_R1", )