Skip to content

Commit

Permalink
Multiloader registry abstraction
Browse files Browse the repository at this point in the history
  • Loading branch information
Gaming32 committed Apr 19, 2024
1 parent 95e8dc0 commit 17ec70b
Show file tree
Hide file tree
Showing 21 changed files with 406 additions and 185 deletions.
3 changes: 0 additions & 3 deletions common/src/main/java/io/github/gaming32/bingo/Bingo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.demonwav.mcdev.annotations.Translatable;
import com.mojang.logging.LogUtils;
import dev.architectury.registry.registries.RegistrarManager;
import io.github.gaming32.bingo.client.BingoClient;
import io.github.gaming32.bingo.conditions.BingoConditions;
import io.github.gaming32.bingo.conditions.BingoParamSets;
Expand Down Expand Up @@ -54,8 +53,6 @@ public class Bingo {
public static final String MOD_ID = "bingo";
public static final Logger LOGGER = LogUtils.getLogger();

public static final RegistrarManager REGISTRAR_MANAGER = RegistrarManager.get(MOD_ID);

public static final LevelResource PERSISTED_BINGO_GAME = new LevelResource("persisted_bingo_game.dat");

public static boolean showOtherTeam;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package io.github.gaming32.bingo.client.icons;

import dev.architectury.registry.registries.RegistrySupplier;
import io.github.gaming32.bingo.data.icons.GoalIcon;
import io.github.gaming32.bingo.data.icons.GoalIconType;
import io.github.gaming32.bingo.platform.registry.RegistryValue;
import net.minecraft.resources.ResourceLocation;

import java.util.HashMap;
Expand All @@ -16,27 +16,27 @@ private IconRenderers() {
}

public static <I extends GoalIcon> void register(GoalIconType<I> iconType, IconRenderer<I> renderer) {
final ResourceLocation id = GoalIconType.REGISTRAR.getId(iconType);
final ResourceLocation id = GoalIconType.REGISTRAR.registry().getKey(iconType);
if (id == null) {
throw new IllegalArgumentException("Tried to register renderer for unregistered icon type " + iconType);
}
RENDERERS.put(GoalIconType.REGISTRAR.getId(iconType), renderer);
RENDERERS.put(id, renderer);
}

public static <I extends GoalIcon> void register(RegistrySupplier<GoalIconType<I>> iconType, IconRenderer<I> renderer) {
RENDERERS.put(iconType.getId(), renderer);
public static <I extends GoalIcon> void register(RegistryValue<GoalIconType<I>> iconType, IconRenderer<I> renderer) {
RENDERERS.put(iconType.id(), renderer);
}

public static <I extends GoalIcon> IconRenderer<I> getRenderer(GoalIconType<I> iconType) {
final ResourceLocation id = GoalIconType.REGISTRAR.getId(iconType);
final ResourceLocation id = GoalIconType.REGISTRAR.registry().getKey(iconType);
if (id == null) {
throw new NoSuchElementException("Unknown id for icon type " + iconType);
}
return getRenderer(id);
}

public static <I extends GoalIcon> IconRenderer<I> getRenderer(RegistrySupplier<GoalIconType<I>> iconType) {
return getRenderer(iconType.getId());
public static <I extends GoalIcon> IconRenderer<I> getRenderer(RegistryValue<GoalIconType<I>> iconType) {
return getRenderer(iconType.id());
}

@SuppressWarnings("unchecked")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package io.github.gaming32.bingo.conditions;

import com.mojang.serialization.Codec;
import dev.architectury.registry.registries.Registrar;
import dev.architectury.registry.registries.RegistrySupplier;
import io.github.gaming32.bingo.Bingo;
import net.minecraft.core.registries.Registries;
import io.github.gaming32.bingo.platform.BingoPlatform;
import io.github.gaming32.bingo.platform.registry.DeferredRegister;
import io.github.gaming32.bingo.platform.registry.RegistryValue;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType;
Expand All @@ -15,27 +16,28 @@ public final class BingoConditions {
private BingoConditions() {
}

private static final Registrar<LootItemConditionType> REGISTRAR = Bingo.REGISTRAR_MANAGER.get(Registries.LOOT_CONDITION_TYPE);
private static final DeferredRegister<LootItemConditionType> REGISTRAR =
BingoPlatform.platform.createDeferredRegister(BuiltInRegistries.LOOT_CONDITION_TYPE);

public static final RegistrySupplier<LootItemConditionType> BLOCK_PATTERN = register("block_pattern", () -> BlockPatternCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> DISTANCE_FROM_SPAWN = register("distance_from_spawn", () -> DistanceFromSpawnCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> FLAMMABLE = register("flammable", () -> FlammableCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> HAS_ANY_EFFECT = register("has_any_effect", () -> HasAnyEffectCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> HAS_ONLY_BEEN_DAMAGED_BY = register("has_only_been_damaged_by", () -> HasOnlyBeenDamagedByCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> IN_STRUCTURE = register("in_structure", () -> InStructureCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> ONE_BY_ONE_HOLE = register("one_by_one_hole", () -> OneByOneHoleCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> PASSENGERS = register("passengers", () -> PassengersCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> PILLAR = register("pillar", () -> PillarCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> STAIRWAY_TO_HEAVEN = register("stairway_to_heaven", () -> StairwayToHeavenCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> TOOL_DAMAGE = register("tool_damage", () -> ToolDamageCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> TOOL_IS_ENCHANTED = register("tool_is_enchanted", () -> ToolIsEnchantedCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> VILLAGER_OWNERSHIP = register("villager_ownership", () -> VillagerOwnershipCondition.CODEC);
public static final RegistrySupplier<LootItemConditionType> WEARING_DIFFERENT_ARMOR = register("wearing_different_armor", () -> WearingDifferentArmorCondition.CODEC);
public static final RegistryValue<LootItemConditionType> BLOCK_PATTERN = register("block_pattern", () -> BlockPatternCondition.CODEC);
public static final RegistryValue<LootItemConditionType> DISTANCE_FROM_SPAWN = register("distance_from_spawn", () -> DistanceFromSpawnCondition.CODEC);
public static final RegistryValue<LootItemConditionType> FLAMMABLE = register("flammable", () -> FlammableCondition.CODEC);
public static final RegistryValue<LootItemConditionType> HAS_ANY_EFFECT = register("has_any_effect", () -> HasAnyEffectCondition.CODEC);
public static final RegistryValue<LootItemConditionType> HAS_ONLY_BEEN_DAMAGED_BY = register("has_only_been_damaged_by", () -> HasOnlyBeenDamagedByCondition.CODEC);
public static final RegistryValue<LootItemConditionType> IN_STRUCTURE = register("in_structure", () -> InStructureCondition.CODEC);
public static final RegistryValue<LootItemConditionType> ONE_BY_ONE_HOLE = register("one_by_one_hole", () -> OneByOneHoleCondition.CODEC);
public static final RegistryValue<LootItemConditionType> PASSENGERS = register("passengers", () -> PassengersCondition.CODEC);
public static final RegistryValue<LootItemConditionType> PILLAR = register("pillar", () -> PillarCondition.CODEC);
public static final RegistryValue<LootItemConditionType> STAIRWAY_TO_HEAVEN = register("stairway_to_heaven", () -> StairwayToHeavenCondition.CODEC);
public static final RegistryValue<LootItemConditionType> TOOL_DAMAGE = register("tool_damage", () -> ToolDamageCondition.CODEC);
public static final RegistryValue<LootItemConditionType> TOOL_IS_ENCHANTED = register("tool_is_enchanted", () -> ToolIsEnchantedCondition.CODEC);
public static final RegistryValue<LootItemConditionType> VILLAGER_OWNERSHIP = register("villager_ownership", () -> VillagerOwnershipCondition.CODEC);
public static final RegistryValue<LootItemConditionType> WEARING_DIFFERENT_ARMOR = register("wearing_different_armor", () -> WearingDifferentArmorCondition.CODEC);

public static void load() {
}

private static RegistrySupplier<LootItemConditionType> register(String registryName, Supplier<Codec<? extends LootItemCondition>> codec) {
private static RegistryValue<LootItemConditionType> register(String registryName, Supplier<Codec<? extends LootItemCondition>> codec) {
return REGISTRAR.register(new ResourceLocation(Bingo.MOD_ID, registryName), () -> new LootItemConditionType(codec.get()));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.github.gaming32.bingo.data.icons;

import com.mojang.serialization.Codec;
import io.github.gaming32.bingo.util.BingoCodecs;
import net.minecraft.core.registries.Registries;
import net.minecraft.tags.TagKey;
import net.minecraft.world.entity.EntityType;
Expand All @@ -12,7 +11,9 @@
import net.minecraft.world.level.block.state.BlockState;

public interface GoalIcon {
Codec<GoalIcon> CODEC = BingoCodecs.registrarByName(GoalIconType.REGISTRAR)
Codec<GoalIcon> CODEC = GoalIconType.REGISTRAR
.registry()
.byNameCodec()
.dispatch(GoalIcon::type, type -> type.codec().codec());

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,38 @@
package io.github.gaming32.bingo.data.icons;

import com.mojang.serialization.MapCodec;
import dev.architectury.registry.registries.Registrar;
import dev.architectury.registry.registries.RegistrySupplier;
import dev.architectury.registry.registries.options.DefaultIdRegistrarOption;
import io.github.gaming32.bingo.Bingo;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import io.github.gaming32.bingo.platform.registry.DeferredRegister;
import io.github.gaming32.bingo.platform.registry.RegistryBuilder;
import io.github.gaming32.bingo.platform.registry.RegistryValue;

public interface GoalIconType<I extends GoalIcon> {
ResourceKey<Registry<GoalIconType<?>>> REGISTRY_KEY = ResourceKey.createRegistryKey(
new ResourceLocation("bingo:goal_icon_type")
);
Registrar<GoalIconType<?>> REGISTRAR = Bingo.REGISTRAR_MANAGER
.<GoalIconType<?>>builder(REGISTRY_KEY.location())
.option(new DefaultIdRegistrarOption(new ResourceLocation("bingo:empty")))
.syncToClients()
DeferredRegister<GoalIconType<?>> REGISTRAR = new RegistryBuilder("goal_icon_type")
.synced()
.defaultId("empty")
.build();

RegistrySupplier<GoalIconType<EmptyIcon>> EMPTY = register("empty", EmptyIcon.CODEC);
RegistrySupplier<GoalIconType<BlockIcon>> BLOCK = register("block", BlockIcon.CODEC);
RegistrySupplier<GoalIconType<CycleIcon>> CYCLE = register("cycle", CycleIcon.CODEC);
RegistrySupplier<GoalIconType<EffectIcon>> EFFECT = register("effect", EffectIcon.CODEC);
RegistrySupplier<GoalIconType<EntityIcon>> ENTITY = register("entity", EntityIcon.CODEC);
RegistrySupplier<GoalIconType<EntityTypeTagCycleIcon>> ENTITY_TYPE_TAG_CYCLE = register("entity_type_tag_cycle", EntityTypeTagCycleIcon.CODEC);
RegistrySupplier<GoalIconType<IndicatorIcon>> INDICATOR = register("indicator", IndicatorIcon.CODEC);
RegistrySupplier<GoalIconType<ItemIcon>> ITEM = register("item", ItemIcon.CODEC);
RegistrySupplier<GoalIconType<ItemTagCycleIcon>> ITEM_TAG_CYCLE = register("item_tag_cycle", ItemTagCycleIcon.CODEC);
RegistryValue<GoalIconType<EmptyIcon>> EMPTY = register("empty", EmptyIcon.CODEC);
RegistryValue<GoalIconType<BlockIcon>> BLOCK = register("block", BlockIcon.CODEC);
RegistryValue<GoalIconType<CycleIcon>> CYCLE = register("cycle", CycleIcon.CODEC);
RegistryValue<GoalIconType<EffectIcon>> EFFECT = register("effect", EffectIcon.CODEC);
RegistryValue<GoalIconType<EntityIcon>> ENTITY = register("entity", EntityIcon.CODEC);
RegistryValue<GoalIconType<EntityTypeTagCycleIcon>> ENTITY_TYPE_TAG_CYCLE = register("entity_type_tag_cycle", EntityTypeTagCycleIcon.CODEC);
RegistryValue<GoalIconType<IndicatorIcon>> INDICATOR = register("indicator", IndicatorIcon.CODEC);
RegistryValue<GoalIconType<ItemIcon>> ITEM = register("item", ItemIcon.CODEC);
RegistryValue<GoalIconType<ItemTagCycleIcon>> ITEM_TAG_CYCLE = register("item_tag_cycle", ItemTagCycleIcon.CODEC);

MapCodec<I> codec();

static <I extends GoalIcon> RegistrySupplier<GoalIconType<I>> register(String id, MapCodec<I> codec) {
if (id.indexOf(':') < 0) {
id = "bingo:" + id;
}
final ResourceLocation location = new ResourceLocation(id);
return REGISTRAR.register(location, () -> new GoalIconType<>() {
static <I extends GoalIcon> RegistryValue<GoalIconType<I>> register(String id, MapCodec<I> codec) {
return REGISTRAR.register(id, () -> new GoalIconType<>() {
@Override
public MapCodec<I> codec() {
return codec;
}

@Override
public String toString() {
return "GoalIconType[" + location + "]";
return "GoalIconType[" + id + "]";
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
import io.github.gaming32.bingo.game.ActiveGoal;
import io.github.gaming32.bingo.game.BingoGame;
import io.github.gaming32.bingo.game.GoalProgress;
import io.github.gaming32.bingo.util.BingoCodecs;
import net.minecraft.server.level.ServerPlayer;

public interface ProgressTracker {
Codec<ProgressTracker> CODEC = BingoCodecs.registrarByName(ProgressTrackerType.REGISTRAR)
Codec<ProgressTracker> CODEC = ProgressTrackerType.REGISTER
.registry()
.byNameCodec()
.dispatch(ProgressTracker::type, type -> type.codec().codec());

default DataResult<ProgressTracker> validate(BingoGoal goal) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,44 +1,32 @@
package io.github.gaming32.bingo.data.progresstrackers;

import com.mojang.serialization.MapCodec;
import dev.architectury.registry.registries.Registrar;
import dev.architectury.registry.registries.RegistrySupplier;
import dev.architectury.registry.registries.options.DefaultIdRegistrarOption;
import io.github.gaming32.bingo.Bingo;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import io.github.gaming32.bingo.platform.registry.DeferredRegister;
import io.github.gaming32.bingo.platform.registry.RegistryBuilder;
import io.github.gaming32.bingo.platform.registry.RegistryValue;

public interface ProgressTrackerType<P extends ProgressTracker> {
ResourceKey<Registry<ProgressTrackerType<?>>> REGISTRY_KEY = ResourceKey.createRegistryKey(
new ResourceLocation("bingo:progress_tracker_type")
);
Registrar<ProgressTrackerType<?>> REGISTRAR = Bingo.REGISTRAR_MANAGER
.<ProgressTrackerType<?>>builder(REGISTRY_KEY.location())
.option(new DefaultIdRegistrarOption(new ResourceLocation("bingo:empty")))
DeferredRegister<ProgressTrackerType<?>> REGISTER = new RegistryBuilder("progress_tracker_type")
.defaultId("empty")
.build();

RegistrySupplier<ProgressTrackerType<EmptyProgressTracker>> EMPTY = register("empty", EmptyProgressTracker.CODEC);
RegistrySupplier<ProgressTrackerType<AchievedRequirementsProgressTracker>> ACHIEVED_REQUIREMENTS = register("achieved_requirements", AchievedRequirementsProgressTracker.CODEC);
RegistrySupplier<ProgressTrackerType<CriterionProgressTracker>> CRITERION = register("criterion", CriterionProgressTracker.CODEC);
RegistrySupplier<ProgressTrackerType<GoalAchievedCountProgressTracker>> GOAL_ACHIEVED_COUNT = register("goal_achieved_type", GoalAchievedCountProgressTracker.CODEC);
RegistryValue<ProgressTrackerType<EmptyProgressTracker>> EMPTY = register("empty", EmptyProgressTracker.CODEC);
RegistryValue<ProgressTrackerType<AchievedRequirementsProgressTracker>> ACHIEVED_REQUIREMENTS = register("achieved_requirements", AchievedRequirementsProgressTracker.CODEC);
RegistryValue<ProgressTrackerType<CriterionProgressTracker>> CRITERION = register("criterion", CriterionProgressTracker.CODEC);
RegistryValue<ProgressTrackerType<GoalAchievedCountProgressTracker>> GOAL_ACHIEVED_COUNT = register("goal_achieved_type", GoalAchievedCountProgressTracker.CODEC);

MapCodec<P> codec();

static <P extends ProgressTracker> RegistrySupplier<ProgressTrackerType<P>> register(String id, MapCodec<P> codec) {
if (id.indexOf(':') < 0) {
id = "bingo:" + id;
}
final ResourceLocation location = new ResourceLocation(id);
return REGISTRAR.register(location, () -> new ProgressTrackerType<>() {
static <P extends ProgressTracker> RegistryValue<ProgressTrackerType<P>> register(String id, MapCodec<P> codec) {
return REGISTER.register(id, () -> new ProgressTrackerType<>() {
@Override
public MapCodec<P> codec() {
return codec;
}

@Override
public String toString() {
return "ProgressTrackerType[" + location + "]";
return "ProgressTrackerType[" + id + "]";
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@
import java.util.stream.Stream;

public interface BingoSub {
Codec<BingoSub> CODEC = BingoCodecs.registrarByName(BingoSubType.REGISTRAR)
Codec<BingoSub> CODEC = BingoSubType.REGISTRAR
.registry()
.byNameCodec()
.dispatch(BingoSub::type, type -> type.codec().codec());
Codec<BingoSub> INNER_CODEC = BingoCodecs.registrarByName(BingoSubType.REGISTRAR)
Codec<BingoSub> INNER_CODEC = BingoSubType.REGISTRAR
.registry()
.byNameCodec()
.dispatch("bingo_type", BingoSub::type, type -> type.codec().codec());

Dynamic<?> substitute(Map<String, Dynamic<?>> referable, RandomSource rand);
Expand Down
Loading

0 comments on commit 17ec70b

Please sign in to comment.