From 0cdd9c3c98e80fcc93f62619783e8fc61963945d Mon Sep 17 00:00:00 2001 From: Shynixn Date: Thu, 30 May 2024 11:02:48 +0200 Subject: [PATCH 1/4] #584 Fixed falling into the void despawns the pet now. --- build.gradle.kts | 8 ++++---- .../impl/physic/ArmorstandEntityComponent.kt | 11 +++++++++++ .../petblocks/impl/service/PetEntityFactoryImpl.kt | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 209b5d9fa..e41f0d37c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,8 +42,8 @@ dependencies { implementation("org.openjdk.nashorn:nashorn-core:15.4") // Custom dependencies - implementation("com.github.shynixn.mcutils:common:2024.8") - implementation("com.github.shynixn.mcutils:packet:2024.5") + implementation("com.github.shynixn.mcutils:common:2024.9") + implementation("com.github.shynixn.mcutils:packet:2024.11") implementation("com.github.shynixn.mcutils:database:2024.2") implementation("com.github.shynixn.mcutils:pathfinder:2024.3") implementation("com.github.shynixn.mcutils:guice:2024.2") @@ -101,7 +101,7 @@ tasks.register("pluginJars") { } /** - * Create legacy plugin jar file. + * Relocate Plugin Jar. */ tasks.register("relocatePluginJar", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class.java) { dependsOn("shadowJar") @@ -162,7 +162,7 @@ tasks.register("pluginJarPremium", com.github.jengelman.gradle.plugins.shadow.ta } /** - * Create legacy plugin jar file. + * Relocate legacy plugin jar file. */ tasks.register("relocateLegacyPluginJar", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class.java) { dependsOn("shadowJar") diff --git a/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt b/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt index 9232a5b69..b97fb48af 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt @@ -1,5 +1,6 @@ package com.github.shynixn.petblocks.impl.physic +import com.github.shynixn.mccoroutine.bukkit.launch import com.github.shynixn.mcutils.common.* import com.github.shynixn.mcutils.common.item.ItemService import com.github.shynixn.mcutils.common.physic.PhysicComponent @@ -14,6 +15,7 @@ import com.github.shynixn.petblocks.enumeration.PetRidingState import com.github.shynixn.petblocks.enumeration.PetVisibility import org.bukkit.Location import org.bukkit.entity.Player +import org.bukkit.plugin.Plugin import org.bukkit.util.EulerAngle class ArmorstandEntityComponent( @@ -24,6 +26,7 @@ class ArmorstandEntityComponent( private val placeHolderService: PlaceHolderService, private val itemService: ItemService, private val pet: Pet, + private val plugin: Plugin, val entityId: Int, ) : PhysicComponent { init { @@ -118,6 +121,14 @@ class ArmorstandEntityComponent( val players = playerComponent.visiblePlayers val parsedEntityType = EntityType.findType(this.petMeta.entityType) + if (position.y < -30) { + // Protection for falling into the void. + plugin.launch { + pet.remove() + } + return + } + for (player in players) { packetService.sendPacketOutEntityVelocity(player, PacketOutEntityVelocity().also { it.entityId = this.entityId diff --git a/src/main/java/com/github/shynixn/petblocks/impl/service/PetEntityFactoryImpl.kt b/src/main/java/com/github/shynixn/petblocks/impl/service/PetEntityFactoryImpl.kt index 5b7a76641..49540dc52 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/service/PetEntityFactoryImpl.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/service/PetEntityFactoryImpl.kt @@ -58,6 +58,7 @@ class PetEntityFactoryImpl @Inject constructor( placeHolderService, itemService, pet, + plugin, armorStandEntityId ) val moveToTargetComponent = MoveToTargetComponent(mathPhysicComponent) From 14c3e2763ff083a481ca334cadf62e7433ee9511 Mon Sep 17 00:00:00 2001 From: Shynixn Date: Thu, 30 May 2024 11:59:14 +0200 Subject: [PATCH 2/4] #585 Reduced amount of packets sent. --- build.gradle.kts | 2 +- .../impl/physic/ArmorstandEntityComponent.kt | 49 ++++++++++++------- src/main/resources/plugin-legacy.yml | 2 +- src/main/resources/plugin.yml | 2 +- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e41f0d37c..85f32471f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } group = "com.github.shynixn" -version = "9.7.0" +version = "9.7.1" repositories { mavenCentral() diff --git a/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt b/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt index b97fb48af..778f93107 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt @@ -29,6 +29,8 @@ class ArmorstandEntityComponent( private val plugin: Plugin, val entityId: Int, ) : PhysicComponent { + private var lastVisibleVector3d = Vector3d() + init { playerComponent.onSpawnMinecraft.add { player, location -> onPlayerSpawn(player, location) } playerComponent.onRemoveMinecraft.add { player, _ -> onPlayerRemove(player) } @@ -129,30 +131,41 @@ class ArmorstandEntityComponent( return } - for (player in players) { - packetService.sendPacketOutEntityVelocity(player, PacketOutEntityVelocity().also { - it.entityId = this.entityId - it.target = motion.toVector() - }) + val hasDistanceChanged = lastVisibleVector3d.distance(position) > 0.1 + val hasYawChanged = position.yaw.toFloat() != lastVisibleVector3d.yaw.toFloat() + val hasPitchChanged = position.pitch.toFloat() != lastVisibleVector3d.pitch.toFloat() + lastVisibleVector3d = position.copy() - packetService.sendPacketOutEntityTeleport(player, PacketOutEntityTeleport().also { - it.entityId = this.entityId - it.target = position.copy().addRelativeUp(petMeta.physics.groundOffset).toLocation() - }) - - if (parsedEntityType != null && parsedEntityType == EntityType.ARMOR_STAND) { - // It causes lag when sent to other entities. - packetService.sendPacketOutEntityMetadata(player, PacketOutEntityMetadata().also { + for (player in players) { + if (hasDistanceChanged || hasYawChanged) { + packetService.sendPacketOutEntityVelocity(player, PacketOutEntityVelocity().also { it.entityId = this.entityId - it.armorStandHeadRotation = convertPitchToEulerAngle(position.pitch) + it.target = motion.toVector() }) - } else { - // Needed for some living entities other than armor stands. - packetService.sendPacketOutEntityHeadRotation(player, PacketOutEntityHeadRotation().also { + + packetService.sendPacketOutEntityTeleport(player, PacketOutEntityTeleport().also { it.entityId = this.entityId - it.yaw = position.yaw + it.target = position.copy().addRelativeUp(petMeta.physics.groundOffset).toLocation() }) } + + if (parsedEntityType != null && parsedEntityType == EntityType.ARMOR_STAND) { + if (hasPitchChanged) { + // It causes lag when sent to other entities. + packetService.sendPacketOutEntityMetadata(player, PacketOutEntityMetadata().also { + it.entityId = this.entityId + it.armorStandHeadRotation = convertPitchToEulerAngle(position.pitch) + }) + } + } else { + if (hasYawChanged && !pet.isRiding()) { + // Needed for some living entities other than armor stands. + packetService.sendPacketOutEntityHeadRotation(player, PacketOutEntityHeadRotation().also { + it.entityId = this.entityId + it.yaw = position.yaw + }) + } + } } } diff --git a/src/main/resources/plugin-legacy.yml b/src/main/resources/plugin-legacy.yml index 9d512f250..6cee7e35d 100644 --- a/src/main/resources/plugin-legacy.yml +++ b/src/main/resources/plugin-legacy.yml @@ -1,5 +1,5 @@ name: PetBlocks -version: 9.7.0 +version: 9.7.1 author: Shynixn main: com.github.shynixn.petblocks.PetBlocksPlugin softdepend: [ PlaceholderAPI, HeadDatabase] diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3f06ec163..4e0ff81d7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: PetBlocks -version: 9.7.0 +version: 9.7.1 author: Shynixn main: com.github.shynixn.petblocks.PetBlocksPlugin softdepend: [ PlaceholderAPI, HeadDatabase] From 9bef7039b8f0c255a668299c370d16b35ff29855 Mon Sep 17 00:00:00 2001 From: Shynixn Date: Thu, 30 May 2024 13:52:19 +0200 Subject: [PATCH 3/4] #585 Fixed hat synchronization. --- .../java/com/github/shynixn/petblocks/contract/Pet.kt | 2 +- .../com/github/shynixn/petblocks/impl/PetEntityImpl.kt | 5 +++++ .../java/com/github/shynixn/petblocks/impl/PetImpl.kt | 8 +++++++- .../impl/commandexecutor/PetBlocksCommandExecutor.kt | 8 +------- .../petblocks/impl/physic/ArmorstandEntityComponent.kt | 1 + .../shynixn/petblocks/impl/service/PetServiceImpl.kt | 2 +- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/shynixn/petblocks/contract/Pet.kt b/src/main/java/com/github/shynixn/petblocks/contract/Pet.kt index d45e326d8..e2232e46b 100644 --- a/src/main/java/com/github/shynixn/petblocks/contract/Pet.kt +++ b/src/main/java/com/github/shynixn/petblocks/contract/Pet.kt @@ -139,7 +139,7 @@ interface Pet { /** * Stops riding, flying or hat if the pet currently performs it. */ - fun umount() + fun unmount() /** * Breaks the block which is in front of the pet and no more than 1 block away. diff --git a/src/main/java/com/github/shynixn/petblocks/impl/PetEntityImpl.kt b/src/main/java/com/github/shynixn/petblocks/impl/PetEntityImpl.kt index 0a95fcce4..3272fb4b7 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/PetEntityImpl.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/PetEntityImpl.kt @@ -87,6 +87,11 @@ class PetEntityImpl( break } + if (pet.isHat()) { + // Update pet location on player. + pet.location = pet.player.location + } + cancellationTokenLoop = CancellationToken() petActionExecutionService.executeAction(pet.player, pet, loop, cancellationTokenLoop) delay(1.ticks) diff --git a/src/main/java/com/github/shynixn/petblocks/impl/PetImpl.kt b/src/main/java/com/github/shynixn/petblocks/impl/PetImpl.kt index a0589b235..cd25960e2 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/PetImpl.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/PetImpl.kt @@ -440,7 +440,7 @@ class PetImpl( /** * Stops riding or flying if the pet currently performs it. */ - override fun umount() { + override fun unmount() { if (isDisposed) { throw PetBlocksPetDisposedException() } @@ -451,6 +451,12 @@ class PetImpl( petMeta.ridingState = PetRidingState.NO + // Fix idle loop. + val loop = "idle" + if (template.loops.containsKey(loop)) { + this.loop = loop + } + if (petEntity != null) { petEntity!!.updateRidingState() call() diff --git a/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt b/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt index 312e1366b..3dc13fa1e 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt @@ -793,13 +793,7 @@ class PetBlocksCommandExecutor @Inject constructor( } private fun unmount(sender: CommandSender, pet: Pet) { - pet.umount() - val loop = "idle" - - if (pet.template.loops.containsKey(loop)) { - pet.loop = loop - } - + pet.unmount() sender.sendPluginMessage(String.format(PetBlocksLanguage.petUnmountMessage, pet.name)) } diff --git a/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt b/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt index 778f93107..93c03d28e 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/physic/ArmorstandEntityComponent.kt @@ -126,6 +126,7 @@ class ArmorstandEntityComponent( if (position.y < -30) { // Protection for falling into the void. plugin.launch { + pet.unmount() pet.remove() } return diff --git a/src/main/java/com/github/shynixn/petblocks/impl/service/PetServiceImpl.kt b/src/main/java/com/github/shynixn/petblocks/impl/service/PetServiceImpl.kt index b88775d5d..04b072378 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/service/PetServiceImpl.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/service/PetServiceImpl.kt @@ -124,7 +124,7 @@ class PetServiceImpl @Inject constructor( if (e.isSpawned) { pet.spawn() } else { - pet.umount() + pet.unmount() } pet From 3da0874eaf2f8538a2b20f03994b1349316670c1 Mon Sep 17 00:00:00 2001 From: Shynixn Date: Sun, 2 Jun 2024 12:21:23 +0200 Subject: [PATCH 4/4] #585 Fixed pets can be manipulated by other players. --- build.gradle.kts | 2 +- .../shynixn/petblocks/PetBlocksLanguage.kt | 7 +- .../shynixn/petblocks/PetBlocksPlugin.kt | 8 +- .../PetBlocksCommandExecutor.kt | 236 +++++++++--------- src/main/resources/lang/en_us.properties | 3 +- 5 files changed, 129 insertions(+), 127 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 85f32471f..7374f9683 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,7 +42,7 @@ dependencies { implementation("org.openjdk.nashorn:nashorn-core:15.4") // Custom dependencies - implementation("com.github.shynixn.mcutils:common:2024.9") + implementation("com.github.shynixn.mcutils:common:2024.11") implementation("com.github.shynixn.mcutils:packet:2024.11") implementation("com.github.shynixn.mcutils:database:2024.2") implementation("com.github.shynixn.mcutils:pathfinder:2024.3") diff --git a/src/main/java/com/github/shynixn/petblocks/PetBlocksLanguage.kt b/src/main/java/com/github/shynixn/petblocks/PetBlocksLanguage.kt index 251b6ee97..a2616d667 100644 --- a/src/main/java/com/github/shynixn/petblocks/PetBlocksLanguage.kt +++ b/src/main/java/com/github/shynixn/petblocks/PetBlocksLanguage.kt @@ -181,8 +181,8 @@ object PetBlocksLanguage { /** [&9PetBlocks&f] &cYou do not have permission to execute this command. **/ var noPermissionCommand : String = "[&9PetBlocks&f] &cYou do not have permission to execute this command." - /** T[&9PetBlocks&f] &cCannot parse boolean %1$1s. **/ - var cannotParseBoolean : String = "T[&9PetBlocks&f] &cCannot parse boolean %1$1s." + /** [&9PetBlocks&f] &cCannot parse boolean %1$1s. **/ + var cannotParseBoolean : String = "[&9PetBlocks&f] &cCannot parse boolean %1$1s." /** Creates a new pet for the player with the given pet template. **/ var createCommandHint : String = "Creates a new pet for the player with the given pet template." @@ -223,6 +223,9 @@ object PetBlocksLanguage { /** [&9PetBlocks&f] Cancelled action. **/ var cancelMessage : String = "[&9PetBlocks&f] Cancelled action." + /** [&9PetBlocks&f] &cYou do not have permission to edit the pets of other players. **/ + var manipulateOtherMessage : String = "[&9PetBlocks&f] &cYou do not have permission to edit the pets of other players." + /** [&9PetBlocks&f] PetBlocks has been reloaded. **/ var reloadMessage : String = "[&9PetBlocks&f] PetBlocks has been reloaded." diff --git a/src/main/java/com/github/shynixn/petblocks/PetBlocksPlugin.kt b/src/main/java/com/github/shynixn/petblocks/PetBlocksPlugin.kt index 76c5d25b3..4727e24df 100644 --- a/src/main/java/com/github/shynixn/petblocks/PetBlocksPlugin.kt +++ b/src/main/java/com/github/shynixn/petblocks/PetBlocksPlugin.kt @@ -29,7 +29,7 @@ import java.util.logging.Level class PetBlocksPlugin : JavaPlugin() { private val prefix: String = ChatColor.BLUE.toString() + "[PetBlocks] " + ChatColor.WHITE private lateinit var module : DependencyInjectionModule - private var immidiateDisable = false + private var immediateDisable = false /** * Called when this plugin is enabled. @@ -67,7 +67,7 @@ class PetBlocksPlugin : JavaPlugin() { } if (!Version.serverVersion.isCompatible(*versions.toTypedArray())) { - immidiateDisable = true + immediateDisable = true logger.log(Level.SEVERE, "================================================") logger.log(Level.SEVERE, "PetBlocks does not support your server version") logger.log(Level.SEVERE, "Install v" + versions[0].from + " - v" + versions[versions.size - 1].to) @@ -121,7 +121,7 @@ class PetBlocksPlugin : JavaPlugin() { playerDataRepository.createIfNotExist() } catch (e: Exception) { e.printStackTrace() - immidiateDisable = true + immediateDisable = true Bukkit.getPluginManager().disablePlugin(plugin) return@launch } @@ -146,7 +146,7 @@ class PetBlocksPlugin : JavaPlugin() { * Called when this plugin is disabled. */ override fun onDisable() { - if (immidiateDisable) { + if (immediateDisable) { return } diff --git a/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt b/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt index 3dc13fa1e..8e7bd84ba 100644 --- a/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt +++ b/src/main/java/com/github/shynixn/petblocks/impl/commandexecutor/PetBlocksCommandExecutor.kt @@ -2,9 +2,7 @@ package com.github.shynixn.petblocks.impl.commandexecutor import com.github.shynixn.mcutils.common.ConfigurationService import com.github.shynixn.mcutils.common.chat.ChatMessageService -import com.github.shynixn.mcutils.common.command.CommandBuilder -import com.github.shynixn.mcutils.common.command.ValidationException -import com.github.shynixn.mcutils.common.command.Validator +import com.github.shynixn.mcutils.common.command.* import com.github.shynixn.mcutils.common.item.Item import com.github.shynixn.mcutils.common.item.ItemService import com.github.shynixn.mcutils.common.repository.CacheRepository @@ -56,6 +54,12 @@ class PetBlocksCommandExecutor @Inject constructor( null } } + private val manipulateOtherPermission: () -> String = { + Permission.MANIPULATE_OTHER.text + } + private val manipulateOtherPermissionMessage: () -> String = { + PetBlocksLanguage.manipulateOtherMessage + } private val onlinePlayerTabs: (suspend (CommandSender) -> List) = { Bukkit.getOnlinePlayers().map { e -> e.name } } @@ -134,35 +138,27 @@ class PetBlocksCommandExecutor @Inject constructor( private val visibilityMustExist = object : Validator { override suspend fun transform( - sender: CommandSender, - prevArgs: List, - openArgs: List + sender: CommandSender, prevArgs: List, openArgs: List ): PetVisibility? { return PetVisibility.values().firstOrNull { e -> e.name.equals(openArgs[0], true) } } override suspend fun message(sender: CommandSender, prevArgs: List, openArgs: List): String { - return String.format( - PetBlocksLanguage.visibilityTypeNotFoundMessage, - PetVisibility.values().joinToString(",") { e -> e.name.lowercase() } - ) + return String.format(PetBlocksLanguage.visibilityTypeNotFoundMessage, + PetVisibility.values().joinToString(",") { e -> e.name.lowercase() }) } } private val rotationTypeMustExist = object : Validator { override suspend fun transform( - sender: CommandSender, - prevArgs: List, - openArgs: List + sender: CommandSender, prevArgs: List, openArgs: List ): PetRotationType? { return PetRotationType.values().firstOrNull { e -> e.name.equals(openArgs[0], true) } } override suspend fun message(sender: CommandSender, prevArgs: List, openArgs: List): String { - return String.format( - PetBlocksLanguage.petRotationTypeNotFound, - PetRotationType.values().joinToString(",") { e -> e.name.lowercase() } - ) + return String.format(PetBlocksLanguage.petRotationTypeNotFound, + PetRotationType.values().joinToString(",") { e -> e.name.lowercase() }) } } @@ -211,10 +207,7 @@ class PetBlocksCommandExecutor @Inject constructor( } private val materialMustExist = object : Validator { override suspend fun validate( - sender: CommandSender, - prevArgs: List, - argument: String, - openArgs: List + sender: CommandSender, prevArgs: List, argument: String, openArgs: List ): Boolean { try { itemService.toItemStack(Item(argument)) // Test if material is valid. @@ -284,10 +277,10 @@ class PetBlocksCommandExecutor @Inject constructor( toolTip { PetBlocksLanguage.createCommandHint } builder().argument("name").validator(petNameMustBeLimited).tabs { listOf("") } .argument("template").validator(templateMustExist).validator(templateMustHavePermission) - .tabs(templateTabs) - .executePlayer(senderHasToBePlayer) { player, name, petTemplate -> + .tabs(templateTabs).executePlayer(senderHasToBePlayer) { player, name, petTemplate -> createPet(player, player, name, petTemplate) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, petTemplate, player -> createPet(commandSender, player, name, petTemplate) } @@ -295,10 +288,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("delete") { permission(Permission.DELETE) toolTip { PetBlocksLanguage.deleteCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - deletePet(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + deletePet(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> deletePet(commandSender, petMustExist(player, name)) } @@ -309,6 +302,7 @@ class PetBlocksCommandExecutor @Inject constructor( builder().executePlayer(senderHasToBePlayer) { player -> listPet(player, player) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { _, player -> listPet(player, player) } @@ -316,10 +310,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("call") { permission(Permission.CALL) toolTip { PetBlocksLanguage.callCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - callPet(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + callPet(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> callPet(commandSender, petMustExist(player, name)) } @@ -333,6 +327,7 @@ class PetBlocksCommandExecutor @Inject constructor( .executePlayer(senderHasToBePlayer) { player, name, x, y, z -> lookAtLocation(player, petMustExist(player, name), Location(player.world, x, y, z)) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, x, y, z, player -> lookAtLocation(commandSender, petMustExist(player, name), Location(player.world, x, y, z)) } @@ -340,10 +335,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("lookatOwner") { permission(Permission.LOOKATOWNER) toolTip { PetBlocksLanguage.lookAtOwnerCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - lookAtLocation(player, petMustExist(player, name), player.location.add(0.0, 1.0, 0.0)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + lookAtLocation(player, petMustExist(player, name), player.location.add(0.0, 1.0, 0.0)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> lookAtLocation(commandSender, petMustExist(player, name), player.location.add(0.0, 1.0, 0.0)) } @@ -354,10 +349,10 @@ class PetBlocksCommandExecutor @Inject constructor( builder().argument("name").tabs(petNamesTabs).argument("x").validator(mustBeDouble) .tabs { listOf("") }.argument("y").validator(mustBeDouble).tabs { listOf("") }.argument("z") .validator(mustBeDouble).tabs { listOf("") }.argument("speed").validator(mustBeDouble) - .tabs { listOf("") } - .executePlayer(senderHasToBePlayer) { player, name, x, y, z, speed -> + .tabs { listOf("") }.executePlayer(senderHasToBePlayer) { player, name, x, y, z, speed -> walkToLocation(player, petMustExist(player, name), Location(player.world, x, y, z), speed) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, x, y, z, speed, player -> walkToLocation( commandSender, petMustExist(player, name), Location(player.world, x, y, z), speed @@ -368,8 +363,7 @@ class PetBlocksCommandExecutor @Inject constructor( permission(Permission.MOVETOOWNER) toolTip { PetBlocksLanguage.moveToOwnerCommandHint } builder().argument("name").tabs(petNamesTabs).argument("speed").validator(mustBeDouble) - .tabs { listOf("") } - .executePlayer(senderHasToBePlayer) { player, name, speed -> + .tabs { listOf("") }.executePlayer(senderHasToBePlayer) { player, name, speed -> walkToLocation( player, petMustExist(player, name), @@ -377,6 +371,7 @@ class PetBlocksCommandExecutor @Inject constructor( speed ) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, speed, player -> walkToLocation( commandSender, @@ -389,10 +384,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("hat") { permission(Permission.HAT) toolTip { PetBlocksLanguage.hatCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - hat(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + hat(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> hat(commandSender, petMustExist(player, name)) } @@ -400,10 +395,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("ride") { permission(Permission.RIDE) toolTip { PetBlocksLanguage.rideCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - ridePet(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + ridePet(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> ridePet(commandSender, petMustExist(player, name)) } @@ -411,10 +406,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("unmount") { permission(Permission.UNMOUNT) toolTip { PetBlocksLanguage.unmountCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - unmount(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + unmount(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> unmount(commandSender, petMustExist(player, name)) } @@ -432,6 +427,7 @@ class PetBlocksCommandExecutor @Inject constructor( player, petMustExist(player, name), Location(world, x, y, z, yaw.toFloat(), pitch.toFloat()) ) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, world, x, y, z, yaw, pitch, player -> teleportPet( commandSender, @@ -451,6 +447,7 @@ class PetBlocksCommandExecutor @Inject constructor( player, petMustExist(player, name), Vector(x, y, z) ) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, x, y, z, player -> setVelocityToPet( commandSender, petMustExist(player, name), Vector(x, y, z) @@ -460,11 +457,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("skintype") { permission(Permission.SKIN) toolTip { PetBlocksLanguage.skinTypeCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("material").validator(materialMustExist).tabs(materialTabs) - .executePlayer(senderHasToBePlayer) { player, name, material -> + builder().argument("name").tabs(petNamesTabs).argument("material").validator(materialMustExist) + .tabs(materialTabs).executePlayer(senderHasToBePlayer) { player, name, material -> setSkinType(player, petMustExist(player, name), material) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, material, player -> setSkinType(commandSender, petMustExist(player, name), material) } @@ -472,11 +469,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("skinnbt") { permission(Permission.SKIN) toolTip { PetBlocksLanguage.skinNbtCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("nbt").tabs { listOf("") } + builder().argument("name").tabs(petNamesTabs).argument("nbt").tabs { listOf("") } .executePlayer(senderHasToBePlayer) { player, name, nbt -> setSkinNbt(player, petMustExist(player, name), nbt) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, nbt, player -> setSkinNbt(commandSender, petMustExist(player, name), nbt) } @@ -484,11 +481,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("skincomponent") { permission(Permission.SKIN) toolTip { PetBlocksLanguage.skinComponentCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("datacomponent").tabs { listOf("") } - .executePlayer(senderHasToBePlayer) { player, name, component -> + builder().argument("name").tabs(petNamesTabs).argument("datacomponent") + .tabs { listOf("") }.executePlayer(senderHasToBePlayer) { player, name, component -> setSkinDataComponent(player, petMustExist(player, name), component) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, component, player -> setSkinDataComponent(commandSender, petMustExist(player, name), component) } @@ -496,11 +493,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("skinbase64") { permission(Permission.SKIN) toolTip { PetBlocksLanguage.skinBase64CommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("skin").tabs { listOf("") } + builder().argument("name").tabs(petNamesTabs).argument("skin").tabs { listOf("") } .executePlayer(senderHasToBePlayer) { player, name, skin -> setSkinBase64(player, petMustExist(player, name), skin) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, skin, player -> setSkinBase64(commandSender, petMustExist(player, name), skin) } @@ -508,11 +505,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("skinheaddatabase") { permission(Permission.SKIN_HEADDATABASE) toolTip { PetBlocksLanguage.skinHeadDatabaseCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("hdbId").tabs { listOf("") } + builder().argument("name").tabs(petNamesTabs).argument("hdbId").tabs { listOf("") } .executePlayer(senderHasToBePlayer) { player, name, hdbId -> setSkinHeadDatabase(player, petMustExist(player, name), hdbId) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, hdbId, player -> setSkinHeadDatabase(commandSender, petMustExist(player, name), hdbId) } @@ -520,11 +517,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("rename") { permission(Permission.RENAME) toolTip { PetBlocksLanguage.renameCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("displayName").validator(petNameMustBeLimited).tabs { listOf("") } - .executePlayer(senderHasToBePlayer) { player, name, displayName -> + builder().argument("name").tabs(petNamesTabs).argument("displayName").validator(petNameMustBeLimited) + .tabs { listOf("") }.executePlayer(senderHasToBePlayer) { player, name, displayName -> setDisplayName(player, petMustExist(player, name), displayName) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, displayName, player -> setDisplayName(commandSender, petMustExist(player, name), displayName) } @@ -532,11 +529,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("visibility") { permission(Permission.VISIBILITY) toolTip { PetBlocksLanguage.visibilityCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("type").validator(visibilityMustExist).tabs(visibilityTabs) - .executePlayer(senderHasToBePlayer) { player, name, visibilityType -> + builder().argument("name").tabs(petNamesTabs).argument("type").validator(visibilityMustExist) + .tabs(visibilityTabs).executePlayer(senderHasToBePlayer) { player, name, visibilityType -> setVisibility(player, petMustExist(player, name), visibilityType) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, visibilityType, player -> setVisibility(commandSender, petMustExist(player, name), visibilityType) } @@ -544,11 +541,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("loop") { permission(Permission.LOOP) toolTip { PetBlocksLanguage.loopCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("loop").tabs { listOf("") } + builder().argument("name").tabs(petNamesTabs).argument("loop").tabs { listOf("") } .executePlayer(senderHasToBePlayer) { player, name, loop -> setPetLoop(player, petMustExist(player, name), loop) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, loop, player -> setPetLoop(commandSender, petMustExist(player, name), loop) } @@ -556,11 +553,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("template") { permission(Permission.TEMPLATE) toolTip { PetBlocksLanguage.templateCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("template").validator(templateMustExist).tabs(templateTabs) - .executePlayer(senderHasToBePlayer) { player, name, template -> + builder().argument("name").tabs(petNamesTabs).argument("template").validator(templateMustExist) + .tabs(templateTabs).executePlayer(senderHasToBePlayer) { player, name, template -> setPetTemplate(player, petMustExist(player, name), template) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, template, player -> setPetTemplate(commandSender, petMustExist(player, name), template) } @@ -568,21 +565,21 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("spawn") { permission(Permission.SPAWN) toolTip { PetBlocksLanguage.spawnCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - spawnPet(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + spawnPet(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> spawnPet(commandSender, petMustExist(player, name)) } } subCommand("despawn") { - permission(Permission.DELETE) + permission(Permission.DESPAWN) toolTip { PetBlocksLanguage.deleteCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - deSpawnPet(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + deSpawnPet(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> deSpawnPet(commandSender, petMustExist(player, name)) } @@ -590,10 +587,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("toggle") { permission(Permission.TOGGLE) toolTip { PetBlocksLanguage.toggleCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - togglePet(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + togglePet(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> togglePet(commandSender, petMustExist(player, name)) } @@ -601,10 +598,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("select") { permission(Permission.SELECT) toolTip { PetBlocksLanguage.selectCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - selectPet(player, player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + selectPet(player, player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> selectPet(commandSender, player, petMustExist(player, name)) } @@ -612,10 +609,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("openheaddatabase") { permission(Permission.OPEN_HEADDATABSE) toolTip { PetBlocksLanguage.openHeadDatabaseCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - openHeadDatabase(player, player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + openHeadDatabase(player, player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> openHeadDatabase(commandSender, player, petMustExist(player, name)) } @@ -623,12 +620,12 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("breakblock") { permission(Permission.BREAK_BLOCK) toolTip { PetBlocksLanguage.breakBlockCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("timeToBreak").validator(mustBeInt).tabs { listOf("") } - .argument("dropType").tabs { DropType.values().map { e -> e.name } } + builder().argument("name").tabs(petNamesTabs).argument("timeToBreak").validator(mustBeInt) + .tabs { listOf("") }.argument("dropType").tabs { DropType.values().map { e -> e.name } } .executePlayer(senderHasToBePlayer) { player, name, timeToBreak, dropType -> breakBlock(player, petMustExist(player, name), dropType, timeToBreak) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, timeToBreak, dropType, player -> breakBlock(commandSender, petMustExist(player, name), dropType, timeToBreak) } @@ -636,10 +633,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("cancel") { permission(Permission.CANCEL) toolTip { PetBlocksLanguage.cancelCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - cancel(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + cancel(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> cancel(commandSender, petMustExist(player, name)) } @@ -647,11 +644,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("moveforward") { permission(Permission.MOVEREL) toolTip { PetBlocksLanguage.moveForwardCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("speed").validator(mustBeDouble) + builder().argument("name").tabs(petNamesTabs).argument("speed").validator(mustBeDouble) .executePlayer(senderHasToBePlayer) { player, name, speed -> moveForward(player, petMustExist(player, name), speed) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, speed, player -> moveForward(commandSender, petMustExist(player, name), speed) } @@ -659,12 +656,12 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("rotaterel") { permission(Permission.ROTATEREL) toolTip { PetBlocksLanguage.rotateRelCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("type").validator(rotationTypeMustExist).tabs(rotationTypeTabs) - .argument("angle").validator(mustBeDouble) + builder().argument("name").tabs(petNamesTabs).argument("type").validator(rotationTypeMustExist) + .tabs(rotationTypeTabs).argument("angle").validator(mustBeDouble) .executePlayer(senderHasToBePlayer) { player, name, rotationType, angle -> rotateRel(player, petMustExist(player, name), rotationType, angle.toFloat()) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, rotationType, angle, player -> rotateRel(commandSender, petMustExist(player, name), rotationType, angle.toFloat()) } @@ -672,11 +669,12 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("entitytype") { permission(Permission.ENTITYTYPE) toolTip { PetBlocksLanguage.entityTypeCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("type").tabs { EntityType.values().map { e -> "minecraft:${e.name.lowercase()}" } } + builder().argument("name").tabs(petNamesTabs).argument("type") + .tabs { EntityType.values().map { e -> "minecraft:${e.name.lowercase()}" } } .executePlayer(senderHasToBePlayer) { player, name, type -> setEntityType(player, petMustExist(player, name), type) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, type, player -> setEntityType(commandSender, petMustExist(player, name), type) } @@ -684,11 +682,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("entityvisible") { permission(Permission.ENTITYVISIBILITY) toolTip { PetBlocksLanguage.entityVisibleCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("flag").validator(mustBeBoolean).tabs(booleanTabs) - .executePlayer(senderHasToBePlayer) { player, name, flag -> + builder().argument("name").tabs(petNamesTabs).argument("flag").validator(mustBeBoolean) + .tabs(booleanTabs).executePlayer(senderHasToBePlayer) { player, name, flag -> setEntityVisible(player, petMustExist(player, name), flag) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, flag, player -> setEntityVisible(commandSender, petMustExist(player, name), flag) } @@ -696,11 +694,11 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("groundoffset") { permission(Permission.GROUNDOFFSET) toolTip { PetBlocksLanguage.groundOffSetCommandHint } - builder().argument("name").tabs(petNamesTabs) - .argument("offset").validator(mustBeDouble).tabs { listOf("") } - .executePlayer(senderHasToBePlayer) { player, name, offset -> + builder().argument("name").tabs(petNamesTabs).argument("offset").validator(mustBeDouble) + .tabs { listOf("") }.executePlayer(senderHasToBePlayer) { player, name, offset -> setGroundOffset(player, petMustExist(player, name), offset) }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, offset, player -> setGroundOffset(commandSender, petMustExist(player, name), offset) } @@ -708,10 +706,10 @@ class PetBlocksCommandExecutor @Inject constructor( subCommand("snap") { permission(Permission.SNAP) toolTip { PetBlocksLanguage.snapCommandHint } - builder().argument("name").tabs(petNamesTabs) - .executePlayer(senderHasToBePlayer) { player, name -> - snap(player, petMustExist(player, name)) - }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + builder().argument("name").tabs(petNamesTabs).executePlayer(senderHasToBePlayer) { player, name -> + snap(player, petMustExist(player, name)) + }.argument("player").validator(playerMustExist).tabs(onlinePlayerTabs) + .permission(manipulateOtherPermission).permissionMessage(manipulateOtherPermissionMessage) .execute { commandSender, name, player -> snap(commandSender, petMustExist(player, name)) } diff --git a/src/main/resources/lang/en_us.properties b/src/main/resources/lang/en_us.properties index 6c6efc9da..d862e63de 100644 --- a/src/main/resources/lang/en_us.properties +++ b/src/main/resources/lang/en_us.properties @@ -53,7 +53,7 @@ noPermissionCommand=[&9PetBlocks&f] &cYou do not have permission to execute this commandUsage=[&9PetBlocks&f] Use /petblocks help to see more info about the plugin. commandDescription=[&9PetBlocks&f] All commands for the PetBlocks plugin. commandSenderHasToBePlayer=[&9PetBlocks&f] The command sender has to be a player if you do not specify the optional player argument. -cannotParseBoolean=T[&9PetBlocks&f] &cCannot parse boolean %1$1s. +cannotParseBoolean=[&9PetBlocks&f] &cCannot parse boolean %1$1s. createCommandHint=Creates a new pet for the player with the given pet template. deleteCommandHint=Deletes the pet of the player. listCommandHint=Lists all pets of a player. @@ -89,3 +89,4 @@ rotateRelCommandHint=Rotates the pet relative to its current rotation. entityTypeCommandHint=Changes the entity type of the pet. The default type is minecraft:armor_stand entityVisibleCommandHint=Changes if the body of an entity is visible. For armorstands this is false, for most of the other entities this should be true. groundOffSetCommandHint=Changes the offset of the body of the entity to the ground. Useful when configuring different entity types. +manipulateOtherMessage=[&9PetBlocks&f] &cYou do not have permission to edit the pets of other players.