Skip to content

Commit

Permalink
service stuff (needs work)
Browse files Browse the repository at this point in the history
  • Loading branch information
IchHabeHunger54 committed Mar 3, 2024
1 parent 7685351 commit 34a3885
Show file tree
Hide file tree
Showing 9 changed files with 70 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,20 @@
import com.github.minecraftschurlimods.bibliocraft.init.BCEntities;
import com.github.minecraftschurlimods.bibliocraft.init.BCRegistries;
import net.minecraft.world.entity.LivingEntity;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModList;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLConstructModEvent;
import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent;
import net.neoforged.neoforge.registries.RegisterEvent;

import java.util.Objects;

public final class EventHandler {
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = Bibliocraft.MOD_ID)
public static final class ModBus {
@SubscribeEvent
@SubscribeEvent(priority = EventPriority.LOWEST)
private static void constructMod(FMLConstructModEvent event) {
event.enqueueWork(() -> {
BibliocraftWoodTypeRegistryImpl.get().postRegister();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.github.minecraftschurlimods.bibliocraft.api;

import com.github.minecraftschurlimods.bibliocraft.apiimpl.BibliocraftDatagenHelperImpl;
import net.minecraft.data.loot.BlockLootSubProvider;
import net.minecraft.data.recipes.RecipeOutput;
import net.minecraft.data.tags.IntrinsicHolderTagsProvider;
Expand All @@ -9,12 +8,19 @@
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.storage.loot.LootTable;
import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.fml.loading.FMLLoader;
import net.neoforged.neoforge.client.model.generators.BlockStateProvider;
import net.neoforged.neoforge.client.model.generators.ItemModelProvider;
import net.neoforged.neoforge.common.data.BlockTagsProvider;
import net.neoforged.neoforge.common.data.LanguageProvider;
import net.neoforged.neoforge.common.util.Lazy;
import org.jetbrains.annotations.ApiStatus;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.function.BiConsumer;
import java.util.function.Function;

Expand Down Expand Up @@ -97,7 +103,7 @@ public interface BibliocraftDatagenHelper {
* @return The only instance of this class.
*/
static BibliocraftDatagenHelper get() {
return BibliocraftDatagenHelperImpl.get();
return InstanceHolder.LAZY_INSTANCE.get();
}

/**
Expand Down Expand Up @@ -173,4 +179,24 @@ default void generateLootTables(BiConsumer<Block, LootTable.Builder> lootTableAd
default void generateRecipes(RecipeOutput output) {
getWoodTypesToGenerate().forEach(woodType -> generateRecipesFor(output, woodType));
}

@ApiStatus.Internal
final class InstanceHolder {
private InstanceHolder() {}

private static final Lazy<BibliocraftDatagenHelper> LAZY_INSTANCE = Lazy.concurrentOf(() -> {
Optional<BibliocraftDatagenHelper> impl = ServiceLoader.load(FMLLoader.getGameLayer(), BibliocraftDatagenHelper.class).findFirst();
if (!FMLEnvironment.production) {
return impl.orElseThrow(() -> {
IllegalStateException exception = new IllegalStateException("Unable to find implementation for BibliocraftDatagenHelper!");
LoggerFactory.getLogger("bibliocraft").error(exception.getMessage(), exception);
return exception;
});
}
return impl.orElseGet(() -> {
LoggerFactory.getLogger("bibliocraft").error("Unable to find implementation for IArsMagicaAPI!");
return null;
});
});
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package com.github.minecraftschurlimods.bibliocraft.api;

import com.github.minecraftschurlimods.bibliocraft.apiimpl.BibliocraftWoodTypeRegistryImpl;
import net.minecraft.data.BlockFamily;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.properties.WoodType;
import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.fml.loading.FMLLoader;
import net.neoforged.neoforge.common.util.Lazy;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.function.Supplier;

/**
Expand Down Expand Up @@ -42,7 +48,7 @@ public interface BibliocraftWoodTypeRegistry {
* @return The only instance of this class.
*/
static BibliocraftWoodTypeRegistry get() {
return BibliocraftWoodTypeRegistryImpl.get();
return InstanceHolder.LAZY_INSTANCE.get();
}

/**
Expand All @@ -53,4 +59,24 @@ static BibliocraftWoodTypeRegistry get() {
default BibliocraftWoodType get(String id) {
return get(new ResourceLocation(id));
}

@ApiStatus.Internal
final class InstanceHolder {
private InstanceHolder() {}

private static final Lazy<BibliocraftWoodTypeRegistry> LAZY_INSTANCE = Lazy.concurrentOf(() -> {
Optional<BibliocraftWoodTypeRegistry> impl = ServiceLoader.load(FMLLoader.getGameLayer(), BibliocraftWoodTypeRegistry.class).findFirst();
if (!FMLEnvironment.production) {
return impl.orElseThrow(() -> {
IllegalStateException exception = new IllegalStateException("Unable to find implementation for BibliocraftWoodTypeRegistry!");
LoggerFactory.getLogger("bibliocraft").error(exception.getMessage(), exception);
return exception;
});
}
return impl.orElseGet(() -> {
LoggerFactory.getLogger("bibliocraft").error("Unable to find implementation for IArsMagicaAPI!");
return null;
});
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import net.neoforged.neoforge.common.Tags;
import net.neoforged.neoforge.common.data.LanguageProvider;
import net.neoforged.neoforge.registries.DeferredHolder;
import org.jetbrains.annotations.ApiStatus;

import java.util.ArrayList;
import java.util.Collections;
Expand All @@ -59,7 +60,8 @@ public class BibliocraftDatagenHelperImpl implements BibliocraftDatagenHelper {
private static final BibliocraftDatagenHelperImpl INSTANCE = new BibliocraftDatagenHelperImpl();
private static final List<BibliocraftWoodType> WOOD_TYPES = new ArrayList<>();

private BibliocraftDatagenHelperImpl() {}
@ApiStatus.Internal
public BibliocraftDatagenHelperImpl() {}

/**
* @return The only instance of this class.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

import java.util.function.Supplier;

@SuppressWarnings("ClassCanBeRecord")
public class BibliocraftWoodTypeImpl implements BibliocraftWoodType {
private final ResourceLocation id;
private final WoodType woodType;
Expand All @@ -18,9 +17,9 @@ public class BibliocraftWoodTypeImpl implements BibliocraftWoodType {
private final BlockFamily family;

/**
* Private constructor. Call {@link BibliocraftWoodTypeRegistry#register(ResourceLocation, WoodType, Supplier, ResourceLocation, BlockFamily)} instead.
* Internal constructor. Call {@link BibliocraftWoodTypeRegistry#register(ResourceLocation, WoodType, Supplier, ResourceLocation, BlockFamily)} instead.
*/
public BibliocraftWoodTypeImpl(ResourceLocation id, WoodType woodType, Supplier<BlockBehaviour.Properties> properties, ResourceLocation texture, BlockFamily family) {
BibliocraftWoodTypeImpl(ResourceLocation id, WoodType woodType, Supplier<BlockBehaviour.Properties> properties, ResourceLocation texture, BlockFamily family) {
this.id = id;
this.woodType = woodType;
this.properties = properties;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.properties.WoodType;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
Expand All @@ -17,7 +18,8 @@ public class BibliocraftWoodTypeRegistryImpl implements BibliocraftWoodTypeRegis
private List<BibliocraftWoodType> values = new ArrayList<>();
private boolean stillRegistering = true;

private BibliocraftWoodTypeRegistryImpl() {}
@ApiStatus.Internal
public BibliocraftWoodTypeRegistryImpl() {}

/**
* @return The only instance of this class.
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/META-INF/mods.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
modLoader="javafml"
loaderVersion="${loader_version_range}"
license="${mod_license}"
#services=["com.github.minecraftschurlimods.bibliocraft.api.BibliocraftDatagenHelper", "com.github.minecraftschurlimods.bibliocraft.api.BibliocraftWoodTypeRegistry"]

[[mods]]
modId="${mod_id}"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
com.github.minecraftschurlimods.bibliocraft.apiimpl.BibliocraftDatagenHelperImpl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
com.github.minecraftschurlimods.bibliocraft.apiimpl.BibliocraftWoodTypeRegistryImpl

0 comments on commit 34a3885

Please sign in to comment.