Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
0921dfb
Bukkit Build Fix
Ifiht Mar 19, 2025
b6e4543
remove comments
Ifiht Mar 20, 2025
4c860ca
remove papermc repo from gradle settings
Ifiht Mar 20, 2025
fb0dbda
add back gradle shasum
Ifiht Mar 20, 2025
d33d4af
fix formatting, update gradle hash
Ifiht Mar 20, 2025
227bfe7
Minestom Updated to latest version as of now 4/12/2025
ckyuri Apr 12, 2025
e2e0e29
Merge branch 'dev/7.0-2' into dev/7.0-2
ckyuri Apr 12, 2025
32cc497
Bug Fix - Entity Type was parsing a value that was incorrect and caus…
ckyuri Apr 12, 2025
9749eec
Merge remote-tracking branch 'origin/dev/7.0-2' into dev/7.0-2
ckyuri Apr 12, 2025
761a014
Reverted changes to comply with build version requirements and avoidi…
ckyuri Apr 16, 2025
d97fb4f
chore: update paper version
Bloeckchengrafik May 27, 2025
1dd59c3
refactor(minestom): replace static singleton access to platform with …
Bloeckchengrafik May 27, 2025
089b25d
feat: update Minestom version and replace deprecated ItemComponent API
Bloeckchengrafik May 27, 2025
5dff256
refactor: minestom chunk storage to improve memory efficiency
Bloeckchengrafik May 30, 2025
5e1c9d8
fix: generation stages not being able to reference eachother
Bloeckchengrafik Jun 1, 2025
858adfe
feat: initial custom biome implementation
Bloeckchengrafik Jun 3, 2025
56a1feb
refactor: move biomes to use user-defined naming conventions.
Bloeckchengrafik Jun 3, 2025
d9a4d64
Merge remote-tracking branch 'origin/dev/7.0-2' into dev/7.0-2
Bloeckchengrafik Jun 3, 2025
b12fe77
feat: add fine-grained biome control to Minestom world builder
Bloeckchengrafik Jun 4, 2025
c08e973
feat: provide default MinestomBlockEntity implementation
Bloeckchengrafik Jun 4, 2025
abdff16
Merge remote-tracking branch 'origin/dev/7.0-2' into dev/7.0-2
Bloeckchengrafik Jun 4, 2025
a061660
chore: Update Minestom version to 1_21_5-4d91778331
Bloeckchengrafik Jun 4, 2025
4450a56
Merge branch 'dev/7.0-2' into dev/7.0-2
duplexsystem Jun 5, 2025
1ef3446
Merge remote-tracking branch 'ckyuri/dev/7.0-2' into dev/7.0-2
Bloeckchengrafik Jun 5, 2025
28132e0
resolve merge conflicts
Bloeckchengrafik Jun 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/Versions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,6 @@ object Versions {
}

object Minestom {
const val minestom = "fb895cb899"
const val minestom = "1_21_5-4d91778331"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.GameMode;
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
import net.minestom.server.event.player.PlayerDisconnectEvent;
import net.minestom.server.event.player.PlayerSpawnEvent;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.LightingChunk;
Expand All @@ -16,23 +17,24 @@
import java.util.concurrent.atomic.AtomicInteger;

import com.dfsek.terra.minestom.world.TerraMinestomWorld;
import com.dfsek.terra.minestom.world.TerraMinestomWorldBuilder;


public class TerraMinestomExample {
private static final Logger logger = LoggerFactory.getLogger(TerraMinestomExample.class);
private final MinecraftServer server = MinecraftServer.init();
private Instance instance;
private TerraMinestomWorld world;
private final TerraMinestomPlatform platform = new TerraMinestomPlatform();

public void createNewInstance() {
instance = MinecraftServer.getInstanceManager().createInstanceContainer();
instance.setChunkSupplier(LightingChunk::new);
}

public void attachTerra() {
world = TerraMinestomWorldBuilder.from(instance)
world = platform.worldBuilder(instance)
.defaultPack()
.doFineGrainedBiomes(false)
.attach();
}

Expand Down Expand Up @@ -121,12 +123,16 @@ public RegenerateCommand() {

private void regenerate() {
instance.sendMessage(Component.text("Regenerating world"));
Instance oldInstance = instance;
platform.reload();
createNewInstance();
attachTerra();
preloadWorldAndMeasure();
MinecraftServer.getConnectionManager().getOnlinePlayers().forEach(player ->
player.setInstance(instance, new Pos(0, 100, 0))
);

MinecraftServer.getInstanceManager().unregisterInstance(oldInstance);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,78 @@

import com.dfsek.tectonic.api.TypeRegistry;
import com.dfsek.tectonic.api.loader.type.TypeLoader;

import com.dfsek.terra.AbstractPlatform;
import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
import com.dfsek.terra.api.handle.ItemHandle;
import com.dfsek.terra.api.handle.WorldHandle;
import com.dfsek.terra.api.world.biome.PlatformBiome;
import com.dfsek.terra.minestom.addon.MinestomAddon;
import com.dfsek.terra.minestom.config.BiomeAdditionsSoundTemplate;
import com.dfsek.terra.minestom.config.BiomeParticleConfigTemplate;
import com.dfsek.terra.minestom.biome.MinestomBiomeLoader;
import com.dfsek.terra.minestom.config.KeyLoader;
import com.dfsek.terra.minestom.config.BiomeMoodSoundTemplate;
import com.dfsek.terra.minestom.config.RGBLikeLoader;
import com.dfsek.terra.minestom.config.SoundEventTemplate;
import com.dfsek.terra.minestom.entity.MinestomEntityType;
import com.dfsek.terra.minestom.item.MinestomItemHandle;
import com.dfsek.terra.minestom.world.MinestomChunkGeneratorWrapper;
import com.dfsek.terra.minestom.world.MinestomWorldHandle;
import com.dfsek.terra.registry.master.ConfigRegistry.PackLoadFailuresException;

import com.dfsek.terra.minestom.api.TerraMinestomWorldBuilder;

import net.kyori.adventure.key.Key;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.MinecraftServer;
import net.minestom.server.instance.Instance;
import net.minestom.server.sound.SoundEvent;
import net.minestom.server.world.biome.BiomeEffects;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;



public final class MinestomPlatform extends AbstractPlatform {
private static final Logger LOGGER = LoggerFactory.getLogger(MinestomPlatform.class);
private static MinestomPlatform INSTANCE = null;
private final MinestomWorldHandle worldHandle = new MinestomWorldHandle();
private final MinestomItemHandle itemHandle = new MinestomItemHandle();

private MinestomPlatform() {
import java.util.ArrayList;
import java.util.List;


public final class TerraMinestomPlatform extends AbstractPlatform {
private static final Logger LOGGER = LoggerFactory.getLogger(TerraMinestomPlatform.class);
private final WorldHandle worldHandle;
private final ItemHandle itemHandle;
private final TypeLoader<PlatformBiome> biomeTypeLoader;
private final ArrayList<BaseAddon> platformAddons = new ArrayList<>(List.of(new MinestomAddon(this)));

public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader<PlatformBiome> biomeTypeLoader, BaseAddon... extraAddons) {
this.worldHandle = worldHandle;
this.itemHandle = itemHandle;
this.biomeTypeLoader = biomeTypeLoader;
this.platformAddons.addAll(List.of(extraAddons));
load();
getEventManager().callEvent(new PlatformInitializationEvent());
}

public TerraMinestomPlatform() {
this(new MinestomWorldHandle(), new MinestomItemHandle(), new MinestomBiomeLoader());
}

@Override
public void register(TypeRegistry registry) {
super.register(registry);
registry
.registerLoader(PlatformBiome.class, new MinestomBiomeLoader())
.registerLoader(PlatformBiome.class, biomeTypeLoader)
.registerLoader(RGBLike.class, new RGBLikeLoader())
.registerLoader(Key.class, new KeyLoader())
.registerLoader(EntityType.class, (TypeLoader<EntityType>) (annotatedType, o, configLoader, depthTracker) -> new MinestomEntityType((String) o))
.registerLoader(BlockState.class, (TypeLoader<BlockState>) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o));
.registerLoader(BlockState.class, (TypeLoader<BlockState>) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o))
.registerLoader(BiomeEffects.Particle.class, BiomeParticleConfigTemplate::new)
.registerLoader(BiomeEffects.MoodSound.class, BiomeMoodSoundTemplate::new)
.registerLoader(BiomeEffects.AdditionsSound.class, BiomeAdditionsSoundTemplate::new)
.registerLoader(SoundEvent.class, SoundEventTemplate::new);
}

@Override
Expand Down Expand Up @@ -82,16 +112,22 @@ public boolean reload() {
@Override
public @NotNull File getDataFolder() {
String pathName = System.getProperty("terra.datafolder");
if (pathName == null) pathName = "./terra/";
if(pathName == null) pathName = "./terra/";
File file = new File(pathName);
if(!file.exists()) file.mkdirs();
return file;
}

public static MinestomPlatform getInstance() {
if(INSTANCE == null) {
INSTANCE = new MinestomPlatform();
}
return INSTANCE;
@Override
protected Iterable<BaseAddon> platformAddon() {
return platformAddons;
}

public TerraMinestomWorldBuilder worldBuilder(Instance instance) {
return new TerraMinestomWorldBuilder(this, instance);
}

public TerraMinestomWorldBuilder worldBuilder() {
return new TerraMinestomWorldBuilder(this, MinecraftServer.getInstanceManager().createInstanceContainer());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.dfsek.terra.minestom.addon;

import ca.solostudios.strata.Versions;
import ca.solostudios.strata.version.Version;

import com.dfsek.terra.api.addon.BaseAddon;

import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.world.biome.Biome;

import com.dfsek.terra.minestom.TerraMinestomPlatform;

import com.dfsek.terra.minestom.config.VanillaBiomeProperties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class MinestomAddon implements BaseAddon {
private static final Version VERSION = Versions.getVersion(1, 0, 0);
private static final Logger logger = LoggerFactory.getLogger(MinestomAddon.class);
private final TerraMinestomPlatform minestomPlatform;

public MinestomAddon(TerraMinestomPlatform minestomPlatform) {
this.minestomPlatform = minestomPlatform;
}

@Override
public void initialize() {
minestomPlatform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigurationLoadEvent.class)
.then(event -> {
if(event.is(Biome.class)) {
event.getLoadedObject(Biome.class).getContext().put(event.load(new VanillaBiomeProperties()));
}
})
.global();
}

@Override
public Version getVersion() { return VERSION; }

@Override
public String getID() { return "terra-minestom"; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.dfsek.terra.minestom.api;

import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.minestom.biome.UserDefinedBiome;


/**
* BiomeFactory serves as a contract for creating custom user-defined biomes in Terra.
* Implementations of this interface are responsible for defining the logic to convert
* configured biomes and source biome data into instances of UserDefinedBiome.
*/
public interface BiomeFactory {
UserDefinedBiome create(ConfigPack pack, Biome source);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@

/**
* Represents a factory interface for creating instances of BlockEntity
* at a specified BlockVec position. This is not implemented directly because
* Minestom does not define a way to build block entities out of the box.
* at a specified BlockVec position. For more fine-grained control, users
* may supply their own version of this interface.
*/
public interface BlockEntityFactory {
@Nullable BlockEntity createBlockEntity(BlockVec position);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package com.dfsek.terra.minestom.api;

import com.dfsek.terra.api.config.ConfigPack;

import com.dfsek.terra.api.registry.CheckedRegistry;

import com.dfsek.terra.minestom.TerraMinestomPlatform;
import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomeFactory;
import com.dfsek.terra.minestom.block.DefaultBlockEntityFactory;
import com.dfsek.terra.minestom.entity.DefaultEntityFactory;

import com.dfsek.terra.minestom.world.TerraMinestomWorld;
import net.minestom.server.instance.Instance;

import java.util.Random;
import java.util.function.Function;


public class TerraMinestomWorldBuilder {
private final TerraMinestomPlatform platform;
private final Instance instance;
private ConfigPack pack;
private long seed = new Random().nextLong();
private EntityFactory entityFactory = new DefaultEntityFactory();
private BlockEntityFactory blockEntityFactory;
private BiomeFactory biomeFactory = new MinestomUserDefinedBiomeFactory();
private boolean doFineGrainedBiomes = true;

public TerraMinestomWorldBuilder(TerraMinestomPlatform platform, Instance instance) {
this.platform = platform;
this.instance = instance;
this.blockEntityFactory = new DefaultBlockEntityFactory(instance);
}

public TerraMinestomWorldBuilder pack(ConfigPack pack) {
this.pack = pack;
return this;
}

public TerraMinestomWorldBuilder packById(String id) {
this.pack = platform.getConfigRegistry().getByID(id).orElseThrow();

return this;
}

public TerraMinestomWorldBuilder findPack(Function<CheckedRegistry<ConfigPack>, ConfigPack> fn) {
this.pack = fn.apply(platform.getConfigRegistry());
return this;
}

public TerraMinestomWorldBuilder defaultPack() {
return this.packById("OVERWORLD");
}

public TerraMinestomWorldBuilder seed(long seed) {
this.seed = seed;
return this;
}

public TerraMinestomWorldBuilder entityFactory(EntityFactory factory) {
this.entityFactory = factory;
return this;
}

public TerraMinestomWorldBuilder blockEntityFactory(BlockEntityFactory factory) {
this.blockEntityFactory = factory;
return this;
}

public TerraMinestomWorldBuilder biomeFactory(BiomeFactory factory) {
this.biomeFactory = factory;
return this;
}

/**
* Due to a current bug with the minestom biome encoder, sometimes, the client gets kicked when decoding a chunk
* packet with more than one biome. Until this is fixed in minestom, one can disable fine-grained biomes to prevent
* this issue.
*
* @deprecated Scheduled for removal once Minestom rolls out a fix
*/
@Deprecated
public TerraMinestomWorldBuilder doFineGrainedBiomes(boolean doFineGrainedBiomes) {
this.doFineGrainedBiomes = doFineGrainedBiomes;
return this;
}

public TerraMinestomWorld attach() {
return new TerraMinestomWorld(platform, instance, pack, seed, entityFactory, blockEntityFactory, biomeFactory, doFineGrainedBiomes);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@

import com.dfsek.terra.api.world.biome.PlatformBiome;

import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.world.biome.Biome;


public class MinestomBiome implements PlatformBiome {
private final Biome biome;
private final DynamicRegistry.Key<Biome> biome;

public MinestomBiome(Biome biome) { this.biome = biome; }
public MinestomBiome(DynamicRegistry.Key<Biome> biome) { this.biome = biome; }

@Override
public Biome getHandle() {
public DynamicRegistry.Key<Biome> getHandle() {
return biome;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import net.minestom.server.MinecraftServer;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.world.biome.Biome;
import org.intellij.lang.annotations.Subst;
import org.jetbrains.annotations.NotNull;

import java.lang.reflect.AnnotatedType;
Expand All @@ -21,6 +22,7 @@ public class MinestomBiomeLoader implements TypeLoader<PlatformBiome> {
@Override
public PlatformBiome load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader,
DepthTracker depthTracker) throws LoadException {
@Subst("name:value")
String id = (String) o;
Key key = Key.key(id);
Biome biome = biomeRegistry.get(key);
Expand Down
Loading
Loading