Enable removing entities and rules from the loop inside

This commit is contained in:
2021-03-18 23:27:03 +01:00
parent 48e340947a
commit 32f7a8d164

View File

@@ -35,6 +35,9 @@ public class DefaultObjectLayer implements ObjectLayer {
private final List<Rule> rules = new ArrayList<>(); private final List<Rule> rules = new ArrayList<>();
private final List<Entity> entitiesToRemove = new LinkedList<>();
private final List<Rule> rulesToRemove = new LinkedList<>();
private final int rows; private final int rows;
private final int columns; private final int columns;
private final Vector2fc stepSize; private final Vector2fc stepSize;
@@ -55,12 +58,12 @@ public class DefaultObjectLayer implements ObjectLayer {
@Override @Override
public void unregisterRule(Rule rule) { public void unregisterRule(Rule rule) {
rules.remove(rule); rulesToRemove.add(rule);
} }
@Override @Override
public void unregisterRules() { public void unregisterRules() {
rules.clear(); rulesToRemove.addAll(rules);
} }
@Override @Override
@@ -72,13 +75,12 @@ public class DefaultObjectLayer implements ObjectLayer {
@Override @Override
public void removeEntity(Entity entity) { public void removeEntity(Entity entity) {
entity.onRemove(this); entitiesToRemove.add(entity);
entities.remove(entity);
} }
@Override @Override
public void clearEntities() { public void clearEntities() {
entities.clear(); entitiesToRemove.addAll(entities);
} }
@Override @Override
@@ -114,7 +116,6 @@ public class DefaultObjectLayer implements ObjectLayer {
} }
} }
return true; return true;
} }
@@ -145,6 +146,22 @@ public class DefaultObjectLayer implements ObjectLayer {
((NPC) entity).getStrategy().nextActivity(this, dt); ((NPC) entity).getStrategy().nextActivity(this, dt);
} }
} }
// Remove entities requested to be removed
if (!entitiesToRemove.isEmpty()) {
for (var entity : entitiesToRemove) {
entities.remove(entity);
entity.onRemove(this);
}
entitiesToRemove.clear();
}
// Remove rules requested to be unregistered
if (!rulesToRemove.isEmpty()) {
rules.removeAll(rulesToRemove);
rulesToRemove.clear();
}
} }
@Override @Override