mirror of
https://github.com/Minestom/Minestom.git
synced 2024-12-25 10:38:18 +01:00
Improve entity viewer iterator creation
This commit is contained in:
parent
fa5fe8f208
commit
45fe2f1ac9
@ -1,6 +1,7 @@
|
||||
package net.minestom.server.entity;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.ints.IntIterator;
|
||||
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
||||
import it.unimi.dsi.fastutil.ints.IntSet;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
@ -46,18 +47,19 @@ final class EntityView {
|
||||
}
|
||||
}
|
||||
entity.updateNewViewer(player);
|
||||
}, player -> {
|
||||
// Remove viewable
|
||||
var lock1 = player.getEntityId() < entity.getEntityId() ? player : entity;
|
||||
var lock2 = lock1 == entity ? player : entity;
|
||||
synchronized (lock1.viewEngine.mutex) {
|
||||
synchronized (lock2.viewEngine.mutex) {
|
||||
entity.viewEngine.viewableOption.unregister(player);
|
||||
player.viewEngine.viewerOption.unregister(entity);
|
||||
}
|
||||
}
|
||||
entity.updateOldViewer(player);
|
||||
});
|
||||
},
|
||||
player -> {
|
||||
// Remove viewable
|
||||
var lock1 = player.getEntityId() < entity.getEntityId() ? player : entity;
|
||||
var lock2 = lock1 == entity ? player : entity;
|
||||
synchronized (lock1.viewEngine.mutex) {
|
||||
synchronized (lock2.viewEngine.mutex) {
|
||||
entity.viewEngine.viewableOption.unregister(player);
|
||||
player.viewEngine.viewerOption.unregister(entity);
|
||||
}
|
||||
}
|
||||
entity.updateOldViewer(player);
|
||||
});
|
||||
this.viewerOption = new Option<>(EntityTracker.Target.ENTITIES, Entity::isAutoViewable,
|
||||
entity instanceof Player player ? e -> e.viewEngine.viewableOption.addition.accept(player) : null,
|
||||
entity instanceof Player player ? e -> e.viewEngine.viewableOption.removal.accept(player) : null);
|
||||
@ -106,21 +108,18 @@ final class EntityView {
|
||||
}
|
||||
|
||||
public void handleAutoViewAddition(Entity entity) {
|
||||
handleAutoView(entity, viewerOption.addition, viewableOption.addition, false);
|
||||
handleAutoView(entity, viewerOption.addition, viewableOption.addition);
|
||||
}
|
||||
|
||||
public void handleAutoViewRemoval(Entity entity) {
|
||||
handleAutoView(entity, viewerOption.removal, viewableOption.removal, true);
|
||||
handleAutoView(entity, viewerOption.removal, viewableOption.removal);
|
||||
}
|
||||
|
||||
private void handleAutoView(Entity entity, Consumer<Entity> viewer, Consumer<Player> viewable,
|
||||
boolean requirement) {
|
||||
private void handleAutoView(Entity entity, Consumer<Entity> viewer, Consumer<Player> viewable) {
|
||||
if (this.entity instanceof Player && viewerOption.isAuto() && entity.isAutoViewable()) {
|
||||
assert viewerOption.isRegistered(entity) == requirement : "Entity is already registered";
|
||||
if (viewer != null) viewer.accept(entity); // Send packet to this player
|
||||
}
|
||||
if (entity instanceof Player player && player.autoViewEntities() && viewableOption.isAuto()) {
|
||||
assert viewableOption.isRegistered(player) == requirement : "Entity is already registered";
|
||||
if (viewable != null) viewable.accept(player); // Send packet to the range-visible player
|
||||
}
|
||||
}
|
||||
@ -231,11 +230,19 @@ final class EntityView {
|
||||
final class SetImpl extends AbstractSet<Player> {
|
||||
@Override
|
||||
public @NotNull Iterator<Player> iterator() {
|
||||
Player[] players;
|
||||
synchronized (mutex) {
|
||||
return viewableOption.bitSet.intStream()
|
||||
.mapToObj(operand -> (Player) Entity.getEntity(operand))
|
||||
.toList().iterator();
|
||||
var bitSet = viewableOption.bitSet;
|
||||
players = new Player[bitSet.size()];
|
||||
int i = 0;
|
||||
for (IntIterator it = bitSet.intIterator(); it.hasNext(); ) {
|
||||
final int id = it.nextInt();
|
||||
final Player player = (Player) Entity.getEntity(id);
|
||||
assert player != null;
|
||||
players[i++] = player;
|
||||
}
|
||||
}
|
||||
return Arrays.asList(players).iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -259,12 +266,5 @@ final class EntityView {
|
||||
return viewableOption.isRegistered(player);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEach(Consumer<? super Player> action) {
|
||||
synchronized (mutex) {
|
||||
viewableOption.bitSet.forEach((int id) -> action.accept((Player) Entity.getEntity(id)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user