Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
6e7d52c
added some item components
Chaosgh Aug 24, 2025
88893db
added some item components
Chaosgh Aug 24, 2025
22b5a40
fixed default mismatch
Chaosgh Aug 24, 2025
9ef42b2
refactor ItemComponents Add InteractionContext for parity and added b…
Chaosgh Aug 24, 2025
0add039
Better handeling of invalide namespaces in ItemPDCComponent (for exam…
Chaosgh Aug 24, 2025
c5dd35e
Merge branch 'develop' into develop
Chaosgh Aug 26, 2025
57df20e
Merge branch 'develop' into develop
Chaosgh Aug 27, 2025
feedee3
Small fix in `ItemNameComponent`: `effectiveName()` is only available…
Chaosgh Aug 27, 2025
5356714
Merge remote-tracking branch 'origin/develop' into develop
Chaosgh Aug 27, 2025
dbbb85f
Merge pull request #1 from gabber235/develop
Chaosgh Sep 4, 2025
8bc8515
- Data types were added to 'pdc' and 'CustomModelDataType'.
Chaosgh Sep 4, 2025
99077b6
- Data types were added to 'pdc' and 'CustomModelDataType'.
Chaosgh Sep 4, 2025
8478c5c
small fixes to stay compatible with the typewriter panel
Chaosgh Sep 4, 2025
aa3f821
Merge pull request #2 from Chaosgh/components
Chaosgh Sep 4, 2025
5c88045
- different unsupported message to make it clearer
Chaosgh Sep 5, 2025
9518b06
small cleanups
Chaosgh Sep 5, 2025
a500a66
Merge branch 'develop' into develop
Chaosgh Sep 15, 2025
6e2eef9
small cleanups like gabber told me
Chaosgh Sep 19, 2025
0f61b85
small cleanups like gabber told me
Chaosgh Sep 19, 2025
47d31fc
Merge branch 'develop' into develop
Chaosgh Sep 19, 2025
38192a5
Merge remote-tracking branch 'origin/develop' into develop
Chaosgh Sep 19, 2025
e330496
Merge branch 'develop' into develop
Chaosgh Sep 20, 2025
dc1fef0
Merge branch 'develop' into develop
Chaosgh Sep 26, 2025
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.typewritermc.engine.paper.utils.item.components

import com.typewritermc.core.books.pages.Colors
import com.typewritermc.core.extension.annotations.AlgebraicTypeInfo
import com.typewritermc.core.extension.annotations.Default
import com.typewritermc.core.extension.annotations.InnerMin
import com.typewritermc.core.extension.annotations.Min
import com.typewritermc.core.interaction.InteractionContext
import com.typewritermc.engine.paper.entry.entries.ConstVar
import com.typewritermc.engine.paper.entry.entries.Var
import com.typewritermc.engine.paper.entry.entries.get
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack

@Suppress("UnstableApiUsage")
@AlgebraicTypeInfo("custom_model_data", Colors.GREEN, "fa6-solid:shapes")
class ItemCustomModelDataComponent(
@InnerMin(Min(0))
@Default("0")

val customModelData: Var<Int> = ConstVar(0),
) : ItemComponent {
override fun apply(player: Player?, interactionContext: InteractionContext?, item: ItemStack) {
item.editMeta { meta ->
val modelData = customModelData.get(player, interactionContext) ?: return@editMeta
val expectedFloats = if (modelData == 0) emptyList() else listOf(modelData.toFloat())
val component = meta.customModelDataComponent
if (component.floats == expectedFloats) return@editMeta
component.floats = expectedFloats
meta.setCustomModelDataComponent(component)
}
}

override fun matches(player: Player?, interactionContext: InteractionContext?, item: ItemStack): Boolean {
val expectedModelData = customModelData.get(player, interactionContext) ?: return false
val actualComponent = item.itemMeta?.customModelDataComponent
val actualFloats = actualComponent?.floats ?: emptyList()

val expectedFloats = if (expectedModelData == 0) {
emptyList()
} else {
listOf(expectedModelData.toFloat())
}

return actualFloats == expectedFloats
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.typewritermc.engine.paper.utils.item.components

import com.typewritermc.core.books.pages.Colors
import com.typewritermc.core.extension.annotations.AlgebraicTypeInfo
import com.typewritermc.core.interaction.InteractionContext
import com.typewritermc.engine.paper.entry.entries.ConstVar
import com.typewritermc.engine.paper.entry.entries.Var
import com.typewritermc.engine.paper.entry.entries.get
import com.typewritermc.engine.paper.utils.Sound
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack

@Suppress("UnstableApiUsage")
@AlgebraicTypeInfo("jukebox_playable", Colors.RED, "fa6-solid:music")
class ItemJukeboxPlayableComponent(
val sound: Var<Sound> = ConstVar(Sound.EMPTY)
) : ItemComponent {
override fun apply(player: Player?, interactionContext: InteractionContext?, item: ItemStack) {
item.editMeta { meta ->
val resolvedSound = sound.get(player, interactionContext)
if (resolvedSound == null || resolvedSound == Sound.EMPTY) {
meta.setJukeboxPlayable(null)
return@editMeta
}

val soundKey = resolvedSound.soundId.namespacedKey ?: return@editMeta
val jukeboxComponent = meta.jukeboxPlayable
jukeboxComponent.songKey = soundKey
meta.setJukeboxPlayable(jukeboxComponent)
}
}

override fun matches(player: Player?, interactionContext: InteractionContext?, item: ItemStack): Boolean {
val expectedSound = sound.get(player, interactionContext)
val actualComponent = item.itemMeta?.jukeboxPlayable

if (expectedSound == null || expectedSound == Sound.EMPTY) {
return actualComponent == null
}

return actualComponent?.songKey == expectedSound.soundId.namespacedKey
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.typewritermc.engine.paper.utils.item.components

import com.typewritermc.core.books.pages.Colors
import com.typewritermc.core.extension.annotations.AlgebraicTypeInfo
import com.typewritermc.core.extension.annotations.Default
import com.typewritermc.core.interaction.InteractionContext
import com.typewritermc.engine.paper.entry.entries.ConstVar
import com.typewritermc.engine.paper.entry.entries.Var
import com.typewritermc.engine.paper.entry.entries.get
import org.bukkit.NamespacedKey
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType

@AlgebraicTypeInfo("persistent_data_container", Colors.PURPLE, "fa6-solid:database")
class ItemPDCComponent(
@Default("\"typewriter\"")
val namespace: Var<String> = ConstVar("typewriter"),
@Default("\"custom_data\"")
val key: Var<String> = ConstVar("custom_data"),
@Default("\"\"")
val value: Var<String> = ConstVar(""),
) : ItemComponent {

override fun apply(player: Player?, interactionContext: InteractionContext?, item: ItemStack) {
item.editMeta { meta ->
val ns = namespace.get(player, interactionContext)?.trim()?.takeIf { it.isNotEmpty() } ?: return@editMeta
val k = key.get(player, interactionContext)?.trim()?.takeIf { it.isNotEmpty() } ?: return@editMeta
val v = value.get(player, interactionContext)?.trim() ?: return@editMeta

val namespacedKey = try {
NamespacedKey(ns, k)
} catch (_: IllegalArgumentException) {
return@editMeta
}

if (v.isBlank()) {
meta.persistentDataContainer.remove(namespacedKey)
} else {
meta.persistentDataContainer.set(namespacedKey, PersistentDataType.STRING, v)
}
}
}

override fun matches(player: Player?, interactionContext: InteractionContext?, item: ItemStack): Boolean {
val ns = namespace.get(player, interactionContext)?.trim()?.takeIf { it.isNotEmpty() } ?: return false
val k = key.get(player, interactionContext)?.trim()?.takeIf { it.isNotEmpty() } ?: return false
val expected = value.get(player, interactionContext)?.trim() ?: return false

val namespacedKey = try {
NamespacedKey(ns, k)
} catch (_: IllegalArgumentException) {
return false
}
val actualValue = item.itemMeta?.persistentDataContainer?.get(namespacedKey, PersistentDataType.STRING)

return if (expected.isBlank()) {
actualValue.isNullOrBlank()
} else {
actualValue == expected
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.typewritermc.engine.paper.utils.item.components

import com.typewritermc.core.books.pages.Colors
import com.typewritermc.core.extension.annotations.AlgebraicTypeInfo
import com.typewritermc.core.extension.annotations.Default
import com.typewritermc.core.interaction.InteractionContext
import com.typewritermc.engine.paper.entry.entries.ConstVar
import com.typewritermc.engine.paper.entry.entries.Var
import com.typewritermc.engine.paper.entry.entries.get
import org.bukkit.NamespacedKey
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack

@AlgebraicTypeInfo("tooltip_style", Colors.CYAN, "fa6-solid:palette")
class ItemTooltipStyleComponent(
@Default("\"minecraft\"")
val namespace: Var<String> = ConstVar("minecraft"),
@Default("\"default\"")
val key: Var<String> = ConstVar("default"),
) : ItemComponent {
override fun apply(player: Player?, interactionContext: InteractionContext?, item: ItemStack) {
item.editMeta { meta ->
val namespaceValue = namespace.get(player, interactionContext) ?: return@editMeta
val keyValue = key.get(player, interactionContext) ?: return@editMeta
val namespacedKey = NamespacedKey(namespaceValue, keyValue)
if (meta.tooltipStyle == namespacedKey) return@editMeta
meta.tooltipStyle = namespacedKey
}
}


override fun matches(player: Player?, interactionContext: InteractionContext?, item: ItemStack): Boolean {
val expectedNamespace = namespace.get(player, interactionContext) ?: return false
val expectedKey = key.get(player, interactionContext) ?: return false
val actualStyle = item.itemMeta?.tooltipStyle
val expectedNamespacedKey = NamespacedKey(expectedNamespace, expectedKey)
return actualStyle == expectedNamespacedKey
}
}