Skip to content

Commit 09b9b51

Browse files
committed
Add EnchantmentContainer utility.
Bootstrapping enchantments and building them during DataGen introduces too much code duplication. This new utility maps the enchantment registrykey to its builder, so it can be reused in multiple contexts. The class also helps with getting registry entries.
1 parent 43de4bf commit 09b9b51

File tree

4 files changed

+135
-29
lines changed

4 files changed

+135
-29
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.provismet.CombatPlusCore.debug.registries;
2+
3+
import com.provismet.CombatPlusCore.CPCMain;
4+
import com.provismet.CombatPlusCore.enchantment.effect.doubleEntity.CodeExecutionDoubleEntityEffect;
5+
import com.provismet.CombatPlusCore.registries.CPCEnchantmentComponentTypes;
6+
import com.provismet.CombatPlusCore.utility.EnchantmentContainer;
7+
import com.provismet.CombatPlusCore.utility.tag.CPCItemTags;
8+
import net.fabricmc.loader.api.FabricLoader;
9+
import net.minecraft.component.type.AttributeModifierSlot;
10+
import net.minecraft.enchantment.Enchantment;
11+
12+
import java.util.Optional;
13+
14+
public class CPCDebugEnchantments {
15+
private static final EnchantmentContainer LOGGER = new EnchantmentContainer(
16+
CPCMain.identifier("logger"),
17+
(itemLookup, enchantmentLookup, damageLookup, blockLookup) -> Enchantment.builder(
18+
Enchantment.definition(
19+
itemLookup.getOrThrow(CPCItemTags.DAMAGE_ENCHANTABLE),
20+
1,
21+
1,
22+
Enchantment.constantCost(1),
23+
Enchantment.constantCost(1),
24+
1,
25+
AttributeModifierSlot.MAINHAND
26+
)
27+
).addEffect(
28+
CPCEnchantmentComponentTypes.POST_CHARGED_ATTACK,
29+
new CodeExecutionDoubleEntityEffect(CPCMain.identifier("log-charged"))
30+
).addEffect(
31+
CPCEnchantmentComponentTypes.POST_CRITICAL_ATTACK,
32+
new CodeExecutionDoubleEntityEffect(CPCMain.identifier("log-critical"))
33+
).addEffect(
34+
CPCEnchantmentComponentTypes.POST_KILL,
35+
new CodeExecutionDoubleEntityEffect(CPCMain.identifier("log-kill"))
36+
)
37+
);
38+
39+
public static Optional<EnchantmentContainer> getDebugContainer () {
40+
if (FabricLoader.getInstance().isDevelopmentEnvironment()) return Optional.of(LOGGER);
41+
return Optional.empty();
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.provismet.CombatPlusCore.utility;
2+
3+
import com.provismet.datagen.CombatPlusCore.provider.CPCEnchantmentProvider;
4+
import net.minecraft.block.Block;
5+
import net.minecraft.enchantment.Enchantment;
6+
import net.minecraft.entity.damage.DamageType;
7+
import net.minecraft.item.Item;
8+
import net.minecraft.registry.DynamicRegistryManager;
9+
import net.minecraft.registry.Registerable;
10+
import net.minecraft.registry.RegistryEntryLookup;
11+
import net.minecraft.registry.RegistryKey;
12+
import net.minecraft.registry.RegistryKeys;
13+
import net.minecraft.registry.RegistryWrapper;
14+
import net.minecraft.registry.entry.RegistryEntry;
15+
import net.minecraft.util.Identifier;
16+
17+
import java.util.Optional;
18+
19+
/**
20+
* Utility class for linking a registry key to an enchantment builder.
21+
* <p>
22+
* The EnchantmentContainer allows the enchantment builder to be reused between data-gen and in bootstrapping.
23+
* <p>
24+
* The EnchantmentContainer can be fed directly to the {@link CPCEnchantmentProvider.EnchantmentBuilder} during
25+
* data generation.
26+
*
27+
* @see RegistryKey
28+
* @see Enchantment.Builder
29+
* @see CPCEnchantmentProvider
30+
*/
31+
public class EnchantmentContainer {
32+
private final RegistryKey<Enchantment> key;
33+
private final BuilderBuilder internalBuilder;
34+
35+
public EnchantmentContainer (Identifier id, BuilderBuilder builder) {
36+
this.key = RegistryKey.of(RegistryKeys.ENCHANTMENT, id);
37+
this.internalBuilder = builder;
38+
}
39+
40+
public RegistryKey<Enchantment> getKey () {
41+
return this.key;
42+
}
43+
44+
public RegistryEntry<Enchantment> getEntryOrThrow (DynamicRegistryManager manager) {
45+
Optional<RegistryEntry.Reference<Enchantment>> reference = manager.get(RegistryKeys.ENCHANTMENT).getEntry(this.key);
46+
return reference.orElseThrow();
47+
}
48+
49+
public RegistryEntry<Enchantment> getEntryOrThrow (RegistryWrapper.WrapperLookup registryLookup) {
50+
Optional<RegistryEntry.Reference<Enchantment>> reference = registryLookup.getWrapperOrThrow(RegistryKeys.ENCHANTMENT).getOptional(this.key);
51+
return reference.orElseThrow();
52+
}
53+
54+
public Enchantment.Builder getBuilder (Registerable<Enchantment> registerable) {
55+
RegistryEntryLookup<Item> itemLookup = registerable.getRegistryLookup(RegistryKeys.ITEM);
56+
RegistryEntryLookup<Enchantment> enchantmentLookup = registerable.getRegistryLookup(RegistryKeys.ENCHANTMENT);
57+
RegistryEntryLookup<DamageType> damageLookup = registerable.getRegistryLookup(RegistryKeys.DAMAGE_TYPE);
58+
RegistryEntryLookup<Block> blockLookup = registerable.getRegistryLookup(RegistryKeys.BLOCK);
59+
return this.getBuilder(itemLookup, enchantmentLookup, damageLookup, blockLookup);
60+
}
61+
62+
public Enchantment.Builder getBuilder (CPCEnchantmentProvider.EnchantmentBuilder enchantmentBuilder) {
63+
return this.getBuilder(enchantmentBuilder.itemLookup, enchantmentBuilder.enchantmentLookup, enchantmentBuilder.damageTypeLookup, enchantmentBuilder.blockLookup);
64+
}
65+
66+
public Enchantment.Builder getBuilder (RegistryEntryLookup<Item> itemLookup, RegistryEntryLookup<Enchantment> enchantmentLookup, RegistryEntryLookup<DamageType> damageLookup, RegistryEntryLookup<Block> blockLookup) {
67+
return this.internalBuilder.create(itemLookup, enchantmentLookup, damageLookup, blockLookup);
68+
}
69+
70+
@FunctionalInterface
71+
public interface BuilderBuilder {
72+
Enchantment.Builder create (RegistryEntryLookup<Item> itemLookup, RegistryEntryLookup<Enchantment> enchantmentLookup, RegistryEntryLookup<DamageType> damageLookup, RegistryEntryLookup<Block> blockLookup);
73+
}
74+
}

src/main/java/com/provismet/datagen/CombatPlusCore/EnchantmentGenerator.java

+7-27
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.provismet.datagen.CombatPlusCore;
22

3-
import com.provismet.CombatPlusCore.CPCMain;
4-
import com.provismet.CombatPlusCore.registries.CPCEnchantmentComponentTypes;
5-
import com.provismet.CombatPlusCore.enchantment.effect.doubleEntity.CodeExecutionDoubleEntityEffect;
3+
import com.provismet.CombatPlusCore.debug.registries.CPCDebugEnchantments;
64
import com.provismet.CombatPlusCore.utility.resource.DevModeResourceCondition;
75
import com.provismet.CombatPlusCore.utility.tag.CPCItemTags;
86
import com.provismet.datagen.CombatPlusCore.provider.CPCEnchantmentProvider;
@@ -38,30 +36,12 @@ public EnchantmentGenerator (FabricDataOutput output, CompletableFuture<Registry
3836

3937
@Override
4038
protected void configure (RegistryWrapper.WrapperLookup registries, Entries entries, EnchantmentBuilder builder) {
41-
builder.add(
42-
CPCMain.identifier("logger"),
43-
Enchantment.builder(
44-
Enchantment.definition(
45-
builder.getItemEntryList(CPCItemTags.DAMAGE_ENCHANTABLE),
46-
1,
47-
1,
48-
Enchantment.constantCost(1),
49-
Enchantment.constantCost(1),
50-
1,
51-
AttributeModifierSlot.MAINHAND
52-
)
53-
).addEffect(
54-
CPCEnchantmentComponentTypes.POST_CHARGED_ATTACK,
55-
new CodeExecutionDoubleEntityEffect(CPCMain.identifier("log-charged"))
56-
).addEffect(
57-
CPCEnchantmentComponentTypes.POST_CRITICAL_ATTACK,
58-
new CodeExecutionDoubleEntityEffect(CPCMain.identifier("log-critical"))
59-
).addEffect(
60-
CPCEnchantmentComponentTypes.POST_KILL,
61-
new CodeExecutionDoubleEntityEffect(CPCMain.identifier("log-kill"))
62-
),
63-
new DevModeResourceCondition()
64-
);
39+
if (CPCDebugEnchantments.getDebugContainer().isPresent()) {
40+
builder.add(
41+
CPCDebugEnchantments.getDebugContainer().get(),
42+
new DevModeResourceCondition()
43+
);
44+
}
6545

6646
builder.add(
6747
Enchantments.SHARPNESS,

src/main/java/com/provismet/datagen/CombatPlusCore/provider/CPCEnchantmentProvider.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.provismet.datagen.CombatPlusCore.provider;
22

3+
import com.provismet.CombatPlusCore.utility.EnchantmentContainer;
34
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
45
import net.fabricmc.fabric.api.datagen.v1.provider.FabricDynamicRegistryProvider;
56
import net.fabricmc.fabric.api.resource.conditions.v1.ResourceCondition;
@@ -39,15 +40,15 @@ protected final void configure (RegistryWrapper.WrapperLookup wrapperLookup, Ent
3940

4041
protected abstract void configure (RegistryWrapper.WrapperLookup wrapperLookup, Entries entries, EnchantmentBuilder builder);
4142

42-
protected static class EnchantmentBuilder {
43+
public static class EnchantmentBuilder {
4344
public final RegistryEntryLookup<Item> itemLookup;
4445
public final RegistryEntryLookup<DamageType> damageTypeLookup;
4546
public final RegistryEntryLookup<Block> blockLookup;
4647
public final RegistryEntryLookup<Enchantment> enchantmentLookup;
4748

4849
private final Entries entries;
4950

50-
public EnchantmentBuilder (Entries entries) {
51+
protected EnchantmentBuilder (Entries entries) {
5152
this.entries = entries;
5253
this.itemLookup = entries.getLookup(RegistryKeys.ITEM);
5354
this.damageTypeLookup = entries.getLookup(RegistryKeys.DAMAGE_TYPE);
@@ -71,6 +72,14 @@ public void add (RegistryKey<Enchantment> enchantmentKey, Enchantment.Builder en
7172
this.add(enchantmentKey.getValue(), enchantmentBuilder, conditions);
7273
}
7374

75+
public void add (EnchantmentContainer container) {
76+
this.add(container.getKey(), container.getBuilder(this));
77+
}
78+
79+
public void add (EnchantmentContainer container, ResourceCondition... conditions) {
80+
this.add(container.getKey(), container.getBuilder(this), conditions);
81+
}
82+
7483
public RegistryEntryList<Item> getItemEntryList (TagKey<Item> tag) {
7584
return this.itemLookup.getOrThrow(tag);
7685
}

0 commit comments

Comments
 (0)