Skip to content

Commit

Permalink
work on fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Gutin1 committed Jan 2, 2025
1 parent 5d16f96 commit 502a590
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ object MultiblockWorkbench : InteractableCustomBlock(
val player = event.player
event.isCancelled = true

// Prevent the double firing of player interact events
cooldown.tryExec(player) { openMenu(player, block.location.toCenterLocation()) }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.horizonsend.ion.server.features.custom.items.misc

import io.papermc.paper.datacomponent.DataComponentTypes
import net.horizonsend.ion.common.extensions.information
import net.horizonsend.ion.common.extensions.userError
import net.horizonsend.ion.common.utils.text.ofChildren
Expand All @@ -20,12 +21,10 @@ import net.horizonsend.ion.server.miscellaneous.utils.text.itemName
import net.horizonsend.ion.server.miscellaneous.utils.updateMeta
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor
import org.bukkit.block.Chest
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.BlockStateMeta
import java.util.Locale

object PackagedMultiblock : CustomItem(
Expand Down Expand Up @@ -63,7 +62,7 @@ object PackagedMultiblock : CustomItem(
return
}

val inventory = ((itemStack.itemMeta as? BlockStateMeta)?.blockState as? Chest)?.inventory ?: return livingEntity.userError("The packaged multiblock has no data!")
val contents = itemStack.getData(DataComponentTypes.CONTAINER) ?: return livingEntity.userError("The packaged multiblock has no data!")

val direction = livingEntity.facing
val origin = PrePackaged.getOriginFromPlacement(
Expand All @@ -82,14 +81,14 @@ object PackagedMultiblock : CustomItem(

val entityData = itemStack.itemMeta.persistentDataContainer.get(NamespacedKeys.MULTIBLOCK_ENTITY_DATA, PersistentMultiblockData)

runCatching { PrePackaged.place(livingEntity, origin, livingEntity.facing, packagedData, inventory, entityData) }.onFailure {
runCatching { PrePackaged.place(livingEntity, origin, livingEntity.facing, packagedData, contents.contents(), entityData) }.onFailure {
livingEntity.information("ERROR: $it")
it.printStackTrace()
}.onSuccess {
// Drop remaining items in packaged multi
val dropLocation = origin.getRelative(direction.oppositeFace).location.toCenterLocation()

for (item in inventory.contents.filterNotNull()) {
for (item in contents.contents().filterNotNull()) {
livingEntity.world.dropItem(dropLocation, item)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package net.horizonsend.ion.server.features.multiblock

import io.papermc.paper.datacomponent.DataComponentTypes
import io.papermc.paper.datacomponent.item.ItemContainerContents
import net.horizonsend.ion.common.extensions.userError
import net.horizonsend.ion.server.features.custom.items.misc.PackagedMultiblock
import net.horizonsend.ion.server.features.multiblock.MultiblockEntities.loadFromData
Expand All @@ -21,6 +23,7 @@ import net.horizonsend.ion.server.miscellaneous.utils.getFacing
import net.horizonsend.ion.server.miscellaneous.utils.getRelativeIfLoaded
import net.horizonsend.ion.server.miscellaneous.utils.isSign
import net.horizonsend.ion.server.miscellaneous.utils.isWallSign
import net.horizonsend.ion.server.miscellaneous.utils.updateData
import net.horizonsend.ion.server.miscellaneous.utils.updateMeta
import net.kyori.adventure.text.Component.text
import org.bukkit.Material
Expand Down Expand Up @@ -85,7 +88,7 @@ object PrePackaged {
return obstructed
}

fun place(player: Player, origin: Block, direction: BlockFace, multiblock: Multiblock, itemSource: Inventory?, entityData: PersistentMultiblockData?) {
fun place(player: Player, origin: Block, direction: BlockFace, multiblock: Multiblock, itemSource: List<ItemStack>?, entityData: PersistentMultiblockData?) {
val requirements = multiblock.shape.getRequirementMap(direction)
val placements = mutableMapOf<Block, BlockData>()

Expand All @@ -102,7 +105,6 @@ object PrePackaged {

if (itemSource != null) {
itemSource
.filterNotNull()
.firstOrNull { requirement.itemRequirement.itemCheck(it) }
?.let {
usedItem = it.clone()
Expand All @@ -125,7 +127,7 @@ object PrePackaged {
val placement = if (usedItem == null) {
requirement.example.clone()
} else {
requirement.itemRequirement.toBlock.invoke(usedItem!!)
requirement.itemRequirement.toBlock.invoke(usedItem)
}

requirement.executePlacementModifications(placement, direction)
Expand All @@ -140,7 +142,7 @@ object PrePackaged {
}

if (multiblock is SignlessStarshipWeaponMultiblock<*>) return
val signItem: ItemStack? = itemSource?.contents?.firstOrNull { it?.type?.isSign == true }
val signItem: ItemStack? = itemSource?.firstOrNull { it.type.isSign == true }

// If there is an item source but no sign then there is not one available
if (itemSource != null && signItem == null) return
Expand Down Expand Up @@ -241,15 +243,11 @@ object PrePackaged {

fun createPackagedItem(availableItems: List<ItemStack>, multiblock: Multiblock): ItemStack {
val base = PackagedMultiblock.createFor(multiblock)
return base.updateMeta {
it as BlockStateMeta

@Suppress("UnstableApiUsage")
val newState = Material.CHEST.createBlockData().createBlockState() as Chest
packageFrom(availableItems, multiblock, newState.inventory)
@Suppress("UnstableApiUsage") val newState = Material.CHEST.createBlockData().createBlockState() as Chest
packageFrom(availableItems, multiblock, newState.inventory)

it.blockState = newState
}
return base.updateData(DataComponentTypes.CONTAINER, ItemContainerContents.containerContents(newState.inventory.contents.toList()))
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,32 @@
package net.horizonsend.ion.server.features.multiblock.type

import net.horizonsend.ion.common.utils.text.toComponent
import net.horizonsend.ion.common.utils.text.wrap
import net.horizonsend.ion.server.features.multiblock.Multiblock
import net.horizonsend.ion.server.miscellaneous.utils.updateDisplayName
import net.horizonsend.ion.server.miscellaneous.utils.updateLore
import net.kyori.adventure.text.Component
import org.bukkit.Material
import org.bukkit.inventory.ItemStack

interface DisplayNameMultilblock {
val displayName: Component
val description: Component

// val iconModel: Key

companion object {
fun Multiblock.getDisplayName() = if (this is DisplayNameMultilblock) displayName else javaClass.simpleName.toComponent()

fun Multiblock.getIcon(): ItemStack {
val base = ItemStack(Material.CHEST)
.updateDisplayName(getDisplayName())

return if (this is DisplayNameMultilblock) base
// .updateData(DataComponentTypes.ITEM_MODEL, iconModel)
.updateLore(description.wrap(150))
else
base
}
}
}

0 comments on commit 502a590

Please sign in to comment.