Skip to content

Commit 58be070

Browse files
committed
item ability handler
1 parent 98785aa commit 58be070

11 files changed

+237
-121
lines changed

Diff for: src/main/kotlin/dev/sterner/VoidBound.kt

+1-63
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,22 @@
11
package dev.sterner
22

3-
import com.mojang.serialization.Codec
43
import com.sammy.malum.MalumMod
5-
import com.sammy.malum.MalumModClient
6-
import dev.emi.trinkets.api.client.TrinketRendererRegistry
7-
import dev.sterner.client.VoidBoundModelLoaderPlugin
8-
import dev.sterner.client.renderer.HallowedMonocleRenderer
9-
import dev.sterner.client.renderer.WandItemRenderer
10-
import dev.sterner.client.screen.OsmoticEnchanterScreen
114
import dev.sterner.common.VoidBoundLootModifier
125
import dev.sterner.listener.EnchantSpiritDataReloadListenerFabricImpl
136
import dev.sterner.registry.*
14-
import io.github.fabricators_of_create.porting_lib.loot.IGlobalLootModifier
15-
import io.github.fabricators_of_create.porting_lib.loot.PortingLibLoot
16-
import io.github.fabricators_of_create.porting_lib.util.RegistryObject
17-
import net.fabricmc.api.ClientModInitializer
187
import net.fabricmc.api.ModInitializer
19-
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap
20-
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin
21-
import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry
228
import net.fabricmc.fabric.api.resource.ResourceManagerHelper
23-
import net.minecraft.client.gui.screens.MenuScreens
24-
import net.minecraft.client.renderer.RenderType
25-
import net.minecraft.client.renderer.item.ItemProperties
269
import net.minecraft.resources.ResourceLocation
2710
import net.minecraft.server.packs.PackType
2811
import org.slf4j.LoggerFactory
2912
import team.lodestar.lodestone.LodestoneLib
3013

3114

32-
object VoidBound : ModInitializer, ClientModInitializer {
15+
object VoidBound : ModInitializer {
3316

3417
const val modid: String = "voidbound"
3518
private val logger = LoggerFactory.getLogger(modid)
3619

37-
3820
override fun onInitialize() {
3921
LodestoneLib()
4022
MalumMod()
@@ -64,50 +46,6 @@ object VoidBound : ModInitializer, ClientModInitializer {
6446
.registerReloadListener(EnchantSpiritDataReloadListenerFabricImpl())
6547
}
6648

67-
override fun onInitializeClient() {
68-
MalumModClient()
69-
VoidBoundShaders.init()
70-
VoidBoundParticleTypeRegistry.init()
71-
VoidBoundKeyBindings.init()
72-
VoidBoundEntityRenderers.init()
73-
VoidBoundModelLayers.init()
74-
VoidBoundEvents.clientInit()
75-
76-
TrinketRendererRegistry.registerRenderer(
77-
VoidBoundItemRegistry.HALLOWED_MONOCLE.get(),
78-
HallowedMonocleRenderer()
79-
)
80-
81-
ItemProperties.register(
82-
VoidBoundItemRegistry.CALL_OF_THE_VOID.get(),
83-
id("glowing")
84-
) { itemStack, _, _, _ ->
85-
val v =
86-
if (itemStack.tag != null && itemStack.tag!!.contains("Glowing") && itemStack.tag!!.getBoolean("Glowing")) 1f else 0f
87-
return@register v
88-
}
89-
90-
BuiltinItemRendererRegistry.INSTANCE.register(
91-
VoidBoundItemRegistry.HALLOWED_GOLD_CAPPED_RUNEWOOD_WAND.get(),
92-
WandItemRenderer("hallowed_gold_capped_runewood_wand")
93-
)
94-
BuiltinItemRendererRegistry.INSTANCE.register(
95-
VoidBoundItemRegistry.SOUL_STAINED_STEEL_CAPPED_SOULWOOD_WAND.get(),
96-
WandItemRenderer("soul_stained_steel_capped_soulwood_wand")
97-
)
98-
99-
BlockRenderLayerMap.INSTANCE.putBlocks(
100-
RenderType.cutout(),
101-
VoidBoundBlockRegistry.TEAR_OF_ENDER.get(),
102-
VoidBoundBlockRegistry.TEAR_OF_BRIMSTONE.get(),
103-
VoidBoundBlockRegistry.OSMOTIC_ENCHANTER.get()
104-
)
105-
106-
ModelLoadingPlugin.register(VoidBoundModelLoaderPlugin)
107-
108-
MenuScreens.register(VoidBoundMenuTypeRegistry.OSMOTIC_ENCHANTER.get(), ::OsmoticEnchanterScreen)
109-
}
110-
11149
fun id(name: String): ResourceLocation {
11250
return ResourceLocation(modid, name)
11351
}

Diff for: src/main/kotlin/dev/sterner/VoidBoundClient.kt

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package dev.sterner
2+
3+
import com.sammy.malum.MalumModClient
4+
import dev.emi.trinkets.api.client.TrinketRendererRegistry
5+
import dev.sterner.VoidBound.id
6+
import dev.sterner.client.VoidBoundModelLoaderPlugin
7+
import dev.sterner.client.renderer.HallowedMonocleRenderer
8+
import dev.sterner.client.renderer.WandItemRenderer
9+
import dev.sterner.client.screen.OsmoticEnchanterScreen
10+
import dev.sterner.common.ItemAbilityHandler
11+
import dev.sterner.registry.*
12+
import net.fabricmc.api.ClientModInitializer
13+
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap
14+
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin
15+
import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry
16+
import net.minecraft.client.gui.screens.MenuScreens
17+
import net.minecraft.client.renderer.RenderType
18+
import net.minecraft.client.renderer.item.ItemProperties
19+
20+
21+
object VoidBoundClient : ClientModInitializer {
22+
23+
val ITEM_ABILITY_HANDLER: ItemAbilityHandler = ItemAbilityHandler()
24+
25+
override fun onInitializeClient() {
26+
MalumModClient()
27+
VoidBoundShaders.init()
28+
VoidBoundParticleTypeRegistry.init()
29+
VoidBoundKeyBindings.init()
30+
VoidBoundEntityRenderers.init()
31+
VoidBoundModelLayers.init()
32+
VoidBoundEvents.clientInit()
33+
34+
TrinketRendererRegistry.registerRenderer(
35+
VoidBoundItemRegistry.HALLOWED_MONOCLE.get(),
36+
HallowedMonocleRenderer()
37+
)
38+
39+
ItemProperties.register(
40+
VoidBoundItemRegistry.CALL_OF_THE_VOID.get(),
41+
id("glowing")
42+
) { itemStack, _, _, _ ->
43+
val v =
44+
if (itemStack.tag != null && itemStack.tag!!.contains("Glowing") && itemStack.tag!!.getBoolean("Glowing")) 1f else 0f
45+
return@register v
46+
}
47+
48+
BuiltinItemRendererRegistry.INSTANCE.register(
49+
VoidBoundItemRegistry.HALLOWED_GOLD_CAPPED_RUNEWOOD_WAND.get(),
50+
WandItemRenderer("hallowed_gold_capped_runewood_wand")
51+
)
52+
BuiltinItemRendererRegistry.INSTANCE.register(
53+
VoidBoundItemRegistry.SOUL_STAINED_STEEL_CAPPED_SOULWOOD_WAND.get(),
54+
WandItemRenderer("soul_stained_steel_capped_soulwood_wand")
55+
)
56+
57+
BlockRenderLayerMap.INSTANCE.putBlocks(
58+
RenderType.cutout(),
59+
VoidBoundBlockRegistry.TEAR_OF_ENDER.get(),
60+
VoidBoundBlockRegistry.TEAR_OF_BRIMSTONE.get(),
61+
VoidBoundBlockRegistry.OSMOTIC_ENCHANTER.get()
62+
)
63+
64+
ModelLoadingPlugin.register(VoidBoundModelLoaderPlugin)
65+
66+
MenuScreens.register(VoidBoundMenuTypeRegistry.OSMOTIC_ENCHANTER.get(), ::OsmoticEnchanterScreen)
67+
}
68+
69+
70+
}

Diff for: src/main/kotlin/dev/sterner/api/VoidBoundApi.kt

+7-27
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import com.sammy.malum.client.VoidRevelationHandler
44
import com.sammy.malum.common.container.WeaversWorkbenchContainer.component
55
import com.sammy.malum.core.systems.recipe.SpiritWithCount
66
import dev.sterner.api.item.ItemAbility
7-
import dev.sterner.api.item.ItemAbilityWithLevel
87
import dev.sterner.listener.EnchantSpiritDataReloadListener
98
import dev.sterner.registry.VoidBoundComponentRegistry
109
import dev.sterner.registry.VoidBoundItemRegistry
@@ -143,29 +142,29 @@ object VoidBoundApi {
143142
return false
144143
}
145144

146-
fun getItemAbility(stack: ItemStack): List<ItemAbilityWithLevel> {
147-
val abilities = mutableListOf<ItemAbilityWithLevel>()
145+
fun getItemAbility(stack: ItemStack): List<ItemAbility> {
146+
val abilities = mutableListOf<ItemAbility>()
148147
val tag = stack.tag ?: return abilities // Return empty if no NBT
149148

150149
val abilitiesTag = tag.getList("Abilities", 10) // 10 is the NBT type for CompoundTag
151150
for (i in 0 until abilitiesTag.size) {
152151
val abilityTag = abilitiesTag.getCompound(i)
153-
val ability = ItemAbilityWithLevel.readNbt(abilityTag)
152+
val ability = ItemAbility.readNbt(abilityTag)
154153
abilities.add(ability)
155154
}
156155
return abilities
157156
}
158157

159158
// Function to add an ItemAbilityWithLevel to an ItemStack's NBT
160-
fun addItemAbility(stack: ItemStack, abilityWithLevel: ItemAbilityWithLevel) {
159+
fun addItemAbility(stack: ItemStack, abilityWithLevel: ItemAbility) {
161160
val tag = stack.orCreateTag // Ensures the stack has NBT
162161
val abilitiesTag = tag.getList("Abilities", 10) // Fetch or create list
163162

164163
// Check if ability already exists, if so, skip adding a duplicate
165164
for (i in 0 until abilitiesTag.size) {
166165
val abilityTag = abilitiesTag.getCompound(i)
167-
val existingAbility = ItemAbilityWithLevel.readNbt(abilityTag)
168-
if (existingAbility.itemAbility == abilityWithLevel.itemAbility) {
166+
val existingAbility = ItemAbility.readNbt(abilityTag)
167+
if (existingAbility == abilityWithLevel) {
169168
return // Ability already exists, exit without adding
170169
}
171170
}
@@ -175,26 +174,7 @@ object VoidBoundApi {
175174
tag.put("Abilities", abilitiesTag)
176175
}
177176

178-
// Function to modify the level of an existing ItemAbility in NBT
179-
fun modifyItemAbilityLevel(stack: ItemStack, itemAbility: ItemAbility, newLevel: Int) {
180-
val tag = stack.tag ?: return // No NBT, nothing to modify
181-
val abilitiesTag = tag.getList("Abilities", 10)
182-
183-
// Find the ability and modify its level
184-
for (i in 0 until abilitiesTag.size) {
185-
val abilityTag = abilitiesTag.getCompound(i)
186-
val ability = ItemAbilityWithLevel.readNbt(abilityTag)
187-
if (ability.itemAbility == itemAbility) {
188-
// Modify the level and update the NBT
189-
abilityTag.putInt("Level", newLevel)
190-
abilitiesTag[i] = abilityTag // Replace the modified ability in the list
191-
tag.put("Abilities", abilitiesTag)
192-
return
193-
}
194-
}
195-
}
196-
197177
fun hasItemAbility(stack: ItemStack, ability: ItemAbility): Boolean {
198-
return !getItemAbility(stack).none { it.itemAbility == ability }
178+
return !getItemAbility(stack).none { it == ability }
199179
}
200180
}

Diff for: src/main/kotlin/dev/sterner/api/item/ItemAbility.kt

+14
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package dev.sterner.api.item
22

3+
import net.minecraft.nbt.CompoundTag
34
import net.minecraft.util.StringRepresentable
45
import net.minecraft.world.entity.EquipmentSlot
56
import net.minecraft.world.item.*
67

78
import kotlin.reflect.KClass
89

910
enum class ItemAbility(private val equipmentSlot: EquipmentSlot?, private val clazz: KClass<out Item>?): StringRepresentable {
11+
NONE(null, null),
1012
AUTOSMELT(null, DiggerItem::class),
1113
VAMPIRISM(null, SwordItem::class),
1214
QUICKDRAW(null, ProjectileWeaponItem::class),
@@ -29,4 +31,16 @@ enum class ItemAbility(private val equipmentSlot: EquipmentSlot?, private val cl
2931
}
3032
return list
3133
}
34+
35+
fun writeNbt(): CompoundTag {
36+
val tag = CompoundTag()
37+
tag.putString("Ability", name)
38+
return tag
39+
}
40+
41+
companion object {
42+
fun readNbt(abilityTag: CompoundTag): ItemAbility {
43+
return valueOf(abilityTag.getString("Ability"))
44+
}
45+
}
3246
}

Diff for: src/main/kotlin/dev/sterner/api/item/ItemAbilityWithLevel.kt

-24
This file was deleted.

Diff for: src/main/kotlin/dev/sterner/api/item/UpgradableAbilityItem.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,25 @@ interface UpgradableAbilityItem {
99

1010
fun removeExperience(experience: Int)
1111

12-
fun writeNbt(abilities: List<ItemAbilityWithLevel>): CompoundTag {
12+
fun writeNbt(abilities: List<ItemAbility>): CompoundTag {
1313
val listTag = ListTag()
1414
for (ability in abilities) {
15-
val ab = ability.writeNbt()
16-
listTag.add(ab)
15+
val abilityTag = ability.writeNbt()
16+
listTag.add(abilityTag)
1717
}
1818
val tag = CompoundTag()
1919
tag.put("Abilities", listTag)
2020
return tag
2121
}
2222

23-
fun readNbt(tag: CompoundTag): List<ItemAbilityWithLevel> {
23+
fun readNbt(tag: CompoundTag): List<ItemAbility> {
2424
val tagList = tag.getList("Abilities", 10)
25-
val list = mutableListOf<ItemAbilityWithLevel>()
25+
val list = mutableListOf<ItemAbility>()
2626

2727
for (i in 0 until tagList.size) {
2828
val abilityTag = tagList.getCompound(i)
29-
val ability = ItemAbilityWithLevel.readNbt(abilityTag)
29+
val ability = ItemAbility.readNbt(abilityTag)
30+
3031
list.add(ability)
3132
}
3233

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package dev.sterner.client.screen
2+
3+
import dev.sterner.api.VoidBoundApi
4+
import dev.sterner.api.item.ItemAbility
5+
import net.minecraft.client.Minecraft
6+
import net.minecraft.client.gui.screens.Screen
7+
import net.minecraft.network.chat.Component
8+
import net.minecraft.world.item.ItemStack
9+
import kotlin.math.max
10+
11+
class ItemAbilityScreen(stack: ItemStack) : Screen(Component.literal("Ability Selection")) {
12+
13+
var focus: Boolean = false
14+
private var yOffset = 0f
15+
private var selection: Int = 0
16+
private var initialized = false
17+
var abilities: List<ItemAbility>? = null
18+
19+
private var w: Int = 0
20+
private var h: Int = 0
21+
22+
init {
23+
this.minecraft = Minecraft.getInstance()
24+
abilities = VoidBoundApi.getItemAbility(stack)
25+
focus = false
26+
yOffset = 0f
27+
selection = 0
28+
initialized = false
29+
30+
w = max((abilities!!.size * 50 + 30).toDouble(), 220.0).toInt()
31+
h = 30
32+
}
33+
34+
fun cycle(direction: Int) {
35+
selection += if ((direction < 0)) 1 else -1
36+
selection = (selection + abilities!!.size) % abilities!!.size
37+
}
38+
39+
fun update() {
40+
if (focus) {
41+
yOffset += (40 - yOffset) * .1f
42+
} else {
43+
yOffset *= .9f
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)