diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java index 691a7a4..b0d35f6 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java @@ -107,7 +107,7 @@ public class LayerWorld extends Layer { tmp_testControls.applyPlayerControls(); for (EntityData data : this.client.getWorld().getData().getEntities()) { - tmp_applyFriction(data); + tmp_applyFriction(data, tickLength); tmp_applyGravity(data, tickLength); tmp_renderCollisionModel(data); } @@ -177,9 +177,9 @@ public class LayerWorld extends Layer { return new StaticModel(b); } - private void tmp_applyFriction(EntityData entity) { - final float frictionCoeff = 1 - 1e-5f; - entity.getVelocity().mul(frictionCoeff); + private void tmp_applyFriction(EntityData entity, float tickLength) { + final float frictionCoeff = Units.get(1e-5f, "kg/s"); + entity.getVelocity().mul((float) Math.exp(-frictionCoeff / entity.getCollisionMass() * tickLength)); } private static final float MC_g = Units.get("32 m/s^2"); diff --git a/src/main/java/ru/windcorp/progressia/common/world/WorldData.java b/src/main/java/ru/windcorp/progressia/common/world/WorldData.java index 64e4b9c..d67515f 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/WorldData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/WorldData.java @@ -55,7 +55,7 @@ public class WorldData { } public void tmp_generate() { - final int size = 1; + final int size = 3; Vec3i cursor = new Vec3i(0, 0, 0); for (cursor.x = -(size / 2); cursor.x <= (size / 2); ++cursor.x) { diff --git a/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java b/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java index bc97593..5ed3ef1 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java +++ b/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java @@ -133,6 +133,11 @@ public abstract class TickContextMutable implements BlockTickContext, TSTickCont protected Role role = Role.NONE; protected boolean isBeingBuilt = false; + /** + * Updated lazily + */ + protected final Vec3i blockInChunk = new Vec3i(); + /* * TickContextMutable */ @@ -275,6 +280,11 @@ public abstract class TickContextMutable implements BlockTickContext, TSTickCont * Optimization */ + @Override + public Vec3i getBlockInChunk() { + return Coordinates.convertInWorldToInChunk(getBlockInWorld(), this.blockInChunk); + } + @Override public void forEachBlock(Consumer action) { checkContextState(Role.CHUNK); diff --git a/src/main/java/ru/windcorp/progressia/server/world/block/BlockTickContext.java b/src/main/java/ru/windcorp/progressia/server/world/block/BlockTickContext.java index 372c403..6ee1138 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/block/BlockTickContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/block/BlockTickContext.java @@ -5,6 +5,7 @@ import java.util.function.Consumer; import java.util.function.Function; import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.block.BlockRelation; @@ -20,6 +21,10 @@ public interface BlockTickContext extends ChunkTickContext { */ Vec3i getBlockInWorld(); + default Vec3i getBlockInChunk() { + return Coordinates.convertInWorldToInChunk(getBlockInWorld(), null); + } + default BlockLogic getBlock() { return getWorld().getBlock(getBlockInWorld()); } diff --git a/src/main/java/ru/windcorp/progressia/server/world/tile/TSTickContext.java b/src/main/java/ru/windcorp/progressia/server/world/tile/TSTickContext.java index c5b9ada..97fd925 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tile/TSTickContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tile/TSTickContext.java @@ -27,22 +27,22 @@ public interface TSTickContext extends BlockTickContext { ChunkLogic chunkLogic = getChunkLogic(); if (chunkLogic == null) return null; - return chunkLogic.getTilesOrNull(getBlockInWorld(), getFace()); + return chunkLogic.getTilesOrNull(getBlockInChunk(), getFace()); } default TileLogicStack getTLS() { - return getChunkLogic().getTiles(getBlockInWorld(), getFace()); + return getChunkLogic().getTiles(getBlockInChunk(), getFace()); } default TileDataStack getTDSOrNull() { ChunkData chunkData = getChunkData(); if (chunkData == null) return null; - return chunkData.getTilesOrNull(getBlockInWorld(), getFace()); + return chunkData.getTilesOrNull(getBlockInChunk(), getFace()); } default TileDataStack getTDS() { - return getChunkData().getTiles(getBlockInWorld(), getFace()); + return getChunkData().getTiles(getBlockInChunk(), getFace()); } /* diff --git a/src/main/java/ru/windcorp/progressia/test/TestContent.java b/src/main/java/ru/windcorp/progressia/test/TestContent.java index 6d2b13e..5b7c1b2 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestContent.java +++ b/src/main/java/ru/windcorp/progressia/test/TestContent.java @@ -252,7 +252,7 @@ public class TestContent { TileData flowers = TileDataRegistry.getInstance().get("Test:YellowFlowers"); TileData sand = TileDataRegistry.getInstance().get("Test:Sand"); - Vec3i aPoint = new Vec3i(5, 0, bpc + bpc/2).sub(chunk.getPosition()); + Vec3i aPoint = new Vec3i(5, 0, bpc + bpc/4).sub(chunk.getPosition().mul_(ChunkData.BLOCKS_PER_CHUNK)); Vec3i pos = new Vec3i(); for (int x = 0; x < bpc; ++x) { @@ -280,6 +280,7 @@ public class TestContent { pos.set(x, y, 0); for (pos.z = bpc - 1; pos.z >= 0 && chunk.getBlock(pos) == air; --pos.z); + if (pos.z < 0) continue; chunk.getTiles(pos, BlockFace.TOP).add(grass); for (BlockFace face : BlockFace.getFaces()) {