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
7 changes: 6 additions & 1 deletion .github/workflows/build-test-upload.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ jobs:
# For versioning, fetch everything so `git describe` works
fetch-depth: 0

- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '8'

- name: Setup Gradle
uses: gradle/gradle-build-action@v2

Expand All @@ -25,7 +30,7 @@ jobs:
run: ./gradlew test

- name: Upload Artifact
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: FastCraft.jar
path: build/libs/FastCraft*.jar
Expand Down
11 changes: 11 additions & 0 deletions fastcraft-bukkit/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@ allprojects {
repositories {
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://hub.spigotmc.org/nexus/content/repositories/snapshots" }
maven { url "https://maven.elmakers.com/repository/" }
maven { url "https://repo.papermc.io/repository/maven-public/" }
}

dependencies {
testImplementation 'org.jetbrains.kotlin:kotlin-test'
testImplementation "io.mockk:mockk:1.12.4"
}

test {
useJUnitPlatform()
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
package net.benwoodworth.fastcraft.bukkit.recipe

import org.bukkit.Material
import org.bukkit.Server
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryType
import org.bukkit.inventory.*
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class CraftingInventoryViewFactory_1_15 @Inject constructor(
private val server: Server,
) : CraftingInventoryViewFactory {
private companion object {
fun air() = ItemStack(Material.AIR)

/**
* The `getHolder` method available in Paper starting with 1.15.2:
* https://jd.papermc.io/paper/1.15.2/org/bukkit/inventory/Inventory.html#getHolder-boolean-
*/
private val paperInventoryGetHolderMethodWithUseSnapshot by lazy {
CraftingInventory::class.java.getMethod("getHolder", Boolean::class.java)
}
}

override fun create(
player: Player,
inventoryHolder: InventoryHolder?,
recipe: Recipe?,
): InventoryView {
return CustomInventoryView(
player = player,
topInventory = CustomCraftingInventory(inventoryHolder, recipe)
)
}

private class CustomInventoryView(
private val player: Player,
private val topInventory: Inventory,
) : InventoryView() {
override fun getPlayer(): Player {
return player
}

override fun getType(): InventoryType {
return topInventory.type
}

override fun getBottomInventory(): Inventory {
return player.inventory
}

override fun getTopInventory(): Inventory {
return topInventory
}

override fun getTitle(): String {
return "Crafting"
}
}

private inner class CustomCraftingInventory private constructor(
private val recipe: Recipe?,
private val baseInventory: Inventory,
) : CraftingInventory, Inventory by baseInventory {
constructor(inventoryHolder: InventoryHolder?, recipe: Recipe?) : this(
recipe = recipe,
baseInventory = server.createInventory(inventoryHolder, InventoryType.WORKBENCH)
)

override fun getItem(index: Int): ItemStack {
return baseInventory.getItem(index) ?: air()
}

override fun getContents(): Array<ItemStack> {
val contents = baseInventory.contents
for (i in contents.indices) {
contents[i] = contents[i] ?: air()
}

return contents
}

override fun getStorageContents(): Array<ItemStack> {
val storageContents = baseInventory.storageContents
for (i in storageContents.indices) {
storageContents[i] = storageContents[i] ?: air()
}

return storageContents
}

override fun getRecipe(): Recipe? {
return recipe
}

override fun getMatrix(): Array<ItemStack> {
return Array(size - 1) { slot -> getItem(slot) }
}

override fun setMatrix(contents: Array<out ItemStack>) {
if (contents.size > baseInventory.size - 1) {
throw IllegalArgumentException("matrix contents too large")
}

setContents(contents)
}

override fun getResult(): ItemStack {
return getItem(9)
}

override fun setResult(newResult: ItemStack?) {
setItem(size - 1, newResult)
}

override fun iterator(index: Int): MutableListIterator<ItemStack> {
val baseIterator = baseInventory.iterator(index)
return object : MutableListIterator<ItemStack> by baseIterator {
override fun next(): ItemStack {
return baseIterator.next() ?: air()
}

override fun previous(): ItemStack {
return baseIterator.previous() ?: air()
}
}
}

override fun iterator(): MutableListIterator<ItemStack> {
return iterator(0)
}

/**
* Delegates interface method added by PaperMC in 1.15.2:
* https://jd.papermc.io/paper/1.15.2/org/bukkit/inventory/Inventory.html#getHolder-boolean-
*/
fun getHolder(useSnapshot: Boolean): InventoryHolder? {
return paperInventoryGetHolderMethodWithUseSnapshot.invoke(baseInventory, useSnapshot) as InventoryHolder?
}
}
}
4 changes: 4 additions & 0 deletions fastcraft-bukkit/paper-1.15/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
dependencies {
testImplementation project(':fastcraft-bukkit:bukkit-1.15')
testImplementation 'com.destroystokyo.paper:paper-api:1.15.2-R0.1-SNAPSHOT'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package net.benwoodworth.fastcraft.bukkit.recipe

import io.mockk.every
import io.mockk.mockk
import org.bukkit.Server
import org.bukkit.event.inventory.InventoryType
import org.bukkit.inventory.Inventory
import org.bukkit.inventory.InventoryHolder
import kotlin.test.Test
import kotlin.test.assertSame

class CraftingInventoryViewFactoryTest {
@Test
fun get_holder_with_use_snapshot_should_delegate_correctly() {
val inventoryHolder = mockk<InventoryHolder>("non-snapshot")
val inventoryHolderSnapshot = mockk<InventoryHolder>("snapshot")

val baseInventory = mockk<Inventory>()
every { baseInventory.getHolder(false) } returns inventoryHolder
every { baseInventory.getHolder(true) } returns inventoryHolderSnapshot

val server = mockk<Server>()
every { server.createInventory(any(), InventoryType.WORKBENCH) } returns baseInventory

val inventoryFactory = CraftingInventoryViewFactory_1_15(server)
val customInventoryView = inventoryFactory.create(mockk(), null, null)
val customCraftingInventory = customInventoryView.topInventory

assertSame(inventoryHolder, customCraftingInventory.getHolder(false))
assertSame(inventoryHolderSnapshot, customCraftingInventory.getHolder(true))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,13 @@ class BukkitFastCraftModule(

@Provides
fun provideCraftingInventoryViewFactory(
instance_1_15: Provider<CraftingInventoryViewFactory_1_15>,
instance_1_14: Provider<CraftingInventoryViewFactory_1_14>,
instance_1_9: Provider<CraftingInventoryViewFactory_1_9>,
instance_1_7: Provider<CraftingInventoryViewFactory_1_7>,
): CraftingInventoryViewFactory {
return when {
bukkitVersion >= VERSION_1_15 -> instance_1_15.get()
bukkitVersion >= VERSION_1_14 -> instance_1_14.get()
bukkitVersion >= VERSION_1_9 -> instance_1_9.get()
bukkitVersion >= VERSION_1_7 -> instance_1_7.get()
Expand Down
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ include ":fastcraft-bukkit:bukkit-1.13"
include ":fastcraft-bukkit:bukkit-1.14"
include ":fastcraft-bukkit:bukkit-1.15"
include ":fastcraft-bukkit:bukkit-platform"
include ":fastcraft-bukkit:paper-1.15"


gradleEnterprise {
Expand Down
Loading