diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java b/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java index dd191ef2..3dbe3386 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/entity/Entity.java @@ -22,6 +22,8 @@ public interface Entity extends Movable, Renderable, Updatable { Direction getDirectionTowards(Entity target); + ObjectLayer getLayer(); + void onAdd(ObjectLayer layer); void onRemove(ObjectLayer layer); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/move/Movable.java b/api/src/main/java/com/bartlomiejpluta/base/api/move/Movable.java index 2638f15d..94ee310f 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/move/Movable.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/move/Movable.java @@ -32,4 +32,6 @@ public interface Movable extends Placeable { int manhattanDistance(Vector2ic coordinates); boolean move(Movement movement); + + void abortMove(); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java b/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java index ff1b042e..42117f16 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/move/Movement.java @@ -26,6 +26,10 @@ public final class Movement { return object.move(this); } + public void abort() { + object.abortMove(); + } + public Movement another() { return object.prepareMovement(direction); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java index 80dccbb9..9b38fe31 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java @@ -200,6 +200,11 @@ public abstract class AnimationDelegate implements Animation { return animation.move(movement); } + @Override + public void abortMove() { + animation.abortMove(); + } + @Override public void onAdd(Layer layer) { animation.onAdd(layer); diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java index ed83464e..b4ddcb26 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java @@ -194,6 +194,11 @@ public abstract class EntityDelegate implements Entity { return entity.getModelMatrix(); } + @Override + public ObjectLayer getLayer() { + return entity.getLayer(); + } + @Override public void onAdd(ObjectLayer layer) { entity.onAdd(layer); @@ -234,6 +239,11 @@ public abstract class EntityDelegate implements Entity { return entity.move(movement); } + @Override + public void abortMove() { + entity.abortMove(); + } + @Override public void update(float dt) { entity.update(dt); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java index 0c54af27..de58e4d5 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/entity/model/DefaultEntity.java @@ -40,6 +40,9 @@ public class DefaultEntity extends MovableSprite implements Entity { @Setter private boolean blocking; + @Getter + private ObjectLayer layer; + public DefaultEntity(Mesh mesh, EntitySetManager entitySetManager, Map spriteDirectionRows, Map spriteDefaultRows, String entitySetUid) { super(mesh, entitySetManager.loadObject(requireNonNull(entitySetUid))); this.entitySetManager = entitySetManager; @@ -124,12 +127,12 @@ public class DefaultEntity extends MovableSprite implements Entity { @Override public void onAdd(ObjectLayer layer) { - // Do nothing + this.layer = layer; } @Override public void onRemove(ObjectLayer layer) { - // Do nothing + this.layer = null; } @Override diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java index b3fbce74..d67a7e70 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/object/DefaultObjectLayer.java @@ -68,6 +68,13 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { @Override public void addEntity(Entity entity) { + var layer = (DefaultObjectLayer) entity.getLayer(); + + if (layer != null) { + layer.entities.remove(entity); + } + + entity.setStepSize(stepSize.x(), stepSize.y()); entitiesToAdd.add(entity); } @@ -153,7 +160,6 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer { if(!entitiesToAdd.isEmpty()) { for (var entity : entitiesToAdd) { entity.onAdd(this); - entity.setStepSize(stepSize.x(), stepSize.y()); entities.add(entity); } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java index e43c71e8..bac94821 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/movement/MovableSprite.java @@ -105,6 +105,14 @@ public abstract class MovableSprite extends AnimatedSprite implements Movable, U return true; } + @Override + public void abortMove() { + setCoordinates(movement.getFrom()); + setDefaultAnimationFrame(); + movementVector = null; + movement = null; + } + @Override public void setCoordinates(int x, int y) { coordinates.x = x;