updated dependencies and updated all usages accordingly, replaced deprecated methods, and updated project to JDK 25

This commit is contained in:
2026-07-19 19:37:44 +02:00
parent ee421245d1
commit 0d7f1fc646
45 changed files with 319 additions and 286 deletions
@@ -3,12 +3,12 @@ package eu.mhsl.minenet.minigames;
import eu.mhsl.minenet.minigames.api.HttpServer;
import eu.mhsl.minenet.minigames.command.Commands;
import eu.mhsl.minenet.minigames.handler.Listeners;
import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.lang.Languages;
import eu.mhsl.minenet.minigames.server.tasks.TablistUpdateTask;
import net.minestom.server.Auth;
import net.minestom.server.MinecraftServer;
import net.minestom.server.extras.bungee.BungeeCordProxy;
import net.minestom.server.extras.lan.OpenToLAN;
import net.minestom.server.extras.velocity.VelocityProxy;
import net.minestom.server.timer.TaskSchedule;
import org.spongepowered.configurate.ConfigurateException;
import org.spongepowered.configurate.ConfigurationNode;
@@ -25,7 +25,7 @@ public class Main {
public static ConfigurationNode globalConfig;
@SuppressWarnings("ResultOfMethodCallIgnored")
public static void main(String[] args) throws ConfigurateException {
static void main(String[] args) throws ConfigurateException {
//noinspection ResultOfMethodCallIgnored
Resource.values(); // This initializes and preloads the enum and extracts the resources
Languages.getInstance(); //Preload languages into the jvm
@@ -38,14 +38,31 @@ public class Main {
ConfigurationNode serverConfig = globalConfig.node("server");
// muss vor MinecraftServer.init() gesetzt werden: ServerFlag liest die Properties statisch beim Klassenladen;
// bei fehlendem/ungueltigem Config-Wert den Minestom-Default behalten (0 wuerde keine Chunks senden)
int viewDistance = serverConfig.node("view-distance").getInt(0);
if(viewDistance > 0) {
System.setProperty("minestom.chunk-view-distance", String.valueOf(viewDistance));
}
logger.info("Initialize Minecraft server...");
MinecraftServer server = MinecraftServer.init();
Auth auth = new Auth.Offline();
if(globalConfig.node("bungeecord", "enabled").getBoolean()) {
auth = new Auth.Bungee();
} else if(globalConfig.node("velocity", "enabled").getBoolean()) {
auth = new Auth.Velocity(Objects.requireNonNull(globalConfig.node("velocity", "secret").getString()));
}
MinecraftServer server = MinecraftServer.init(auth);
// MinestomPvP.init();
// Dimensionen muessen vor server.start() registriert werden:
// seit Minestom 26.x sind die dynamischen Registries nach dem Start eingefroren
Dimension.values();
MinecraftServer.setBrandName("mhsl.eu - minenet - credits to minestom");
MinecraftServer.setCompressionThreshold(serverConfig.node("compression-threshold").getInt(0));
System.setProperty("minestom.chunk-view-distance", String.valueOf(serverConfig.node("view-distance").getInt()));
Commands.values();
Listeners.values();
@@ -57,12 +74,6 @@ public class Main {
if(serverConfig.node("open-to-lan").getBoolean()) OpenToLAN.open();
if(globalConfig.node("bungeecord", "enabled").getBoolean()) BungeeCordProxy.enable();
if(globalConfig.node("velocity", "enabled").getBoolean()) {
VelocityProxy.enable(Objects.requireNonNull(globalConfig.node("velocity", "secret").getString()));
}
server.start("0.0.0.0", serverConfig.node("port").getInt(25565));
System.gc();
@@ -35,7 +35,7 @@ public class SetMemorialCommand extends PrivilegedCommand {
.getTournament()
.setMemorialConfiguration(
new MemorialConfiguration(
Material.fromNamespaceId(context.get(materialArgument)),
Material.fromKey(context.get(materialArgument)),
context.get(titleArgument),
context.get(loreArgument)
)
@@ -37,7 +37,7 @@ public class SetRewardCommand extends PrivilegedCommand {
.getTournament()
.setRewardConfiguration(
new RewardConfiguration(
Material.fromNamespaceId(context.get(materialArgument)),
Material.fromKey(context.get(materialArgument)),
Arrays.stream(context.get(amountsArgument)).map(Integer::valueOf).collect(Collectors.toList())
)
);
@@ -2,6 +2,7 @@ package eu.mhsl.minenet.minigames.handler;
import eu.mhsl.minenet.minigames.handler.global.AddEntityToInstanceEventListener;
import eu.mhsl.minenet.minigames.handler.global.ChatFormatHandler;
import eu.mhsl.minenet.minigames.handler.global.PlayerFreezeHandler;
import eu.mhsl.minenet.minigames.handler.global.PlayerLeaveHandler;
import eu.mhsl.minenet.minigames.handler.global.PlayerLoginHandler;
import net.minestom.server.MinecraftServer;
@@ -11,6 +12,7 @@ public enum Listeners {
SPAWN(new AddEntityToInstanceEventListener()),
LOGIN(new PlayerLoginHandler()),
LEAVE(new PlayerLeaveHandler()),
FREEZE(new PlayerFreezeHandler()),
CHAT(new ChatFormatHandler());
Listeners(EventListener<?> event) {
@@ -0,0 +1,43 @@
package eu.mhsl.minenet.minigames.handler.global;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Player;
import net.minestom.server.event.EventListener;
import net.minestom.server.event.player.PlayerTickEvent;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import org.jetbrains.annotations.NotNull;
/**
* Weder Minestom noch MinestomPvP verwalten die TICKS_FROZEN-Metadata. Der 26.x-Client baut das
* Freeze-Overlay bei Powder-Snow-Kontakt zwar selbst auf, der Abbau ist aber server-authoritative —
* ohne diese Vanilla-Logik bleibt das Overlay dauerhaft haengen (auch ueber Instanzwechsel hinweg).
*/
public class PlayerFreezeHandler implements EventListener<PlayerTickEvent> {
private static final int TICKS_REQUIRED_TO_FREEZE = 140;
@Override
public @NotNull Class<PlayerTickEvent> eventType() {
return PlayerTickEvent.class;
}
@Override
public @NotNull Result run(@NotNull PlayerTickEvent event) {
Player p = event.getPlayer();
Instance instance = p.getInstance();
if(instance == null) return Result.SUCCESS;
Pos pos = p.getPosition();
boolean inPowderSnow = instance.getBlock(pos).compare(Block.POWDER_SNOW)
|| instance.getBlock(pos.add(0, 1, 0)).compare(Block.POWDER_SNOW);
int ticksFrozen = p.getEntityMeta().getTickFrozen();
if(inPowderSnow) {
p.getEntityMeta().setTickFrozen(Math.min(TICKS_REQUIRED_TO_FREEZE, ticksFrozen + 1));
} else if(ticksFrozen > 0) {
p.getEntityMeta().setTickFrozen(Math.max(0, ticksFrozen - 2));
}
return Result.SUCCESS;
}
}
@@ -1,45 +1,66 @@
package eu.mhsl.minenet.minigames.instance;
import net.kyori.adventure.key.Key;
import net.minestom.server.MinecraftServer;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.utils.NamespaceID;
import net.minestom.server.registry.RegistryKey;
import net.minestom.server.registry.RegistryTag;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.world.DimensionType;
import net.minestom.server.world.attribute.EnvironmentAttribute;
import net.minestom.server.world.clock.WorldClock;
import net.minestom.server.world.timeline.Timeline;
/**
* Prebuilt dimensions
*/
public enum Dimension {
OVERWORLD(
NamespaceID.from("minenet:fullbright_overworld"),
Key.key("minenet:fullbright_overworld"),
DimensionType
.builder()
.ambientLight(2.0f)
// Fullbright: seit MC 26.1 laeuft die Grundhelligkeit ueber das Environment-Attribut
// AMBIENT_LIGHT_COLOR (Vanilla-Overworld: #0A0A0A); der alte ambientLight-2.0-Hack
// liegt ausserhalb der validen Range und bricht das Client-Rendering
.setAttribute(EnvironmentAttribute.AMBIENT_LIGHT_COLOR, NamedTextColor.WHITE)
// defaultClock noetig, damit Instance#setTime/#defaultClock funktionieren (sonst null); Timelines wie Vanilla-Overworld
.defaultClock(WorldClock.OVERWORLD)
.timelines(RegistryTag.direct(Timeline.DAY, Timeline.MOON, Timeline.EARLY_GAME, Timeline.VILLAGER_SCHEDULE))
.build()
),
NETHER(
NamespaceID.from("minenet:fullbright_nether"),
Key.key("minenet:fullbright_nether"),
DimensionType
.builder()
.ambientLight(2.0f)
.effects("minecraft:the_nether")
// Fullbright: seit MC 26.1 laeuft die Grundhelligkeit ueber das Environment-Attribut
// AMBIENT_LIGHT_COLOR (Vanilla-Overworld: #0A0A0A); der alte ambientLight-2.0-Hack
// liegt ausserhalb der validen Range und bricht das Client-Rendering
.setAttribute(EnvironmentAttribute.AMBIENT_LIGHT_COLOR, NamedTextColor.WHITE)
.skybox(DimensionType.Skybox.NONE)
.defaultClock(WorldClock.OVERWORLD)
.timelines(RegistryTag.direct(Timeline.VILLAGER_SCHEDULE))
.build()
),
THE_END(
NamespaceID.from("minenet:fullbright_end"),
Key.key("minenet:fullbright_end"),
DimensionType
.builder()
.ambientLight(2.0f)
.effects("minecraft:the_end")
// Fullbright: seit MC 26.1 laeuft die Grundhelligkeit ueber das Environment-Attribut
// AMBIENT_LIGHT_COLOR (Vanilla-Overworld: #0A0A0A); der alte ambientLight-2.0-Hack
// liegt ausserhalb der validen Range und bricht das Client-Rendering
.setAttribute(EnvironmentAttribute.AMBIENT_LIGHT_COLOR, NamedTextColor.WHITE)
.skybox(DimensionType.Skybox.END)
.defaultClock(WorldClock.THE_END)
.timelines(RegistryTag.direct(Timeline.VILLAGER_SCHEDULE))
.build()
);
public final DimensionType DIMENSION;
public final NamespaceID namespaceID;
public final DynamicRegistry.Key<DimensionType> key;
public final Key namespaceID;
public final RegistryKey<DimensionType> key;
Dimension(NamespaceID namespaceID, DimensionType dimType) {
Dimension(Key namespaceID, DimensionType dimType) {
this.DIMENSION = dimType;
this.namespaceID = namespaceID;
@@ -1,21 +1,29 @@
package eu.mhsl.minenet.minigames.instance;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.kyori.adventure.key.Key;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.event.instance.AddEntityToInstanceEvent;
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.registry.RegistryKey;
import net.minestom.server.timer.TaskSchedule;
import net.minestom.server.world.DimensionType;
import java.util.UUID;
public class MineNetInstance extends InstanceContainer {
public MineNetInstance(DynamicRegistry.Key<DimensionType> type) {
super(UUID.randomUUID(), type);
public MineNetInstance(RegistryKey<DimensionType> type) {
this(UUID.randomUUID(), type);
}
// Eindeutiger Dimension-Name pro Instanz: Minestom entscheidet anhand dieses Namens (nicht des
// DimensionTypes), ob beim setInstance das volle Respawn-Protokoll gefahren wird. Ohne den Reset
// rendert der 26.x-Client nach einem Wechsel zwischen Instanzen gleicher Dimension keine Chunks.
private MineNetInstance(UUID uuid, RegistryKey<DimensionType> type) {
super(uuid, type, Key.key("minenet", "instance-" + uuid));
MinecraftServer.getInstanceManager().registerInstance(this);
this.eventNode()
@@ -16,7 +16,7 @@ import net.minestom.server.event.item.ItemDropEvent;
import net.minestom.server.event.player.PlayerBlockBreakEvent;
import net.minestom.server.event.player.PlayerBlockPlaceEvent;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.registry.RegistryKey;
import net.minestom.server.timer.ExecutionType;
import net.minestom.server.timer.TaskSchedule;
import net.minestom.server.world.DimensionType;
@@ -34,7 +34,7 @@ public abstract class Game extends MineNetInstance implements Spawnable {
protected boolean isRunning = false;
protected boolean isBeforeBeginning = true;
public Game(DynamicRegistry.Key<DimensionType> dimensionType) {
public Game(RegistryKey<DimensionType> dimensionType) {
super(dimensionType);
MinecraftServer.getInstanceManager().registerInstance(this);
@@ -9,7 +9,7 @@ import eu.mhsl.minenet.minigames.score.Score;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.registry.RegistryKey;
import net.minestom.server.timer.ExecutionType;
import net.minestom.server.timer.Task;
import net.minestom.server.timer.TaskSchedule;
@@ -26,7 +26,7 @@ public class StatelessGame extends Game {
private int timeLimit = 0;
private int timePlayed = 0;
public StatelessGame(DynamicRegistry.Key<DimensionType> dimensionType, String gameName, Score score) {
public StatelessGame(RegistryKey<DimensionType> dimensionType, String gameName, Score score) {
super(dimensionType);
this.score = score;
this.name = gameName;
@@ -14,9 +14,9 @@ import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.event.instance.AddEntityToInstanceEvent;
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.inventory.InventoryType;
import net.minestom.server.inventory.click.ClickType;
import net.minestom.server.inventory.condition.InventoryConditionResult;
import net.minestom.server.inventory.click.Click;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.sound.SoundEvent;
@@ -106,8 +106,8 @@ public class GameConfigurationInventory extends InteractableInventory {
}
@Override
protected void onClick(Player player, int slot, ClickType clickType, InventoryConditionResult inventoryConditionResult) {
inventoryConditionResult.setCancel(true);
protected void onClick(Player player, int slot, Click click, InventoryPreClickEvent event) {
event.setCancelled(true);
if(!this.map.containsKey(slot)) return;
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.acidRain;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.opensimplex.FastSimplexNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.score.LastWinsScore;
@@ -28,9 +29,8 @@ import java.util.concurrent.CompletableFuture;
public class AcidRain extends StatelessGame {
final JNoise noise = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.09)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.09)
.build();
final private int radius = 20;
final private int roofHeight = 55;
@@ -105,7 +105,7 @@ public class AcidRain extends StatelessGame {
for(int z = -radius; z <= radius; z++) {
batch.setBlock(x, this.roofHeight, z, Block.AIR);
if(new Pos(x, 0, z).distance(new Pos(0, 0, 0)) > radius) continue;
if(this.noise.getNoise(x + offset, z + offset) > 0.4) continue;
if(this.noise.evaluateNoise(x + offset, z + offset) > 0.4) continue;
batch.setBlock(x, this.roofHeight, z, Block.OAK_PLANKS);
}
@@ -229,7 +229,7 @@ public class ElytraRace extends StatelessGame {
if(data.currentCheckpoint == 0) checkpointPos = this.getSpawn().add(0, 3, 0);
p.setVelocity(Vec.ZERO);
p.setFlyingWithElytra(false);
p.teleport(Pos.fromPoint(checkpointPos).add(0.5, 0, 0.5));
p.teleport(new Pos(checkpointPos).add(0.5, 0, 0.5));
p.setFlying(true);
p.setFlyingSpeed(0);
@@ -8,6 +8,7 @@ import io.github.togar2.pvp.events.EntityKnockbackEvent;
import io.github.togar2.pvp.events.FinalAttackEvent;
import io.github.togar2.pvp.events.PrepareAttackEvent;
import io.github.togar2.pvp.feature.CombatFeatures;
import io.github.togar2.pvp.feature.knockback.KnockbackSettings;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Player;
import net.minestom.server.event.instance.InstanceTickEvent;
@@ -50,7 +51,15 @@ class HighGround extends StatelessGame {
this.eventNode().addListener(
EntityKnockbackEvent.class,
entityKnockbackEvent -> entityKnockbackEvent.setStrength(1.1f)
entityKnockbackEvent -> entityKnockbackEvent.setSettings(
KnockbackSettings.builder()
.horizontal(1.1)
.vertical(KnockbackSettings.DEFAULT.vertical())
.verticalLimit(KnockbackSettings.DEFAULT.verticalLimit())
.extraHorizontal(KnockbackSettings.DEFAULT.extraHorizontal())
.extraVertical(KnockbackSettings.DEFAULT.extraVertical())
.build()
)
);
this.eventNode().addListener(InstanceTickEvent.class, instanceTickEvent -> {
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -13,8 +14,8 @@ import java.util.Random;
*/
class BasaltPillars extends Obstacle {
private final JNoise ground = JNoise.newBuilder()
.perlin()
.setFrequency(0.13)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.13)
.build();
@Override
@@ -22,7 +23,7 @@ class BasaltPillars extends Obstacle {
Random rnd = seededRandom(start);
forEachColumn(start, point -> {
double noise = this.ground.getNoise(point.blockX(), point.blockZ());
double noise = this.ground.evaluateNoise(point.blockX(), point.blockZ());
Block floor = noise > 0.4 ? Block.SOUL_SOIL : noise < -0.4 ? Block.BASALT : Block.BLACKSTONE;
unit.modifier().setBlock(point.withY(start.blockY()), floor);
});
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -13,8 +14,8 @@ import java.util.Random;
*/
class CobwebGrove extends Obstacle {
private final JNoise soil = JNoise.newBuilder()
.perlin()
.setFrequency(0.12)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.12)
.build();
@Override
@@ -22,7 +23,7 @@ class CobwebGrove extends Obstacle {
Random rnd = seededRandom(start);
forEachColumn(start, point -> {
Block floor = this.soil.getNoise(point.blockX(), point.blockZ()) > 0 ? Block.PODZOL : Block.COARSE_DIRT;
Block floor = this.soil.evaluateNoise(point.blockX(), point.blockZ()) > 0 ? Block.PODZOL : Block.COARSE_DIRT;
unit.modifier().setBlock(point.withY(start.blockY()), floor);
int z = relZ(point, start);
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -13,8 +14,8 @@ import java.util.Random;
*/
class HoneyField extends Obstacle {
private final JNoise sticky = JNoise.newBuilder()
.perlin()
.setFrequency(0.2)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.2)
.build();
@Override
@@ -22,7 +23,7 @@ class HoneyField extends Obstacle {
Random rnd = seededRandom(start);
forEachColumn(start, point -> {
boolean stickyFloor = this.sticky.getNoise(point.blockX(), point.blockZ()) > 0.35;
boolean stickyFloor = this.sticky.evaluateNoise(point.blockX(), point.blockZ()) > 0.35;
unit.modifier().setBlock(point.withY(start.blockY()), stickyFloor ? Block.HONEY_BLOCK : Block.HONEYCOMB_BLOCK);
});
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -13,8 +14,8 @@ import java.util.Random;
*/
class IceRink extends Obstacle {
private final JNoise streaks = JNoise.newBuilder()
.perlin()
.setFrequency(0.15)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.15)
.build();
@Override
@@ -22,7 +23,7 @@ class IceRink extends Obstacle {
Random rnd = seededRandom(start);
forEachColumn(start, point -> {
double noise = this.streaks.getNoise(point.blockX(), point.blockZ());
double noise = this.streaks.evaluateNoise(point.blockX(), point.blockZ());
Block floor = noise > 0.45 ? Block.BLUE_ICE : noise < -0.55 ? Block.ICE : Block.PACKED_ICE;
unit.modifier().setBlock(point.withY(start.blockY()), floor);
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -14,8 +15,8 @@ import java.util.Random;
*/
class MudPools extends Obstacle {
private final JNoise pools = JNoise.newBuilder()
.perlin()
.setFrequency(0.11)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.11)
.build();
@Override
@@ -24,7 +25,7 @@ class MudPools extends Obstacle {
forEachColumn(start, point -> {
int z = relZ(point, start);
double noise = this.pools.getNoise(point.blockX(), point.blockZ());
double noise = this.pools.evaluateNoise(point.blockX(), point.blockZ());
boolean pool = z >= 1 && z <= 14 && noise > 0.05;
if(pool) {
@@ -1,14 +1,15 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
class Mudpit extends Obstacle {
private final JNoise curves = JNoise.newBuilder()
.perlin()
.setFrequency(0.1)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.1)
.build();
@Override
@@ -16,7 +17,7 @@ class Mudpit extends Obstacle {
forEachColumn(start, point -> {
double relative = relZ(point, start);
double modifier = -1.5 * Math.cos(relative * Math.PI/7.5) + 1.5;
double heightAtBlock = start.blockY() + this.curves.getNoise(point.blockX(), point.blockZ()) * modifier;
double heightAtBlock = start.blockY() + this.curves.evaluateNoise(point.blockX(), point.blockZ()) * modifier;
unit.modifier().setBlock(point.withY(heightAtBlock), Block.SOUL_SAND);
unit.modifier().setBlock(point.withY(heightAtBlock-1), Block.SOUL_SAND);
});
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -16,8 +17,8 @@ import java.util.Random;
*/
class PowderSnowField extends Obstacle {
private final JNoise drifts = JNoise.newBuilder()
.perlin()
.setFrequency(0.14)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.14)
.build();
@Override
@@ -28,7 +29,7 @@ class PowderSnowField extends Obstacle {
int z = relZ(point, start);
int laneX = 7 + (int) Math.round(3 * Math.sin(z * Math.PI / 7.5));
boolean onLane = relX(point, start) == laneX || relX(point, start) == laneX + 1;
double noise = this.drifts.getNoise(point.blockX(), point.blockZ());
double noise = this.drifts.evaluateNoise(point.blockX(), point.blockZ());
boolean drift = z >= 2 && z <= 13 && noise > (onLane ? 0.45 : 0.0);
unit.modifier().setBlock(point.withY(start.blockY()), onLane ? Block.PACKED_ICE : Block.SNOW_BLOCK);
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -13,8 +14,8 @@ import java.util.Random;
*/
class SandDunes extends Obstacle {
private final JNoise dunes = JNoise.newBuilder()
.perlin()
.setFrequency(0.08)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.08)
.build();
@Override
@@ -23,7 +24,7 @@ class SandDunes extends Obstacle {
forEachColumn(start, point -> {
double taper = -1.25 * Math.cos(relZ(point, start) * Math.PI / 7.5) + 1.25;
double noise = (this.dunes.getNoise(point.blockX(), point.blockZ()) + 1) / 2;
double noise = (this.dunes.evaluateNoise(point.blockX(), point.blockZ()) + 1) / 2;
int top = start.blockY() + (int) Math.round(noise * taper);
for(int y = start.blockY() - 1; y < top; y++) {
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.perlin.PerlinNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit;
@@ -13,8 +14,8 @@ import java.util.Random;
*/
class SlimePatches extends Obstacle {
private final JNoise blobs = JNoise.newBuilder()
.perlin()
.setFrequency(0.18)
.perlin(PerlinNoiseGenerator.newBuilder().build())
.scale(0.18)
.build();
@Override
@@ -23,7 +24,7 @@ class SlimePatches extends Obstacle {
forEachColumn(start, point -> {
int z = relZ(point, start);
boolean slime = z >= 1 && z <= 14 && this.blobs.getNoise(point.blockX(), point.blockZ()) > -0.2;
boolean slime = z >= 1 && z <= 14 && this.blobs.evaluateNoise(point.blockX(), point.blockZ()) > -0.2;
unit.modifier().setBlock(point.withY(start.blockY()), slime ? Block.SLIME_BLOCK : Block.MOSS_BLOCK);
if(!slime && z >= 2 && z <= 13 && rnd.nextInt(18) == 0) {
@@ -125,7 +125,7 @@ public class SpaceSnake extends StatelessGame {
}
PlayState state = this.playerStates.get(playerBlockPlaceEvent.getPlayer());
state.blocks.add(playerBlockPlaceEvent.getBlockPosition().asVec().asPosition());
state.blocks.add(new Pos(playerBlockPlaceEvent.getBlockPosition()));
state.cutToLength(pos -> this.setBlock(pos, Block.AIR));
MinecraftServer.getSchedulerManager().scheduleNextTick(() -> this.updateInv(playerBlockPlaceEvent.getPlayer()));
@@ -32,7 +32,7 @@ public class Sumo extends StatelessGame {
super(Dimension.OVERWORLD.key, "Sumo", new LastWinsScore());
this.getScore().setIgnoreLastPlayers(1);
this.setTime(6000);
this.setTimeRate(0);
this.defaultClock().pause();
this.radius = radius;
this.health = health;
@@ -22,7 +22,12 @@ public class TowerdefenseRoom extends InstanceContainer {
private final Towerdefense game;
public TowerdefenseRoom(Player player, Towerdefense game) {
super(UUID.randomUUID(), Dimension.OVERWORLD.key);
this(UUID.randomUUID(), player, game);
}
// eindeutiger Dimension-Name pro Instanz, siehe MineNetInstance
private TowerdefenseRoom(UUID uuid, Player player, Towerdefense game) {
super(uuid, Dimension.OVERWORLD.key, net.kyori.adventure.key.Key.key("minenet", "instance-" + uuid));
MinecraftServer.getInstanceManager().registerInstance(this);
this.player = player;
this.game = game;
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.opensimplex.FastSimplexNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.score.FirstWinsScore;
@@ -49,9 +50,8 @@ class TrafficLightRace extends StatelessGame {
@Override
protected void onLoad(@NotNull CompletableFuture<Void> callback) {
final JNoise slowBatches = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.1)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.1)
.build();
AbsoluteBlockBatch batch = new AbsoluteBlockBatch();
@@ -62,7 +62,7 @@ class TrafficLightRace extends StatelessGame {
}
for(int z = this.preRun; z <= this.length + this.preRun; z++) {
batch.setBlock(x, 50, z, slowBatches.getNoise(x, z) > 0.6 ? Block.SOUL_SAND : BlockPallet.STREET.rnd());
batch.setBlock(x, 50, z, slowBatches.evaluateNoise(x, z) > 0.6 ? Block.SOUL_SAND : BlockPallet.STREET.rnd());
}
for(int z = this.preRun + this.length; z <= this.preRun + this.length + this.afterRun; z++) {
@@ -15,8 +15,7 @@ import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.metadata.other.FallingBlockMeta;
import net.minestom.server.event.player.PlayerStartSneakingEvent;
import net.minestom.server.event.player.PlayerStopSneakingEvent;
import net.minestom.server.event.player.PlayerInputEvent;
import net.minestom.server.event.player.PlayerTickEvent;
import net.minestom.server.instance.block.Block;
import net.minestom.server.item.ItemStack;
@@ -45,8 +44,7 @@ class TurtleGame extends StatelessGame {
this.eventNode()
.addListener(PlayerTickEvent.class, this::onPlayerTick)
.addListener(PlayerStartSneakingEvent.class, this::onPlayerStartSneak)
.addListener(PlayerStopSneakingEvent.class, this::onPlayerStopSneak);
.addListener(PlayerInputEvent.class, this::onPlayerInput);
}
@Override
@@ -66,14 +64,10 @@ class TurtleGame extends StatelessGame {
}
}
private void onPlayerStartSneak(@NotNull PlayerStartSneakingEvent event) {
private void onPlayerInput(@NotNull PlayerInputEvent event) {
Player p = event.getPlayer();
this.turtlePlayerMap.get(p).boostSpeed();
}
private void onPlayerStopSneak(@NotNull PlayerStopSneakingEvent event) {
Player p = event.getPlayer();
this.turtlePlayerMap.get(p).cancelBoost();
if(event.hasPressedShiftKey()) this.turtlePlayerMap.get(p).boostSpeed();
if(event.hasReleasedShiftKey()) this.turtlePlayerMap.get(p).cancelBoost();
}
protected void onPlayerTick(@NotNull PlayerTickEvent event) {
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.turtleGame.gameObjects;
import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityCreature;
@@ -52,7 +53,7 @@ public class Turtle extends EntityCreature {
if(this.getInstance() == null) return;
this.teleport(this.getPosition().withView(this.player.getPosition().withPitch(this.getPosition().pitch())));
Vec lookingVector = this.player.getPosition().direction().withY(0).mul(100);
this.lookAt(this.getPosition().add(lookingVector.asPosition()));
this.lookAt(this.getPosition().add(new Pos(lookingVector)));
}
public void move() {
@@ -36,7 +36,7 @@ public class Hub extends MineNetInstance implements Spawnable {
this.setChunkLoader(new AnvilLoader(Path.of("maps/hub")));
this.setTime(18000);
this.setTimeRate(0);
this.defaultClock().pause();
}
@@ -9,10 +9,10 @@ import eu.mhsl.minenet.minigames.shared.inventory.InteractableInventory;
import net.kyori.adventure.text.Component;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.event.player.PlayerPacketEvent;
import net.minestom.server.inventory.InventoryType;
import net.minestom.server.inventory.click.ClickType;
import net.minestom.server.inventory.condition.InventoryConditionResult;
import net.minestom.server.inventory.click.Click;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.network.packet.client.play.ClientNameItemPacket;
@@ -45,9 +45,9 @@ public class JoinInventory extends InteractableInventory {
}
@Override
protected void onClick(Player player, int slot, ClickType clickType, InventoryConditionResult inventoryConditionResult) {
protected void onClick(Player player, int slot, Click click, InventoryPreClickEvent event) {
if(slot != 2) return;
inventoryConditionResult.setCancel(true);
event.setCancelled(true);
player.closeInventory();
this.typedText = this.formatInput(this.typedText);
@@ -2,13 +2,8 @@ package eu.mhsl.minenet.minigames.message.type;
import eu.mhsl.minenet.minigames.message.TranslatableMessage;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.title.Title;
import net.kyori.adventure.title.TitlePart;
import net.minestom.server.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnknownNullability;
import java.time.Duration;
import java.util.function.Consumer;
@@ -41,26 +36,6 @@ public class TitleMessage extends TranslatableMessage {
@Override
public void send(Player p) {
Audience.audience(p).showTitle(new Title() {
@Override
public @NotNull Component title() {
return TitleMessage.this.build(p);
}
@Override
public @NotNull Component subtitle() {
return TitleMessage.this.subtitle.build(p);
}
@Override
public @Nullable Times times() {
return TitleMessage.this.times;
}
@Override
public <T> @UnknownNullability T part(@NotNull TitlePart<T> part) {
return null;
}
});
Audience.audience(p).showTitle(Title.title(this.build(p), this.subtitle.build(p), this.times));
}
}
@@ -44,11 +44,11 @@ public class Tournament {
}
return new Rewards(
this.memorialConfiguration.memorialMaterial().namespace().value(),
this.memorialConfiguration.memorialMaterial().key().value(),
this.memorialConfiguration.memorialTitle(),
this.memorialConfiguration.memorialLore(),
this.getGameScores().keySet().stream().map(Player::getUuid).toList(),
this.rewardConfiguration.item().namespace().value(),
this.rewardConfiguration.item().key().value(),
itemCount
);
}
@@ -2,24 +2,40 @@ package eu.mhsl.minenet.minigames.shared.inventory;
import net.kyori.adventure.text.Component;
import net.minestom.server.entity.Player;
import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.InventoryType;
import net.minestom.server.inventory.click.ClickType;
import net.minestom.server.inventory.condition.InventoryConditionResult;
import net.minestom.server.inventory.click.Click;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
public class InteractableInventory extends Inventory {
private final Map<Integer, ClickAction> clickActions = new ConcurrentHashMap<>();
private record ClickAction(ItemStack item, Consumer<ItemClick> callback, boolean closeAfter) {
}
/**
* Defines an Inventory with direct callbacks for ItemSlots
*/
protected InteractableInventory(@NotNull InventoryType inventoryType, @NotNull Component title) {
super(inventoryType, title);
this.addInventoryCondition(this::onClick);
this.eventNode().addListener(InventoryPreClickEvent.class, event -> {
event.setCancelled(true);
this.onClick(event.getPlayer(), event.getSlot(), event.getClick(), event);
ClickAction action = this.clickActions.get(event.getSlot());
if(action == null) return;
if(action.closeAfter()) event.getPlayer().closeInventory();
action.callback().accept(new ItemClick(event.getPlayer(), this, event.getSlot(), action.item(), event.getClick()));
});
}
/**
@@ -27,13 +43,7 @@ public class InteractableInventory extends Inventory {
*/
protected void setClickableItem(ItemStack item, int slot, Consumer<ItemClick> callback, boolean closeAfter) {
this.setItemStack(slot, item);
this.addInventoryCondition((player, clickedSlot, clickType, inventoryConditionResult) -> {
if(clickedSlot == slot) {
if(closeAfter) player.closeInventory();
callback.accept(new ItemClick(player, this, clickedSlot, item, clickType));
}
inventoryConditionResult.setCancel(true);
});
this.clickActions.put(slot, new ClickAction(item, callback, closeAfter));
}
protected void setClickableItem(ItemStack item, int slot, Consumer<ItemClick> callback) {
@@ -62,7 +72,7 @@ public class InteractableInventory extends Inventory {
/**
* You may want to Override this method to get more generic click events
*/
protected void onClick(Player player, int slot, ClickType clickType, InventoryConditionResult inventoryConditionResult) {
protected void onClick(Player player, int slot, Click click, InventoryPreClickEvent event) {
}
}
@@ -2,7 +2,7 @@ package eu.mhsl.minenet.minigames.shared.inventory;
import net.minestom.server.entity.Player;
import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.click.ClickType;
import net.minestom.server.inventory.click.Click;
import net.minestom.server.item.ItemStack;
public class ItemClick {
@@ -10,17 +10,17 @@ public class ItemClick {
private final InteractableInventory inventory;
private final int clickedSlot;
private final ItemStack item;
private final ClickType clickType;
private final Click click;
/**
* Describes a click on an Item from an IntractableInventory
*/
public ItemClick(Player player, InteractableInventory inventory, int clickedSlot, ItemStack item, ClickType clickType) {
public ItemClick(Player player, InteractableInventory inventory, int clickedSlot, ItemStack item, Click click) {
this.player = player;
this.inventory = inventory;
this.clickedSlot = clickedSlot;
this.item = item;
this.clickType = clickType;
this.click = click;
}
public Player getPlayer() {
@@ -39,7 +39,7 @@ public class ItemClick {
return this.item;
}
public ClickType getClickType() {
return this.clickType;
public Click getClick() {
return this.click;
}
}
@@ -2,6 +2,7 @@ package eu.mhsl.minenet.minigames.util;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.batch.AbsoluteBlockBatch;
import net.minestom.server.instance.batch.Batch;
import net.minestom.server.instance.batch.ChunkBatch;
import net.minestom.server.utils.chunk.ChunkUtils;
@@ -24,27 +25,19 @@ public class BatchUtil {
}
}
public static void loadAndApplyBatch(Batch batch, InstanceContainer instance, Runnable onFinish) {
public static void loadAndApplyBatch(AbsoluteBlockBatch batch, InstanceContainer instance, Runnable onFinish) {
batch.awaitReady();
long[] affectedChunks = BatchUtil.getAffectedChunks(batch);
ChunkUtils.optionalLoadAll(instance, affectedChunks, null).thenRun(() -> batch.apply(instance, onFinish));
ChunkUtils.optionalLoadAll(instance, affectedChunks, null).thenRun(() -> batch.apply(instance, b -> onFinish.run()));
}
public static void loadAndApplyBatchBlocking(Batch batch, InstanceContainer instance) {
public static void loadAndApplyBatchBlocking(AbsoluteBlockBatch batch, InstanceContainer instance) {
CompletableFuture<Void> future = new CompletableFuture<>();
batch.awaitReady();
long[] affectedChunks = BatchUtil.getAffectedChunks(batch);
CompletableFuture<Void> loadChunksTask = ChunkUtils.optionalLoadAll(instance, affectedChunks, null);
Runnable completerTask = () -> {
System.out.println("COMPLETE");
future.complete(null);
};
loadChunksTask.thenRun(() -> {
System.out.println("BEGIN");
batch.apply(instance, completerTask);
});
loadChunksTask.thenRun(() -> batch.apply(instance, b -> future.complete(null)));
try {
future.get();
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.world.generator.featureEnriched;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.opensimplex.FastSimplexNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import eu.mhsl.minenet.minigames.util.NumberUtil;
import eu.mhsl.minenet.minigames.world.generator.terrain.HeightTerrainGenerator;
import net.minestom.server.coordinate.Point;
@@ -9,15 +10,13 @@ import java.util.function.Function;
public class ValeGenerator extends HeightTerrainGenerator {
private final JNoise curves = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.01)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.01)
.build();
private final JNoise largeCurves = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.001)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.001)
.build();
private Function<Integer, Double> xShiftMultiplier = multiplier -> 1d;
@@ -33,7 +32,7 @@ public class ValeGenerator extends HeightTerrainGenerator {
}
public int getXShiftAtZ(int z) {
return (int) ((this.curves.getNoise(z) * 32 + this.largeCurves.getNoise(z) * 64) * this.xShiftMultiplier.apply(z) + this.xShiftOffset.apply(z));
return (int) ((this.curves.evaluateNoise(z) * 32 + this.largeCurves.evaluateNoise(z) * 64) * this.xShiftMultiplier.apply(z) + this.xShiftOffset.apply(z));
}
public void setXShiftMultiplier(Function<Integer, Double> xShiftMultiplier) {
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.world.generator.terrain;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.opensimplex.FastSimplexNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import eu.mhsl.minenet.minigames.util.NumberUtil;
import eu.mhsl.minenet.minigames.world.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.PlateTerrainGenerator;
@@ -17,19 +18,16 @@ public class CircularPlateTerrainGenerator extends PlateTerrainGenerator {
protected final Random rnd = new Random();
private final int size;
private final JNoise base = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.01)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.01)
.build();
private final JNoise batches = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.05)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.05)
.build();
private final JNoise peaks = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.1)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.1)
.build();
public CircularPlateTerrainGenerator(int size) {
@@ -61,11 +59,11 @@ public class CircularPlateTerrainGenerator extends PlateTerrainGenerator {
unit.modifier().setBlock(bottom, Block.GRASS_BLOCK);
synchronized(this.base) {
double baseNoise = this.base.getNoise(bottom.x(), bottom.z());
double baseNoise = this.base.evaluateNoise(bottom.x(), bottom.z());
double currentHeight = minTwo(NumberUtil.map(distance, 0, 400, -((double) this.size / 5), 200)) + baseNoise * 8;
synchronized(this.batches) {
double elementNoise = this.batches.getNoise(bottom.x(), bottom.z());
double elementNoise = this.batches.evaluateNoise(bottom.x(), bottom.z());
unit.modifier().fill(
bottom,
@@ -76,7 +74,7 @@ public class CircularPlateTerrainGenerator extends PlateTerrainGenerator {
}
synchronized(this.peaks) {
double peakNoise = this.peaks.getNoise(bottom.x(), bottom.z());
double peakNoise = this.peaks.evaluateNoise(bottom.x(), bottom.z());
if(peakNoise > 0.97 && bottom.distance(new Pos(0, 0, 0)) > (this.size + 20)) {
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.world.generator.terrain;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.opensimplex.FastSimplexNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import eu.mhsl.minenet.minigames.util.GeneratorUtils;
import eu.mhsl.minenet.minigames.util.NumberUtil;
import eu.mhsl.minenet.minigames.world.BlockPallet;
@@ -17,19 +18,16 @@ import java.util.function.Function;
public class HeightTerrainGenerator extends BaseGenerator {
protected final Random rnd = new Random();
private final JNoise base = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.01)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.01)
.build();
private final JNoise batches = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.05)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.05)
.build();
private final JNoise peaks = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.1)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.1)
.build();
private final BlockPallet blockPallet = BlockPallet.STONE;
protected Function<Point, Integer> heightNoiseMultiplier = (Point) -> 16;
@@ -43,13 +41,13 @@ public class HeightTerrainGenerator extends BaseGenerator {
unit.modifier().setBlock(bottomPoint, this.blockPallet.rnd());
synchronized(this.base) {
double heightNoise = this.base.getNoise(bottomPoint.x(), bottomPoint.z());
double heightNoise = this.base.evaluateNoise(bottomPoint.x(), bottomPoint.z());
double noiseModifier = heightNoise * this.heightNoiseMultiplier.apply(bottomPoint);
double heightModifier = NumberUtil.clamp(this.calculateHeight.apply(bottomPoint) + noiseModifier, 1d, unit.size().y());
if(heightModifier < 1) System.out.println("HEIGHT MODIFIER ILLEGAL");
synchronized(this.batches) {
double batchNoise = this.batches.getNoise(bottomPoint.x(), bottomPoint.z());
double batchNoise = this.batches.evaluateNoise(bottomPoint.x(), bottomPoint.z());
Block block = batchNoise < 0.9 ? batchNoise > -0.2 ? Block.GRASS_BLOCK : Block.SOUL_SAND : Block.STONE;
unit.modifier().fill(bottomPoint, bottomPoint.add(1, heightModifier, 1), block);
@@ -77,7 +75,7 @@ public class HeightTerrainGenerator extends BaseGenerator {
}
synchronized(this.peaks) {
double peakNoise = this.peaks.getNoise(bottomPoint.x(), bottomPoint.z());
double peakNoise = this.peaks.evaluateNoise(bottomPoint.x(), bottomPoint.z());
if(peakNoise > 0.97 && bottomPoint.distance(new Pos(0, 0, 0)) > (50 + 20)) {
@@ -1,6 +1,7 @@
package eu.mhsl.minenet.minigames.world.generator.terrain;
import de.articdive.jnoise.JNoise;
import de.articdive.jnoise.generators.noisegen.opensimplex.FastSimplexNoiseGenerator;
import de.articdive.jnoise.pipeline.JNoise;
import eu.mhsl.minenet.minigames.util.NumberUtil;
import eu.mhsl.minenet.minigames.world.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.PlateTerrainGenerator;
@@ -21,19 +22,16 @@ public class SquarePlateTerrainGenerator extends PlateTerrainGenerator {
private final int width;
private final int length;
private final JNoise base = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.01)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.01)
.build();
private final JNoise batches = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.05)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.05)
.build();
private final JNoise peaks = JNoise.newBuilder()
.fastSimplex()
.setSeed(this.rnd.nextLong())
.setFrequency(0.1)
.fastSimplex(FastSimplexNoiseGenerator.newBuilder().setSeed(this.rnd.nextLong()).build())
.scale(0.1)
.build();
public SquarePlateTerrainGenerator(int width, int length) {
@@ -82,7 +80,7 @@ public class SquarePlateTerrainGenerator extends PlateTerrainGenerator {
unit.modifier().setBlock(bottom, Block.GRASS_BLOCK);
synchronized(this.base) {
double baseNoise = this.base.getNoise(bottom.x(), bottom.z());
double baseNoise = this.base.evaluateNoise(bottom.x(), bottom.z());
double[] possibleHeights = {
minTwo(NumberUtil.map(bottom.distance(new Pos(0, 0, 0)), 0, 400, -((double) this.width / 5), 200)) + baseNoise * 8,
minTwo(NumberUtil.map(bottom.distance(new Pos(this.width, 0, 0)), 0, 400, -((double) this.width / 5), 200)) + baseNoise * 8,
@@ -93,7 +91,7 @@ public class SquarePlateTerrainGenerator extends PlateTerrainGenerator {
double currentHeight = Arrays.stream(possibleHeights).min().getAsDouble();
synchronized(this.batches) {
double elementNoise = this.batches.getNoise(bottom.x(), bottom.z());
double elementNoise = this.batches.evaluateNoise(bottom.x(), bottom.z());
unit.modifier().fill(
bottom,
@@ -104,7 +102,7 @@ public class SquarePlateTerrainGenerator extends PlateTerrainGenerator {
}
synchronized(this.peaks) {
double peakNoise = this.peaks.getNoise(bottom.x(), bottom.z());
double peakNoise = this.peaks.evaluateNoise(bottom.x(), bottom.z());
if(peakNoise > 0.97 && bottom.distance(new Pos(0, 0, 0)) > (this.width + 20)) {