sort of working fabric implementation

This commit is contained in:
dfsek
2021-06-24 23:41:08 -07:00
parent dc1f1a0339
commit 9fa660409d
27 changed files with 144 additions and 91 deletions

View File

@@ -4,6 +4,7 @@ import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
import java.util.Random;
@@ -25,7 +26,7 @@ public interface Structure {
boolean test(Location location, Random random, Rotation rotation);
@SuppressWarnings("try")
boolean generate(Buffer buffer, Random random, Rotation rotation, int recursions);
boolean generate(Buffer buffer, World world, Random random, Rotation rotation, int recursions);
@SuppressWarnings("try")
boolean generateDirect(Location location, Random random, Rotation rotation);

View File

@@ -1,13 +1,20 @@
package com.dfsek.terra.api.structure.buffer;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
public interface Buffer {
Buffer addItem(BufferedItem item, Location location);
void paste(Vector3 origin, Chunk chunk);
Location getOrigin();
void paste(Vector3 origin, World world);
String getMark(Location location);
Buffer addItem(BufferedItem item, Vector3 location);
Buffer setMark(String mark, Location location);
Vector3 getOrigin();
String getMark(Vector3 location);
Buffer setMark(String mark, Vector3 location);
}

View File

@@ -1,13 +1,8 @@
package com.dfsek.terra.api.structure.buffer;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public interface BufferedItem {
void paste(Location origin);
default void paste(Chunk chunk, Location origin) {
origin.setWorld(chunk.getWorld()); // Fabric weirdness
paste(origin);
}
void paste(Vector3 origin, World world);
}

View File

@@ -33,7 +33,9 @@ import com.dfsek.terra.api.structures.script.builders.ZeroArgFunctionBuilder;
import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer;
import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import net.jafama.FastMath;
@@ -48,7 +50,7 @@ import java.util.concurrent.ExecutionException;
public class StructureScript implements Structure {
private final Block block;
private final String id;
private final Cache<Location, StructureBuffer> cache;
private final Cache<Vector3, StructureBuffer> cache;
private final TerraPlugin main;
private String tempID;
@@ -115,9 +117,9 @@ public class StructureScript implements Structure {
@SuppressWarnings("try")
public boolean generate(Location location, Random random, Rotation rotation) {
try(ProfileFrame ignore = main.getProfiler().profile("terrascript:" + id)) {
StructureBuffer buffer = new StructureBuffer(location);
boolean level = applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0));
buffer.paste();
StructureBuffer buffer = new StructureBuffer(location.toVector());
boolean level = applyBlock(new TerraImplementationArguments(buffer, rotation, random, location.getWorld(), 0));
buffer.paste(location.toVector(), location.getWorld());
return level;
}
}
@@ -126,8 +128,8 @@ public class StructureScript implements Structure {
@SuppressWarnings("try")
public boolean generate(Location location, Chunk chunk, Random random, Rotation rotation) {
try(ProfileFrame ignore = main.getProfiler().profile("terrascript_chunk:" + id)) {
StructureBuffer buffer = computeBuffer(location, random, rotation);
buffer.paste(chunk);
StructureBuffer buffer = computeBuffer(location.toVector(), location.getWorld(), random, rotation);
buffer.paste(location.toVector(), chunk);
return buffer.succeeded();
}
}
@@ -136,16 +138,16 @@ public class StructureScript implements Structure {
@SuppressWarnings("try")
public boolean test(Location location, Random random, Rotation rotation) {
try(ProfileFrame ignore = main.getProfiler().profile("terrascript_test:" + id)) {
StructureBuffer buffer = computeBuffer(location, random, rotation);
StructureBuffer buffer = computeBuffer(location.toVector(), location.getWorld(), random, rotation);
return buffer.succeeded();
}
}
private StructureBuffer computeBuffer(Location location, Random random, Rotation rotation) {
private StructureBuffer computeBuffer(Vector3 location, World world, Random random, Rotation rotation) {
try {
return cache.get(location, () -> {
StructureBuffer buf = new StructureBuffer(location);
buf.setSucceeded(applyBlock(new TerraImplementationArguments(buf, rotation, random, 0)));
buf.setSucceeded(applyBlock(new TerraImplementationArguments(buf, rotation, random, world, 0)));
return buf;
});
} catch(ExecutionException e) {
@@ -155,9 +157,9 @@ public class StructureScript implements Structure {
@Override
@SuppressWarnings("try")
public boolean generate(Buffer buffer, Random random, Rotation rotation, int recursions) {
public boolean generate(Buffer buffer, World world, Random random, Rotation rotation, int recursions) {
try(ProfileFrame ignore = main.getProfiler().profile("terrascript_recursive:" + id)) {
return applyBlock(new TerraImplementationArguments(buffer, rotation, random, recursions));
return applyBlock(new TerraImplementationArguments(buffer, rotation, random, world, recursions));
}
}
@@ -165,8 +167,8 @@ public class StructureScript implements Structure {
@SuppressWarnings("try")
public boolean generateDirect(Location location, Random random, Rotation rotation) {
try(ProfileFrame ignore = main.getProfiler().profile("terrascript_direct:" + id)) {
DirectBuffer buffer = new DirectBuffer(location);
return applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0));
DirectBuffer buffer = new DirectBuffer(location.toVector(), location.getWorld());
return applyBlock(new TerraImplementationArguments(buffer, rotation, random, location.getWorld(), 0));
}
}

View File

@@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments;
import com.dfsek.terra.api.world.World;
import java.util.Random;
@@ -10,13 +11,15 @@ public class TerraImplementationArguments implements ImplementationArguments {
private final Buffer buffer;
private final Rotation rotation;
private final Random random;
private final World world;
private final int recursions;
private boolean waterlog = false;
public TerraImplementationArguments(Buffer buffer, Rotation rotation, Random random, int recursions) {
public TerraImplementationArguments(Buffer buffer, Rotation rotation, Random random, World world, int recursions) {
this.buffer = buffer;
this.rotation = rotation;
this.random = random;
this.world = world;
this.recursions = recursions;
}
@@ -43,4 +46,8 @@ public class TerraImplementationArguments implements ImplementationArguments {
public void setWaterlog(boolean waterlog) {
this.waterlog = waterlog;
}
public World getWorld() {
return world;
}
}

View File

@@ -40,7 +40,7 @@ public abstract class AbstractBlockFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation());
RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse());
arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main, arguments.isWaterlog()), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main, arguments.isWaterlog()), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())));
}
@Override

View File

@@ -40,7 +40,7 @@ public class BiomeFunction implements Function<String> {
RotationUtil.rotateVector(xz, arguments.getRotation());
BiomeProvider grid = main.getWorld(arguments.getBuffer().getOrigin().getWorld()).getBiomeProvider();
BiomeProvider grid = main.getWorld(arguments.getWorld()).getBiomeProvider();
return ((UserDefinedBiome) grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))))).getID();
}

View File

@@ -34,7 +34,7 @@ public class CheckBlockFunction implements Function<String> {
RotationUtil.rotateVector(xz, arguments.getRotation());
String data = arguments.getBuffer().getOrigin().getWorld().getBlockData(arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ()))).getVector()).getAsString();
String data = arguments.getWorld().getBlockData(arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())))).getAsString();
if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties
else return data;
}

View File

@@ -10,6 +10,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
@@ -47,12 +48,12 @@ public class CheckFunction implements Function<String> {
RotationUtil.rotateVector(xz, arguments.getRotation());
Location location = arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())));
Vector3 location = arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())));
return apply(location, arguments.getBuffer().getOrigin().getWorld());
return apply(location, arguments.getWorld());
}
private String apply(Location vector, World world) {
private String apply(Vector3 vector, World world) {
TerraWorld tw = main.getWorld(world);
SamplerCache cache = tw.getConfig().getSamplerCache();
double comp = sample(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ(), cache);

View File

@@ -42,7 +42,7 @@ public class EntityFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation());
arguments.getBuffer().addItem(new BufferedEntity(data, main), new Vector3Impl(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ()).toLocation(arguments.getBuffer().getOrigin().getWorld()));
arguments.getBuffer().addItem(new BufferedEntity(data, main), new Vector3Impl(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ()));
return null;
}

View File

@@ -31,7 +31,7 @@ public class GetMarkFunction implements Function<String> {
Vector2 xz = new Vector2Impl(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue());
RotationUtil.rotateVector(xz, arguments.getRotation());
String mark = arguments.getBuffer().getMark(new Vector3Impl(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
String mark = arguments.getBuffer().getMark(new Vector3Impl(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ())));
return mark == null ? "" : mark;
}

View File

@@ -53,7 +53,7 @@ public class LootFunction implements Function<Void> {
return null;
}
arguments.getBuffer().addItem(new BufferedLootApplication(table, main, script), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
arguments.getBuffer().addItem(new BufferedLootApplication(table, main, script), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())));
return null;
}

View File

@@ -42,7 +42,7 @@ public class PullFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation());
BlockData rot = data.clone();
RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse());
arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())));
return null;
}

View File

@@ -34,7 +34,7 @@ public class SetMarkFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation());
arguments.getBuffer().setMark(mark.apply(implementationArguments, variableMap), new Vector3Impl(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
arguments.getBuffer().setMark(mark.apply(implementationArguments, variableMap), new Vector3Impl(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ())));
return null;
}

View File

@@ -37,7 +37,7 @@ public class StateFunction implements Function<Void> {
Vector2 xz = new Vector2Impl(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue());
RotationUtil.rotateVector(xz, arguments.getRotation());
arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments, variableMap)), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld()));
arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments, variableMap)), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())));
return null;
}

View File

@@ -74,7 +74,7 @@ public class StructureFunction implements Function<Boolean> {
Vector3 offset = new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ()));
return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1);
return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getWorld(), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1);
}
@Override

View File

@@ -3,6 +3,8 @@ package com.dfsek.terra.api.structures.structure.buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
import java.util.List;
@@ -10,10 +12,9 @@ public class Cell implements BufferedItem {
private final List<BufferedItem> items = new GlueList<>();
private String mark = null;
@Override
public void paste(Location origin) {
items.forEach(item -> item.paste(origin));
public void paste(Vector3 origin, World world) {
items.forEach(item -> item.paste(origin, world));
}
public void add(BufferedItem item) {

View File

@@ -3,6 +3,9 @@ package com.dfsek.terra.api.structures.structure.buffer;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -11,31 +14,43 @@ import java.util.Map;
* Buffer implementation that directly pastes to the world.
*/
public class DirectBuffer implements Buffer {
private final Location origin;
private final Map<Location, String> marks = new LinkedHashMap<>();
private final Vector3 origin;
private final World target;
private final Map<Vector3, String> marks = new LinkedHashMap<>();
public DirectBuffer(Location origin) {
public DirectBuffer(Vector3 origin, World target) {
this.origin = origin;
this.target = target;
}
@Override
public Buffer addItem(BufferedItem item, Location location) {
item.paste(origin.clone().add(location));
public void paste(Vector3 origin, Chunk chunk) {
// no-op
}
@Override
public void paste(Vector3 origin, World world) {
// no-op
}
@Override
public Buffer addItem(BufferedItem item, Vector3 location) {
item.paste(origin.clone().add(location), target);
return this;
}
@Override
public Location getOrigin() {
public Vector3 getOrigin() {
return origin;
}
@Override
public String getMark(Location location) {
public String getMark(Vector3 location) {
return marks.get(location);
}
@Override
public Buffer setMark(String mark, Location location) {
public Buffer setMark(String mark, Vector3 location) {
marks.put(location, mark);
return this;
}

View File

@@ -4,6 +4,8 @@ import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
public class IntermediateBuffer implements Buffer {
private final Buffer original;
@@ -15,22 +17,32 @@ public class IntermediateBuffer implements Buffer {
}
@Override
public Buffer addItem(BufferedItem item, Location location) {
public void paste(Vector3 origin, Chunk chunk) {
// no-op
}
@Override
public void paste(Vector3 origin, World world) {
// no-op
}
@Override
public Buffer addItem(BufferedItem item, Vector3 location) {
return original.addItem(item, location.add(offset));
}
@Override
public Location getOrigin() {
public Vector3 getOrigin() {
return original.getOrigin().clone().add(offset);
}
@Override
public String getMark(Location location) {
public String getMark(Vector3 location) {
return original.getMark(location.add(offset));
}
@Override
public Buffer setMark(String mark, Location location) {
public Buffer setMark(String mark, Vector3 location) {
original.setMark(mark, location.add(offset));
return this;
}

View File

@@ -3,42 +3,44 @@ package com.dfsek.terra.api.structures.structure.buffer;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
import net.jafama.FastMath;
import java.util.LinkedHashMap;
import java.util.Map;
public class StructureBuffer implements Buffer {
private final Map<Location, Cell> bufferedItemMap = new LinkedHashMap<>();
private final Location origin;
private final Map<Vector3, Cell> bufferedItemMap = new LinkedHashMap<>();
private final Vector3 origin;
private boolean succeeded;
public StructureBuffer(Location origin) {
public StructureBuffer(Vector3 origin) {
this.origin = origin;
}
public void paste() {
bufferedItemMap.forEach(((vector3, item) -> item.paste(origin.clone().add(vector3))));
public void paste(Vector3 origin, World world) {
bufferedItemMap.forEach(((vector3, item) -> item.paste(origin.clone().add(vector3), world)));
}
public void paste(Chunk chunk) {
public void paste(Vector3 origin, Chunk chunk) {
bufferedItemMap.forEach(((location, item) -> {
Location current = origin.clone().add(location);
Vector3 current = origin.clone().add(location);
if(FastMath.floorDiv(current.getBlockX(), 16) != chunk.getX() || FastMath.floorDiv(current.getBlockZ(), 16) != chunk.getZ())
return;
item.paste(chunk, current);
item.paste(current, chunk.getWorld());
}));
}
@Override
public Buffer addItem(BufferedItem item, Location location) {
public Buffer addItem(BufferedItem item, Vector3 location) {
bufferedItemMap.computeIfAbsent(location, l -> new Cell()).add(item);
return this;
}
@Override
public String getMark(Location location) {
public String getMark(Vector3 location) {
Cell cell = bufferedItemMap.get(location);
if(cell != null) {
return cell.getMark();
@@ -47,7 +49,7 @@ public class StructureBuffer implements Buffer {
}
@Override
public Buffer setMark(String mark, Location location) {
public Buffer setMark(String mark, Vector3 location) {
bufferedItemMap.computeIfAbsent(location, l -> new Cell()).setMark(mark);
return this;
}
@@ -61,7 +63,7 @@ public class StructureBuffer implements Buffer {
}
@Override
public Location getOrigin() {
public Vector3 getOrigin() {
return origin.clone();
}
}

View File

@@ -4,7 +4,8 @@ import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.BlockData;
import com.dfsek.terra.api.block.data.Waterlogged;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedBlock implements BufferedItem {
private final BlockData data;
@@ -20,13 +21,13 @@ public class BufferedBlock implements BufferedItem {
}
@Override
public void paste(Location origin) {
public void paste(Vector3 origin, World world) {
try {
BlockData data = origin.getWorld().getBlockData(origin.toVector());
if(overwrite || data.isAir()) {
if(waterlog && data instanceof Waterlogged && data.getBlockType().isWater())
((Waterlogged) data).setWaterlogged(true);
origin.getWorld().setBlockData(origin.getVector(), data);
BlockData current = world.getBlockData(origin);
if(overwrite || current.isAir()) {
if(waterlog && current instanceof Waterlogged && current.getBlockType().isWater())
((Waterlogged) current).setWaterlogged(true);
world.setBlockData(origin, data);
}
} catch(RuntimeException e) {
main.logger().severe("Failed to place block at location " + origin + ": " + e.getMessage());

View File

@@ -6,6 +6,8 @@ import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.event.events.world.generation.EntitySpawnEvent;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedEntity implements BufferedItem {
@@ -18,8 +20,8 @@ public class BufferedEntity implements BufferedItem {
}
@Override
public void paste(Location origin) {
Entity entity = origin.clone().add(0.5, 0, 0.5).getWorld().spawnEntity(origin, type);
public void paste(Vector3 origin, World world) {
Entity entity = world.spawnEntity(origin.clone().add(0.5, 0, 0.5).toLocation(world), type);
main.getEventManager().callEvent(new EntitySpawnEvent(entity.world().getTerraGenerator().getConfigPack(), entity));
}
}

View File

@@ -9,6 +9,8 @@ import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.structures.script.StructureScript;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedLootApplication implements BufferedItem {
private final LootTable table;
@@ -22,16 +24,16 @@ public class BufferedLootApplication implements BufferedItem {
}
@Override
public void paste(Location origin) {
public void paste(Vector3 origin, World world) {
try {
BlockState data = origin.getWorld().getBlockState(origin.getVector());
BlockState data = world.getBlockState(origin);
if(!(data instanceof Container)) {
main.logger().severe("Failed to place loot at " + origin + "; block " + data + " is not container.");
return;
}
Container container = (Container) data;
LootPopulateEvent event = new LootPopulateEvent(container, table, origin.getWorld().getTerraGenerator().getConfigPack(), structure);
LootPopulateEvent event = new LootPopulateEvent(container, table, world.getTerraGenerator().getConfigPack(), structure);
main.getEventManager().callEvent(event);
if(event.isCancelled()) return;

View File

@@ -4,6 +4,7 @@ import com.dfsek.terra.api.block.BlockData;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedPulledBlock implements BufferedItem {
private final BlockData data;
@@ -13,11 +14,11 @@ public class BufferedPulledBlock implements BufferedItem {
}
@Override
public void paste(Location origin) {
Vector3 mutable = origin.toVector();
while(mutable.getY() > origin.getWorld().getMinHeight()) {
if(!origin.getWorld().getBlockData(mutable).isAir()) {
origin.getWorld().setBlockData(mutable, data);
public void paste(Vector3 origin, World world) {
Vector3 mutable = origin.clone();
while(mutable.getY() > world.getMinHeight()) {
if(!world.getBlockData(mutable).isAir()) {
world.setBlockData(mutable, data);
break;
}
mutable.subtract(0, 1, 0);

View File

@@ -4,6 +4,8 @@ import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.structure.buffer.BufferedItem;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
public class BufferedStateManipulator implements BufferedItem {
private final TerraPlugin main;
@@ -15,9 +17,9 @@ public class BufferedStateManipulator implements BufferedItem {
}
@Override
public void paste(Location origin) {
public void paste(Vector3 origin, World world) {
try {
BlockState state = origin.getWorld().getBlockState(origin.getVector());
BlockState state = world.getBlockState(origin);
state.applyState(data);
state.update(false);
} catch(Exception e) {

View File

@@ -18,6 +18,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.LocationImpl;
import com.dfsek.terra.vector.Vector3Impl;
import java.util.HashMap;
@@ -41,8 +42,8 @@ public class SpawnCommand implements CommandTemplate {
Position dummy = new Position(0, 0);
String check = new CheckFunction(main, new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), dummy).apply(new TerraImplementationArguments(new StructureBuffer(
new LocationImpl(player.world(), x, y, z)
), Rotation.NONE, new FastRandom(), 0), new HashMap<>());
new Vector3Impl(x, y, z)
), Rotation.NONE, new FastRandom(), player.world(), 0), new HashMap<>());
sender.sendMessage("Found: " + check);
}

View File

@@ -1,6 +1,5 @@
package com.dfsek.terra.world.population.items.tree;
import com.dfsek.terra.api.block.BlockFace;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.util.ProbabilityCollection;
@@ -19,12 +18,14 @@ public class TreeLayer extends PlaceableLayer<Tree> {
@Override
public void place(Chunk chunk, Vector2 coords) {
Tree item = layer.get(noise, coords.getX(), coords.getZ());
int cx = chunk.getX() << 4;
int cz = chunk.getZ() << 4;
Tree item = layer.get(noise, coords.getX() + cx, coords.getZ() + cz);
Vector3 running = coords.extrude(level.getMax());
for(int ignored : level) {
running.subtract(0,1,0);
if(item.getSpawnable().contains(chunk.getBlockData(running.getBlockX(), running.getBlockY(), running.getBlockZ()).getBlockType())) {
item.plant(running.toLocation(chunk.getWorld()).add(0, 1, 0), PopulationUtil.getRandom(chunk, coords.hashCode()));
item.plant(running.toLocation(chunk.getWorld()).add(cx, 1, cz), PopulationUtil.getRandom(chunk, coords.hashCode()));
}
}
}