Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ Commands are now easier to use in general:

- Added tag `@since 0.8.0` to all APIs added in 0.8.0
- Make `BukkitPlayerInventory.collectEquippedItems` protected. It was public by an accident.
- Fixed `BukkitPlayerInventory.collectStoredItems` excluding the first stack equal to the item in the main hand instead of the held slot itself.
- Default implementation of `ClassSystem.hasAnyClass()` changed.
Now it checks if `getClasses()` returns a non-empty list instead of checking `getPrimaryClass() != null`.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ public abstract class BukkitPlayerInventory(player: Player) : PlayerInventory<It
val playerInventory = player.inventory
return playerInventory.storageContents
.asSequence()
.filterIndexed { slot, _ -> slot != playerInventory.heldItemSlot }
.plus(additionalItems)
.minus(playerInventory.itemInMainHand)
.filterNotNullOrEmpty()
.toList()
}
Expand Down
14 changes: 7 additions & 7 deletions mimic-bukkit/src/main/kotlin/command/ClassSystemSubcommand.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ package ru.endlesscode.mimic.command
import com.mojang.brigadier.arguments.StringArgumentType
import io.papermc.paper.command.brigadier.argument.ArgumentTypes
import net.kyori.adventure.text.format.NamedTextColor
import org.bukkit.entity.Player
import org.bukkit.command.CommandSender
import ru.endlesscode.mimic.Mimic
import ru.endlesscode.mimic.internal.append
import ru.endlesscode.mimic.internal.appendLine
Expand All @@ -41,22 +41,22 @@ internal fun CommandBuilder.classSystemSubcommand(mimic: Mimic) = literal("class
literal("info") {
executesPlayer(infoCommandExecutor(mimic))
argument(TARGET, ArgumentTypes.player()) {
executesPlayer(infoCommandExecutor(mimic))
executesAny(infoCommandExecutor(mimic))
}
}

// Check that player has the given classes
literal("check") {
argument(TARGET, ArgumentTypes.player()) {
argument(CLASSES, StringArgumentType.greedyString()) {
executesPlayer(checkCommandExecutor(mimic))
executesAny(checkCommandExecutor(mimic))
}
}
}
}

private fun infoCommandExecutor(mimic: Mimic): CommandAction<Player> = { player, context ->
val target = context.getPlayerOrDefault(TARGET, player)
private fun infoCommandExecutor(mimic: Mimic): CommandAction<CommandSender> = { sender, context ->
val target = context.getPlayerOrSender(TARGET, sender)
val provider = mimic.getClassSystemProvider()
val system = provider.getSystem(target)

Expand All @@ -72,10 +72,10 @@ private fun infoCommandExecutor(mimic: Mimic): CommandAction<Player> = { player,
suggestedCommand("info", "/mimic class info (player)", "Show information about player's class system"),
)
}
player.sendMessage(message)
sender.sendMessage(message)
}

private fun checkCommandExecutor(mimic: Mimic): CommandAction<Player> = { sender, context ->
private fun checkCommandExecutor(mimic: Mimic): CommandAction<CommandSender> = { sender, context ->
val target = context.getPlayer(TARGET)
val classes = context.getArgument<String>(CLASSES).split(" ")

Expand Down
8 changes: 4 additions & 4 deletions mimic-bukkit/src/main/kotlin/command/InventorySubcommand.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ru.endlesscode.mimic.command

import io.papermc.paper.command.brigadier.argument.ArgumentTypes
import org.bukkit.entity.Player
import org.bukkit.command.CommandSender
import ru.endlesscode.mimic.ExperimentalMimicApi
import ru.endlesscode.mimic.Mimic
import ru.endlesscode.mimic.internal.text
Expand All @@ -19,14 +19,14 @@ internal fun CommandBuilder.inventorySubcommand(mimic: Mimic) = literal("invento
literal("info") {
executesPlayer(infoExecutor(mimic))
argument(TARGET, ArgumentTypes.player()) {
executesPlayer(infoExecutor(mimic))
executesAny(infoExecutor(mimic))
}
}
}

@OptIn(ExperimentalMimicApi::class)
private fun infoExecutor(mimic: Mimic): CommandAction<Player> = { sender, context ->
val target = context.getPlayerOrDefault(TARGET, sender)
private fun infoExecutor(mimic: Mimic): CommandAction<CommandSender> = { sender, context ->
val target = context.getPlayerOrSender(TARGET, sender)
val provider = mimic.getPlayerInventoryProvider()
val inventory = provider.getSystem(target)

Expand Down
13 changes: 6 additions & 7 deletions mimic-bukkit/src/main/kotlin/command/LevelSystemSubcommand.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import io.papermc.paper.command.brigadier.argument.CustomArgumentType
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import ru.endlesscode.mimic.Mimic
import ru.endlesscode.mimic.internal.Log
import ru.endlesscode.mimic.internal.append
Expand All @@ -55,7 +54,7 @@ internal fun CommandBuilder.levelSystemSubcommand(mimic: Mimic) = literal("xp")
literal("info") {
executesPlayer(infoCommandExecutor(mimic))
argument(TARGET, ArgumentTypes.player()) {
executesPlayer(infoCommandExecutor(mimic))
executesAny(infoCommandExecutor(mimic))
}
}

Expand All @@ -64,7 +63,7 @@ internal fun CommandBuilder.levelSystemSubcommand(mimic: Mimic) = literal("xp")
suggests { _, builder -> suggestValues(builder) }
executesPlayer(changeCommandExecutor(mimic))
argument(TARGET, ArgumentTypes.player()) {
executesPlayer(changeCommandExecutor(mimic))
executesAny(changeCommandExecutor(mimic))
}
}
}
Expand Down Expand Up @@ -105,8 +104,8 @@ private fun ExpValue.describe(): Component {
}
}

private fun infoCommandExecutor(mimic: Mimic): CommandAction<Player> = { sender, context ->
val target = context.getPlayerOrDefault(TARGET, sender)
private fun infoCommandExecutor(mimic: Mimic): CommandAction<CommandSender> = { sender, context ->
val target = context.getPlayerOrSender(TARGET, sender)
val provider = mimic.getLevelSystemProvider()
val system = provider.getSystem(target)

Expand All @@ -127,9 +126,9 @@ private fun infoCommandExecutor(mimic: Mimic): CommandAction<Player> = { sender,
sender.sendMessage(message)
}

private fun changeCommandExecutor(mimic: Mimic): CommandAction<Player> = { sender, context ->
private fun changeCommandExecutor(mimic: Mimic): CommandAction<CommandSender> = { sender, context ->
val value = context.getArgument<ExpValue>(VALUE)
val target = context.getPlayerOrDefault(TARGET, sender)
val target = context.getPlayerOrSender(TARGET, sender)
catchUnsupported {
val system = mimic.getLevelSystem(target)
@Suppress("DEPRECATION") // Allow using exp setter
Expand Down
5 changes: 3 additions & 2 deletions mimic-bukkit/src/main/kotlin/command/brigadier.kt
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,9 @@ internal fun CommandContext<CommandSourceStack>.getPlayer(name: String): Player
getArgument<PlayerSelectorArgumentResolver>(name).resolve(source).firstOrNull()
?: throw commandError("No player was found")

internal fun CommandContext<CommandSourceStack>.getPlayerOrDefault(name: String, default: Player): Player =
if (hasArgument(name)) getPlayer(name) else default
/** Returns the player from the argument [name]. If it is not specified, [sender] must be a player. */
internal fun CommandContext<CommandSourceStack>.getPlayerOrSender(name: String, sender: CommandSender): Player =
if (hasArgument(name)) getPlayer(name) else sender as Player

internal fun CommandContext<CommandSourceStack>.getBlockLocation(name: String): Location =
getArgument<BlockPositionResolver>(name).resolve(source).toLocation(source.location.world)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package ru.endlesscode.mimic.impl.vanilla

import io.kotest.matchers.collections.shouldContainExactly
import io.mockk.every
import io.mockk.mockk
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.PlayerInventory
import ru.endlesscode.mimic.BukkitTestBase
import kotlin.test.Test

class MinecraftPlayerInventoryTest : BukkitTestBase() {

private val playerInventory: PlayerInventory = mockk()

// SUT
private val inventory = MinecraftPlayerInventory(player)

init {
every { player.inventory } returns playerInventory
}

@Test
fun `when get stored items and another slot has equal stack - should exclude only held slot`() {
val heldItem = item()
val equalItem = item()
every { equalItem == heldItem } returns true
every { playerInventory.storageContents } returns arrayOf(equalItem, heldItem, null)
every { playerInventory.heldItemSlot } returns 1

inventory.storedItems.shouldContainExactly(equalItem)
}

private fun item(): ItemStack = mockk {
every { isEmpty } returns false
}
}
Loading