Skip to content

Commit

Permalink
rework profileeditor updatePlayer to do a proper tracker respawn
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jul 6, 2022
1 parent e3880f8 commit 936e036
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 80 deletions.
Expand Up @@ -347,6 +347,23 @@ public void forceSpectate(Player player, Entity entity) {
send(player, new ClientboundSetCameraPacket(((CraftEntity) entity).getHandle()));
}

public static void forceRespawnPlayerEntity(Entity entity, Player viewer) {
ChunkMap tracker = ((ServerLevel) ((CraftEntity) entity).getHandle().level).getChunkSource().chunkMap;
ChunkMap.TrackedEntity entityTracker = tracker.entityMap.get(entity.getEntityId());
if (entityTracker != null) {
try {
ServerEntity entry = (ServerEntity) ENTITY_TRACKER_ENTRY_GETTER.get(entityTracker);
if (entry != null) {
entry.removePairing(((CraftPlayer) viewer).getHandle());
entry.addPairing(((CraftPlayer) viewer).getHandle());
}
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}
}

@Override
public void sendRename(Player player, Entity entity, String name, boolean listMode) {
try {
Expand All @@ -356,20 +373,7 @@ public void sendRename(Player player, Entity entity, String name, boolean listMo
}
else {
// For player entities, force a respawn packet and let the dynamic intercept correct the details
ChunkMap tracker = ((ServerLevel) ((CraftEntity) entity).getHandle().level).getChunkSource().chunkMap;
ChunkMap.TrackedEntity entityTracker = tracker.entityMap.get(entity.getEntityId());
if (entityTracker != null) {
try {
ServerEntity entry = (ServerEntity) ENTITY_TRACKER_ENTRY_GETTER.get(entityTracker);
if (entry != null) {
entry.removePairing(((CraftPlayer) player).getHandle());
entry.addPairing(((CraftPlayer) player).getHandle());
}
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}
forceRespawnPlayerEntity(entity, player);
}
return;
}
Expand Down
Expand Up @@ -14,16 +14,13 @@
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket;
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerLevel;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_18_R2.CraftServer;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

import java.lang.invoke.MethodHandle;
import java.util.List;
Expand All @@ -35,32 +32,19 @@ public class ProfileEditorImpl extends ProfileEditor {
protected void updatePlayer(final Player player, final boolean isSkinChanging) {
final ServerPlayer entityPlayer = ((CraftPlayer) player).getHandle();
final UUID uuid = player.getUniqueId();
ClientboundRemoveEntitiesPacket destroyPacket = new ClientboundRemoveEntitiesPacket(entityPlayer.getId());
final List<Player> viewingPlayers = NMSHandler.entityHelper.getPlayersThatSee(player);
for (Player otherPlayer : viewingPlayers) {
ClientboundPlayerInfoPacket playerInfo = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, entityPlayer);
for (Player otherPlayer : Bukkit.getServer().getOnlinePlayers()) {
PacketHelperImpl.send(otherPlayer, playerInfo);
}
for (Player otherPlayer : NMSHandler.entityHelper.getPlayersThatSee(player)) {
if (!otherPlayer.getUniqueId().equals(uuid)) {
PacketHelperImpl.send(otherPlayer, destroyPacket);
PacketHelperImpl.forceRespawnPlayerEntity(player, otherPlayer);
}
}
new BukkitRunnable() {
@Override
public void run() {
ClientboundPlayerInfoPacket playerInfo = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, entityPlayer);
ClientboundAddPlayerPacket spawnPacket = new ClientboundAddPlayerPacket(entityPlayer);
for (Player otherPlayer : Bukkit.getServer().getOnlinePlayers()) {
PacketHelperImpl.send(otherPlayer, playerInfo);
}
for (Player otherPlayer : viewingPlayers) {
if (otherPlayer.isOnline() && !otherPlayer.getUniqueId().equals(uuid)) {
PacketHelperImpl.send(otherPlayer, spawnPacket);
}
}
if (isSkinChanging) {
((CraftServer) Bukkit.getServer()).getHandle().respawn(entityPlayer, (ServerLevel) entityPlayer.level, true, player.getLocation(), false);
}
player.updateInventory();
}
}.runTaskLater(NMSHandler.getJavaPlugin(), 5);
if (isSkinChanging) {
((CraftServer) Bukkit.getServer()).getHandle().respawn(entityPlayer, (ServerLevel) entityPlayer.level, true, player.getLocation(), false);
}
player.updateInventory();
}

public static boolean handleAlteredProfiles(ClientboundPlayerInfoPacket packet, DenizenNetworkManagerImpl manager) {
Expand Down
Expand Up @@ -347,6 +347,23 @@ public void forceSpectate(Player player, Entity entity) {
send(player, new ClientboundSetCameraPacket(((CraftEntity) entity).getHandle()));
}

public static void forceRespawnPlayerEntity(Entity entity, Player viewer) {
ChunkMap tracker = ((ServerLevel) ((CraftEntity) entity).getHandle().level).getChunkSource().chunkMap;
ChunkMap.TrackedEntity entityTracker = tracker.entityMap.get(entity.getEntityId());
if (entityTracker != null) {
try {
ServerEntity entry = (ServerEntity) ENTITY_TRACKER_ENTRY_GETTER.get(entityTracker);
if (entry != null) {
entry.removePairing(((CraftPlayer) viewer).getHandle());
entry.addPairing(((CraftPlayer) viewer).getHandle());
}
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}
}

@Override
public void sendRename(Player player, Entity entity, String name, boolean listMode) {
try {
Expand All @@ -356,20 +373,7 @@ public void sendRename(Player player, Entity entity, String name, boolean listMo
}
else {
// For player entities, force a respawn packet and let the dynamic intercept correct the details
ChunkMap tracker = ((ServerLevel) ((CraftEntity) entity).getHandle().level).getChunkSource().chunkMap;
ChunkMap.TrackedEntity entityTracker = tracker.entityMap.get(entity.getEntityId());
if (entityTracker != null) {
try {
ServerEntity entry = (ServerEntity) ENTITY_TRACKER_ENTRY_GETTER.get(entityTracker);
if (entry != null) {
entry.removePairing(((CraftPlayer) player).getHandle());
entry.addPairing(((CraftPlayer) player).getHandle());
}
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}
forceRespawnPlayerEntity(entity, player);
}
return;
}
Expand Down
Expand Up @@ -14,16 +14,13 @@
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket;
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerLevel;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

import java.lang.invoke.MethodHandle;
import java.util.List;
Expand All @@ -35,32 +32,19 @@ public class ProfileEditorImpl extends ProfileEditor {
protected void updatePlayer(final Player player, final boolean isSkinChanging) {
final ServerPlayer entityPlayer = ((CraftPlayer) player).getHandle();
final UUID uuid = player.getUniqueId();
ClientboundRemoveEntitiesPacket destroyPacket = new ClientboundRemoveEntitiesPacket(entityPlayer.getId());
final List<Player> viewingPlayers = NMSHandler.entityHelper.getPlayersThatSee(player);
for (Player otherPlayer : viewingPlayers) {
ClientboundPlayerInfoPacket playerInfo = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, entityPlayer);
for (Player otherPlayer : Bukkit.getServer().getOnlinePlayers()) {
PacketHelperImpl.send(otherPlayer, playerInfo);
}
for (Player otherPlayer : NMSHandler.entityHelper.getPlayersThatSee(player)) {
if (!otherPlayer.getUniqueId().equals(uuid)) {
PacketHelperImpl.send(otherPlayer, destroyPacket);
PacketHelperImpl.forceRespawnPlayerEntity(player, otherPlayer);
}
}
new BukkitRunnable() {
@Override
public void run() {
ClientboundPlayerInfoPacket playerInfo = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, entityPlayer);
ClientboundAddPlayerPacket spawnPacket = new ClientboundAddPlayerPacket(entityPlayer);
for (Player otherPlayer : Bukkit.getServer().getOnlinePlayers()) {
PacketHelperImpl.send(otherPlayer, playerInfo);
}
for (Player otherPlayer : viewingPlayers) {
if (otherPlayer.isOnline() && !otherPlayer.getUniqueId().equals(uuid)) {
PacketHelperImpl.send(otherPlayer, spawnPacket);
}
}
if (isSkinChanging) {
((CraftServer) Bukkit.getServer()).getHandle().respawn(entityPlayer, (ServerLevel) entityPlayer.level, true, player.getLocation(), false);
}
player.updateInventory();
}
}.runTaskLater(NMSHandler.getJavaPlugin(), 5);
if (isSkinChanging) {
((CraftServer) Bukkit.getServer()).getHandle().respawn(entityPlayer, (ServerLevel) entityPlayer.level, true, player.getLocation(), false);
}
player.updateInventory();
}

public static boolean handleAlteredProfiles(ClientboundPlayerInfoPacket packet, DenizenNetworkManagerImpl manager) {
Expand Down

0 comments on commit 936e036

Please sign in to comment.