mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-20 15:51:11 +00:00
feat: minestom entities
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
package com.dfsek.terra.minestom;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.vector.Vector3;
|
||||||
|
|
||||||
|
import net.minestom.server.coordinate.Point;
|
||||||
|
import net.minestom.server.coordinate.Pos;
|
||||||
|
|
||||||
|
|
||||||
|
public class MinestomAdapter {
|
||||||
|
public static Vector3 adapt(Point point) {
|
||||||
|
return Vector3.of(point.x(), point.y(), point.z());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Pos adapt(Vector3 vector) {
|
||||||
|
return new Pos(vector.getX(), vector.getY(), vector.getZ());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.dfsek.terra.minestom.api;
|
||||||
|
|
||||||
|
|
||||||
|
import net.minestom.server.entity.Entity;
|
||||||
|
import net.minestom.server.entity.EntityType;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows adding AI to generated entities using custom entity types
|
||||||
|
*/
|
||||||
|
public interface EntityFactory {
|
||||||
|
Entity createEntity(EntityType type);
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
package com.dfsek.terra.minestom.entity;
|
||||||
|
|
||||||
|
import com.dfsek.terra.minestom.api.EntityFactory;
|
||||||
|
|
||||||
|
import net.minestom.server.entity.Entity;
|
||||||
|
import net.minestom.server.entity.EntityType;
|
||||||
|
|
||||||
|
|
||||||
|
public class DefaultEntityFactory implements EntityFactory {
|
||||||
|
@Override
|
||||||
|
public Entity createEntity(EntityType type) {
|
||||||
|
return new Entity(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
+62
@@ -0,0 +1,62 @@
|
|||||||
|
package com.dfsek.terra.minestom.entity;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.entity.Entity;
|
||||||
|
import com.dfsek.terra.api.entity.EntityType;
|
||||||
|
import com.dfsek.terra.api.util.vector.Vector3;
|
||||||
|
import com.dfsek.terra.api.world.ServerWorld;
|
||||||
|
import com.dfsek.terra.minestom.world.TerraMinestomWorld;
|
||||||
|
|
||||||
|
|
||||||
|
public class DeferredMinestomEntity implements Entity {
|
||||||
|
private final EntityType type;
|
||||||
|
private double x;
|
||||||
|
private double y;
|
||||||
|
private double z;
|
||||||
|
private TerraMinestomWorld world;
|
||||||
|
|
||||||
|
public DeferredMinestomEntity(double x, double y, double z, EntityType type, TerraMinestomWorld world) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
this.type = type;
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vector3 position() {
|
||||||
|
return Vector3.of(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void position(Vector3 position) {
|
||||||
|
x = position.getX();
|
||||||
|
y = position.getY();
|
||||||
|
z = position.getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void world(ServerWorld world) {
|
||||||
|
this.world = (TerraMinestomWorld) world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServerWorld world() {
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void spawn() {
|
||||||
|
int chunkX = (int) x >> 4;
|
||||||
|
int chunkZ = (int) z >> 4;
|
||||||
|
|
||||||
|
if(!world.getHandle().isChunkLoaded(chunkX, chunkZ)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinestomEntity.spawn(x, y, z, type, world);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package com.dfsek.terra.minestom.entity;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.entity.EntityType;
|
||||||
|
import com.dfsek.terra.api.util.vector.Vector3;
|
||||||
|
import com.dfsek.terra.api.world.ServerWorld;
|
||||||
|
|
||||||
|
import com.dfsek.terra.minestom.MinestomAdapter;
|
||||||
|
import com.dfsek.terra.minestom.world.TerraMinestomWorld;
|
||||||
|
|
||||||
|
import net.minestom.server.coordinate.Pos;
|
||||||
|
import net.minestom.server.entity.Entity;
|
||||||
|
import net.minestom.server.instance.Instance;
|
||||||
|
|
||||||
|
|
||||||
|
public class MinestomEntity implements com.dfsek.terra.api.entity.Entity {
|
||||||
|
private final Entity delegate;
|
||||||
|
private final TerraMinestomWorld world;
|
||||||
|
|
||||||
|
public MinestomEntity(Entity delegate, TerraMinestomWorld world) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vector3 position() {
|
||||||
|
return MinestomAdapter.adapt(delegate.getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void position(Vector3 position) {
|
||||||
|
delegate.teleport(MinestomAdapter.adapt(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void world(ServerWorld world) {
|
||||||
|
delegate.setInstance(((TerraMinestomWorld) world).getHandle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServerWorld world() {
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getHandle() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MinestomEntity spawn(double x, double y, double z, EntityType type, TerraMinestomWorld world) {
|
||||||
|
Instance instance = world.getHandle();
|
||||||
|
Entity entity = world.getEntityFactory().createEntity(((MinestomEntityType) type).getHandle());
|
||||||
|
entity.setInstance(instance, new Pos(x, y, z));
|
||||||
|
return new MinestomEntity(entity, world);
|
||||||
|
}
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
package com.dfsek.terra.minestom.entity;
|
||||||
|
|
||||||
|
|
||||||
|
import net.minestom.server.entity.EntityType;
|
||||||
|
|
||||||
|
|
||||||
|
public class MinestomEntityType implements com.dfsek.terra.api.entity.EntityType {
|
||||||
|
private final EntityType delegate;
|
||||||
|
|
||||||
|
public MinestomEntityType(String id) {
|
||||||
|
delegate = EntityType.fromNamespaceId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityType getHandle() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
-1
@@ -11,6 +11,8 @@ import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
|
|||||||
import com.dfsek.terra.api.world.chunk.generation.ProtoWorld;
|
import com.dfsek.terra.api.world.chunk.generation.ProtoWorld;
|
||||||
import com.dfsek.terra.minestom.chunk.GeneratedChunkCache;
|
import com.dfsek.terra.minestom.chunk.GeneratedChunkCache;
|
||||||
|
|
||||||
|
import com.dfsek.terra.minestom.entity.DeferredMinestomEntity;
|
||||||
|
|
||||||
import net.minestom.server.instance.block.Block;
|
import net.minestom.server.instance.block.Block;
|
||||||
import net.minestom.server.instance.block.Block.Setter;
|
import net.minestom.server.instance.block.Block.Setter;
|
||||||
|
|
||||||
@@ -62,7 +64,10 @@ public class MinestomProtoWorld implements ProtoWorld {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Entity spawnEntity(double x, double y, double z, EntityType entityType) {
|
public Entity spawnEntity(double x, double y, double z, EntityType entityType) {
|
||||||
return null;
|
TerraMinestomWorld world = (TerraMinestomWorld) this.world;
|
||||||
|
DeferredMinestomEntity entity = new DeferredMinestomEntity(x, y, z, entityType, world);
|
||||||
|
world.enqueueEntitySpawn(entity);
|
||||||
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+3
-1
@@ -5,6 +5,8 @@ import com.dfsek.terra.api.entity.EntityType;
|
|||||||
import com.dfsek.terra.api.handle.WorldHandle;
|
import com.dfsek.terra.api.handle.WorldHandle;
|
||||||
|
|
||||||
import com.dfsek.terra.minestom.block.MinestomBlockState;
|
import com.dfsek.terra.minestom.block.MinestomBlockState;
|
||||||
|
import com.dfsek.terra.minestom.entity.MinestomEntityType;
|
||||||
|
|
||||||
import net.minestom.server.instance.block.Block;
|
import net.minestom.server.instance.block.Block;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -24,6 +26,6 @@ public class MinestomWorldHandle implements WorldHandle {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull EntityType getEntity(@NotNull String id) {
|
public @NotNull EntityType getEntity(@NotNull String id) {
|
||||||
return null;
|
return new MinestomEntityType(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-5
@@ -5,6 +5,7 @@ import com.dfsek.terra.api.block.state.BlockState;
|
|||||||
import com.dfsek.terra.api.config.ConfigPack;
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
import com.dfsek.terra.api.entity.Entity;
|
import com.dfsek.terra.api.entity.Entity;
|
||||||
import com.dfsek.terra.api.entity.EntityType;
|
import com.dfsek.terra.api.entity.EntityType;
|
||||||
|
import com.dfsek.terra.api.util.generic.pair.Pair;
|
||||||
import com.dfsek.terra.api.world.ServerWorld;
|
import com.dfsek.terra.api.world.ServerWorld;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
import com.dfsek.terra.api.world.chunk.Chunk;
|
import com.dfsek.terra.api.world.chunk.Chunk;
|
||||||
@@ -13,10 +14,19 @@ import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||||
|
|
||||||
|
import com.dfsek.terra.minestom.api.EntityFactory;
|
||||||
|
import com.dfsek.terra.minestom.block.MinestomBlockState;
|
||||||
|
import com.dfsek.terra.minestom.entity.DeferredMinestomEntity;
|
||||||
|
import com.dfsek.terra.minestom.entity.MinestomEntity;
|
||||||
|
|
||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.instance.Instance;
|
import net.minestom.server.instance.Instance;
|
||||||
|
import net.minestom.server.instance.block.Block;
|
||||||
import net.minestom.server.world.DimensionType;
|
import net.minestom.server.world.DimensionType;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
|
||||||
public final class TerraMinestomWorld implements ServerWorld, WorldProperties {
|
public final class TerraMinestomWorld implements ServerWorld, WorldProperties {
|
||||||
private final Instance instance;
|
private final Instance instance;
|
||||||
@@ -24,8 +34,9 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties {
|
|||||||
private final long seed;
|
private final long seed;
|
||||||
private final DimensionType dimensionType;
|
private final DimensionType dimensionType;
|
||||||
private final MinestomChunkGeneratorWrapper wrapper;
|
private final MinestomChunkGeneratorWrapper wrapper;
|
||||||
|
private final EntityFactory factory;
|
||||||
|
|
||||||
public TerraMinestomWorld(Instance instance, ConfigPack pack, long seed) {
|
public TerraMinestomWorld(Instance instance, ConfigPack pack, long seed, EntityFactory factory) {
|
||||||
this.instance = instance;
|
this.instance = instance;
|
||||||
this.pack = pack;
|
this.pack = pack;
|
||||||
this.seed = seed;
|
this.seed = seed;
|
||||||
@@ -36,6 +47,7 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties {
|
|||||||
pack.getGeneratorProvider().newInstance(pack),
|
pack.getGeneratorProvider().newInstance(pack),
|
||||||
this
|
this
|
||||||
);
|
);
|
||||||
|
this.factory = factory;
|
||||||
|
|
||||||
instance.setGenerator(this.wrapper);
|
instance.setGenerator(this.wrapper);
|
||||||
}
|
}
|
||||||
@@ -47,17 +59,17 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBlockState(int x, int y, int z, BlockState data, boolean physics) {
|
public void setBlockState(int x, int y, int z, BlockState data, boolean physics) {
|
||||||
|
instance.setBlock(x, y, z, (Block) data.getHandle());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Entity spawnEntity(double x, double y, double z, EntityType entityType) {
|
public Entity spawnEntity(double x, double y, double z, EntityType entityType) {
|
||||||
return null;
|
return MinestomEntity.spawn(x, y, z, entityType, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getBlockState(int x, int y, int z) {
|
public BlockState getBlockState(int x, int y, int z) {
|
||||||
return null;
|
return new MinestomBlockState(instance.getBlock(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -96,11 +108,21 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getHandle() {
|
public Instance getHandle() {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DimensionType getDimensionType() {
|
public DimensionType getDimensionType() {
|
||||||
return dimensionType;
|
return dimensionType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EntityFactory getEntityFactory() {
|
||||||
|
return factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enqueueEntitySpawn(DeferredMinestomEntity deferredMinestomEntity) {
|
||||||
|
int chunkX = deferredMinestomEntity.position().getBlockX() >> 4;
|
||||||
|
int chunkZ = deferredMinestomEntity.position().getBlockZ() >> 4;
|
||||||
|
instance.loadChunk(chunkX, chunkZ).thenAccept(chunk -> deferredMinestomEntity.spawn());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-1
@@ -5,6 +5,8 @@ import com.dfsek.terra.api.config.ConfigPack;
|
|||||||
import com.dfsek.terra.api.registry.CheckedRegistry;
|
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||||
|
|
||||||
import com.dfsek.terra.minestom.MinestomPlatform;
|
import com.dfsek.terra.minestom.MinestomPlatform;
|
||||||
|
import com.dfsek.terra.minestom.api.EntityFactory;
|
||||||
|
import com.dfsek.terra.minestom.entity.DefaultEntityFactory;
|
||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.instance.Instance;
|
import net.minestom.server.instance.Instance;
|
||||||
|
|
||||||
@@ -16,6 +18,7 @@ public class TerraMinestomWorldBuilder {
|
|||||||
private final Instance instance;
|
private final Instance instance;
|
||||||
private ConfigPack pack;
|
private ConfigPack pack;
|
||||||
private long seed = new Random().nextLong();
|
private long seed = new Random().nextLong();
|
||||||
|
private EntityFactory factory = new DefaultEntityFactory();
|
||||||
|
|
||||||
private TerraMinestomWorldBuilder(Instance instance) { this.instance = instance; }
|
private TerraMinestomWorldBuilder(Instance instance) { this.instance = instance; }
|
||||||
|
|
||||||
@@ -56,7 +59,12 @@ public class TerraMinestomWorldBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TerraMinestomWorldBuilder entityFactory(EntityFactory factory) {
|
||||||
|
this.factory = factory;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public TerraMinestomWorld attach() {
|
public TerraMinestomWorld attach() {
|
||||||
return new TerraMinestomWorld(instance, pack, seed);
|
return new TerraMinestomWorld(instance, pack, seed, factory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user