Implement proper paper workaround for initializing viewers of a tracker entry

Avoids trouble down the line...
This commit is contained in:
Irmo van den Berge committed 2023-05-10 21:06:00 +02:00
1 parent a616e18488
commit 7fda292b69
3 files changed
+36 -7

No files matched your search

@@ -4,7 +4,6 @@ import com.bergerkiller.mountiplex.reflection.declarations.Template;
import com.bergerkiller.generated.net.minecraft.world.entity.EntityHandle;
import org.bukkit.entity.Player;
import java.util.Collection;
import java.util.List;
/**
* Instance wrapper handle for type <b>net.minecraft.server.level.EntityTrackerEntry</b>.
@@ -36,7 +35,7 @@ public abstract class EntityTrackerEntryHandle extends Template.Handle {
public abstract EntityTrackerEntryStateHandle getState();
public abstract EntityHandle getEntity();
public abstract void setEntity(EntityHandle entity);
public abstract void scanPlayers(List<Player> playerList);
public abstract void updateViewers();
public abstract void removeViewer(Player player);
public abstract void updatePlayer(Player player);
public abstract void hideForAll();
@@ -82,7 +81,7 @@ public abstract class EntityTrackerEntryHandle extends Template.Handle {
public final Template.Method.Converted<Void> setState = new Template.Method.Converted<Void>();
public final Template.Method.Converted<EntityHandle> getEntity = new Template.Method.Converted<EntityHandle>();
public final Template.Method.Converted<Void> setEntity = new Template.Method.Converted<Void>();
public final Template.Method.Converted<Void> scanPlayers = new Template.Method.Converted<Void>();
public final Template.Method<Void> updateViewers = new Template.Method<Void>();
public final Template.Method.Converted<Void> removeViewer = new Template.Method.Converted<Void>();
public final Template.Method.Converted<Void> updatePlayer = new Template.Method.Converted<Void>();
public final Template.Method<Void> hideForAll = new Template.Method<Void>();
@@ -263,7 +263,7 @@ public class CommonEntity<T extends org.bukkit.entity.Entity> extends ExtendedEn
newEntry.updatePlayer(previousViewer);
}
} else {
newEntry.scanPlayers(getWorld().getPlayers());
newEntry.updateViewers();
}
}
@@ -299,11 +299,33 @@ class EntityTrackerEntry {
entry#trackerEntryEntity = entity;
}
public void updateViewers() {
Entity entity = instance#entity;
#if exists net.minecraft.server.level.PlayerChunkMap$EntityTracker final void updatePlayers(com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<net.minecraft.server.level.EntityPlayer> newTrackerCandidates);
// Paper after some optimizations were made to tracking
#require net.minecraft.server.level.PlayerChunkMap$EntityTracker final void paperUpdatePlayers:updatePlayers(com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<net.minecraft.server.level.EntityPlayer> newTrackerCandidates);
com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet players = entity.getPlayersInTrackRange();
instance#paperUpdatePlayers(players);
#else
// Spigot / old paper
#if version >= 1.17
WorldServer world = (WorldServer) entity.level;
#else
WorldServer world = (WorldServer) entity.world;
#endif
#if version >= 1.18
java.util.List playersOnWorld = world.players();
instance.updatePlayers(playersOnWorld);
#else
java.util.List playersOnWorld = world.getPlayers();
instance.track(playersOnWorld);
#endif
#endif
}
#if version >= 1.18
public void scanPlayers:updatePlayers((List<org.bukkit.entity.Player>) List<EntityPlayer> playerList);
public void removeViewer:removePlayer((org.bukkit.entity.Player) EntityPlayer player);
#else
public void scanPlayers:track((List<org.bukkit.entity.Player>) List<EntityPlayer> playerList);
public void removeViewer:clear((org.bukkit.entity.Player) EntityPlayer player);
#endif
#else
@@ -323,7 +345,15 @@ class EntityTrackerEntry {
instance#entity = entity;
}
public void scanPlayers((List<org.bukkit.entity.Player>) List<EntityHuman> playerList);
public void updateViewers() {
Entity entity = instance#entity;
// Spigot / old paper
WorldServer world = (WorldServer) entity.world;
java.util.List playersOnWorld = world.players;
instance.scanPlayers(playersOnWorld);
}
public void removeViewer:a((org.bukkit.entity.Player) EntityPlayer player);
#endif