Refactored Generation class structure

This commit is contained in:
Elias Müller 2023-10-03 18:30:34 +02:00
parent b3b6644d24
commit 8ef61e0880
12 changed files with 81 additions and 47 deletions

View File

@ -5,7 +5,7 @@ import eu.mhsl.minenet.minigames.score.FirstWinsScore;
import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.util.BatchUtil;
import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.world.generator.BlockPallet; import eu.mhsl.minenet.minigames.world.generator.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.terrain.CircularTerrainGenerator; import eu.mhsl.minenet.minigames.world.generator.terrain.CircularPlateTerrainGenerator;
import io.github.bloepiloepi.pvp.config.AttackConfig; import io.github.bloepiloepi.pvp.config.AttackConfig;
import io.github.bloepiloepi.pvp.config.DamageConfig; import io.github.bloepiloepi.pvp.config.DamageConfig;
import io.github.bloepiloepi.pvp.config.PvPConfig; import io.github.bloepiloepi.pvp.config.PvPConfig;
@ -27,7 +27,7 @@ class Deathcube extends StatelessGame {
this.radius = radius; this.radius = radius;
this.height = height + 49; this.height = height + 49;
this.percentage = percentage; this.percentage = percentage;
this.setGenerator(new CircularTerrainGenerator(radius+10, true)); this.setGenerator(new CircularPlateTerrainGenerator(radius+10).setPlateHeight(50));
if(pvpEnabled == 1) eventNode().addChild( if(pvpEnabled == 1) eventNode().addChild(
PvPConfig.emptyBuilder() PvPConfig.emptyBuilder()

View File

@ -8,7 +8,7 @@ import eu.mhsl.minenet.minigames.util.CommonProperties;
import eu.mhsl.minenet.minigames.util.Intersect; import eu.mhsl.minenet.minigames.util.Intersect;
import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.world.generator.BlockPallet; import eu.mhsl.minenet.minigames.world.generator.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.terrain.SquareTerrainGenerator; import eu.mhsl.minenet.minigames.world.generator.terrain.SquarePlateTerrainGenerator;
import net.kyori.adventure.sound.Sound; import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
@ -36,7 +36,7 @@ class Minerun extends StatelessGame {
public Minerun(int width, int length, int minePercentage) { public Minerun(int width, int length, int minePercentage) {
super(Dimension.THE_END.DIMENSION, "Minerun", new FirstWinsScore()); super(Dimension.THE_END.DIMENSION, "Minerun", new FirstWinsScore());
setGenerator(new SquareTerrainGenerator(width, length + preRun + afterFinishLine).withPlate(50)); setGenerator(new SquarePlateTerrainGenerator(width, length + preRun + afterFinishLine).setPlateHeight(50));
this.width = width; this.width = width;
this.length = length; this.length = length;

View File

@ -6,7 +6,7 @@ import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import eu.mhsl.minenet.minigames.score.LastWinsScore; import eu.mhsl.minenet.minigames.score.LastWinsScore;
import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.util.BatchUtil;
import eu.mhsl.minenet.minigames.world.generator.BlockPallet; import eu.mhsl.minenet.minigames.world.generator.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.terrain.CircularTerrainGenerator; import eu.mhsl.minenet.minigames.world.generator.terrain.CircularPlateTerrainGenerator;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.GameMode; import net.minestom.server.entity.GameMode;
import net.minestom.server.event.player.PlayerMoveEvent; import net.minestom.server.event.player.PlayerMoveEvent;
@ -32,7 +32,7 @@ public class Spleef extends StatelessGame {
this.radius = radius; this.radius = radius;
this.stackCount = stackCount; this.stackCount = stackCount;
setGenerator(new CircularTerrainGenerator(50, false)); setGenerator(new CircularPlateTerrainGenerator(50));
eventNode().addListener(PlayerStartDiggingEvent.class, this::destroyBlock); eventNode().addListener(PlayerStartDiggingEvent.class, this::destroyBlock);
} }

View File

@ -4,7 +4,7 @@ import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.score.LastWinsScore; import eu.mhsl.minenet.minigames.score.LastWinsScore;
import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.util.BatchUtil;
import eu.mhsl.minenet.minigames.world.generator.terrain.CircularTerrainGenerator; import eu.mhsl.minenet.minigames.world.generator.terrain.CircularPlateTerrainGenerator;
import io.github.bloepiloepi.pvp.config.*; import io.github.bloepiloepi.pvp.config.*;
import io.github.bloepiloepi.pvp.events.FinalAttackEvent; import io.github.bloepiloepi.pvp.events.FinalAttackEvent;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
@ -32,7 +32,7 @@ public class Stickfight extends StatelessGame {
((Player) finalAttackEvent.getTarget()).setHealth(20); ((Player) finalAttackEvent.getTarget()).setHealth(20);
}); });
setGenerator(new CircularTerrainGenerator(20, false)); setGenerator(new CircularPlateTerrainGenerator(20));
} }
@Override @Override

View File

@ -4,7 +4,7 @@ import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.score.LastWinsScore; import eu.mhsl.minenet.minigames.score.LastWinsScore;
import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.util.BatchUtil;
import eu.mhsl.minenet.minigames.world.generator.terrain.CircularTerrainGenerator; import eu.mhsl.minenet.minigames.world.generator.terrain.CircularPlateTerrainGenerator;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Entity; import net.minestom.server.entity.Entity;
@ -30,7 +30,7 @@ public class TntRun extends StatelessGame {
super(Dimension.OVERWORLD.DIMENSION, "tntRun", new LastWinsScore()); super(Dimension.OVERWORLD.DIMENSION, "tntRun", new LastWinsScore());
this.radius = radius; this.radius = radius;
this.stackCount = stackCount; this.stackCount = stackCount;
setGenerator(new CircularTerrainGenerator(radius, false)); setGenerator(new CircularPlateTerrainGenerator(radius));
} }
@Override @Override

View File

@ -7,7 +7,7 @@ import eu.mhsl.minenet.minigames.util.BatchUtil;
import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.util.CommonProperties; import eu.mhsl.minenet.minigames.util.CommonProperties;
import eu.mhsl.minenet.minigames.world.generator.BlockPallet; import eu.mhsl.minenet.minigames.world.generator.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.terrain.SquareTerrainGenerator; import eu.mhsl.minenet.minigames.world.generator.terrain.SquarePlateTerrainGenerator;
import net.kyori.adventure.sound.Sound; import net.kyori.adventure.sound.Sound;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec; import net.minestom.server.coordinate.Vec;
@ -42,9 +42,9 @@ class TrafficLightRace extends StatelessGame {
this.length = length; this.length = length;
setGenerator( setGenerator(
new SquareTerrainGenerator(width, length + preRun + afterRun) new SquarePlateTerrainGenerator(width, length + preRun + afterRun)
.withPlate(50) .setPlateHeight(50)
.withBorders() .setGenerateBorders(true)
); );
} }

View File

@ -0,0 +1,28 @@
package eu.mhsl.minenet.minigames.world.generator;
import net.minestom.server.instance.generator.Generator;
public abstract class PlateTerrainGenerator implements Generator {
protected int plateHeight = 0;
protected BlockPallet platePallet = BlockPallet.GROUND;
protected boolean generateBorders = false;
public PlateTerrainGenerator setPlateHeight(int plateHeight) {
this.plateHeight = plateHeight;
return this;
}
public PlateTerrainGenerator setPlatePallet(BlockPallet platePallet) {
this.platePallet = platePallet;
return this;
}
public PlateTerrainGenerator setGenerateBorders(boolean generateBorders) {
this.generateBorders = generateBorders;
return this;
}
public boolean generatePlate() {
return plateHeight > 0;
}
}

View File

@ -7,6 +7,6 @@ import java.util.Random;
public abstract class Structure { public abstract class Structure {
protected final Random rnd = new Random(); protected final Random rnd = new Random();
public abstract void generateGame(Block.Setter setter); public abstract void generateStructure(Block.Setter setter);
} }

View File

@ -7,12 +7,14 @@ import net.minestom.server.instance.block.Block;
public class PeakRock extends Structure { public class PeakRock extends Structure {
private final Point position; private final Point position;
public PeakRock(Point position) { private final BlockPallet blockPallet;
public PeakRock(Point position, BlockPallet blockPallet) {
this.position = position; this.position = position;
this.blockPallet = blockPallet;
} }
@Override @Override
public void generateGame(Block.Setter setter) { public void generateStructure(Block.Setter setter) {
for (int stoneX = -4; stoneX < 4; stoneX++) { for (int stoneX = -4; stoneX < 4; stoneX++) {
for (int stoneZ = -4; stoneZ < 4; stoneZ++) { for (int stoneZ = -4; stoneZ < 4; stoneZ++) {
@ -21,7 +23,7 @@ public class PeakRock extends Structure {
for (int stoneY = 0; stoneY < 10-(int) distanceToCenter * rnd.nextDouble(2, 5); stoneY++) { for (int stoneY = 0; stoneY < 10-(int) distanceToCenter * rnd.nextDouble(2, 5); stoneY++) {
Point blockPos = position.add(stoneX, stoneY, stoneZ); Point blockPos = position.add(stoneX, stoneY, stoneZ);
setter.setBlock(blockPos, BlockPallet.STONE.rnd()); setter.setBlock(blockPos, this.blockPallet.rnd());
} }
} }
} }

View File

@ -0,0 +1,18 @@
package eu.mhsl.minenet.minigames.world.generator.structures.generatable;
import eu.mhsl.minenet.minigames.world.generator.structures.Structure;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block;
public class Tree extends Structure {
private final Point position;
public Tree(Point position) {
this.position = position;
}
@Override
public void generateStructure(Block.Setter setter) {
}
}

View File

@ -3,26 +3,24 @@ package eu.mhsl.minenet.minigames.world.generator.terrain;
import de.articdive.jnoise.JNoise; import de.articdive.jnoise.JNoise;
import eu.mhsl.minenet.minigames.util.RangeMap; import eu.mhsl.minenet.minigames.util.RangeMap;
import eu.mhsl.minenet.minigames.world.generator.BlockPallet; import eu.mhsl.minenet.minigames.world.generator.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.PlateTerrainGenerator;
import eu.mhsl.minenet.minigames.world.generator.structures.generatable.PeakRock; import eu.mhsl.minenet.minigames.world.generator.structures.generatable.PeakRock;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit; import net.minestom.server.instance.generator.GenerationUnit;
import net.minestom.server.instance.generator.Generator;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Random; import java.util.Random;
public class CircularTerrainGenerator implements Generator { public class CircularPlateTerrainGenerator extends PlateTerrainGenerator {
protected final Random rnd = new Random(); protected final Random rnd = new Random();
private final int size; private final int size;
private final boolean generatePlate; public CircularPlateTerrainGenerator(int size) {
public CircularTerrainGenerator(int size, boolean generatePlate) {
this.size = size; this.size = size;
this.generatePlate = generatePlate;
} }
private final JNoise base = JNoise.newBuilder() private final JNoise base = JNoise.newBuilder()
.fastSimplex() .fastSimplex()
.setSeed(rnd.nextLong()) .setSeed(rnd.nextLong())
@ -54,8 +52,8 @@ public class CircularTerrainGenerator implements Generator {
double distance = bottom.distance(new Pos(0, 0, 0)); double distance = bottom.distance(new Pos(0, 0, 0));
if(distance <= this.size && generatePlate) { if(distance <= this.size && generatePlate()) {
unit.modifier().fill(bottom, bottom.add(1, 50, 1), BlockPallet.GROUND.rnd()); unit.modifier().fill(bottom, bottom.add(1, 50, 1), platePallet.rnd());
continue; continue;
} }
@ -63,7 +61,7 @@ public class CircularTerrainGenerator implements Generator {
synchronized (base) { synchronized (base) {
double baseNoise = base.getNoise(bottom.x(), bottom.z()); double baseNoise = base.getNoise(bottom.x(), bottom.z());
double currentHeight = minTwo(RangeMap.map(distance, 0, 400, -(this.size / 5), 200)) + baseNoise * 8; double currentHeight = minTwo(RangeMap.map(distance, 0, 400, -((double) this.size / 5), 200)) + baseNoise * 8;
synchronized (batches) { synchronized (batches) {
double elementNoise = batches.getNoise(bottom.x(), bottom.z()); double elementNoise = batches.getNoise(bottom.x(), bottom.z());
@ -82,7 +80,7 @@ public class CircularTerrainGenerator implements Generator {
if(peakNoise > 0.97 && bottom.distance(new Pos(0, 0, 0)) > (this.size + 20)) { if(peakNoise > 0.97 && bottom.distance(new Pos(0, 0, 0)) > (this.size + 20)) {
Point center = bottom.add(1, currentHeight-3, 1); Point center = bottom.add(1, currentHeight-3, 1);
unit.fork(setter -> new PeakRock(center).generateGame(setter)); unit.fork(setter -> new PeakRock(center, BlockPallet.STONE).generateStructure(setter));
} }
} }

View File

@ -3,42 +3,30 @@ package eu.mhsl.minenet.minigames.world.generator.terrain;
import de.articdive.jnoise.JNoise; import de.articdive.jnoise.JNoise;
import eu.mhsl.minenet.minigames.util.RangeMap; import eu.mhsl.minenet.minigames.util.RangeMap;
import eu.mhsl.minenet.minigames.world.generator.BlockPallet; import eu.mhsl.minenet.minigames.world.generator.BlockPallet;
import eu.mhsl.minenet.minigames.world.generator.PlateTerrainGenerator;
import eu.mhsl.minenet.minigames.world.generator.structures.generatable.PeakRock; import eu.mhsl.minenet.minigames.world.generator.structures.generatable.PeakRock;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.generator.GenerationUnit; import net.minestom.server.instance.generator.GenerationUnit;
import net.minestom.server.instance.generator.Generator;
import net.minestom.server.world.DimensionType; import net.minestom.server.world.DimensionType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays; import java.util.Arrays;
import java.util.Random; import java.util.Random;
public class SquareTerrainGenerator implements Generator { public class SquarePlateTerrainGenerator extends PlateTerrainGenerator {
protected final Random rnd = new Random(); protected final Random rnd = new Random();
private final int width; private final int width;
private final int length; private final int length;
private int plateHeight = 0;
private boolean withBorder = false;
public SquareTerrainGenerator(int width, int length) { public SquarePlateTerrainGenerator(int width, int length) {
this.width = width; this.width = width;
this.length = length; this.length = length;
} }
public SquareTerrainGenerator withPlate(int plateHeight) {
this.plateHeight = plateHeight;
return this;
}
public SquareTerrainGenerator withBorders() {
this.withBorder = true;
return this;
}
private final JNoise base = JNoise.newBuilder() private final JNoise base = JNoise.newBuilder()
.fastSimplex() .fastSimplex()
.setSeed(rnd.nextLong()) .setSeed(rnd.nextLong())
@ -71,14 +59,14 @@ public class SquareTerrainGenerator implements Generator {
for (int z = 0; z < unit.size().z(); z++) { for (int z = 0; z < unit.size().z(); z++) {
Point bottom = start.add(x, 0, z); Point bottom = start.add(x, 0, z);
if(plateHeight > 0) { if(generatePlate()) {
if(bottom.x() <= width && bottom.x() >= 0 && bottom.z() <= length && bottom.z() >= 0) { if(bottom.x() <= width && bottom.x() >= 0 && bottom.z() <= length && bottom.z() >= 0) {
unit.modifier().fill(bottom, bottom.add(1, plateHeight, 1), BlockPallet.GROUND.rnd()); unit.modifier().fill(bottom, bottom.add(1, plateHeight, 1), platePallet.rnd());
continue; continue;
} }
} }
if(withBorder) { if(generateBorders) {
Runnable generateBorder = () -> unit.modifier().fill(bottom, bottom.add(1, DimensionType.OVERWORLD.getMaxY(), 1), Block.BARRIER); Runnable generateBorder = () -> unit.modifier().fill(bottom, bottom.add(1, DimensionType.OVERWORLD.getMaxY(), 1), Block.BARRIER);
if(bottom.z() <= length+1 && bottom.z() >= -1 && bottom.x() >= -1 && bottom.x() <= width+1) { if(bottom.z() <= length+1 && bottom.z() >= -1 && bottom.x() >= -1 && bottom.x() <= width+1) {
@ -121,7 +109,7 @@ public class SquareTerrainGenerator implements Generator {
if(peakNoise > 0.97 && bottom.distance(new Pos(0, 0, 0)) > (this.width + 20)) { if(peakNoise > 0.97 && bottom.distance(new Pos(0, 0, 0)) > (this.width + 20)) {
Point center = bottom.add(1, currentHeight-3, 1); Point center = bottom.add(1, currentHeight-3, 1);
unit.fork(setter -> new PeakRock(center).generateGame(setter)); unit.fork(setter -> new PeakRock(center, BlockPallet.STONE).generateStructure(setter));
} }
} }