Compare commits

...

2 Commits

Author SHA1 Message Date
dfsek 1df09f44ea add BiomeCreationEvent 2021-05-11 15:34:02 -07:00
dfsek fa8a6f38cc addon Platform annotation 2021-05-11 10:04:27 -07:00
4 changed files with 77 additions and 7 deletions
@@ -0,0 +1,16 @@
package com.dfsek.terra.api.addons.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Optional annotation that specifies platforms
* addon is made for.
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Platform {
String[] value();
}
@@ -6,6 +6,7 @@ import com.dfsek.terra.addon.PreLoadAddon;
import com.dfsek.terra.addon.exception.AddonLoadException;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addons.TerraAddon;
import com.dfsek.terra.api.addons.annotations.Platform;
import com.dfsek.terra.api.injection.Injector;
import com.dfsek.terra.api.injection.exception.InjectionException;
import com.dfsek.terra.registry.OpenRegistry;
@@ -15,6 +16,8 @@ import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;
import java.util.logging.LogManager;
import java.util.logging.Logger;
@@ -66,6 +69,12 @@ public class AddonRegistry extends OpenRegistry<TerraAddon> {
for(PreLoadAddon addon : pool.getAddons()) {
Class<? extends TerraAddon> addonClass = addon.getAddonClass();
if(addonClass.isAnnotationPresent(Platform.class)) {
List<String> platforms = Arrays.asList(addonClass.getAnnotation(Platform.class).value());
if(!platforms.contains(main.platformName())) throw new AddonLoadException("Addon \"" + addon.getId() + "\" cannot run on platform " + main.platformName() + ". Allowed platforms: " + platforms);
}
Constructor<? extends TerraAddon> constructor;
String logPrefix = "Terra:" + addon.getId();
@@ -37,6 +37,7 @@ import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.config.lang.Language;
import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.fabric.api.BiomeCreationEvent;
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.generation.PopulatorFeature;
import com.dfsek.terra.fabric.generation.TerraBiomeSource;
@@ -249,7 +250,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
.registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> biomeFixer.translate((String) o));
}
private Biome createBiome(BiomeBuilder biome) {
private Biome createBiome(BiomeBuilder biome, ConfigPack pack) {
BiomeTemplate template = biome.getTemplate();
Map<String, Integer> colors = template.getColors();
@@ -279,7 +280,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
accessor.getFoliageColor().ifPresent(effects::foliageColor);
}
return new Biome.Builder()
Biome.Builder builder = new Biome.Builder()
.precipitation(vanilla.getPrecipitation())
.category(vanilla.getCategory())
.depth(vanilla.getDepth())
@@ -287,16 +288,19 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
.temperature(vanilla.getTemperature())
.downfall(vanilla.getDownfall())
.effects(effects.build())
.spawnSettings(vanilla.getSpawnSettings())
.generationSettings(generationSettings.build())
.build();
.spawnSettings(vanilla.getSpawnSettings());
eventManager.callEvent(new BiomeCreationEvent(builder, effects, biome, pack));
builder.generationSettings(generationSettings.build());
return builder.build();
}
public void packInit() {
logger.info("Loading config packs...");
registry.loadAll(this);
registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes.
registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome, pack)))); // Register all Terra biomes.
if(FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
registry.forEach(pack -> {
@@ -331,7 +335,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
logger.info("Loaded addons.");
Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), POPULATOR_FEATURE);
RegistryKey<ConfiguredFeature<?, ?>> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator"));
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE);
@@ -0,0 +1,42 @@
package com.dfsek.terra.fabric.api;
import com.dfsek.terra.api.event.events.PackEvent;
import com.dfsek.terra.config.builder.BiomeBuilder;
import com.dfsek.terra.config.pack.ConfigPack;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeEffects;
/**
* Called when a {@link Biome} is created
* as a delegate to a {@link BiomeBuilder}.
*/
public class BiomeCreationEvent implements PackEvent {
private final Biome.Builder builder;
private final BiomeEffects.Builder effectsBuilder;
private final BiomeBuilder terraBiome;
private final ConfigPack pack;
public BiomeCreationEvent(Biome.Builder builder, BiomeEffects.Builder effectsBuilder, BiomeBuilder terraBiome, ConfigPack pack) {
this.builder = builder;
this.effectsBuilder = effectsBuilder;
this.terraBiome = terraBiome;
this.pack = pack;
}
@Override
public ConfigPack getPack() {
return pack;
}
public BiomeBuilder getTerraBiome() {
return terraBiome;
}
public Biome.Builder getBuilder() {
return builder;
}
public BiomeEffects.Builder getEffectsBuilder() {
return effectsBuilder;
}
}