Skip to content

Commit 03b30cb

Browse files
committed
Add support for platform native registry read access.
1 parent 74690f6 commit 03b30cb

File tree

9 files changed

+400
-0
lines changed

9 files changed

+400
-0
lines changed

Common/src/main/java/net/darkhax/bookshelf/api/Services.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import net.darkhax.bookshelf.Constants;
44
import net.darkhax.bookshelf.api.event.IEventHelper;
5+
import net.darkhax.bookshelf.api.registry.IGameRegistries;
56
import net.darkhax.bookshelf.api.registry.IRegistryHelperFactory;
67
import net.darkhax.bookshelf.api.util.IPlatformHelper;
78

@@ -12,6 +13,7 @@ public class Services {
1213
public static final IPlatformHelper PLATFORM = load(IPlatformHelper.class);
1314
public static final IRegistryHelperFactory REGISTRY_HELPER = load(IRegistryHelperFactory.class);
1415
public static final IEventHelper EVENTS = load(IEventHelper.class);
16+
public static final IGameRegistries REGISTRIES = load(IGameRegistries.class);
1517

1618
public static <T> T load(Class<T> clazz) {
1719

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package net.darkhax.bookshelf.api.registry;
2+
3+
import net.minecraft.core.particles.ParticleType;
4+
import net.minecraft.sounds.SoundEvent;
5+
import net.minecraft.world.effect.MobEffect;
6+
import net.minecraft.world.entity.EntityType;
7+
import net.minecraft.world.entity.ai.attributes.Attribute;
8+
import net.minecraft.world.entity.decoration.Motive;
9+
import net.minecraft.world.entity.npc.VillagerProfession;
10+
import net.minecraft.world.entity.npc.VillagerType;
11+
import net.minecraft.world.inventory.MenuType;
12+
import net.minecraft.world.item.Item;
13+
import net.minecraft.world.item.alchemy.Potion;
14+
import net.minecraft.world.item.enchantment.Enchantment;
15+
import net.minecraft.world.level.block.Block;
16+
import net.minecraft.world.level.block.entity.BlockEntityType;
17+
import net.minecraft.world.level.gameevent.GameEvent;
18+
19+
public interface IGameRegistries {
20+
21+
IRegistryReader<Block> blocks();
22+
23+
IRegistryReader<Item> items();
24+
25+
IRegistryReader<Enchantment> enchantments();
26+
27+
IRegistryReader<Motive> paintings();
28+
29+
IRegistryReader<MobEffect> mobEffects();
30+
31+
IRegistryReader<Potion> potions();
32+
33+
IRegistryReader<Attribute> attributes();
34+
35+
IRegistryReader<VillagerProfession> villagerProfessions();
36+
37+
IRegistryReader<VillagerType> villagerTypes();
38+
39+
IRegistryReader<SoundEvent> sounds();
40+
41+
IRegistryReader<MenuType<?>> menuTypes();
42+
43+
IRegistryReader<ParticleType<?>> particles();
44+
45+
IRegistryReader<EntityType<?>> entities();
46+
47+
IRegistryReader<BlockEntityType<?>> blockEntities();
48+
49+
IRegistryReader<GameEvent> gameEvents();
50+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package net.darkhax.bookshelf.api.registry;
2+
3+
import net.minecraft.resources.ResourceLocation;
4+
5+
import javax.annotation.Nullable;
6+
import java.util.stream.Stream;
7+
import java.util.stream.StreamSupport;
8+
9+
public interface IRegistryReader<T> extends Iterable<T> {
10+
11+
@Nullable
12+
T get(ResourceLocation id);
13+
14+
@Nullable
15+
ResourceLocation getId(T value);
16+
17+
default Stream<T> streamValues() {
18+
19+
return StreamSupport.stream(spliterator(), false);
20+
}
21+
22+
default Stream<T> parallelStreamValues() {
23+
24+
return StreamSupport.stream(spliterator(), true);
25+
}
26+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package net.darkhax.bookshelf.impl.registry;
2+
3+
import net.darkhax.bookshelf.api.registry.IGameRegistries;
4+
import net.darkhax.bookshelf.api.registry.IRegistryReader;
5+
import net.minecraft.core.Registry;
6+
import net.minecraft.core.particles.ParticleType;
7+
import net.minecraft.sounds.SoundEvent;
8+
import net.minecraft.world.effect.MobEffect;
9+
import net.minecraft.world.entity.EntityType;
10+
import net.minecraft.world.entity.ai.attributes.Attribute;
11+
import net.minecraft.world.entity.decoration.Motive;
12+
import net.minecraft.world.entity.npc.VillagerProfession;
13+
import net.minecraft.world.entity.npc.VillagerType;
14+
import net.minecraft.world.inventory.MenuType;
15+
import net.minecraft.world.item.Item;
16+
import net.minecraft.world.item.alchemy.Potion;
17+
import net.minecraft.world.item.enchantment.Enchantment;
18+
import net.minecraft.world.level.block.Block;
19+
import net.minecraft.world.level.block.entity.BlockEntityType;
20+
import net.minecraft.world.level.gameevent.GameEvent;
21+
22+
public class GameRegistriesVanilla implements IGameRegistries {
23+
24+
private final IRegistryReader<Block> blockRegistry = new RegistryReaderVanilla<>(Registry.BLOCK);
25+
private final IRegistryReader<Item> itemRegistry = new RegistryReaderVanilla<>(Registry.ITEM);
26+
private final IRegistryReader<Enchantment> enchantmentRegistry = new RegistryReaderVanilla<>(Registry.ENCHANTMENT);
27+
private final IRegistryReader<Motive> paintingRegistry = new RegistryReaderVanilla<>(Registry.MOTIVE);
28+
private final IRegistryReader<MobEffect> mobEffectRegistry = new RegistryReaderVanilla<>(Registry.MOB_EFFECT);
29+
private final IRegistryReader<Potion> potionRegistry = new RegistryReaderVanilla<>(Registry.POTION);
30+
private final IRegistryReader<Attribute> attributeRegistry = new RegistryReaderVanilla<>(Registry.ATTRIBUTE);
31+
private final IRegistryReader<VillagerProfession> professionRegistry = new RegistryReaderVanilla<>(Registry.VILLAGER_PROFESSION);
32+
private final IRegistryReader<VillagerType> villagerTypeRegistry = new RegistryReaderVanilla<>(Registry.VILLAGER_TYPE);
33+
private final IRegistryReader<SoundEvent> soundRegistry = new RegistryReaderVanilla<>(Registry.SOUND_EVENT);
34+
private final IRegistryReader<MenuType<?>> menuRegistry = new RegistryReaderVanilla<>(Registry.MENU);
35+
private final IRegistryReader<ParticleType<?>> particleRegistry = new RegistryReaderVanilla<>(Registry.PARTICLE_TYPE);
36+
private final IRegistryReader<EntityType<?>> entityRegistry = new RegistryReaderVanilla<>(Registry.ENTITY_TYPE);
37+
private final IRegistryReader<BlockEntityType<?>> blockEntityRegistry = new RegistryReaderVanilla<>(Registry.BLOCK_ENTITY_TYPE);
38+
private final IRegistryReader<GameEvent> gameEventRegistry = new RegistryReaderVanilla<>(Registry.GAME_EVENT);
39+
40+
@Override
41+
public IRegistryReader<Block> blocks() {
42+
43+
return this.blockRegistry;
44+
}
45+
46+
@Override
47+
public IRegistryReader<Item> items() {
48+
49+
return this.itemRegistry;
50+
}
51+
52+
@Override
53+
public IRegistryReader<Enchantment> enchantments() {
54+
55+
return this.enchantmentRegistry;
56+
}
57+
58+
@Override
59+
public IRegistryReader<Motive> paintings() {
60+
61+
return this.paintingRegistry;
62+
}
63+
64+
@Override
65+
public IRegistryReader<MobEffect> mobEffects() {
66+
67+
return this.mobEffectRegistry;
68+
}
69+
70+
@Override
71+
public IRegistryReader<Potion> potions() {
72+
return this.potionRegistry;
73+
}
74+
75+
@Override
76+
public IRegistryReader<Attribute> attributes() {
77+
return this.attributeRegistry;
78+
}
79+
80+
@Override
81+
public IRegistryReader<VillagerProfession> villagerProfessions() {
82+
return this.professionRegistry;
83+
}
84+
85+
@Override
86+
public IRegistryReader<VillagerType> villagerTypes() {
87+
return this.villagerTypeRegistry;
88+
}
89+
90+
@Override
91+
public IRegistryReader<SoundEvent> sounds() {
92+
return this.soundRegistry;
93+
}
94+
95+
@Override
96+
public IRegistryReader<MenuType<?>> menuTypes() {
97+
return this.menuRegistry;
98+
}
99+
100+
@Override
101+
public IRegistryReader<ParticleType<?>> particles() {
102+
return this.particleRegistry;
103+
}
104+
105+
@Override
106+
public IRegistryReader<EntityType<?>> entities() {
107+
return this.entityRegistry;
108+
}
109+
110+
@Override
111+
public IRegistryReader<BlockEntityType<?>> blockEntities() {
112+
return this.blockEntityRegistry;
113+
}
114+
115+
@Override
116+
public IRegistryReader<GameEvent> gameEvents() {
117+
return this.gameEventRegistry;
118+
}
119+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package net.darkhax.bookshelf.impl.registry;
2+
3+
import net.darkhax.bookshelf.api.registry.IRegistryReader;
4+
import net.minecraft.core.Registry;
5+
import net.minecraft.resources.ResourceLocation;
6+
7+
import java.util.Iterator;
8+
9+
public class RegistryReaderVanilla<T> implements IRegistryReader<T> {
10+
11+
private final Registry<T> registry;
12+
13+
public RegistryReaderVanilla(Registry<T> registry) {
14+
15+
this.registry = registry;
16+
}
17+
18+
@Override
19+
public T get(ResourceLocation id) {
20+
21+
return this.registry.get(id);
22+
}
23+
24+
@Override
25+
public ResourceLocation getId(T value) {
26+
27+
return this.registry.getKey(value);
28+
}
29+
30+
@Override
31+
public Iterator<T> iterator() {
32+
33+
return registry.iterator();
34+
}
35+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
net.darkhax.bookshelf.impl.registry.GameRegistriesVanilla
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package net.darkhax.bookshelf.impl.registry;
2+
3+
import net.darkhax.bookshelf.api.registry.IGameRegistries;
4+
import net.darkhax.bookshelf.api.registry.IRegistryReader;
5+
import net.minecraft.core.Registry;
6+
import net.minecraft.core.particles.ParticleType;
7+
import net.minecraft.sounds.SoundEvent;
8+
import net.minecraft.world.effect.MobEffect;
9+
import net.minecraft.world.entity.EntityType;
10+
import net.minecraft.world.entity.ai.attributes.Attribute;
11+
import net.minecraft.world.entity.decoration.Motive;
12+
import net.minecraft.world.entity.npc.VillagerProfession;
13+
import net.minecraft.world.entity.npc.VillagerType;
14+
import net.minecraft.world.inventory.MenuType;
15+
import net.minecraft.world.item.Item;
16+
import net.minecraft.world.item.alchemy.Potion;
17+
import net.minecraft.world.item.enchantment.Enchantment;
18+
import net.minecraft.world.level.block.Block;
19+
import net.minecraft.world.level.block.entity.BlockEntityType;
20+
import net.minecraft.world.level.gameevent.GameEvent;
21+
import net.minecraftforge.registries.ForgeRegistries;
22+
23+
public class GameRegistriesForge implements IGameRegistries {
24+
25+
private final IRegistryReader<Block> blockRegistry = new RegistryReaderForge<>(ForgeRegistries.BLOCKS);
26+
private final IRegistryReader<Item> itemRegistry = new RegistryReaderForge<>(ForgeRegistries.ITEMS);
27+
private final IRegistryReader<Enchantment> enchantmentRegistry = new RegistryReaderForge<>(ForgeRegistries.ENCHANTMENTS);
28+
private final IRegistryReader<Motive> paintingRegistry = new RegistryReaderForge<>(ForgeRegistries.PAINTING_TYPES);
29+
private final IRegistryReader<MobEffect> mobEffectRegistry = new RegistryReaderForge<>(ForgeRegistries.MOB_EFFECTS);
30+
private final IRegistryReader<Potion> potionRegistry = new RegistryReaderForge<>(ForgeRegistries.POTIONS);
31+
private final IRegistryReader<Attribute> attributeRegistry = new RegistryReaderForge<>(ForgeRegistries.ATTRIBUTES);
32+
private final IRegistryReader<VillagerProfession> professionRegistry = new RegistryReaderForge<>(ForgeRegistries.PROFESSIONS);
33+
private final IRegistryReader<SoundEvent> soundRegistry = new RegistryReaderForge<>(ForgeRegistries.SOUND_EVENTS);
34+
private final IRegistryReader<MenuType<?>> menuRegistry = new RegistryReaderForge<>(ForgeRegistries.CONTAINERS);
35+
private final IRegistryReader<ParticleType<?>> particleRegistry = new RegistryReaderForge<>(ForgeRegistries.PARTICLE_TYPES);
36+
private final IRegistryReader<EntityType<?>> entityRegistry = new RegistryReaderForge<>(ForgeRegistries.ENTITIES);
37+
private final IRegistryReader<BlockEntityType<?>> blockEntityRegistry = new RegistryReaderForge<>(ForgeRegistries.BLOCK_ENTITIES);
38+
39+
// No native Forge Registry
40+
@Deprecated
41+
private final IRegistryReader<GameEvent> gameEventRegistry = new RegistryReaderVanilla<>(Registry.GAME_EVENT);
42+
43+
@Deprecated
44+
private final IRegistryReader<VillagerType> villagerTypeRegistry = new RegistryReaderVanilla<>(Registry.VILLAGER_TYPE);
45+
46+
@Override
47+
public IRegistryReader<Block> blocks() {
48+
49+
return this.blockRegistry;
50+
}
51+
52+
@Override
53+
public IRegistryReader<Item> items() {
54+
55+
return this.itemRegistry;
56+
}
57+
58+
@Override
59+
public IRegistryReader<Enchantment> enchantments() {
60+
61+
return this.enchantmentRegistry;
62+
}
63+
64+
@Override
65+
public IRegistryReader<Motive> paintings() {
66+
67+
return this.paintingRegistry;
68+
}
69+
70+
@Override
71+
public IRegistryReader<MobEffect> mobEffects() {
72+
73+
return this.mobEffectRegistry;
74+
}
75+
76+
@Override
77+
public IRegistryReader<Potion> potions() {
78+
return this.potionRegistry;
79+
}
80+
81+
@Override
82+
public IRegistryReader<Attribute> attributes() {
83+
return this.attributeRegistry;
84+
}
85+
86+
@Override
87+
public IRegistryReader<VillagerProfession> villagerProfessions() {
88+
return this.professionRegistry;
89+
}
90+
91+
@Override
92+
public IRegistryReader<VillagerType> villagerTypes() {
93+
return this.villagerTypeRegistry;
94+
}
95+
96+
@Override
97+
public IRegistryReader<SoundEvent> sounds() {
98+
return this.soundRegistry;
99+
}
100+
101+
@Override
102+
public IRegistryReader<MenuType<?>> menuTypes() {
103+
return this.menuRegistry;
104+
}
105+
106+
@Override
107+
public IRegistryReader<ParticleType<?>> particles() {
108+
return this.particleRegistry;
109+
}
110+
111+
@Override
112+
public IRegistryReader<EntityType<?>> entities() {
113+
return this.entityRegistry;
114+
}
115+
116+
@Override
117+
public IRegistryReader<BlockEntityType<?>> blockEntities() {
118+
return this.blockEntityRegistry;
119+
}
120+
121+
@Override
122+
public IRegistryReader<GameEvent> gameEvents() {
123+
return this.gameEventRegistry;
124+
}
125+
}

0 commit comments

Comments
 (0)