Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/paulevsGitch/BCLib
Browse files Browse the repository at this point in the history
  • Loading branch information
paulevsGitch committed Nov 30, 2021
2 parents 4c57670 + af8c3ba commit 8a93be6
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 7 deletions.
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ loom_version=0.8-SNAPSHOT
# Fabric Properties
# check these on https://fabricmc.net/versions.html
minecraft_version= 1.17.1
loader_version= 0.12.4
fabric_version = 0.41.3+1.17
loader_version= 0.12.5
fabric_version = 0.42.1+1.17

# Mod Properties
mod_version = 0.5.5
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/ru/bclib/api/BiomeAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
import ru.bclib.world.generator.BiomePicker;
import ru.bclib.world.structures.BCLStructureFeature;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
Expand Down Expand Up @@ -507,7 +509,13 @@ public static <M extends Mob> void addBiomeMobSpawn(Biome biome, EntityType<M> e
}

private static <T extends Object> List<T> getMutableList(List<T> input) {
if (input instanceof ImmutableList) {
if (input!=null) {
System.out.println("getMutableList: " + input.getClass().getName());
for (Class cl : input.getClass().getInterfaces()){
System.out.println(" - " + cl.getName());
}
}
if (/*input instanceof ImmutableList ||*/ !(input instanceof ArrayList || input instanceof LinkedList)) {
return Lists.newArrayList(input);
}
return input;
Expand Down
121 changes: 121 additions & 0 deletions src/main/java/ru/bclib/api/LifeCycleAPI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package ru.bclib.api;

import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.progress.ChunkProgressListener;
import net.minecraft.world.level.CustomSpawner;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.storage.LevelStorageSource;
import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess;
import net.minecraft.world.level.storage.ServerLevelData;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;

/**
* provides some lifetime hooks for a Minecraft instance
*/
public class LifeCycleAPI {
private final static List<LevelLoadBiomesCall> onLoadLevelBiomes = new ArrayList<>(2);
private final static List<LevelLoadCall> onLoadLevel = new ArrayList<>(2);

/**
* A callback function that is used for each new ServerLevel instance
*/
public interface LevelLoadBiomesCall {
void onLoad(ServerLevel world, long seed, Registry<Biome> registry);
}

/**
* A callback function that is used for each new ServerLevel instance
*/
public interface LevelLoadCall {
void onLoad(
ServerLevel world,
MinecraftServer minecraftServer,
Executor executor,
LevelStorageSource.LevelStorageAccess levelStorageAccess,
ServerLevelData serverLevelData,
ResourceKey<Level> resourceKey,
DimensionType dimensionType,
ChunkProgressListener chunkProgressListener,
ChunkGenerator chunkGenerator,
boolean bl,
long l,
List<CustomSpawner> list,
boolean bl2);
}

/**
* Register a callback that is called when a new {@code ServerLevel is instantiated}.
* This callback will receive the world seed as well as it's biome registry.
* @param call The calbback Method
*/
public static void onLevelLoad(LevelLoadBiomesCall call){
onLoadLevelBiomes.add(call);
}

/**
* Register a callback that is called when a new {@code ServerLevel is instantiated}.
* This callbacl will receiv all parameters that were passed to the ServerLevel's constructor
* @param call The calbback Method
*/
public static void onLevelLoad(LevelLoadCall call){
onLoadLevel.add(call);
}

/**
* For internal use, You should not call this method!
* @param minecraftServer
* @param executor
* @param levelStorageAccess
* @param serverLevelData
* @param resourceKey
* @param dimensionType
* @param chunkProgressListener
* @param chunkGenerator
* @param bl
* @param l
* @param list
* @param bl2
*/
public static void _runLevelLoad(ServerLevel world,
MinecraftServer minecraftServer,
Executor executor,
LevelStorageSource.LevelStorageAccess levelStorageAccess,
ServerLevelData serverLevelData,
ResourceKey<Level> resourceKey,
DimensionType dimensionType,
ChunkProgressListener chunkProgressListener,
ChunkGenerator chunkGenerator,
boolean bl,
long l,
List<CustomSpawner> list,
boolean bl2){
onLoadLevel.forEach(c -> c.onLoad(
world,
minecraftServer,
executor,
levelStorageAccess,
serverLevelData,
resourceKey,
dimensionType,
chunkProgressListener,
chunkGenerator,
bl,
l,
list,
bl2)
);

final long seed = world.getSeed();
final Registry<Biome> biomeRegistry = world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY);
onLoadLevelBiomes.forEach(c -> c.onLoad(world, seed, biomeRegistry));
}
}
14 changes: 10 additions & 4 deletions src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package ru.bclib.mixin.common;

import java.util.List;
import java.util.concurrent.Executor;
import java.util.function.Supplier;

import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
Expand All @@ -17,10 +21,7 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.bclib.api.BiomeAPI;

import java.util.List;
import java.util.concurrent.Executor;
import java.util.function.Supplier;
import ru.bclib.api.LifeCycleAPI;

@Mixin(ServerLevel.class)
public abstract class ServerLevelMixin extends Level {
Expand All @@ -32,6 +33,9 @@ protected ServerLevelMixin(WritableLevelData writableLevelData, ResourceKey<Leve

@Inject(method = "<init>*", at = @At("TAIL"))
private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey<Level> registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List<CustomSpawner> list, boolean bl, CallbackInfo info) {
ServerLevel world = ServerLevel.class.cast(this);
LifeCycleAPI._runLevelLoad(world, server, workerExecutor, session, properties, registryKey, dimensionType, worldGenerationProgressListener, chunkGenerator, debugWorld, l, list, bl);

BiomeAPI.initRegistry(server);
BiomeAPI.applyModifications(ServerLevel.class.cast(this));

Expand All @@ -40,5 +44,7 @@ private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExec
}

bclib_lastWorld = session.getLevelId();


}
}

0 comments on commit 8a93be6

Please sign in to comment.