Split InteractiveEntity to separate listeners and remove position checks

This commit is contained in:
2021-04-01 20:12:25 +02:00
parent e1e6d897cd
commit f5f8ec1595
3 changed files with 28 additions and 21 deletions

View File

@@ -0,0 +1,7 @@
package com.bartlomiejpluta.base.api.entity;
import com.bartlomiejpluta.base.api.move.Movement;
public interface EntityStepInListener extends Entity {
void onEntityStepIn(Movement movement, Entity entity);
}

View File

@@ -2,8 +2,6 @@ package com.bartlomiejpluta.base.api.entity;
import com.bartlomiejpluta.base.api.move.Movement; import com.bartlomiejpluta.base.api.move.Movement;
public interface InteractiveEntity extends Entity { public interface EntityStepOutListener extends Entity {
void onEntityStepIn(Movement movement, Entity entity);
void onEntityStepOut(Movement movement, Entity entity); void onEntityStepOut(Movement movement, Entity entity);
} }

View File

@@ -3,7 +3,8 @@ package com.bartlomiejpluta.base.engine.world.map.layer.object;
import com.bartlomiejpluta.base.api.ai.NPC; import com.bartlomiejpluta.base.api.ai.NPC;
import com.bartlomiejpluta.base.api.camera.Camera; import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.entity.Entity; import com.bartlomiejpluta.base.api.entity.Entity;
import com.bartlomiejpluta.base.api.entity.InteractiveEntity; import com.bartlomiejpluta.base.api.entity.EntityStepInListener;
import com.bartlomiejpluta.base.api.entity.EntityStepOutListener;
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility; import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility;
import com.bartlomiejpluta.base.api.map.model.GameMap; import com.bartlomiejpluta.base.api.map.model.GameMap;
@@ -28,7 +29,8 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
@Getter @Getter
private final ArrayList<Entity> entities = new ArrayList<>(); private final ArrayList<Entity> entities = new ArrayList<>();
private final List<InteractiveEntity> interactiveEntities = new ArrayList<>(); private final List<EntityStepInListener> stepInListeners = new ArrayList<>();
private final List<EntityStepOutListener> stepOutListeners = new ArrayList<>();
@Getter @Getter
private final PassageAbility[][] passageMap; private final PassageAbility[][] passageMap;
@@ -53,8 +55,12 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
layer.entities.remove(entity); layer.entities.remove(entity);
} }
if (entity instanceof InteractiveEntity) { if (entity instanceof EntityStepInListener) {
interactiveEntities.add((InteractiveEntity) entity); stepInListeners.add((EntityStepInListener) entity);
}
if (entity instanceof EntityStepOutListener) {
stepOutListeners.add((EntityStepOutListener) entity);
} }
entity.setStepSize(stepSize.x(), stepSize.y()); entity.setStepSize(stepSize.x(), stepSize.y());
@@ -67,8 +73,12 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
public void removeEntity(Entity entity) { public void removeEntity(Entity entity) {
entities.remove(entity); entities.remove(entity);
if (entity instanceof InteractiveEntity) { if (entity instanceof EntityStepInListener) {
interactiveEntities.remove(entity); stepInListeners.remove(entity);
}
if (entity instanceof EntityStepOutListener) {
stepOutListeners.remove(entity);
} }
entity.onRemove(this); entity.onRemove(this);
@@ -168,23 +178,15 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
@Override @Override
public void notifyEntityStepIn(Movement movement, Entity entity) { public void notifyEntityStepIn(Movement movement, Entity entity) {
var target = movement.getTo(); for (var listener : stepInListeners) {
listener.onEntityStepIn(movement, entity);
for (var listener : interactiveEntities) {
if (listener.getCoordinates().equals(target)) {
listener.onEntityStepIn(movement, entity);
}
} }
} }
@Override @Override
public void notifyEntityStepOut(Movement movement, Entity entity) { public void notifyEntityStepOut(Movement movement, Entity entity) {
var source = movement.getFrom(); for (var listener : stepOutListeners) {
listener.onEntityStepOut(movement, entity);
for (var listener : interactiveEntities) {
if (listener.getCoordinates().equals(source)) {
listener.onEntityStepOut(movement, entity);
}
} }
} }
} }