Add viewer fallback for non-entities

Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
TheMode 2021-11-02 16:08:21 +01:00
parent 5b63636e92
commit d919e1b60d

View File

@ -214,14 +214,38 @@ public final class ViewEngine {
@Override @Override
public int size() { public int size() {
synchronized (mutex) { synchronized (mutex) {
return manualViewers.size() + viewableOption.bitSet.size(); int size = manualViewers.size();
if (entity != null) return size + viewableOption.bitSet.size();
// Non-entity fallback
final List<List<Player>> auto = ViewEngine.this.viewableOption.references;
if (auto != null) {
for (List<Player> players : auto) {
if (players.isEmpty()) continue;
for (Player player : players) {
if (validAutoViewer(player)) size++;
}
}
}
return size;
} }
} }
@Override @Override
public boolean isEmpty() { public boolean isEmpty() {
synchronized (mutex) { synchronized (mutex) {
return manualViewers.isEmpty() && viewableOption.bitSet.isEmpty(); if (!manualViewers.isEmpty()) return false;
if (entity != null) return viewableOption.bitSet.isEmpty();
// Non-entity fallback
final List<List<Player>> auto = ViewEngine.this.viewableOption.references;
if (auto != null) {
for (List<Player> players : auto) {
if (players.isEmpty()) continue;
for (Player player : players) {
if (validAutoViewer(player)) return false;
}
}
}
return true;
} }
} }
@ -229,14 +253,23 @@ public final class ViewEngine {
public boolean contains(Object o) { public boolean contains(Object o) {
if (!(o instanceof Player player)) return false; if (!(o instanceof Player player)) return false;
synchronized (mutex) { synchronized (mutex) {
return manualViewers.contains(player) || viewableOption.isRegistered(player); if (manualViewers.contains(player)) return true;
if (entity != null) return viewableOption.isRegistered(player);
// Non-entity fallback
final List<List<Player>> auto = ViewEngine.this.viewableOption.references;
if (auto != null) {
for (List<Player> players : auto) {
if (players.isEmpty()) continue;
if (players.contains(player) && validAutoViewer(player)) return true;
}
}
return false;
} }
} }
@Override @Override
public void forEach(Consumer<? super Player> action) { public void forEach(Consumer<? super Player> action) {
synchronized (mutex) { synchronized (mutex) {
// Manual viewers
if (!manualViewers.isEmpty()) manualViewers.forEach(action); if (!manualViewers.isEmpty()) manualViewers.forEach(action);
// Auto // Auto
final List<List<Player>> auto = ViewEngine.this.viewableOption.references; final List<List<Player>> auto = ViewEngine.this.viewableOption.references;