Skip to content

Commit 4e2ecf6

Browse files
committed
Add "has_enchantments" conditional
1 parent 69242ce commit 4e2ecf6

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
lines changed

README.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@ A vanilla-like implementation of Optifine's CIT, shaped how I believe it would b
88

99
- has_enchantment (if stack has the enchantment)
1010
- fields:
11-
- enchantment: Enchantment Identifier [REQUIRED]
11+
- enchantment: Enchantment identifier [REQUIRED]
1212
- level [OPTIONAL]
13+
- has_enchantments (if stack has all the listed enchantments)
14+
- fields:
15+
- enchantments: List of enchantment identifier [REQUIRED]
1316

1417
#### Range Dispatch:
1518

1619
- enchantment_level (value based on enchantment level)
1720
- fields:
18-
- enchantment: Enchantment Identifier [REQUIRED]
21+
- enchantment: Enchantment identifier [REQUIRED]
1922

2023
#### Select:
2124

@@ -90,4 +93,27 @@ golden_apple.json
9093
}
9194
}
9295
}
96+
```
97+
98+
bone.json
99+
100+
```json
101+
{
102+
"model": {
103+
"type": "minecraft:condition",
104+
"property": "chit:has_enchantments",
105+
"enchantments": [
106+
"minecraft:unbreaking",
107+
"minecraft:sharpness"
108+
],
109+
"on_true": {
110+
"type": "minecraft:model",
111+
"model": "minecraft:item/stick"
112+
},
113+
"on_false": {
114+
"type": "minecraft:model",
115+
"model": "minecraft:item/bone"
116+
}
117+
}
118+
}
93119
```

src/main/kotlin/btw/lowercase/chit/ChitClientMod.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package btw.lowercase.chit
22

33
import btw.lowercase.chit.property.conditional.HasEnchantmentConditional
4+
import btw.lowercase.chit.property.conditional.HasEnchantmentsConditional
45
import btw.lowercase.chit.property.numeric.EnchantmentLevelNumeric
56
import btw.lowercase.chit.property.select.RaritySelect
67
import net.fabricmc.api.ClientModInitializer
@@ -13,6 +14,7 @@ object ChitClientMod : ClientModInitializer {
1314
override fun onInitializeClient() {
1415
// Enchantments
1516
ConditionalItemModelProperties.ID_MAPPER.put(id("has_enchantment"), HasEnchantmentConditional.CODEC)
17+
ConditionalItemModelProperties.ID_MAPPER.put(id("has_enchantments"), HasEnchantmentsConditional.CODEC)
1618
RangeSelectItemModelProperties.ID_MAPPER.put(id("enchantment_level"), EnchantmentLevelNumeric.CODEC)
1719

1820
// Components
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package btw.lowercase.chit.property.conditional
2+
3+
import btw.lowercase.chit.EnchantmentUtil
4+
import com.mojang.serialization.MapCodec
5+
import com.mojang.serialization.codecs.RecordCodecBuilder
6+
import net.minecraft.client.multiplayer.ClientLevel
7+
import net.minecraft.client.renderer.item.properties.conditional.ConditionalItemModelProperty
8+
import net.minecraft.resources.ResourceLocation
9+
import net.minecraft.world.entity.LivingEntity
10+
import net.minecraft.world.item.ItemDisplayContext
11+
import net.minecraft.world.item.ItemStack
12+
13+
class HasEnchantmentsConditional(val enchantmentIds: List<ResourceLocation>) :
14+
ConditionalItemModelProperty {
15+
companion object {
16+
val CODEC = RecordCodecBuilder.mapCodec { instance ->
17+
instance.group(
18+
ResourceLocation.CODEC.listOf().fieldOf("enchantments")
19+
.forGetter(HasEnchantmentsConditional::enchantmentIds)
20+
).apply(instance, ::HasEnchantmentsConditional)
21+
}
22+
}
23+
24+
override fun get(
25+
stack: ItemStack,
26+
clientLevel: ClientLevel?,
27+
livingEntity: LivingEntity?,
28+
layer: Int,
29+
itemDisplayContext: ItemDisplayContext,
30+
): Boolean {
31+
if (enchantmentIds.isNotEmpty() && stack.enchantments.size() == 0) {
32+
return false
33+
} else {
34+
for (enchantmentId in enchantmentIds) {
35+
if (EnchantmentUtil.getEnchantmentLevel(clientLevel, stack, enchantmentId) == 0) {
36+
return false
37+
}
38+
}
39+
40+
return true
41+
}
42+
}
43+
44+
override fun type(): MapCodec<out ConditionalItemModelProperty?> {
45+
return CODEC
46+
}
47+
}

0 commit comments

Comments
 (0)